]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/main.c
Alguna modificación al informe que ya no recuerdo.
[z.facultad/66.09/etherled.git] / src / main.c
index f980df1fb630c10f9d10b7c4669bb80017a34f83..070804402c392471e2df984cfb5a4a9c761bbcfa 100644 (file)
@@ -5,8 +5,10 @@
 #include "reg51.h"
 #include "netdev.h"
 #include "eth.h"
 #include "reg51.h"
 #include "netdev.h"
 #include "eth.h"
+#include "arp.h"
 #include "ip.h"
 #include "udp.h"
 #include "ip.h"
 #include "udp.h"
+#include "elp.h"
 
 void main(void)
 {
 
 void main(void)
 {
@@ -26,7 +28,7 @@ void main(void)
 
     // Comienza a 'dibujar'
     EA  = 1; // Habilita interrupciones globalmente
 
     // Comienza a 'dibujar'
     EA  = 1; // Habilita interrupciones globalmente
-    TR2 = 1; // Pone a correr el 'dibujado'
+    ET2 = 1; // Pone a correr el 'dibujado'
 
     // Inicializo IP
     ip_addr_local[0] = 10;
 
     // Inicializo IP
     ip_addr_local[0] = 10;
@@ -35,37 +37,45 @@ void main(void)
     ip_addr_local[3] = 100;
 
     // Inicializo puerto UDP
     ip_addr_local[3] = 100;
 
     // Inicializo puerto UDP
-    udp_port_local = 9876;
+    udp_port_local = ELP_PORT;
 
     while (1) // Forever
     {
 
     while (1) // Forever
     {
-        byte i; //XXX
-        byte len;
-
-        len = netdev_recv_start();
+        byte len = netdev_recv_start();
+        //printb(len, 0x10);
         if (!len) // no recibimos nada (válido)
             continue; // Probamos de nuevo
 
         // Tenemos algo!
         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
 
         // 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)
         {
 
         // 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:
 
             case ETH_IP:
-                //print(0x8);
                 // Parseamos cabecera IP
                 if (!ip_read_packet_header()) // No es un buen header
                     goto drop; // Tiramos el paquete
                 // 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)
 
                 // Vemos que protocolo transporta
                 switch (ip_proto)
@@ -74,37 +84,44 @@ void main(void)
                         goto drop; // Tiramos el paquete
 
                     case IP_UDP:
                         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
 
                         // 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!
-                        len = udp_dgram_len - UDP_HEADER_SIZE;
-                        netdev_read_start(len);
-                        leds_matrix_len = len;
-                        for (i = 0; i < len; ++i)
-                            leds_matrix[i] = udp_read_byte();
-                        netdev_read_end();
+                        // 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;
                         if (!udp_checksum_ok())
                             goto drop;
+                        //print(0x0008);
+
+                        // Terminamos recepción
                         netdev_recv_end();
                         netdev_recv_end();
+                        //print(0x0010);
 
                         // Respuesta
                         netdev_send_start();
                         eth_write_frame_header();
 
                         // Respuesta
                         netdev_send_start();
                         eth_write_frame_header();
-                        //udp_dgram_len = UDP_HEADER_SIZE+len;
-                        //ip_packet_len = IP_HEADER_SIZE+udp_dgram_len;
+                        ip_packet_len = UDP_HEADER_SIZE + len;
+                        //printb(ip_packet_len, 0x20);
                         ip_write_packet_header();
                         ip_write_packet_header();
+                        udp_dgram_len = len;
+                        //printb(udp_dgram_len, 0x40);
                         udp_write_dgram_header();
                         udp_write_dgram_header();
-                        netdev_write_start(len);
-                        for (i = 0; i < len; ++i)
-                            udp_write_byte(leds_matrix[i]);
-                        netdev_write_end();
-                        udp_write_checksum(ETH_HEADER_SIZE+IP_HEADER_SIZE);
-                        netdev_send_end(ETH_HEADER_SIZE+IP_HEADER_SIZE+udp_dgram_len);
+                        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;
                 }
         }
         continue;