]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/main.c
Implementado el checksum de UDP, tanto para paquetes recibidos como para
[z.facultad/66.09/etherled.git] / src / main.c
index c679ac80ea11c951a31be02de362b761ba02ec0f..60ed5db0cec78cba5e4b71922ef001982b569842 100644 (file)
@@ -26,13 +26,15 @@ void main(void)
     ip_addr_local[3] = 100;
 
     // Inicializo puerto UDP
-    udp_port_local = 9000;
+    udp_port_local = 9876;
 
     while (1) // Forever
     {
-        byte i;
-        byte len = netdev_recv_start();
-        printb(len, 0x1);
+        byte buf[64]; //XXX
+        byte i; //XXX
+        byte len;
+
+        len = netdev_recv_start();
         if (!len) // no recibimos nada (vĂ¡lido)
             continue; // Probamos de nuevo
 
@@ -47,7 +49,7 @@ void main(void)
         // Vemos que protocolo transporta
         switch (eth_proto)
         {
-            case ETH_ARP: // FIXME, implementar ARP!
+            case ETH_ARP: // TODO: implementar ARP!
                 goto drop; // Tiramos el paquete
 
             case ETH_IP:
@@ -60,7 +62,7 @@ void main(void)
                 // 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:
@@ -69,22 +71,36 @@ void main(void)
                         if (!udp_read_dgram_header()) // No es un buen header
                             goto drop; // Tiramos el paquete
 
-                        printb(udp_dgram_len, 0x40);
+                        //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
-                        {
-                            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:
+                        len = udp_dgram_len - UDP_HEADER_SIZE;
+                        netdev_read_start(len);
+                        for (i = 0; i < len; ++i)
+                            buf[i] = udp_read_byte();
+                        netdev_read_end();
+                        if (!udp_checksum_ok())
+                            goto drop;
                         netdev_recv_end();
+
+                        // 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_write_packet_header();
+                        udp_write_dgram_header();
+                        netdev_write_start(len);
+                        for (i = 0; i < len; ++i)
+                            udp_write_byte(buf[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);
                 }
         }
+        continue;
+drop:
+        netdev_recv_end();
     }
 }