1 // vim: set et sw=4 sts=4 :
17 // Hacemos prueba simple de los leds
20 // Inicializamos dispositivo de red
23 // Si hubo un error, quedan prendidos todos los leds
28 // Comienza a 'dibujar'
29 EA = 1; // Habilita interrupciones globalmente
30 ET2 = 1; // Pone a correr el 'dibujado'
33 ip_addr_local[0] = 10;
34 ip_addr_local[1] = 10;
35 ip_addr_local[2] = 10;
36 ip_addr_local[3] = 100;
38 // Inicializo puerto UDP
39 udp_port_local = ELP_PORT;
43 byte len = netdev_recv_start();
45 if (!len) // no recibimos nada (válido)
46 continue; // Probamos de nuevo
50 // Parseamos cabecera ethernet
51 if (!eth_read_frame_header()) // No es un buen header
52 goto drop; // Tiramos el paquete
54 // Vemos que protocolo transporta
57 case ETH_ARP: // TODO: implementar ARP!
58 goto drop; // Tiramos el paquete
61 // Parseamos cabecera IP
62 if (!ip_read_packet_header()) // No es un buen header
63 goto drop; // Tiramos el paquete
65 // Vemos que protocolo transporta
68 case IP_ICMP: // TODO: implementar ICMP!
69 goto drop; // Tiramos el paquete
72 // Parseamos cabecera UDP
73 if (!udp_read_dgram_header()) // No es un buen header
74 goto drop; // Tiramos el paquete
76 // Procesamos comando ELP y obtenemos tamaño de la
78 len = elp_read_process_command();
81 // Si el tamaño es 0, hubo error o no está soportado
86 // FIXME por ahora no tenemos forma de 'abortar' el
87 // comando si el checksum es incorrecto, lo verificamos
89 if (!udp_checksum_ok())
93 // Terminamos recepción
99 eth_write_frame_header();
100 ip_packet_len = UDP_HEADER_SIZE + len;
101 //printb(ip_packet_len, 0x20);
102 ip_write_packet_header();
104 //printb(udp_dgram_len, 0x40);
105 udp_write_dgram_header();
106 elp_write_response();
107 udp_write_checksum(ETH_HEADER_SIZE + IP_HEADER_SIZE);
108 netdev_send_end(ETH_HEADER_SIZE + IP_HEADER_SIZE
109 + UDP_HEADER_SIZE + len);