]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/main.c
Arregla macros para que no hagan lío evaluando cosas más de una vez.
[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         byte i;
34         byte len = netdev_recv_start();
35         printb(len, 0x1);
36         if (!len) // no recibimos nada (válido)
37             continue; // Probamos de nuevo
38
39         // Tenemos algo!
40         //print(0x2);
41
42         // Parseamos cabecera ethernet
43         if (!eth_read_frame_header()) // No es un buen header
44             goto drop; // Tiramos el paquete
45         //print(0x4);
46
47         // Vemos que protocolo transporta
48         switch (eth_proto)
49         {
50             case ETH_ARP: // FIXME, implementar ARP!
51                 goto drop; // Tiramos el paquete
52
53             case ETH_IP:
54                 //print(0x8);
55                 // Parseamos cabecera IP
56                 if (!ip_read_packet_header()) // No es un buen header
57                     goto drop; // Tiramos el paquete
58                 //print(0x10);
59
60                 // Vemos que protocolo transporta
61                 switch (ip_proto)
62                 {
63                     case IP_ICMP: // FIXME, implementar ICMP!
64                         goto drop; // Tiramos el paquete
65
66                     case IP_UDP:
67                         //print(0x20);
68                         // Parseamos cabecera UDP
69                         if (!udp_read_dgram_header()) // No es un buen header
70                             goto drop; // Tiramos el paquete
71
72                         printb(udp_dgram_len, 0x40);
73                         // TODO
74                         // Nuestro protocolo, por ahora un simple echo!
75                         for (i = 8; i < udp_dgram_len; ++i) // 8 por la cabecera UDP
76                         {
77                             leds0 = ~netdev_recv_byte();
78                             leds1 = ~i;
79                             sleep(8);
80                         }
81                         i = (udp_dgram_len % 2) ? udp_dgram_len : (udp_dgram_len + 1);
82                         for (i += 34; i < len; ++i) // 8 por la cabecera UDP
83                             netdev_recv_byte();
84 drop:
85                         netdev_recv_end();
86                 }
87         }
88     }
89 }
90