ip_addr_local[3] = 100;
// Inicializo puerto UDP
- udp_port_local = 9000;
+ udp_port_local = 9876;
while (1) // Forever
{
- byte i;
- byte len = netdev_recv_start();
- printb(len, 0x1);
+ byte buf[64]; //XXX
+ byte i; //XXX
+ byte len;
+
+ len = netdev_recv_start();
if (!len) // no recibimos nada (vĂ¡lido)
continue; // Probamos de nuevo
// Vemos que protocolo transporta
switch (eth_proto)
{
- case ETH_ARP: // FIXME, implementar ARP!
+ case ETH_ARP: // TODO: implementar ARP!
goto drop; // Tiramos el paquete
case ETH_IP:
// Vemos que protocolo transporta
switch (ip_proto)
{
- case IP_ICMP: // FIXME, implementar ICMP!
+ case IP_ICMP: // TODO: implementar ICMP!
goto drop; // Tiramos el paquete
case IP_UDP:
if (!udp_read_dgram_header()) // No es un buen header
goto drop; // Tiramos el paquete
- printb(udp_dgram_len, 0x40);
+ //printb(udp_dgram_len, 0x40);
// TODO
// Nuestro protocolo, por ahora un simple echo!
- for (i = 8; i < udp_dgram_len; ++i) // 8 por la cabecera UDP
- {
- printb(netdev_recv_byte(), 0x00);
- }
- //i = (udp_dgram_len % 2) ? (udp_dgram_len - 1) : udp_dgram_len;
- for (i += 34; i < len; ++i) // 8 por las cabeceras eth+IP
- netdev_recv_byte();
-drop:
+ len = udp_dgram_len - UDP_HEADER_SIZE;
+ netdev_read_start(len);
+ for (i = 0; i < len; ++i)
+ buf[i] = udp_read_byte();
+ netdev_read_end();
+ if (!udp_checksum_ok())
+ goto drop;
netdev_recv_end();
+
+ // Respuesta
+ netdev_send_start();
+ eth_write_frame_header();
+ //udp_dgram_len = UDP_HEADER_SIZE+len;
+ //ip_packet_len = IP_HEADER_SIZE+udp_dgram_len;
+ ip_write_packet_header();
+ udp_write_dgram_header();
+ netdev_write_start(len);
+ for (i = 0; i < len; ++i)
+ udp_write_byte(buf[i]);
+ netdev_write_end();
+ udp_write_checksum(ETH_HEADER_SIZE+IP_HEADER_SIZE);
+ netdev_send_end(ETH_HEADER_SIZE+IP_HEADER_SIZE+udp_dgram_len);
}
}
+ continue;
+drop:
+ netdev_recv_end();
}
}