]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/udp.h
Ahora el módulo de red se encarga sólo de darse cuenta cuando hay que hacer
[z.facultad/66.09/etherled.git] / src / udp.h
1 // vim: set et sw=4 sts=4 :     
2
3 #ifndef _UDP_H_
4 #define _UDP_H_
5
6 #include "types.h"
7
8 /** @file
9  * Datagrama UDP.
10  *
11  * <pre>
12  *  0      7 8     15 16    23 24    31  
13  * +--------+--------+--------+--------+ 
14  * |     Source      |   Destination   | 
15  * |      Port       |      Port       | 
16  * +--------+--------+--------+--------+ 
17  * |                 |                 | 
18  * |     Length      |    Checksum     | 
19  * +--------+--------+--------+--------+ 
20  * |                                     
21  * |          data octets ...            
22  * +---------------- ...                 
23  * </pre>
24  *
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
28  * es 8.
29  *
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':
33  *
34  * <pre>
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   | 
44  * |      Port       |      Port       | 
45  * +--------+--------+--------+--------+ 
46  * |                 |                 | 
47  * |     Length      |    Checksum     | 
48  * +--------+--------+--------+--------+ 
49  * |                                     
50  * |    data octets ... (padding)
51  * +---------------- ...                 
52  * </pre>
53  */
54
55 /** Puerto UDP nuestro */
56 extern uint16 udp_port_local;
57
58 /** Puerto UDP de destino */
59 extern uint16 udp_port_remote;
60
61 /** Tamaño del datagrama UDP */
62 extern byte udp_dgram_len;
63
64 /** Lee la cabecera del datagrama UDP.
65  *
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.
69  */
70 bool udp_read_dgram_header();
71
72 /** Recibe un word del payload UDP chequeando el checksum. */
73 uint16 udp_read_word();
74
75 /* Indica si el checksum calculado está ok */
76 bool udp_checksum_ok();
77
78 /** Escribe la cabecera del datagrama UDP.
79  *
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).
82  */
83 void udp_write_dgram_header();
84
85 /** Escribe un word al payload UDP chequeando el checksum. */
86 void udp_write_word(uint16 w);
87
88 /* Escribe el checksum calculado al frame a enviar */
89 void udp_write_checksum();
90
91 #endif /* _UDP_H_ */