1 // vim: set et sw=4 sts=4 :
7 /** tipos de paquetes transportados soportados */
8 enum { IP = 0x0800, ARP = 0x0806 };
10 byte eth_addr_local[ETH_ADDR_SIZE];
12 byte eth_addr_remote[ETH_ADDR_SIZE];
14 eth_proto_t eth_proto;
16 bool eth_read_frame_header()
18 /* variable para iterar */
20 netdev_read_start(ETH_HEADER_SIZE);
21 /* descarto MAC de destino, acepto broadcasts */
22 for (i = 0; i < ETH_ADDR_SIZE; ++i)
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())
39 return false; /* drop */
45 void eth_write_frame_header()
47 /* variable para iterar */
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);