From 24dd3fb2a36f8784d22e022b83d8b96397229286 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Tue, 13 Dec 2005 00:44:25 +0000 Subject: [PATCH] =?utf8?q?Mejora=20el=20manejo=20de=20tama=C3=B1os=20de=20?= =?utf8?q?paquetes=20IP=20y=20UDP,=20para=20que=20sea=20m=C3=A1s=20simple?= =?utf8?q?=20su=20uso.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/ip.c | 9 +++++++-- src/ip.h | 2 +- src/udp.c | 17 ++++++++++------- src/udp.h | 2 +- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/ip.c b/src/ip.c index f60c3d4..de4cc32 100644 --- 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 */ diff --git a/src/ip.h b/src/ip.h index a40693a..ecddd52 100644 --- 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) */ diff --git a/src/udp.c b/src/udp.c index 68c457d..bd6f9c2 100644 --- 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); diff --git a/src/udp.h b/src/udp.h index d08d03f..b178e9f 100644 --- 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. -- 2.43.0