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
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 */
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();
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
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);
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);