]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/main.c
Implementa el protocolo ELP sobre UDP. Tiene problemas cuando los leds estan
[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 "reg51.h"
6 #include "netdev.h"
7 #include "eth.h"
8 #include "ip.h"
9 #include "udp.h"
10 #include "elp.h"
11
12 void main(void)
13 {
14     // Inicializamos leds
15     leds_init();
16
17     // Hacemos prueba simple de los leds
18     leds_test();
19
20     // Inicializamos dispositivo de red
21     if (!netdev_init())
22     {
23         // Si hubo un error, quedan prendidos todos los leds
24         leds_write(0xFFFF);
25         return;
26     }
27
28     // Comienza a 'dibujar'
29     EA  = 1; // Habilita interrupciones globalmente
30     //XXX TR2 = 1; // Pone a correr el 'dibujado'
31
32     // Inicializo IP
33     ip_addr_local[0] = 10;
34     ip_addr_local[1] = 10;
35     ip_addr_local[2] = 10;
36     ip_addr_local[3] = 100;
37
38     // Inicializo puerto UDP
39     udp_port_local = ELP_PORT;
40
41     while (1) // Forever
42     {
43         byte len = netdev_recv_start();
44         //printb(len, 0x10);
45         if (!len) // no recibimos nada (válido)
46             continue; // Probamos de nuevo
47
48         // Tenemos algo!
49
50         // Parseamos cabecera ethernet
51         if (!eth_read_frame_header()) // No es un buen header
52             goto drop; // Tiramos el paquete
53
54         // Vemos que protocolo transporta
55         switch (eth_proto)
56         {
57             case ETH_ARP: // TODO: implementar ARP!
58                 goto drop; // Tiramos el paquete
59
60             case ETH_IP:
61                 // Parseamos cabecera IP
62                 if (!ip_read_packet_header()) // No es un buen header
63                     goto drop; // Tiramos el paquete
64
65                 // Vemos que protocolo transporta
66                 switch (ip_proto)
67                 {
68                     case IP_ICMP: // TODO: implementar ICMP!
69                         goto drop; // Tiramos el paquete
70
71                     case IP_UDP:
72                         // Parseamos cabecera UDP
73                         if (!udp_read_dgram_header()) // No es un buen header
74                             goto drop; // Tiramos el paquete
75
76                         // Procesamos comando ELP y obtenemos tamaño de la
77                         // respuesta
78                         len = elp_read_process_command();
79                         printb(len, 0x02);
80
81                         // Si el tamaño es 0, hubo error o no está soportado
82                         if (!len)
83                             goto drop;
84                         print(0x0004);
85
86                         // FIXME por ahora no tenemos forma de 'abortar' el
87                         // comando si el checksum es incorrecto, lo verificamos
88                         // por deporte.
89                         if (!udp_checksum_ok())
90                             goto drop;
91                         print(0x0008);
92
93                         // Terminamos recepción
94                         netdev_recv_end();
95                         print(0x0010);
96
97                         // Respuesta
98                         netdev_send_start();
99                         eth_write_frame_header();
100                         ip_packet_len = UDP_HEADER_SIZE + len;
101                         printb(ip_packet_len, 0x20);
102                         ip_write_packet_header();
103                         udp_dgram_len = len;
104                         printb(udp_dgram_len, 0x40);
105                         udp_write_dgram_header();
106                         elp_write_response();
107                         udp_write_checksum(ETH_HEADER_SIZE + IP_HEADER_SIZE);
108                         netdev_send_end(ETH_HEADER_SIZE + IP_HEADER_SIZE
109                                 + UDP_HEADER_SIZE + len);
110                         printb(ETH_HEADER_SIZE + IP_HEADER_SIZE
111                                 + UDP_HEADER_SIZE + len, 0x80);
112                         //XXX
113                         if (elp_command.set && (elp_command.var == ELP_VAR_PAUSE))
114                             TR2 = 1;
115                 }
116         }
117         continue;
118 drop:
119         netdev_recv_end();
120     }
121 }
122