quadros Ethernet tocados são vistos parcialmente quando a interface MTU é menor que os quadros tocados

2

Tenho uma topologia muito simples a seguir, em que o roteador r1 envia mensagens de "solicitação de eco" ICMP para r2 com cargas de 2000 bytes e roteador r2 responde a essas mensagens com mensagens "eco response" do ICMP:

As interfaces dos roteadores Gi0 / 0/0 são com MTU de 9000 bytes. Como visto no desenho, há também uma conexão de rede passiva entre esses dois roteadores que espelha o tráfego para a interface bond0 no PC . Quando bond0 (e, portanto, eth2 e eth3) possui MTU menor que frames Ethernet contendo mensagens ICMP on wire, então utilitários de captura de pacotes como tcpdump ou tshark veem apenas parte da parte de carga útil das mensagens ICMP. Por exemplo, vamos dizer que r1 envia mensagens ICMP preenchidas com dados 0xabcd e, em seguida, os utilitários de captura de pacotes ouvem nas interfaces bond0, eth2 ou eth3 em PC , consulte os seguintes dados:

0x0000:  abcd abcd abcd abcd abcd abcd abcd abcd  ................
0x0010:  abcd abcd abcd abcd abcd abcd abcd abcd  ................
0x0020:  abcd abcd abcd abcd abcd abcd abcd abcd  ................
0x0030:  abcd abcd abcd abcd abcd abcd abcd abcd  ................
0x0040:  abcd abcd abcd abcd abcd abcd abcd abcd  ................
/* further data removed for brevity */

O que causa esse comportamento?

    
por Martin 02.03.2016 / 17:14

1 resposta

2

De fato, usbnet parece ser o mais provável culpado.

     /* rx and tx sides can use different message sizes;
      * bind() should set rx_urb_size in that case.
      */
     dev->hard_mtu = net->mtu + net->hard_header_len;

     net->netdev_ops = &usbnet_netdev_ops;
     net->watchdog_timeo = TX_TIMEOUT_JIFFIES;
     net->ethtool_ops = &usbnet_ethtool_ops;

     // allow device-specific bind/init procedures
     // NOTE net->name still not usable ...
     if (info->bind) {
             status = info->bind (dev, udev);
             ...
     }
     ....
     if (!dev->rx_urb_size)
             dev->rx_urb_size = dev->hard_mtu;

link

cdc_ether não define rx_urb_size em si, até onde eu sei.

Estou supondo que o tamanho do URB seja passado para o controlador USB e que os quadros de ethernet sejam cortados para caber (não me pergunte por que não o outro lado). Quer dizer, espero que sua experiência não esteja causando o hardware em DMA fora dos buffers alocados:).

Mesmo o cdc_ether configurou o rx_urb_size, há um pouco estranho no retorno de chamada ndo_change_mtu no usbnet. Parece que pode acabar sendo indexado de volta ao mtu, se o mtu já foi definido para o máximo.

Honestamente, eu não sei como isso funciona, só parece estranho à primeira vista.

     if (dev->rx_urb_size == old_hard_mtu) {
             dev->rx_urb_size = dev->hard_mtu;

link

    
por 09.03.2016 / 22:32

Tags