#include "reg51.h"
#include "netdev.h"
#include "eth.h"
+#include "arp.h"
#include "ip.h"
#include "udp.h"
#include "elp.h"
// Comienza a 'dibujar'
EA = 1; // Habilita interrupciones globalmente
- //XXX TR2 = 1; // Pone a correr el 'dibujado'
+ ET2 = 1; // Pone a correr el 'dibujado'
// Inicializo IP
ip_addr_local[0] = 10;
// Vemos que protocolo transporta
switch (eth_proto)
{
- case ETH_ARP: // TODO: implementar ARP!
- goto drop; // Tiramos el paquete
+ case ETH_ARP:
+ // Obtenemos paquete ARP
+ if (!arp_read_packet) // No es un paquete soportado
+ goto drop; // Tiramos el paquete
+
+ // Terminamos recepción
+ netdev_recv_end();
+
+ // Respondemos
+ netdev_send_start();
+ eth_write_frame_header();
+ arp_write_packet();
+ netdev_send_end(ETH_HEADER_SIZE + ARP_PACKET_SIZE);
+
+ // Seguimos viaje
+ continue;
case ETH_IP:
// Parseamos cabecera IP
// Procesamos comando ELP y obtenemos tamaño de la
// respuesta
len = elp_read_process_command();
- printb(len, 0x02);
+ //printb(len, 0x02);
// Si el tamaño es 0, hubo error o no está soportado
if (!len)
goto drop;
- print(0x0004);
+ //print(0x0004);
// FIXME por ahora no tenemos forma de 'abortar' el
// comando si el checksum es incorrecto, lo verificamos
// por deporte.
if (!udp_checksum_ok())
goto drop;
- print(0x0008);
+ //print(0x0008);
// Terminamos recepción
netdev_recv_end();
- print(0x0010);
+ //print(0x0010);
// Respuesta
netdev_send_start();
eth_write_frame_header();
ip_packet_len = UDP_HEADER_SIZE + len;
- printb(ip_packet_len, 0x20);
+ //printb(ip_packet_len, 0x20);
ip_write_packet_header();
udp_dgram_len = len;
- printb(udp_dgram_len, 0x40);
+ //printb(udp_dgram_len, 0x40);
udp_write_dgram_header();
elp_write_response();
udp_write_checksum(ETH_HEADER_SIZE + IP_HEADER_SIZE);
netdev_send_end(ETH_HEADER_SIZE + IP_HEADER_SIZE
+ UDP_HEADER_SIZE + len);
- printb(ETH_HEADER_SIZE + IP_HEADER_SIZE
- + UDP_HEADER_SIZE + len, 0x80);
- //XXX
- if (elp_command.set && (elp_command.var == ELP_VAR_PAUSE))
- TR2 = 1;
}
}
continue;