X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/cbf2122a2f610a2b92f1dfcb0f554b4bf7c4757e..8f48e4df85125bfd22f8c93b5952deccc9f6af72:/src/main.c?ds=sidebyside diff --git a/src/main.c b/src/main.c index 7cd2716..c679ac8 100644 --- a/src/main.c +++ b/src/main.c @@ -1,44 +1,21 @@ // vim: set et sw=4 sts=4 : +#include "debug.h" +#include "leds.h" #include "netdev.h" #include "eth.h" #include "ip.h" #include "udp.h" -#ifdef SDCC -static xdata at 0x0080 byte leds0; -static xdata at 0x00c0 byte leds1; -#else -static byte xdata leds0 _at_ 0x0080; -static byte xdata leds1 _at_ 0x00c0; -#endif - -#define leds(word) \ - do \ - { \ - leds0 = ~LOW(word); \ - leds1 = ~HIGH(word); \ - } \ - while (0) - - -void sleep(unsigned char times) -{ - unsigned int i; - unsigned char j; - for (i = 0; i < 0xffff; ++i) - for (j = 0; j < times; ++j); -} - void main(void) { // Apagamos todos los leds - leds(0x0000); + leds(0); // Inicializamos dispositivo de red if (!netdev_init()) { - leds(0xffff); + leds(0xFFFF); while(1); // Si falla init nos quedamos bobos } @@ -53,58 +30,59 @@ void main(void) while (1) // Forever { - uint16 len = netdev_recv_start(); - if (!len) // no recibimos nada - { - netdev_recv_end(); - continue; // vamos de nuevo! - } + byte i; + byte len = netdev_recv_start(); + printb(len, 0x1); + 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 - { - // Tenemos algo! - netdev_recv_end(); // Tiramos el paquete - continue; // Vamos de nuevo! - } + goto drop; // Tiramos el paquete + //print(0x4); // Vemos que protocolo transporta switch (eth_proto) { case ETH_ARP: // FIXME, implementar ARP! - netdev_recv_end(); // Tiramos el paquete - continue; // Vamos de nuevo! + goto drop; // Tiramos el paquete case ETH_IP: + //print(0x8); // Parseamos cabecera IP if (!ip_read_packet_header()) // No es un buen header - { - netdev_recv_end(); // Tiramos el paquete - continue; // Vamos de nuevo! - } + goto drop; // Tiramos el paquete + //print(0x10); // Vemos que protocolo transporta switch (ip_proto) { case IP_ICMP: // FIXME, implementar ICMP! - netdev_recv_end(); // Tiramos el paquete - continue; // Vamos de nuevo! + goto drop; // Tiramos el paquete case IP_UDP: + //print(0x20); // Parseamos cabecera UDP if (!udp_read_dgram_header()) // No es un buen header - { - netdev_recv_end(); // Tiramos el paquete - continue; // Vamos de nuevo! - } + goto drop; // Tiramos el paquete + printb(udp_dgram_len, 0x40); // TODO // Nuestro protocolo, por ahora un simple echo! - for (len = 8; len < udp_dgram_len; len += 2) // 8 por la cabecera UDP + for (i = 8; i < udp_dgram_len; ++i) // 8 por la cabecera UDP { - leds(netdev_recv_word()); - sleep(5); + leds0 = ~netdev_recv_byte(); + leds1 = ~i; + sleep(8); } + i = (udp_dgram_len % 2) ? udp_dgram_len : (udp_dgram_len + 1); + for (i += 34; i < len; ++i) // 8 por la cabecera UDP + netdev_recv_byte(); +drop: + netdev_recv_end(); } } }