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 /** Puerto UDP nuestro */
56 extern uint16 udp_port_local;
58 /** Puerto UDP de destino */
59 extern uint16 udp_port_remote;
61 /** Tamaño del datagrama UDP */
62 extern byte udp_dgram_len;
64 /** Lee la cabecera del datagrama UDP.
66 * Deja en udp_port_remote el puerto de origen.
67 * Si devuelve false (0) es que hubo un error o es un datagrama no soportado,
68 * por lo que hay que descartarlo.
70 bool udp_read_dgram_header();
72 /** Recibe un word del payload UDP chequeando el checksum. */
73 uint16 udp_read_word();
75 /* Indica si el checksum calculado está ok */
76 bool udp_checksum_ok();
78 /** Escribe la cabecera del datagrama UDP.
80 * Pone como puerto destino a udp_port_remote, como origen udp_port_local y como
81 * tamaño a udp_dgram_len (en la parte baja y 0 en la parte alta).
83 void udp_write_dgram_header();
85 /** Escribe un word al payload UDP chequeando el checksum. */
86 void udp_write_word(uint16 w);
88 /* Escribe el checksum calculado al frame a enviar */
89 void udp_write_checksum();