]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/main.c
Bugfix en el cálculo de checksum.
[z.facultad/66.09/etherled.git] / src / main.c
1 // vim: set et sw=4 sts=4 :     
2
3 #include "debug.h"
4 #include "leds.h"
5 #include "netdev.h"
6 #include "eth.h"
7 #include "ip.h"
8 #include "udp.h"
9
10 void main(void)
11 {
12     // Apagamos todos los leds
13     leds(0);
14
15     // Inicializamos dispositivo de red
16     if (!netdev_init())
17     {
18         leds(0xFFFF);
19         while(1); // Si falla init nos quedamos bobos
20     }
21
22     // Inicializo IP
23     ip_addr_local[0] = 10;
24     ip_addr_local[1] = 10;
25     ip_addr_local[2] = 10;
26     ip_addr_local[3] = 100;
27
28     // Inicializo puerto UDP
29     udp_port_local = 9000;
30
31     while (1) // Forever
32     {
33         uint16 len = netdev_recv_start();
34         printb(len, 0x1);
35         if (!len) // no recibimos nada
36             goto drop; // Tiramos el paquete
37
38         // Tenemos algo!
39         //print(0x2);
40
41         // Parseamos cabecera ethernet
42         if (!eth_read_frame_header()) // No es un buen header
43             goto drop; // Tiramos el paquete
44         //print(0x4);
45
46         // Vemos que protocolo transporta
47         switch (eth_proto)
48         {
49             case ETH_ARP: // FIXME, implementar ARP!
50                 goto drop; // Tiramos el paquete
51
52             case ETH_IP:
53                 //print(0x8);
54                 // Parseamos cabecera IP
55                 if (!ip_read_packet_header()) // No es un buen header
56                     goto drop; // Tiramos el paquete
57                 //print(0x10);
58
59                 // Vemos que protocolo transporta
60                 switch (ip_proto)
61                 {
62                     case IP_ICMP: // FIXME, implementar ICMP!
63                         goto drop; // Tiramos el paquete
64
65                     case IP_UDP:
66                         //print(0x20);
67                         // Parseamos cabecera UDP
68                         if (!udp_read_dgram_header()) // No es un buen header
69                             goto drop; // Tiramos el paquete
70
71                         printb(udp_dgram_len, 0x40);
72                         // TODO
73                         // Nuestro protocolo, por ahora un simple echo!
74                         for (len = 8; len < udp_dgram_len; len += 2) // 8 por la cabecera UDP
75                         {
76                             print(netdev_recv_word());
77                         }
78 drop:
79                         netdev_recv_end();
80                 }
81         }
82     }
83 }
84