X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/0052faf6d85ec776823a1a33efc8d911b4b4e2f6..afe814271b1b8c0519595d12d5a9cad8a24a3cc9:/src/main.c?ds=sidebyside diff --git a/src/main.c b/src/main.c index 69e0a54..0708044 100644 --- a/src/main.c +++ b/src/main.c @@ -5,6 +5,7 @@ #include "reg51.h" #include "netdev.h" #include "eth.h" +#include "arp.h" #include "ip.h" #include "udp.h" #include "elp.h" @@ -27,7 +28,7 @@ void main(void) // 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; @@ -54,8 +55,22 @@ void main(void) // 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 @@ -76,42 +91,37 @@ void main(void) // 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;