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