]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/eth.c
Arregla macros para que no hagan lío evaluando cosas más de una vez.
[z.facultad/66.09/etherled.git] / src / eth.c
1 // vim: set et sw=4 sts=4 :     
2
3 #include "debug.h"
4 #include "netdev.h"
5 #include "eth.h"
6
7 /** tipos de paquetes transportados soportados */
8 enum { IP = 0x0800, ARP = 0x0806 };
9
10 byte eth_addr_local[ETH_ADDR_SIZE];
11
12 byte eth_addr_remote[ETH_ADDR_SIZE];
13
14 eth_proto_t eth_proto;
15
16 bool eth_read_frame_header()
17 {
18     /* variable para iterar */
19     byte i;
20     /* descarto MAC de destino, acepto broadcasts */
21     for (i = 0; i < ETH_ADDR_SIZE; ++i)
22         netdev_recv_byte();
23     /* obtenemos MAC de origen */
24     for (i = 0; i < ETH_ADDR_SIZE; ++i)
25         eth_addr_remote[i] = netdev_recv_byte();
26     /* obtenemos tipo de protocolo transportado por el frame, (sólo
27      * aceptamos IP y ARP) */
28     switch (netdev_recv_word())
29     {
30         case IP:
31             eth_proto = ETH_IP;
32             break;
33         case ARP:
34             eth_proto = ETH_ARP;
35             break;
36         default:
37             return false; /* drop */
38     }
39     return true;
40 }
41
42 void eth_write_frame_header()
43 {
44     /* variable para iterar */
45     byte i;
46     /* mandamos como MAC de destino la remota */
47     for (i = 0; i < ETH_ADDR_SIZE; ++i)
48         netdev_send_byte(eth_addr_remote[i]);
49     /* y como fuente la nuestra */
50     for (i = 0; i < ETH_ADDR_SIZE; ++i)
51         netdev_send_byte(eth_addr_local[i]);
52     /* escribimos el tipo de paquete que transporta el frame */
53     netdev_send_word((eth_proto == ETH_IP) ? IP : ARP);
54 }
55