Estou trabalhando em um aplicativo que gera geração de tráfego de rede. O aplicativo tem eth1
no modo promíscuo. Por isso, lida diretamente com todo o tráfego de entrada e saída.
Um dos recursos que estou implementando é a fragmentação e a desfragmentação de IP. Os fragmentos de entrada precisam ser remontados e os pacotes de saída precisam ser fragmentados se seus tamanhos excederem o MTU de 1500 bytes.
Uma maneira simples de testar meu aplicativo é enviar um comando ping
para o endereço IP de eth1
:
ping -c1 -s 20000 10.3.2.1
Isso está funcionando bem.
No entanto, quando o tamanho do pacote excede ~ 53000 bytes, ele falha. De acordo com o Wireshark eu recebo fragmentos até o fragmento compensar ~ 51000 e depois nada, seguido por um tempo limite de remontagem.
O tamanho máximo de um pacote IP é de 65535 bytes. O comando ping
permite especificar um tamanho até 65507. Isso realmente funciona se eu fizer ping para eth0
(controlado pelo OS).
Ao inspecionar o aplicativo a partir do interior com o GDB, tudo está indo bem. Percorrendo o código revela que os fragmentos entram no meu aplicativo, o pacote IP é remontado com sucesso e, em seguida, fragmentado novamente, e os fragmentos são enviados de volta ao remetente. Mesmo para o último fragmento, o valor de retorno de send(...)
(API de soquete) é igual ao tamanho do fragmento, indicando sucesso.
Alguém tem ideia do que poderia estar errado?
O sistema operacional é o Linux (baseado no RTLinux).