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 */
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 uint16 udp_read_word();
78 /* Indica si el checksum calculado está ok */
79 bool udp_checksum_ok();
81 /** Escribe la cabecera del datagrama UDP.
83 * Pone como puerto destino a udp_port_remote, como origen udp_port_local y como
84 * tamaño a udp_dgram_len (en la parte baja y 0 en la parte alta).
86 void udp_write_dgram_header();
88 /** Escribe un word al payload UDP chequeando el checksum. */
89 void udp_write_word(uint16 w);
91 /* Escribe el checksum calculado al frame a enviar */
92 void udp_write_checksum();