]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/eth.h
Arregla macros para que no hagan lío evaluando cosas más de una vez.
[z.facultad/66.09/etherled.git] / src / eth.h
1 // vim: set et sw=4 sts=4 :     
2
3 #ifndef _ETH_H_
4 #define _ETH_H_
5
6 #include "types.h"
7
8 /** @file
9  * Estructura de un frame ethernet.
10  *
11  * <pre>
12  * /--- 8 ----/--- 6 ----/--- 6 ----/- 2 --/- 46-1500 -/- 4 -/  bytes
13  * +----------+----------+----------+------+-----------+-----+
14  * | preamble | dst addr | src addr | type |   data    | crc |
15  * +----------+----------+----------+------+-----------+-----+
16  * </pre>
17  *
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.
21  */
22
23 /** Tamaño de dirección MAC (en bytes) */
24 #define ETH_ADDR_SIZE 6
25
26 /** Tipos de frame ethernet */
27 typedef enum { ETH_IP, ETH_ARP } eth_proto_t;
28
29 /** Dirección MAC nuestra */
30 extern byte eth_addr_local[ETH_ADDR_SIZE];
31
32 /** Dirección MAC de destino */
33 extern byte eth_addr_remote[ETH_ADDR_SIZE];
34
35 /** Indica que protocolo está transportando el frame */
36 extern eth_proto_t eth_proto;
37
38 /**
39  * Lee la cabecera del frame ethernet.
40  *
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.
44  */
45 bool eth_read_frame_header();
46
47 /**
48  * Escribe la cabecera del frame ethernet.
49  *
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).
52  */
53 void eth_write_frame_header();
54
55 #endif /* _ETH_H_ */