1 // vim: set et sw=4 sts=4 :
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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
21 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
22 * | Destination Address |
23 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 * | Options | Padding |
25 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
27 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
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.
35 /** Tamaño de dirección IP (en bytes) */
36 #define IP_ADDR_SIZE 4
38 /** Tamaño de cabecera IP (en bytes) */
39 #define IP_HEADER_SIZE 20
41 /** Tipos de paquete IP */
42 typedef enum { IP_UDP, IP_ICMP } ip_proto_t;
44 /** Dirección IP nuestra */
45 extern byte ip_addr_local[IP_ADDR_SIZE];
47 /** Dirección IP de destino */
48 extern byte ip_addr_remote[IP_ADDR_SIZE];
50 /** Tamaño del payload del paquete IP (no soportamos más de 255) */
51 extern byte ip_packet_len;
53 /** Indica si el paquete es ICMP (si no es UDP) */
54 extern ip_proto_t ip_proto;
56 /** Lee la cabecera del paquete IP.
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.
62 bool ip_read_packet_header();
64 /** Escribe la cabecera del paquete IP.
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.
69 void ip_write_packet_header();