]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/udp.c
Nueva manejo de buffers, un poco más modular. El proyecto quedó como un echo
[z.facultad/66.09/etherled.git] / src / udp.c
index 9738341a243bbba08d4333241557ca0331b5bb54..f8264b12d5b18badf8d4fdad9266f9b7c1f40282 100644 (file)
--- 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()