1 // vim: set et sw=4 sts=4 :
13 netdev_read_start(ARP_HEADER_SIZE);
14 /* hardware type (solo soportamos ethernet: 0x0001)*/
15 if (netdev_read_word() != 0x0001)
17 /* protocolo (sólo soportamos IP: 0x0800) */
18 if (netdev_read_word() != 0x0800)
20 /* tamaño de dirección de hardware (sólo soportamos ethernet) */
21 if (netdev_read_byte() != ETH_ADDR_SIZE)
23 /* tamaño de dirección de protocolo (sólo soportamos IPv4) */
24 if (netdev_read_byte() != IP_ADDR_SIZE)
26 /* opcode (sólo le damos bola a los requests: 0x0001) */
27 if (netdev_read_word() != 0x0001)
30 /* si las cosas no vienen bien a esta altura, ni nos gastamos en seguir */
33 netdev_read_start(ARP_PAYLOAD_SIZE);
34 /* obtenemos MAC de origen (ya la teníamos pero por las dudas) */
35 for (i = 0; i < ETH_ADDR_SIZE; ++i)
36 eth_addr_remote[i] = netdev_read_byte();
37 /* obtenemos IP de origen */
38 for (i = 0; i < IP_ADDR_SIZE; ++i)
39 ip_addr_remote[i] = netdev_read_byte();
40 /* la MAC de destino no nos importa, seguramente es broadcast */
41 for (i = 0; i < ETH_ADDR_SIZE; ++i)
43 /* sí nos importa qué IP andan buscando */
44 for (i = 0; i < IP_ADDR_SIZE; ++i)
45 if (ip_addr_local[i] != netdev_read_byte())
46 ok = false; /* si no buscan la nuestra, perdemos interés */
51 void arp_write_packet()
55 netdev_write_start(ARP_PACKET_SIZE);
56 /* hardware type (ethernet: 0x0001)*/
57 netdev_write_word(0x0001);
58 /* protocolo type (IP: 0x0800) */
59 netdev_write_word(0x0800);
60 /* tamaño de dirección de hardware */
61 netdev_write_byte(ETH_ADDR_SIZE);
62 /* tamaño de dirección de protocolo */
63 netdev_write_byte(IP_ADDR_SIZE);
64 /* opcode (response: 0x0002) */
65 netdev_write_word(0x0002);
67 for (i = 0; i < ETH_ADDR_SIZE; ++i)
68 netdev_write_byte(eth_addr_local[i]);
70 for (i = 0; i < IP_ADDR_SIZE; ++i)
71 netdev_write_byte(ip_addr_local[i]);
73 for (i = 0; i < ETH_ADDR_SIZE; ++i)
74 netdev_write_byte(eth_addr_remote[i]);
76 for (i = 0; i < IP_ADDR_SIZE; ++i)
77 netdev_write_byte(ip_addr_remote[i]);