X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/2cf7241a2ec32fd51b6d859c2eb0317b23739609..f5186e12ed5aedf98d0fa0d8299a73c830046c75:/src/udp.c?ds=sidebyside diff --git a/src/udp.c b/src/udp.c index f8264b1..09b9bfc 100644 --- a/src/udp.c +++ b/src/udp.c @@ -1,5 +1,6 @@ // vim: set et sw=4 sts=4 : +#include "debug.h" #include "netdev.h" #include "ip.h" #include "udp.h" @@ -12,6 +13,8 @@ byte udp_dgram_len; /* para calcular checksum */ static uint16 checksum; +static byte byte_count; +static byte last_byte; /* agrega un word al checksum calculado */ static void sum(uint16 w) @@ -28,6 +31,7 @@ bool udp_read_dgram_header() netdev_read_start(UDP_HEADER_SIZE); /* reseteamos checksum */ checksum = 0; + byte_count = 0; /* el UDP tiene un checksum que incluye parte de la cabecera IP */ /* ip de origen */ sum(WORD(ip_addr_remote[0], ip_addr_remote[1])); @@ -66,16 +70,29 @@ bool udp_read_dgram_header() return true; } -uint16 udp_read_word() +byte udp_read_byte() { - uint16 w = netdev_read_word(); - sum(w); - return w; + byte b; + if (byte_count % 2) // impar, tengo 2, sumo + { + b = netdev_read_byte(); + sum(WORD(last_byte, b)); + } + else // par, guardo para sumar cuando tenga 2 + { + b = netdev_read_byte(); + last_byte = b; + } + ++byte_count; + return b; } bool udp_checksum_ok() { - return (uint16)~checksum; + // Verifico si falta sumar algo (UDP debe sumar de a un word) + if (byte_count == (udp_dgram_len - UDP_HEADER_SIZE)) + sum(WORD(last_byte, 0x00)); // Relleno el byte que falta con 0x00 + return !(uint16)~checksum; } void udp_write_dgram_header() @@ -83,6 +100,7 @@ void udp_write_dgram_header() netdev_write_start(UDP_HEADER_SIZE); /* reseteamos checksum */ checksum = 0; + byte_count = 0; /* el UDP tiene un checksum que incluye parte de la cabecera IP */ /* ip de origen */ sum(WORD(ip_addr_remote[0], ip_addr_remote[1])); @@ -110,15 +128,30 @@ void udp_write_dgram_header() netdev_write_end(); } -void udp_write_word(uint16 w) +void udp_write_byte(byte b) { - sum(w); - netdev_write_word(w); + if (byte_count % 2) // impar, tengo 2, sumo + { + netdev_write_byte(b); + sum(WORD(last_byte, b)); + } + else // par, guardo para sumar cuando tenga 2 + { + netdev_write_byte(b); + last_byte = b; + } + ++byte_count; } -void udp_write_checksum() +void udp_write_checksum(byte offset) { - // XXX TODO FIXME + // Verifico si falta sumar algo (UDP debe sumar de a un word) + if (byte_count == (udp_dgram_len - UDP_HEADER_SIZE)) + 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 + netdev_write_word((uint16)~checksum); // Guardo checksum + netdev_write_end(); return; }