]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - pruebas/c/net/eth.c
Bugfix en el cálculo de checksum.
[z.facultad/66.09/etherled.git] / pruebas / c / net / eth.c
1 #include "eth.h"
2
3 /** tipos de paquetes transportados soportados */
4 enum { IP = 0x0800, ARP = 0x0806 };
5
6 byte eth_addr_local[ETH_ADDR_SIZE];
7
8 byte eth_addr_remote[ETH_ADDR_SIZE];
9
10 bool eth_frame_arp;
11
12 bool eth_read_frame_header()
13 {
14         /* variable para iterar */
15         byte i;
16         /* vemos si es para nosotros */
17         for (i = 0; i < ETH_ADDR_SIZE; ++i)
18                 if (eth_addr_local[i] != net_getb())
19                         return false; /* no es para nosotros (drop) */
20         /* obtenemos MAC de origen */
21         for (i = 0; i < ETH_ADDR_SIZE; ++i)
22                 eth_addr_remote[i] = net_getb();
23         /* obtenemos tipo de protocolo transportado por el frame, (sólo
24          * aceptamos IP y ARP) */
25         switch (net_getw())
26         {
27                 case IP:
28                         eth_frame_arp = false;
29                         break;
30                 case ARP:
31                         eth_frame_arp = true;
32                         break;
33                 default:
34                         return false; /* drop */
35         }
36         return true;
37 }
38
39 void eth_write_frame_header()
40 {
41         /* variable para iterar */
42         byte i;
43         /* mandamos como MAC de destino la remota */
44         for (i = 0; i < ETH_ADDR_SIZE; ++i)
45                 net_putb(eth_addr_remote[i]);
46         /* y como fuente la nuestra */
47         for (i = 0; i < ETH_ADDR_SIZE; ++i)
48                 net_putb(eth_addr_local[i]);
49         /* escribimos el tipo de paquete que transporta el frame */
50         net_putw(eth_frame_arp ? ARP : IP);
51 }
52