]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/udp.c
Implementado el checksum de UDP, tanto para paquetes recibidos como para
[z.facultad/66.09/etherled.git] / src / udp.c
index f8264b12d5b18badf8d4fdad9266f9b7c1f40282..09b9bfc24fe89c053dce5407cdf8336557e67ef9 100644 (file)
--- a/src/udp.c
+++ b/src/udp.c
@@ -1,5 +1,6 @@
 // vim: set et sw=4 sts=4 :    
 
+#include "debug.h"
 #include "netdev.h"
 #include "ip.h"
 #include "udp.h"
@@ -12,6 +13,8 @@ byte udp_dgram_len;
 
 /* para calcular checksum */
 static uint16 checksum;
+static byte byte_count;
+static byte last_byte;
 
 /* agrega un word al checksum calculado */
 static void sum(uint16 w)
@@ -28,6 +31,7 @@ bool udp_read_dgram_header()
     netdev_read_start(UDP_HEADER_SIZE);
     /* reseteamos checksum */
     checksum = 0;
+    byte_count = 0;
     /* el UDP tiene un checksum que incluye parte de la cabecera IP */
     /* ip de origen */
     sum(WORD(ip_addr_remote[0], ip_addr_remote[1]));
@@ -66,16 +70,29 @@ bool udp_read_dgram_header()
     return true;
 }
 
-uint16 udp_read_word()
+byte udp_read_byte()
 {
-    uint16 w = netdev_read_word();
-    sum(w);
-    return w;
+    byte b;
+    if (byte_count % 2) // impar, tengo 2, sumo
+    {
+        b = netdev_read_byte();
+        sum(WORD(last_byte, b));
+    }
+    else // par, guardo para sumar cuando tenga 2
+    {
+        b = netdev_read_byte();
+        last_byte = b;
+    }
+    ++byte_count;
+    return b;
 }
 
 bool udp_checksum_ok()
 {
-    return (uint16)~checksum;
+    // Verifico si falta sumar algo (UDP debe sumar de a un word)
+    if (byte_count == (udp_dgram_len - UDP_HEADER_SIZE))
+        sum(WORD(last_byte, 0x00)); // Relleno el byte que falta con 0x00
+    return !(uint16)~checksum;
 }
 
 void udp_write_dgram_header()
@@ -83,6 +100,7 @@ void udp_write_dgram_header()
     netdev_write_start(UDP_HEADER_SIZE);
     /* reseteamos checksum */
     checksum = 0;
+    byte_count = 0;
     /* el UDP tiene un checksum que incluye parte de la cabecera IP */
     /* ip de origen */
     sum(WORD(ip_addr_remote[0], ip_addr_remote[1]));
@@ -110,15 +128,30 @@ void udp_write_dgram_header()
     netdev_write_end();
 }
 
-void udp_write_word(uint16 w)
+void udp_write_byte(byte b)
 {
-    sum(w);
-    netdev_write_word(w);
+    if (byte_count % 2) // impar, tengo 2, sumo
+    {
+        netdev_write_byte(b);
+        sum(WORD(last_byte, b));
+    }
+    else // par, guardo para sumar cuando tenga 2
+    {
+        netdev_write_byte(b);
+        last_byte = b;
+    }
+    ++byte_count;
 }
 
-void udp_write_checksum()
+void udp_write_checksum(byte offset)
 {
-    // XXX TODO FIXME
+    // Verifico si falta sumar algo (UDP debe sumar de a un word)
+    if (byte_count == (udp_dgram_len - UDP_HEADER_SIZE))
+        sum(WORD(last_byte, 0x00)); // Relleno el byte que falta con 0x00
+    // Escribo checksum en el buffer de la placa de red
+    netdev_write_start_at(offset + 6, 2); // 6 bytes de offset hasta el checksum
+    netdev_write_word((uint16)~checksum); // Guardo checksum
+    netdev_write_end();
     return;
 }