1 // vim: set et sw=4 sts=4 :
12 * 0 7 8 15 16 23 24 31
13 * +--------+--------+--------+--------+
14 * | Source | Destination |
16 * +--------+--------+--------+--------+
18 * | Length | Checksum |
19 * +--------+--------+--------+--------+
22 * +---------------- ...
25 * Aceptamos sólo datagramas UDP que vayan a el puerto de nuestra aplicación y
26 * cuyo tamaño sea menor a 255. El resto es descartado.
27 * El Length es tanto de la cabecera como datos, por lo tanto el tamaño mínimo
30 * El checksum se calcula utilizando algunos datos de la capa inferior e incluye
31 * a los datos (completando con 0 al final si no es múltiplo de 2). Entonces es
32 * calculado sobre el siguiente paquete 'virtual':
35 * 0 7 8 15 16 23 24 31
36 * +--------+--------+--------+--------+
37 * | ip source address |
38 * +--------+--------+--------+--------+
39 * | ip destination address |
40 * +--------+--------+--------+--------+
41 * | zero |protocol| UDP length |
42 * +--------+--------+--------+--------+
43 * | Source | Destination |
45 * +--------+--------+--------+--------+
47 * | Length | Checksum |
48 * +--------+--------+--------+--------+
50 * | data octets ... (padding)
51 * +---------------- ...
55 /** Tamaño de la cabecera UDP */
56 #define UDP_HEADER_SIZE 8
58 /** Puerto UDP nuestro */
59 extern uint16 udp_port_local;
61 /** Puerto UDP de destino */
62 extern uint16 udp_port_remote;
64 /** Tamaño del datagrama UDP (no soportamos más de 255) */
65 extern byte udp_dgram_len;
67 /** Lee la cabecera del datagrama UDP.
69 * Deja en udp_port_remote el puerto de origen.
70 * Si devuelve false (0) es que hubo un error o es un datagrama no soportado,
71 * por lo que hay que descartarlo.
73 bool udp_read_dgram_header();
75 /** Recibe un word del payload UDP chequeando el checksum.
76 * @precond Hay que llamar antes a netdev_read_start()
80 /* Indica si el checksum calculado está ok */
81 bool udp_checksum_ok();
83 /** Escribe la cabecera del datagrama UDP.
85 * Pone como puerto destino a udp_port_remote, como origen udp_port_local y como
86 * tamaño a udp_dgram_len (en la parte baja y 0 en la parte alta).
88 void udp_write_dgram_header();
90 /** Escribe un word al payload UDP chequeando el checksum.
91 * @precond Hay que llamar antes a netdev_write_start()
93 void udp_write_byte(byte b);
95 /* Escribe el checksum calculado al frame a enviar
96 * @param offset Offset a partir de donde están las cabeceras UDP.
98 void udp_write_checksum(byte offset);