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 /** Tamaño de cabecera ethernet */
27 #define ETH_HEADER_SIZE 14
29 /** Tipos de frame ethernet */
30 typedef enum { ETH_IP, ETH_ARP } eth_proto_t;
32 /** Dirección MAC nuestra */
33 extern byte eth_addr_local[ETH_ADDR_SIZE];
35 /** Dirección MAC de destino */
36 extern byte eth_addr_remote[ETH_ADDR_SIZE];
38 /** Indica que protocolo está transportando el frame */
39 extern eth_proto_t eth_proto;
42 * Lee la cabecera del frame ethernet.
44 * Deja en mac_addr_remote la MAC de origen y eth_frame_arp en 1 si es ARP.
45 * Si devuelve false (0) hay un error o es un frame no soportado, por lo que
46 * hay que descartarlo.
48 bool eth_read_frame_header();
51 * Escribe la cabecera del frame ethernet.
53 * Pone como destino a mac_addr_remote, como origen a mac_addr_local y como
54 * tipo ARP si eth_frame_arp está en 1 (si no el tipo es IP).
56 void eth_write_frame_header();