]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - pruebas/sdcc/8051_dp8390_echo_server/udp.h
Copio el estado actual del proyecto como un ejemplo de echo server.
[z.facultad/66.09/etherled.git] / pruebas / sdcc / 8051_dp8390_echo_server / 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 /** Tamaño de la cabecera UDP */
56 #define UDP_HEADER_SIZE 8
57
58 /** Puerto UDP nuestro */
59 extern uint16 udp_port_local;
60
61 /** Puerto UDP de destino */
62 extern uint16 udp_port_remote;
63
64 /** Tamaño del datagrama UDP (no soportamos más de 255) */
65 extern byte udp_dgram_len;
66
67 /** Lee la cabecera del datagrama UDP.
68  *
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.
72  */
73 bool udp_read_dgram_header();
74
75 /** Recibe un word del payload UDP chequeando el checksum.
76  * @precond Hay que llamar antes a netdev_read_start()
77  */
78 byte udp_read_byte();
79
80 /* Indica si el checksum calculado está ok */
81 bool udp_checksum_ok();
82
83 /** Escribe la cabecera del datagrama UDP.
84  *
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).
87  */
88 void udp_write_dgram_header();
89
90 /** Escribe un word al payload UDP chequeando el checksum.
91  * @precond Hay que llamar antes a netdev_write_start()
92  */
93 void udp_write_byte(byte b);
94
95 /* Escribe el checksum calculado al frame a enviar
96  * @param offset Offset a partir de donde están las cabeceras UDP.
97  */
98 void udp_write_checksum(byte offset);
99
100 #endif /* _UDP_H_ */