]> git.llucax.com Git - z.facultad/66.09/etherled.git/commitdiff
Mejora el manejo de tamaños de paquetes IP y UDP, para que sea más simple su
authorLeandro Lucarella <llucax@gmail.com>
Tue, 13 Dec 2005 00:44:25 +0000 (00:44 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Tue, 13 Dec 2005 00:44:25 +0000 (00:44 +0000)
uso.

src/ip.c
src/ip.h
src/udp.c
src/udp.h

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 */
index a40693a812bb97130f8d2afb1a64ce745bce67c7..ecddd523662b6f94015fa0ab2d57bf6924d6d4c1 100644 (file)
--- a/src/ip.h
+++ b/src/ip.h
@@ -47,7 +47,7 @@ extern byte ip_addr_local[IP_ADDR_SIZE];
 /** Dirección IP de destino */
 extern byte ip_addr_remote[IP_ADDR_SIZE];
 
-/** Tamaño del paquete IP */
+/** Tamaño del payload del paquete IP (no soportamos más de 255) */
 extern byte ip_packet_len;
 
 /** Indica si el paquete es ICMP (si no es UDP) */
index 68c457dd1261dcc5608e1adea00596e3d912eac5..bd6f9c276bf2da8452b2e3b4f41b9eac90bcd323 100644 (file)
--- a/src/udp.c
+++ b/src/udp.c
@@ -41,8 +41,8 @@ bool udp_read_dgram_header()
     sum(WORD(ip_addr_local[2], ip_addr_local[3]));
     /* protocolo expresado en 16 bits (0x11 es UDP) */
     sum(0x0011);
-    /* tamaño del paquete UDP (sin las cabeceras que son 20 bytes) */
-    sum(ip_packet_len - 20);
+    /* tamaño del paquete UDP (IP ya está sin las cabeceras) */
+    sum(ip_packet_len);
     /* de ahora en más todos los datos del checksum corresponden a UDP */
     /* puerto origen (remoto) */
     udp_port_remote = netdev_read_word();
@@ -57,10 +57,13 @@ bool udp_read_dgram_header()
     if (tmp = netdev_read_byte()) /* no soportamos más de 255 bytes */
         ok = false; /* drop */
     udp_dgram_len = netdev_read_byte(); /* parte baja */
-    if (udp_dgram_len < 8) /* no puede ser más chico que sus cabeceras */
+    /* no puede ser más chico que sus cabeceras */
+    if (udp_dgram_len < UDP_HEADER_SIZE)
         ok = false; /* drop */
     /* agregamos tamaño al checksum */
     sum(WORD(tmp, udp_dgram_len));
+    /* sacamos la cabecera al tamaño */
+    udp_dgram_len -= UDP_HEADER_SIZE;
     /* agregamos checksum al checksum */
     sum(netdev_read_word());
     /* falta agregar el cuerpo del mensaje para verificar la suma
@@ -110,8 +113,8 @@ void udp_write_dgram_header()
     sum(WORD(ip_addr_local[2], ip_addr_local[3]));
     /* protocolo expresado en 16 bits (0x11 es UDP) */
     sum(0x0011);
-    /* tamaño del paquete UDP (IP sin las cabeceras, que son 20 bytes) */
-    sum(ip_packet_len - 20); // FIXME
+    /* tamaño del paquete UDP */
+    sum(WORD(0x00, udp_dgram_len + UDP_HEADER_SIZE));
     /* puerto origen */
     netdev_write_word(udp_port_local);
     sum(udp_port_local);
@@ -120,8 +123,8 @@ void udp_write_dgram_header()
     sum(udp_port_remote);
     /* tamaño del datagrama */
     netdev_write_byte(0x00); /* parte alta en 0 porque no soportamos más de 255 */
-    netdev_write_byte(udp_dgram_len);
-    sum(WORD(0x00, udp_dgram_len));
+    netdev_write_byte(udp_dgram_len + UDP_HEADER_SIZE);
+    sum(WORD(0x00, udp_dgram_len + UDP_HEADER_SIZE));
     /* indicamos que no se usa checksum */
     netdev_write_word(0x0000);
     sum(0x0000);
index d08d03faf15aa94e52eb7251ad87320a86b68224..b178e9f9ea5ff57b1e7b6609f3d2354eebc13b19 100644 (file)
--- a/src/udp.h
+++ b/src/udp.h
@@ -61,7 +61,7 @@ extern uint16 udp_port_local;
 /** Puerto UDP de destino */
 extern uint16 udp_port_remote;
 
-/** Tamaño del datagrama UDP (no soportamos más de 255) */
+/** Tamaño del payload del datagrama UDP (no soportamos más de 255) */
 extern byte udp_dgram_len;
 
 /** Lee la cabecera del datagrama UDP.