X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/6d441bbe709092d070c21b92aeeabfb82cb5982f..f5186e12ed5aedf98d0fa0d8299a73c830046c75:/src/main.c diff --git a/src/main.c b/src/main.c index 419ad41..60ed5db 100644 --- a/src/main.c +++ b/src/main.c @@ -26,13 +26,15 @@ void main(void) 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 @@ -47,7 +49,7 @@ void main(void) // 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: @@ -60,7 +62,7 @@ void main(void) // 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: @@ -69,20 +71,36 @@ void main(void) 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(); } }