1 // vim: set et sw=4 sts=4 :
18 // Hacemos prueba simple de los leds
21 // Inicializamos dispositivo de red
24 // Si hubo un error, quedan prendidos todos los leds
29 // Comienza a 'dibujar'
30 EA = 1; // Habilita interrupciones globalmente
31 ET2 = 1; // Pone a correr el 'dibujado'
34 ip_addr_local[0] = 10;
35 ip_addr_local[1] = 10;
36 ip_addr_local[2] = 10;
37 ip_addr_local[3] = 100;
39 // Inicializo puerto UDP
40 udp_port_local = ELP_PORT;
44 byte len = netdev_recv_start();
46 if (!len) // no recibimos nada (válido)
47 continue; // Probamos de nuevo
51 // Parseamos cabecera ethernet
52 if (!eth_read_frame_header()) // No es un buen header
53 goto drop; // Tiramos el paquete
55 // Vemos que protocolo transporta
59 // Obtenemos paquete ARP
60 if (!arp_read_packet) // No es un paquete soportado
61 goto drop; // Tiramos el paquete
63 // Terminamos recepción
68 eth_write_frame_header();
70 netdev_send_end(ETH_HEADER_SIZE + ARP_PACKET_SIZE);
76 // Parseamos cabecera IP
77 if (!ip_read_packet_header()) // No es un buen header
78 goto drop; // Tiramos el paquete
80 // Vemos que protocolo transporta
83 case IP_ICMP: // TODO: implementar ICMP!
84 goto drop; // Tiramos el paquete
87 // Parseamos cabecera UDP
88 if (!udp_read_dgram_header()) // No es un buen header
89 goto drop; // Tiramos el paquete
91 // Procesamos comando ELP y obtenemos tamaño de la
93 len = elp_read_process_command();
96 // Si el tamaño es 0, hubo error o no está soportado
101 // FIXME por ahora no tenemos forma de 'abortar' el
102 // comando si el checksum es incorrecto, lo verificamos
104 if (!udp_checksum_ok())
108 // Terminamos recepción
114 eth_write_frame_header();
115 ip_packet_len = UDP_HEADER_SIZE + len;
116 //printb(ip_packet_len, 0x20);
117 ip_write_packet_header();
119 //printb(udp_dgram_len, 0x40);
120 udp_write_dgram_header();
121 elp_write_response();
122 udp_write_checksum(ETH_HEADER_SIZE + IP_HEADER_SIZE);
123 netdev_send_end(ETH_HEADER_SIZE + IP_HEADER_SIZE
124 + UDP_HEADER_SIZE + len);