1 // vim: set et sw=4 sts=4 :
14 * 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
15 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 * | Hardware Type | Protocol Type |
17 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
18 * | Hardware Size | Protocol Size | Opcode |
19 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20 * | Sender MAC (cant. de bytes especificados por Hardware size) |
21 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
22 * | Sender IP (cant. de bytes especificados por Protocol size) |
23 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 * | Target MAC (cant. de bytes especificados por Hardware size) |
25 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26 * | Target IP (cant. de bytes especificados por Protocol size) |
27 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
29 * Nosotros sólo implementamos la respuesta a un request ARP, ya que sólo
30 * respondemos paquetes, nunca tenemos que enviar un paquete a una IP
31 * arbitraria. De esta manera nos evitamos, además, la necesidad de tener una
32 * tabla de cache ARP y de enviar peticiones ARP.
35 /** Tamaño de la cabecera ARP (en bytes) */
36 #define ARP_HEADER_SIZE 8
38 /** Tamaño del payload del paquete ARP que soportamos nosotros (en bytes) */
39 #define ARP_PAYLOAD_SIZE (2*ETH_ADDR_SIZE + 2*IP_ADDR_SIZE)
41 /** Tamaño del paquete ARP que soportamos nosotros (en bytes) */
42 #define ARP_PACKET_SIZE (ARP_HEADER_SIZE + ARP_PAYLOAD_SIZE)
44 /** Lee el paquete ARP.
46 * Si devuelve false (0) es que hubo un error o es un paquete no soportado, por
47 * lo que hay que descartarlo.
49 bool arp_read_packet();
51 /** Escribe el paquete ARP.
53 * Responde al request recibido con la ip de ip_addr_local.
55 void arp_write_packet();