]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/arp.c
Elimino config.h que estaba de más y hago que borre todos los archivos
[z.facultad/66.09/etherled.git] / src / arp.c
1 // vim: set et sw=4 sts=4 :     
2
3 #include "arp.h"
4 #include "netdev.h"
5 #include "debug.h"
6 #include "eth.h"
7 #include "ip.h"
8
9 bool arp_read_packet()
10 {
11     byte i;
12     bit ok = true;
13     netdev_read_start(ARP_HEADER_SIZE);
14     /* hardware type (solo soportamos ethernet: 0x0001)*/
15     if (netdev_read_word() != 0x0001)
16         ok = false;
17     /* protocolo (sólo soportamos IP: 0x0800) */
18     if (netdev_read_word() != 0x0800)
19         ok = false;
20     /* tamaño de dirección de hardware (sólo soportamos ethernet) */
21     if (netdev_read_byte() != ETH_ADDR_SIZE)
22         ok = false;
23     /* tamaño de dirección de protocolo (sólo soportamos IPv4) */
24     if (netdev_read_byte() != IP_ADDR_SIZE)
25         ok = false;
26     /* opcode (sólo le damos bola a los requests: 0x0001) */
27     if (netdev_read_word() != 0x0001)
28         ok = false;
29     netdev_read_end();
30     /* si las cosas no vienen bien a esta altura, ni nos gastamos en seguir */
31     if (!ok)
32         return ok;
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)
42         netdev_read_byte();
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 */
47     netdev_read_end();
48     return ok;
49 }
50
51 void arp_write_packet()
52 {
53     byte i;
54     bit ok = true;
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);
66     /* MAC de origen */
67     for (i = 0; i < ETH_ADDR_SIZE; ++i)
68         netdev_write_byte(eth_addr_local[i]);
69     /* IP de origen */
70     for (i = 0; i < IP_ADDR_SIZE; ++i)
71         netdev_write_byte(ip_addr_local[i]);
72     /* MAC de destino */
73     for (i = 0; i < ETH_ADDR_SIZE; ++i)
74         netdev_write_byte(eth_addr_remote[i]);
75     /* IP de destino */
76     for (i = 0; i < IP_ADDR_SIZE; ++i)
77         netdev_write_byte(ip_addr_remote[i]);
78     netdev_write_end();
79 }
80