X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/184461d7b468cd81882a29e292b6f7a9822b50d8..2cf7241a2ec32fd51b6d859c2eb0317b23739609:/src/udp.c?ds=sidebyside diff --git a/src/udp.c b/src/udp.c index 9738341..f8264b1 100644 --- a/src/udp.c +++ b/src/udp.c @@ -24,6 +24,8 @@ static void sum(uint16 w) bool udp_read_dgram_header() { byte tmp; + bit ok = true; + netdev_read_start(UDP_HEADER_SIZE); /* reseteamos checksum */ checksum = 0; /* el UDP tiene un checksum que incluye parte de la cabecera IP */ @@ -39,33 +41,34 @@ bool udp_read_dgram_header() sum(ip_packet_len - 20); /* de ahora en más todos los datos del checksum corresponden a UDP */ /* puerto origen (remoto) */ - udp_port_remote = netdev_recv_word(); + udp_port_remote = netdev_read_word(); /* agregamos puerto de origen al checksum */ sum(udp_port_remote); /* sólo aceptamos datagramas a nuestro puerto */ - if (netdev_recv_word() != udp_port_local) - return false; /* drop */ + if (netdev_read_word() != udp_port_local) + ok = false; /* drop */ /* agregamos puerto de destino al checksum */ sum(udp_port_local); /* tamaño del datagrama */ - if (tmp = netdev_recv_byte()) /* no soportamos más de 255 bytes */ - return false; /* drop */ - udp_dgram_len = netdev_recv_byte(); /* parte baja */ + 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 */ - return false; /* drop */ + ok = false; /* drop */ /* agregamos tamaño al checksum */ sum(WORD(tmp, udp_dgram_len)); /* agregamos checksum al checksum */ - sum(netdev_recv_word()); + sum(netdev_read_word()); /* falta agregar el cuerpo del mensaje para verificar la suma * esto debe hacerlo el protocolo que sigue para poder seguir obteniendo * los datos de la placa de red byte a byte */ + netdev_read_end(); return true; } uint16 udp_read_word() { - uint16 w = netdev_recv_word(); + uint16 w = netdev_read_word(); sum(w); return w; } @@ -77,6 +80,7 @@ bool udp_checksum_ok() void udp_write_dgram_header() { + netdev_write_start(UDP_HEADER_SIZE); /* reseteamos checksum */ checksum = 0; /* el UDP tiene un checksum que incluye parte de la cabecera IP */ @@ -91,24 +95,25 @@ void udp_write_dgram_header() /* tamaño del paquete UDP (IP sin las cabeceras, que son 20 bytes) */ sum(ip_packet_len - 20); // FIXME /* puerto origen */ - netdev_send_word(udp_port_local); + netdev_write_word(udp_port_local); sum(udp_port_local); /* puerto destino */ - netdev_send_word(udp_port_remote); + netdev_write_word(udp_port_remote); sum(udp_port_remote); /* tamaño del datagrama */ - netdev_send_byte(0x00); /* parte alta en 0 porque no soportamos más de 255 */ - netdev_send_byte(udp_dgram_len); + 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)); /* indicamos que no se usa checksum */ - netdev_send_word(0x0000); + netdev_write_word(0x0000); sum(0x0000); + netdev_write_end(); } void udp_write_word(uint16 w) { sum(w); - netdev_send_word(w); + netdev_write_word(w); } void udp_write_checksum()