]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/ip.h
Arregla macros para que no hagan lío evaluando cosas más de una vez.
[z.facultad/66.09/etherled.git] / src / ip.h
1 // vim: set et sw=4 sts=4 :     
2
3 #ifndef _IP_H_
4 #define _IP_H_
5
6 #include "types.h"
7
8 /** @file
9  * Paquete IP.
10  *
11  *  0                   1                   2                   3   
12  *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
13  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
14  * |Version|  IHL  |Type of Service|          Total Length         |
15  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16  * |         Identification        |Flags|      Fragment Offset    |
17  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
18  * |  Time to Live |    Protocol   |         Header Checksum       |
19  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20  * |                       Source Address                          |
21  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
22  * |                    Destination Address                        |
23  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24  * |                    Options                    |    Padding    |
25  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26  * |                             Data                              |
27  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28  * 
29  * Nosotros sólo implementamos la versión 4, sin opciones, con tamaño de paquete
30  * como máximo de 255 bytes, sin fragmentación y sólo los protocolos UDP e ICMP
31  * (este último sólo para responder al ping). Todos los paquetes que no cumplan
32  * con estas restricciones son descartados.
33  */
34
35 /** Tamaño de dirección IP (en bytes) */
36 #define IP_ADDR_SIZE 4
37
38 /** Tipos de paquete IP */
39 typedef enum { IP_UDP, IP_ICMP } ip_proto_t;
40
41 /** Dirección IP nuestra */
42 extern byte ip_addr_local[IP_ADDR_SIZE];
43
44 /** Dirección IP de destino */
45 extern byte ip_addr_remote[IP_ADDR_SIZE];
46
47 /** Tamaño del paquete IP */
48 extern byte ip_packet_len;
49
50 /** Indica si el paquete es ICMP (si no es UDP) */
51 extern ip_proto_t ip_proto;
52
53 /** Lee la cabecera del paquete IP.
54  *
55  * Deja en ip_addr_remote la ip de origen.
56  * Si devuelve false (0) es que hubo un error o es un paquete no soportado, por
57  * lo que hay que descartarlo.
58  */
59 bool ip_read_packet_header();
60
61 /** Escribe la cabecera del paquete IP.
62  *
63  * Pone como destino a ip_addr_remote, como origen a ip_addr_local, el protocolo
64  * lo especifica según ip_proto_icmp y como tamaño pone ip_packet_len.
65  */
66 void ip_write_packet_header();
67
68 #endif /* _IP_H_ */