ficou muito bacana a sua placa.
eu acho q o roteamento nao tem segredo, tudo o que vc tem a fazer eh procurar o endereco destino em uma tabela de roteamento. nao sei qual o nivel de detalhamento de rota que vc quer e como esta a implementacao, mas pode ser tanto algo simples (verifica de qual interface veio e manda pela outra) ou algo mais elaborado (com suporte a networks e sub-networks).
se vc quer algo mais detalhado, sua tabela de rotas deve conter a network, netmask, gateway, interface e metric. entao, sabendo o ip destino do pacote, vc varre a tabela procurando o destino que melhor se encaixa ao que vc quer, ou seja, o ip destino deve estar dentro da faixa de ips valido para uma network/netmask. se vc tiver mais de uma rota com a mesma network/netmask, existe a metrica para avaliar qual delas tem precedencia. no caso dos roteadores cisco, por exemplo, colocar rotas com a mesma metrica faz com que o roteador sorteie o trafego entre as interfaces com a mesma metrica (balanceando o trafego). colocar metricas diferentes faz com que o trafego saia pela metrica menor, exceto quando a interface estiver down por algum problema, entao ela pega a proxima metrica disponivel.
por ex, para balancear trafego em um roteador cisco:
ip route 192.168.0.0 255.255.0.0 serial0 metric 1
ip route 192.168.0.0 255.255.0.0 serial1 metric 1
para priorizar pela serial0 e ter um backup na serial1:
ip route 192.168.0.0 255.255.0.0 serial0 metric 1
ip route 192.168.0.0 255.255.0.0 serial1 metric 2
a interface na tabela indica por qual interface vc vai mandar o pacote, mas isso nao eh toda a informacao: se o ip destino nao for diretamente alcancavel, vc precisa rotear ele atraves de outro router, por isso vc tem uma entrada para um gateway. note que tanto enviando diretamente para o ip destino (quando ele esta na mesma rede) quanto mandando para um gateway (quando o ip destino esta em outra rede), vc precisa consultar a tabela arp: para o ip destino vc indica o mac address do ip destino, para o gateway, vc mantem o ip destino no header e coloca o mac address do gateway.
por ex, para um host na mesma rede:
ip route 192.168.0.0 255.255.0.0 ethernet0
para um host em outra rede:
ip route 172.16.0.0 255.255.0.0 192.168.1.1
note que 192.168.1.1 esta na rede local (ethernet0), mas para chegar ateh 172.16.0.0/16 vc precisa mandar os pacotes para 192.168.1.1, q eh o gateway para essa rede.
e finalmente as sub-redes: pode ocorrer casos onde vc tenha rotas para uma rede e uma sub-rede na mesma tabela. por exemplo
ip route 192.168.0.0 255.255.0.0 ethernet0
ip route 192.168.2.0 255.255.255.0 serial0
a rede classe B 192.168.0.0 esta na ethernet, mas tem uma sub-rede menor, composta pela classe C 192.168.2.0 e roteada para a serial0. uma boa ideia eh ordenar a tabela pelas netmasks, da menor para a maior, entao sub-ordenar por network e entao por metric. assim vc pega a primeira rota jah corretamente, mesmo em casos mais complexos:
ip route 192.168.2.0 255.255.255.0 serial0 metric 1
ip route 192.168.2.0 255.255.255.0 serial1 metric 2
ip route 192.168.0.0 255.255.0.0 ethernet0
ip route 0.0.0.0 0.0.0.0 192.168.1.1 metric 1
ip route 0.0.0.0 0.0.0.0 192.168.1.2 metric 2
se vc ir para o 192.168.2.1, ele vai pegar corretamente a primeira rota e com a menor metrica. se essa interface nao estiver disponivel, ele vai para a metrica 2. se vc for para o 192.168.1.1, ele vai pela ethernet, se vc for para qq endereco ele vai por uma das metricas disponiveis na sequencia: 0.0.0.0 0.0.0.0 corresponde a maior netmask possivel, portanto eh o gateway default.
bom, eh soh uma ideia. se vcs tiverem tempo livre, acho q imitar o lider de mercado (cisco) seria uma boa ideia
eu jah fiz projetos similares com o mc68302 e mpc860, que possuem bom suporte on-chip a ring-buffers, entao estou curioso em saber qual a performance de trafego das suas interfaces, isto eh, como vc esta movendo os dados pela memoria e entre as interfaces, pois suponho que o AVR nao tem um bus externo largo e nao possui dezenas de canais de dma.