]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - src/main.c
Ejemplo completo del módulo de leds implementado en assembly y llamado desde un
[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         byte len;
36
37         len = netdev_recv_start();
38         if (!len) // no recibimos nada (válido)
39             continue; // Probamos de nuevo
40
41         // Tenemos algo!
42         //print(0x2);
43
44         // Parseamos cabecera ethernet
45         if (!eth_read_frame_header()) // No es un buen header
46             goto drop; // Tiramos el paquete
47         //print(0x4);
48
49         // Vemos que protocolo transporta
50         switch (eth_proto)
51         {
52             case ETH_ARP: // TODO: implementar ARP!
53                 goto drop; // Tiramos el paquete
54
55             case ETH_IP:
56                 //print(0x8);
57                 // Parseamos cabecera IP
58                 if (!ip_read_packet_header()) // No es un buen header
59                     goto drop; // Tiramos el paquete
60                 //print(0x10);
61
62                 // Vemos que protocolo transporta
63                 switch (ip_proto)
64                 {
65                     case IP_ICMP: // TODO: implementar ICMP!
66                         goto drop; // Tiramos el paquete
67
68                     case IP_UDP:
69                         //print(0x20);
70                         // Parseamos cabecera UDP
71                         if (!udp_read_dgram_header()) // No es un buen header
72                             goto drop; // Tiramos el paquete
73
74                         //printb(udp_dgram_len, 0x40);
75                         // TODO
76                         // Nuestro protocolo, por ahora un simple echo!
77                         len = udp_dgram_len - UDP_HEADER_SIZE;
78                         netdev_read_start(len);
79                         for (i = 0; i < len; ++i)
80                             buf[i] = udp_read_byte();
81                         netdev_read_end();
82                         if (!udp_checksum_ok())
83                             goto drop;
84                         netdev_recv_end();
85
86                         // Respuesta
87                         netdev_send_start();
88                         eth_write_frame_header();
89                         //udp_dgram_len = UDP_HEADER_SIZE+len;
90                         //ip_packet_len = IP_HEADER_SIZE+udp_dgram_len;
91                         ip_write_packet_header();
92                         udp_write_dgram_header();
93                         netdev_write_start(len);
94                         for (i = 0; i < len; ++i)
95                             udp_write_byte(buf[i]);
96                         netdev_write_end();
97                         udp_write_checksum(ETH_HEADER_SIZE+IP_HEADER_SIZE);
98                         netdev_send_end(ETH_HEADER_SIZE+IP_HEADER_SIZE+udp_dgram_len);
99                 }
100         }
101         continue;
102 drop:
103         netdev_recv_end();
104     }
105 }
106