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 /* descarto MAC de destino, acepto broadcasts */
21 for (i = 0; i < ETH_ADDR_SIZE; ++i)
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())
37 return false; /* drop */
42 void eth_write_frame_header()
44 /* variable para iterar */
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);