X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/6d441bbe709092d070c21b92aeeabfb82cb5982f..HEAD:/src/main.c diff --git a/src/main.c b/src/main.c index 419ad41..0708044 100644 --- a/src/main.c +++ b/src/main.c @@ -2,23 +2,34 @@ #include "debug.h" #include "leds.h" +#include "reg51.h" #include "netdev.h" #include "eth.h" +#include "arp.h" #include "ip.h" #include "udp.h" +#include "elp.h" void main(void) { - // Apagamos todos los leds - leds(0); + // Inicializamos leds + leds_init(); + + // Hacemos prueba simple de los leds + leds_test(); // Inicializamos dispositivo de red if (!netdev_init()) { - leds(0xFFFF); - while(1); // Si falla init nos quedamos bobos + // Si hubo un error, quedan prendidos todos los leds + leds_write(0xFFFF); + return; } + // Comienza a 'dibujar' + EA = 1; // Habilita interrupciones globalmente + ET2 = 1; // Pone a correr el 'dibujado' + // Inicializo IP ip_addr_local[0] = 10; ip_addr_local[1] = 10; @@ -26,63 +37,96 @@ void main(void) ip_addr_local[3] = 100; // Inicializo puerto UDP - udp_port_local = 9000; + udp_port_local = ELP_PORT; while (1) // Forever { - byte i; byte len = netdev_recv_start(); - printb(len, 0x1); + //printb(len, 0x10); if (!len) // no recibimos nada (válido) continue; // Probamos de nuevo // Tenemos algo! - //print(0x2); // Parseamos cabecera ethernet if (!eth_read_frame_header()) // No es un buen header goto drop; // Tiramos el paquete - //print(0x4); // Vemos que protocolo transporta switch (eth_proto) { - case ETH_ARP: // FIXME, 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: - //print(0x8); // Parseamos cabecera IP if (!ip_read_packet_header()) // No es un buen header goto drop; // Tiramos el paquete - //print(0x10); // Vemos que protocolo transporta switch (ip_proto) { - case IP_ICMP: // FIXME, implementar ICMP! + case IP_ICMP: // TODO: implementar ICMP! goto drop; // Tiramos el paquete case IP_UDP: - //print(0x20); // Parseamos cabecera UDP if (!udp_read_dgram_header()) // No es un buen header goto drop; // Tiramos el paquete - printb(udp_dgram_len, 0x40); - // TODO - // Nuestro protocolo, por ahora un simple echo! - for (i = 8; i < udp_dgram_len; ++i) // 8 por la cabecera UDP - { - printb(netdev_recv_byte(), 0x00); - } - //i = (udp_dgram_len % 2) ? (udp_dgram_len - 1) : udp_dgram_len; - for (i += 34; i < len; ++i) // 8 por las cabeceras eth+IP - netdev_recv_byte(); -drop: + // Procesamos comando ELP y obtenemos tamaño de la + // respuesta + len = elp_read_process_command(); + //printb(len, 0x02); + + // Si el tamaño es 0, hubo error o no está soportado + if (!len) + goto drop; + //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); + + // Terminamos recepción netdev_recv_end(); + //print(0x0010); + + // Respuesta + netdev_send_start(); + eth_write_frame_header(); + ip_packet_len = UDP_HEADER_SIZE + len; + //printb(ip_packet_len, 0x20); + ip_write_packet_header(); + udp_dgram_len = len; + //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); } } + continue; +drop: + netdev_recv_end(); } }