]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/c/eth.h
Listo el cálculo de checksum de IP.
[z.facultad/66.09/etherled.git] / src / c / eth.h
1 #ifndef _ETH_H_
2 #define _ETH_H_
3
4 #include "types.h"
5 #include "net.h"
6
7 /** @file
8  * Estructura de un frame ethernet.
9  *
10  * <pre>
11  * /--- 8 ----/--- 6 ----/--- 6 ----/- 2 --/- 46-1500 -/- 4 -/  bytes
12  * +----------+----------+----------+------+-----------+-----+
13  * | preamble | dst addr | src addr | type |   data    | crc |
14  * +----------+----------+----------+------+-----------+-----+
15  * </pre>
16  *
17  * type es 0x0800 para IP y 0x0806 para ARP, los únicos dos protocolos que
18  * soportamos sobre ethernet.
19  * El preamble y el crc los pone la placa de red automáticamente.
20  */
21
22 /** Tamaño de dirección MAC (en bytes) */
23 #define MAC_ADDR_SIZE 6
24
25 /** Dirección MAC nuestra */
26 extern byte mac_addr_local[ETH_MAC_SIZE];
27
28 /** Dirección MAC de destino */
29 extern byte mac_addr_remote[ETH_MAC_SIZE];
30
31 /** Indica si el frame transporta ARP (si no transporta IP) */
32 extern bool eth_frame_arp; /* FIXME: debería ser un bit manejado con ASM supongo */
33
34 /**
35  * Lee la cabecera del frame ethernet.
36  *
37  * Deja en mac_addr_remote la MAC de origen y eth_frame_arp en 1 si es ARP.
38  * Si devuelve false (0) hay un error o es un frame no soportado, por lo que
39  * hay que descartarlo.
40  */
41 bool eth_read_frame_header();
42
43 /**
44  * Escribe la cabecera del frame ethernet.
45  *
46  * Pone como destino a mac_addr_remote, como origen a mac_addr_local y como
47  * tipo ARP si eth_frame_arp está en 1 (si no el tipo es IP).
48  */
49 void eth_write_frame_header();
50
51 #endif /* _ETH_H_ */