]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/eth.h
Nueva manejo de buffers, un poco más modular. El proyecto quedó como un echo
[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 /** Tamaño de cabecera ethernet */
27 #define ETH_HEADER_SIZE 14
28
29 /** Tipos de frame ethernet */
30 typedef enum { ETH_IP, ETH_ARP } eth_proto_t;
31
32 /** Dirección MAC nuestra */
33 extern byte eth_addr_local[ETH_ADDR_SIZE];
34
35 /** Dirección MAC de destino */
36 extern byte eth_addr_remote[ETH_ADDR_SIZE];
37
38 /** Indica que protocolo está transportando el frame */
39 extern eth_proto_t eth_proto;
40
41 /**
42  * Lee la cabecera del frame ethernet.
43  *
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.
47  */
48 bool eth_read_frame_header();
49
50 /**
51  * Escribe la cabecera del frame ethernet.
52  *
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).
55  */
56 void eth_write_frame_header();
57
58 #endif /* _ETH_H_ */