]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/main.c
Primer intento de integración y creación del proyecto.
[z.facultad/66.09/etherled.git] / src / main.c
1 // vim: set et sw=4 sts=4 :     
2
3 #include "netdev.h"
4 #include "eth.h"
5 #include "ip.h"
6 #include "udp.h"
7
8 #ifdef SDCC
9 static xdata at 0x0080 byte leds0;
10 static xdata at 0x00c0 byte leds1;
11 #else
12 static byte xdata leds0 _at_ 0x0080;
13 static byte xdata leds1 _at_ 0x00c0;
14 #endif
15
16 #define leds(word)              \
17     do                          \
18     {                           \
19         leds0 = ~LOW(word);     \
20         leds1 = ~HIGH(word);    \
21     }                           \
22     while (0)
23         
24
25 void sleep(unsigned char times)
26 {
27     unsigned int i;
28     unsigned char j;
29     for (i = 0; i < 0xffff; ++i)
30         for (j = 0; j < times; ++j);
31 }
32
33 void main(void)
34 {
35     // Apagamos todos los leds
36     leds(0x0000);
37
38     // Inicializamos dispositivo de red
39     if (!netdev_init())
40     {
41         leds(0xffff);
42         while(1); // Si falla init nos quedamos bobos
43     }
44
45     // Inicializo IP
46     ip_addr_local[0] = 10;
47     ip_addr_local[1] = 10;
48     ip_addr_local[2] = 10;
49     ip_addr_local[3] = 100;
50
51     // Inicializo puerto UDP
52     udp_port_local = 9000;
53
54     while (1) // Forever
55     {
56         uint16 len = netdev_recv_start();
57         if (!len) // no recibimos nada
58         {
59             netdev_recv_end();
60             continue; // vamos de nuevo!
61         }
62
63         // Parseamos cabecera ethernet
64         if (!eth_read_frame_header()) // No es un buen header
65         {
66         // Tenemos algo!
67             netdev_recv_end(); // Tiramos el paquete
68             continue; // Vamos de nuevo!
69         }
70
71         // Vemos que protocolo transporta
72         switch (eth_proto)
73         {
74             case ETH_ARP: // FIXME, implementar ARP!
75                 netdev_recv_end(); // Tiramos el paquete
76                 continue; // Vamos de nuevo!
77
78             case ETH_IP:
79                 // Parseamos cabecera IP
80                 if (!ip_read_packet_header()) // No es un buen header
81                 {
82                     netdev_recv_end(); // Tiramos el paquete
83                     continue; // Vamos de nuevo!
84                 }
85
86                 // Vemos que protocolo transporta
87                 switch (ip_proto)
88                 {
89                     case IP_ICMP: // FIXME, implementar ICMP!
90                         netdev_recv_end(); // Tiramos el paquete
91                         continue; // Vamos de nuevo!
92
93                     case IP_UDP:
94                         // Parseamos cabecera UDP
95                         if (!udp_read_dgram_header()) // No es un buen header
96                         {
97                             netdev_recv_end(); // Tiramos el paquete
98                             continue; // Vamos de nuevo!
99                         }
100
101                         // TODO
102                         // Nuestro protocolo, por ahora un simple echo!
103                         for (len = 8; len < udp_dgram_len; len += 2) // 8 por la cabecera UDP
104                         {
105                             leds(netdev_recv_word());
106                             sleep(5);
107                         }
108                 }
109         }
110     }
111 }
112