1 // vim: set et sw=4 sts=4 :
9 * Estructura de un frame ethernet.
12 * /--- 8 ----/--- 6 ----/--- 6 ----/- 2 --/- 46-1500 -/- 4 -/ bytes
13 * +----------+----------+----------+------+-----------+-----+
14 * | preamble | dst addr | src addr | type | data | crc |
15 * +----------+----------+----------+------+-----------+-----+
18 * type es 0x0800 para IP y 0x0806 para ARP, los únicos dos protocolos que
19 * soportamos sobre ethernet.
20 * El preamble y el crc los pone la placa de red automáticamente.
23 /** Tamaño de dirección MAC (en bytes) */
24 #define ETH_ADDR_SIZE 6
26 /** Tipos de frame ethernet */
27 typedef enum { ETH_IP, ETH_ARP } eth_proto_t;
29 /** Dirección MAC nuestra */
30 extern byte eth_addr_local[ETH_ADDR_SIZE];
32 /** Dirección MAC de destino */
33 extern byte eth_addr_remote[ETH_ADDR_SIZE];
35 /** Indica que protocolo está transportando el frame */
36 extern eth_proto_t eth_proto;
39 * Lee la cabecera del frame ethernet.
41 * Deja en mac_addr_remote la MAC de origen y eth_frame_arp en 1 si es ARP.
42 * Si devuelve false (0) hay un error o es un frame no soportado, por lo que
43 * hay que descartarlo.
45 bool eth_read_frame_header();
48 * Escribe la cabecera del frame ethernet.
50 * Pone como destino a mac_addr_remote, como origen a mac_addr_local y como
51 * tipo ARP si eth_frame_arp está en 1 (si no el tipo es IP).
53 void eth_write_frame_header();