1 // vim: set et sw=4 sts=4 :
9 uint16 udp_port_remote;
13 /* para calcular checksum */
14 static uint16 checksum;
16 /* agrega un word al checksum calculado */
17 static void sum(uint16 w)
20 if (checksum < w) /* corrección de carry (hubo OV) */
24 bool udp_read_dgram_header()
27 /* reseteamos checksum */
29 /* el UDP tiene un checksum que incluye parte de la cabecera IP */
31 sum(WORD(ip_addr_remote[0], ip_addr_remote[1]));
32 sum(WORD(ip_addr_remote[2], ip_addr_remote[3]));
34 sum(WORD(ip_addr_local[0], ip_addr_local[1]));
35 sum(WORD(ip_addr_local[2], ip_addr_local[3]));
36 /* protocolo expresado en 16 bits (0x11 es UDP) */
38 /* tamaño del paquete UDP (sin las cabeceras que son 20 bytes) */
39 sum(ip_packet_len - 20);
40 /* de ahora en más todos los datos del checksum corresponden a UDP */
41 /* puerto origen (remoto) */
42 udp_port_remote = netdev_recv_word();
43 /* agregamos puerto de origen al checksum */
45 /* sólo aceptamos datagramas a nuestro puerto */
46 if (netdev_recv_word() != udp_port_local)
47 return false; /* drop */
48 /* agregamos puerto de destino al checksum */
50 /* tamaño del datagrama */
51 if (tmp = netdev_recv_byte()) /* no soportamos más de 255 bytes */
52 return false; /* drop */
53 udp_dgram_len = netdev_recv_byte(); /* parte baja */
54 if (udp_dgram_len < 8) /* no puede ser más chico que sus cabeceras */
55 return false; /* drop */
56 /* agregamos tamaño al checksum */
57 sum(WORD(tmp, udp_dgram_len));
58 /* agregamos checksum al checksum */
59 sum(netdev_recv_word());
60 /* falta agregar el cuerpo del mensaje para verificar la suma
61 * esto debe hacerlo el protocolo que sigue para poder seguir obteniendo
62 * los datos de la placa de red byte a byte */
66 uint16 udp_read_word()
68 uint16 w = netdev_recv_word();
73 bool udp_checksum_ok()
75 return (uint16)~checksum;
78 void udp_write_dgram_header()
80 /* reseteamos checksum */
82 /* el UDP tiene un checksum que incluye parte de la cabecera IP */
84 sum(WORD(ip_addr_remote[0], ip_addr_remote[1]));
85 sum(WORD(ip_addr_remote[2], ip_addr_remote[3]));
87 sum(WORD(ip_addr_local[0], ip_addr_local[1]));
88 sum(WORD(ip_addr_local[2], ip_addr_local[3]));
89 /* protocolo expresado en 16 bits (0x11 es UDP) */
91 /* tamaño del paquete UDP (IP sin las cabeceras, que son 20 bytes) */
92 sum(ip_packet_len - 20); // FIXME
94 netdev_send_word(udp_port_local);
97 netdev_send_word(udp_port_remote);
99 /* tamaño del datagrama */
100 netdev_send_byte(0x00); /* parte alta en 0 porque no soportamos más de 255 */
101 netdev_send_byte(udp_dgram_len);
102 sum(WORD(0x00, udp_dgram_len));
103 /* indicamos que no se usa checksum */
104 netdev_send_word(0x0000);
108 void udp_write_word(uint16 w)
114 void udp_write_checksum()