Включить контрольную сумму заголовка IP в NIC - PullRequest
0 голосов
/ 28 февраля 2019

Я использую необработанное программирование сокетов на C и пытаюсь разгрузить вычисление контрольной суммы заголовка IP в NIC.Я проверил, что разгрузка контрольной суммы включена на NIC.

$ ethtool -k enp1s0d1
Features for enp1s0d1:
rx-checksumming: on
tx-checksumming: on
    tx-checksum-ipv4: on
    tx-checksum-ip-generic: off [fixed]
    tx-checksum-ipv6: on
    tx-checksum-fcoe-crc: off [fixed]
    tx-checksum-sctp: off [fixed]

В программе отправителя я установил контрольную сумму заголовка IP на 0, то есть:

struct iphdr *iph;
iph->check  = htons(0);

Однакопринимающая сторона не получает никаких пакетов.Если я вручную установлю контрольную сумму заголовка IP с помощью приведенного ниже кода, получатель сможет получать пакеты:

unsigned short checksum(unsigned short* buff, int _16bitword)
{
    unsigned long sum;
    for(sum=0;_16bitword>0;_16bitword--)
        sum+=htons(*(buff)++);
    do
    {
        sum = ((sum >> 16) + (sum & 0xFFFF));
    }
    while(sum & 0xFFFF0000);

    return (~sum);
}

Интересно, я что-то не так сделал?Я заметил, что один из документов ядра (https://www.kernel.org/doc/Documentation/networking/checksum-offloads.txt) говорит

Не выполняется разгрузка контрольной суммы заголовка IP; она всегда выполняется программно.

Это причина?

...