]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/main.c
Integra leds con modulo de red. El programa está ahora recibiendo datos de la
[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
11 void main(void)
12 {
13     // Inicializamos leds
14     leds_init();
15
16     // Hacemos prueba simple de los leds
17     leds_test();
18
19     // Inicializamos dispositivo de red
20     if (!netdev_init())
21     {
22         // Si hubo un error, quedan prendidos todos los leds
23         leds_write(0xFFFF);
24         return;
25     }
26
27     // Comienza a 'dibujar'
28     EA  = 1; // Habilita interrupciones globalmente
29     TR2 = 1; // Pone a correr el 'dibujado'
30
31     // Inicializo IP
32     ip_addr_local[0] = 10;
33     ip_addr_local[1] = 10;
34     ip_addr_local[2] = 10;
35     ip_addr_local[3] = 100;
36
37     // Inicializo puerto UDP
38     udp_port_local = 9876;
39
40     while (1) // Forever
41     {
42         byte i; //XXX
43         byte len;
44
45         len = netdev_recv_start();
46         if (!len) // no recibimos nada (válido)
47             continue; // Probamos de nuevo
48
49         // Tenemos algo!
50         //print(0x2);
51
52         // Parseamos cabecera ethernet
53         if (!eth_read_frame_header()) // No es un buen header
54             goto drop; // Tiramos el paquete
55         //print(0x4);
56
57         // Vemos que protocolo transporta
58         switch (eth_proto)
59         {
60             case ETH_ARP: // TODO: implementar ARP!
61                 goto drop; // Tiramos el paquete
62
63             case ETH_IP:
64                 //print(0x8);
65                 // Parseamos cabecera IP
66                 if (!ip_read_packet_header()) // No es un buen header
67                     goto drop; // Tiramos el paquete
68                 //print(0x10);
69
70                 // Vemos que protocolo transporta
71                 switch (ip_proto)
72                 {
73                     case IP_ICMP: // TODO: implementar ICMP!
74                         goto drop; // Tiramos el paquete
75
76                     case IP_UDP:
77                         //print(0x20);
78                         // Parseamos cabecera UDP
79                         if (!udp_read_dgram_header()) // No es un buen header
80                             goto drop; // Tiramos el paquete
81
82                         //printb(udp_dgram_len, 0x40);
83                         // TODO
84                         // Nuestro protocolo, por ahora un simple echo!
85                         len = udp_dgram_len - UDP_HEADER_SIZE;
86                         netdev_read_start(len);
87                         leds_matrix_len = len;
88                         for (i = 0; i < len; ++i)
89                             leds_matrix[i] = udp_read_byte();
90                         netdev_read_end();
91                         if (!udp_checksum_ok())
92                             goto drop;
93                         netdev_recv_end();
94
95                         // Respuesta
96                         netdev_send_start();
97                         eth_write_frame_header();
98                         //udp_dgram_len = UDP_HEADER_SIZE+len;
99                         //ip_packet_len = IP_HEADER_SIZE+udp_dgram_len;
100                         ip_write_packet_header();
101                         udp_write_dgram_header();
102                         netdev_write_start(len);
103                         for (i = 0; i < len; ++i)
104                             udp_write_byte(leds_matrix[i]);
105                         netdev_write_end();
106                         udp_write_checksum(ETH_HEADER_SIZE+IP_HEADER_SIZE);
107                         netdev_send_end(ETH_HEADER_SIZE+IP_HEADER_SIZE+udp_dgram_len);
108                 }
109         }
110         continue;
111 drop:
112         netdev_recv_end();
113     }
114 }
115