]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/main.c
Nueva manejo de buffers, un poco más modular. El proyecto quedó como un echo
[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 = 9876;
30
31     while (1) // Forever
32     {
33         byte buf[64]; //XXX
34         byte i; //XXX
35
36         if (!netdev_recv_start()) // 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: // TODO: 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: // TODO: 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                         netdev_read_start(udp_dgram_len-UDP_HEADER_SIZE);
76                         for (i = 0; i < udp_dgram_len-UDP_HEADER_SIZE; ++i)
77                             buf[i] = netdev_read_byte();
78                         netdev_read_end();
79                         netdev_recv_end();
80
81                         // Respuesta
82                         netdev_send_start();
83                         eth_write_frame_header();
84                         ip_write_packet_header();
85                         udp_write_dgram_header();
86                         netdev_write_start(udp_dgram_len-UDP_HEADER_SIZE);
87                         for (i = 0; i < udp_dgram_len-UDP_HEADER_SIZE; ++i)
88                             netdev_write_byte(buf[i]);
89                         netdev_write_end();
90                         netdev_send_end(ETH_HEADER_SIZE+IP_HEADER_SIZE+udp_dgram_len);
91                 }
92         }
93         continue;
94 drop:
95         netdev_recv_end();
96     }
97 }
98