1 // vim: set et sw=4 sts=4 :
12 // Apagamos todos los leds
15 // Inicializamos dispositivo de red
19 while(1); // Si falla init nos quedamos bobos
23 ip_addr_local[0] = 10;
24 ip_addr_local[1] = 10;
25 ip_addr_local[2] = 10;
26 ip_addr_local[3] = 100;
28 // Inicializo puerto UDP
29 udp_port_local = 9876;
37 len = netdev_recv_start();
38 if (!len) // no recibimos nada (válido)
39 continue; // Probamos de nuevo
44 // Parseamos cabecera ethernet
45 if (!eth_read_frame_header()) // No es un buen header
46 goto drop; // Tiramos el paquete
49 // Vemos que protocolo transporta
52 case ETH_ARP: // TODO: implementar ARP!
53 goto drop; // Tiramos el paquete
57 // Parseamos cabecera IP
58 if (!ip_read_packet_header()) // No es un buen header
59 goto drop; // Tiramos el paquete
62 // Vemos que protocolo transporta
65 case IP_ICMP: // TODO: implementar ICMP!
66 goto drop; // Tiramos el paquete
70 // Parseamos cabecera UDP
71 if (!udp_read_dgram_header()) // No es un buen header
72 goto drop; // Tiramos el paquete
74 //printb(udp_dgram_len, 0x40);
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();
82 if (!udp_checksum_ok())
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]);
97 udp_write_checksum(ETH_HEADER_SIZE+IP_HEADER_SIZE);
98 netdev_send_end(ETH_HEADER_SIZE+IP_HEADER_SIZE+udp_dgram_len);