- {
- netdev_recv_end(); // Tiramos el paquete
- continue; // Vamos de nuevo!
- }
-
- // TODO
- // Nuestro protocolo, por ahora un simple echo!
- for (len = 8; len < udp_dgram_len; len += 2) // 8 por la cabecera UDP
- {
- leds(netdev_recv_word());
- sleep(5);
- }
+ goto drop; // Tiramos el paquete
+
+ // Procesamos comando ELP y obtenemos tamaño de la
+ // respuesta
+ len = elp_read_process_command();
+ //printb(len, 0x02);
+
+ // Si el tamaño es 0, hubo error o no está soportado
+ if (!len)
+ goto drop;
+ //print(0x0004);
+
+ // FIXME por ahora no tenemos forma de 'abortar' el
+ // comando si el checksum es incorrecto, lo verificamos
+ // por deporte.
+ if (!udp_checksum_ok())
+ goto drop;
+ //print(0x0008);
+
+ // Terminamos recepción
+ netdev_recv_end();
+ //print(0x0010);
+
+ // Respuesta
+ netdev_send_start();
+ eth_write_frame_header();
+ ip_packet_len = UDP_HEADER_SIZE + len;
+ //printb(ip_packet_len, 0x20);
+ ip_write_packet_header();
+ udp_dgram_len = len;
+ //printb(udp_dgram_len, 0x40);
+ udp_write_dgram_header();
+ elp_write_response();
+ udp_write_checksum(ETH_HEADER_SIZE + IP_HEADER_SIZE);
+ netdev_send_end(ETH_HEADER_SIZE + IP_HEADER_SIZE
+ + UDP_HEADER_SIZE + len);