]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/main.c
Arregla macros para que no hagan lío evaluando cosas más de una vez.
[z.facultad/66.09/etherled.git] / src / main.c
index 7cd27163c955894dbc067104382b84bdf04947c9..c679ac80ea11c951a31be02de362b761ba02ec0f 100644 (file)
@@ -1,44 +1,21 @@
 // vim: set et sw=4 sts=4 :    
 
 // 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"
 
 #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
 void main(void)
 {
     // Apagamos todos los leds
-    leds(0x0000);
+    leds(0);
 
     // Inicializamos dispositivo de red
     if (!netdev_init())
     {
 
     // Inicializamos dispositivo de red
     if (!netdev_init())
     {
-        leds(0xffff);
+        leds(0xFFFF);
         while(1); // Si falla init nos quedamos bobos
     }
 
         while(1); // Si falla init nos quedamos bobos
     }
 
@@ -53,58 +30,59 @@ void main(void)
 
     while (1) // Forever
     {
 
     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
 
         // 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!
 
         // 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:
 
             case ETH_IP:
+                //print(0x8);
                 // Parseamos cabecera IP
                 if (!ip_read_packet_header()) // No es un buen header
                 // 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!
 
                 // 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:
 
                     case IP_UDP:
+                        //print(0x20);
                         // Parseamos cabecera UDP
                         if (!udp_read_dgram_header()) // No es un buen header
                         // 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!
                         // 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();
                 }
         }
     }
                 }
         }
     }