]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/ip.c
Alguna modificación al informe que ya no recuerdo.
[z.facultad/66.09/etherled.git] / src / ip.c
index f60c3d4b125a6ee144b3997e7bc480d81101e560..de4cc322e20e86af1c862fefe31a960c4a0215b0 100644 (file)
--- a/src/ip.c
+++ b/src/ip.c
@@ -48,8 +48,13 @@ bool ip_read_packet_header()
     if (h = netdev_read_byte()) /* tiene más de 255 bytes (no lo soportamos) */
         ok = false;
     ip_packet_len = netdev_read_byte(); /* hasta 255 bytes tienen los nuestros */
+    /* no puede ser más chico que sus cabeceras */
+    if (ip_packet_len < IP_HEADER_SIZE)
+        ok = false; /* drop */
     /* vamos calculando checksum */
     sum(WORD(h, ip_packet_len));
+    /* sacamos la cabecera al tamaño */
+    ip_packet_len -= IP_HEADER_SIZE;
     /* ignoramos identificación (2 bytes) y vamos calculando checksum */
     sum(netdev_read_word());
     /* si tiene prendido el bit de MF (More Fragments, bit 5 del byte, bit 2
@@ -127,8 +132,8 @@ void ip_write_packet_header()
     sum(WORD(h, l)); /* actualizamos checksum */
     /* escribimos tamaño del paquete */
     netdev_write_byte(h = 0x00); /* nunca vamos a mandar algo de más de 255 bytes */
-    netdev_write_byte(ip_packet_len);
-    sum(WORD(h, ip_packet_len)); /* actualizamos checksum */
+    netdev_write_byte(ip_packet_len + IP_HEADER_SIZE);
+    sum(WORD(h, ip_packet_len + IP_HEADER_SIZE)); /* actualizamos checksum */
     /* identificación (sirve para reensamblar paquetes) */
     netdev_write_word(++id);
     sum(id); /* actualizamos checksum */