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