Я использую необработанное программирование сокетов на 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; она всегда выполняется программно.
Это причина?