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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
21 * | Destination Address |
22 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
23 * | Options | Padding |
24 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
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.
34 /** Tamaño de dirección IP (en bytes) */
35 #define IP_ADDR_SIZE 4
37 /** Dirección IP nuestra */
38 extern byte ip_addr_local[IP_ADDR_SIZE];
40 /** Dirección IP de destino */
41 extern byte ip_addr_remote[IP_ADDR_SIZE];
43 /** Tamaño del paquete IP */
44 extern byte ip_packet_len;
46 /** Indica si el paquete es ICMP (si no es UDP) */
49 /** Lee la cabecera del paquete IP.
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.
55 bool ip_read_packet_header();
57 /** Escribe la cabecera del paquete IP.
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.
62 void ip_write_packet_header();