#include "reg51.h"
#include "netdev.h"
#include "eth.h"
+#include "arp.h"
#include "ip.h"
#include "udp.h"
+#include "elp.h"
void main(void)
{
// Comienza a 'dibujar'
EA = 1; // Habilita interrupciones globalmente
- TR2 = 1; // Pone a correr el 'dibujado'
+ ET2 = 1; // Pone a correr el 'dibujado'
// Inicializo IP
ip_addr_local[0] = 10;
ip_addr_local[3] = 100;
// Inicializo puerto UDP
- udp_port_local = 9876;
+ udp_port_local = ELP_PORT;
while (1) // Forever
{
- byte i; //XXX
- byte len;
-
- len = netdev_recv_start();
+ byte len = netdev_recv_start();
+ //printb(len, 0x10);
if (!len) // no recibimos nada (válido)
continue; // Probamos de nuevo
// Tenemos algo!
- //print(0x2);
// Parseamos cabecera ethernet
if (!eth_read_frame_header()) // No es un buen header
goto drop; // Tiramos el paquete
- //print(0x4);
// Vemos que protocolo transporta
switch (eth_proto)
{
- case ETH_ARP: // TODO: implementar ARP!
- goto drop; // Tiramos el paquete
+ case ETH_ARP:
+ // Obtenemos paquete ARP
+ if (!arp_read_packet) // No es un paquete soportado
+ goto drop; // Tiramos el paquete
+
+ // Terminamos recepción
+ netdev_recv_end();
+
+ // Respondemos
+ netdev_send_start();
+ eth_write_frame_header();
+ arp_write_packet();
+ netdev_send_end(ETH_HEADER_SIZE + ARP_PACKET_SIZE);
+
+ // Seguimos viaje
+ continue;
case ETH_IP:
- //print(0x8);
// Parseamos cabecera IP
if (!ip_read_packet_header()) // No es un buen header
goto drop; // Tiramos el paquete
- //print(0x10);
// Vemos que protocolo transporta
switch (ip_proto)
goto drop; // Tiramos el paquete
case IP_UDP:
- //print(0x20);
// Parseamos cabecera UDP
if (!udp_read_dgram_header()) // No es un buen header
goto drop; // Tiramos el paquete
- //printb(udp_dgram_len, 0x40);
- // TODO
- // Nuestro protocolo, por ahora un simple echo!
- len = udp_dgram_len - UDP_HEADER_SIZE;
- netdev_read_start(len);
- leds_matrix_len = len;
- for (i = 0; i < len; ++i)
- leds_matrix[i] = udp_read_byte();
- netdev_read_end();
+ // 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();
- //udp_dgram_len = UDP_HEADER_SIZE+len;
- //ip_packet_len = IP_HEADER_SIZE+udp_dgram_len;
+ 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();
- netdev_write_start(len);
- for (i = 0; i < len; ++i)
- udp_write_byte(leds_matrix[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);
+ 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);
}
}
continue;