X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/5b3a8f73a2eccd20452b8e2d628df024b925b44e..db76f3270c5bee0eb1b5ee71fa1946e8d5132d43:/src/udp.c diff --git a/src/udp.c b/src/udp.c index 09b9bfc..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 @@ -90,7 +93,7 @@ byte udp_read_byte() bool udp_checksum_ok() { // Verifico si falta sumar algo (UDP debe sumar de a un word) - if (byte_count == (udp_dgram_len - UDP_HEADER_SIZE)) + if (byte_count % 2) sum(WORD(last_byte, 0x00)); // Relleno el byte que falta con 0x00 return !(uint16)~checksum; } @@ -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); @@ -146,7 +149,7 @@ void udp_write_byte(byte b) void udp_write_checksum(byte offset) { // Verifico si falta sumar algo (UDP debe sumar de a un word) - if (byte_count == (udp_dgram_len - UDP_HEADER_SIZE)) + if (byte_count % 2) 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