]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/ip.h
Mejora el manejo de tamaños de paquetes IP y UDP, para que sea más simple su
[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 /** Tamaño de cabecera IP (en bytes) */
39 #define IP_HEADER_SIZE 20
40
41 /** Tipos de paquete IP */
42 typedef enum { IP_UDP, IP_ICMP } ip_proto_t;
43
44 /** Dirección IP nuestra */
45 extern byte ip_addr_local[IP_ADDR_SIZE];
46
47 /** Dirección IP de destino */
48 extern byte ip_addr_remote[IP_ADDR_SIZE];
49
50 /** Tamaño del payload del paquete IP (no soportamos más de 255) */
51 extern byte ip_packet_len;
52
53 /** Indica si el paquete es ICMP (si no es UDP) */
54 extern ip_proto_t ip_proto;
55
56 /** Lee la cabecera del paquete IP.
57  *
58  * Deja en ip_addr_remote la ip de origen.
59  * Si devuelve false (0) es que hubo un error o es un paquete no soportado, por
60  * lo que hay que descartarlo.
61  */
62 bool ip_read_packet_header();
63
64 /** Escribe la cabecera del paquete IP.
65  *
66  * Pone como destino a ip_addr_remote, como origen a ip_addr_local, el protocolo
67  * lo especifica según ip_proto_icmp y como tamaño pone ip_packet_len.
68  */
69 void ip_write_packet_header();
70
71 #endif /* _IP_H_ */