]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/eth.c
Ejemplo completo del módulo de leds implementado en assembly y llamado desde un
[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     netdev_read_start(ETH_HEADER_SIZE);
21     /* descarto MAC de destino, acepto broadcasts */
22     for (i = 0; i < ETH_ADDR_SIZE; ++i)
23         netdev_read_byte();
24     /* obtenemos MAC de origen */
25     for (i = 0; i < ETH_ADDR_SIZE; ++i)
26         eth_addr_remote[i] = netdev_read_byte();
27     /* obtenemos tipo de protocolo transportado por el frame, (sólo
28      * aceptamos IP y ARP) */
29     switch (netdev_read_word())
30     {
31         case IP:
32             eth_proto = ETH_IP;
33             break;
34         case ARP:
35             eth_proto = ETH_ARP;
36             break;
37         default:
38             netdev_read_end();
39             return false; /* drop */
40     }
41     netdev_read_end();
42     return true;
43 }
44
45 void eth_write_frame_header()
46 {
47     /* variable para iterar */
48     byte i;
49     netdev_write_start(ETH_HEADER_SIZE);
50     /* mandamos como MAC de destino la remota */
51     for (i = 0; i < ETH_ADDR_SIZE; ++i)
52         netdev_write_byte(eth_addr_remote[i]);
53     /* y como fuente la nuestra */
54     for (i = 0; i < ETH_ADDR_SIZE; ++i)
55         netdev_write_byte(eth_addr_local[i]);
56     /* escribimos el tipo de paquete que transporta el frame */
57     netdev_write_word((eth_proto == ETH_IP) ? IP : ARP);
58     netdev_write_end();
59 }
60