LINUX.ORG.RU

TCP checksum calculate, как?

 , ,


0

1

struct tcphdr *tcph = (struct tcphdr *)(skb_network_header((skb)) + ip_hdrlen((skb)));
struct iphdr *iph = (struct iphdr *)skb_network_header(skb);    
printk(KERN_ALERT "INFO: CHECKSUM TCP old: %u.\n",tcph->check);
datalen = skb->len - (iph->ihl << 2);
tcph->check = 0;printk(KERN_ALERT "INFO: CHECKSUM TCP=0: %u.\n",tcph->check);
tcph->check = csum_tcpudp_magic(iph->saddr, iph->daddr, datalen, IPPROTO_TCP, csum_partial((unsigned char *)tcph,datalen,0));
printk(KERN_ALERT "INFO: CHECKSUM TCP new: %u.\n",tcph->check);

Есть пример, но на выдаче неверная сумма. Не могу понять, как правильно считать чексумму.
Суть данного кода в том, что он просто считает заново хэш исходящего пакета.

skb->ip_summed = CHECKSUM_UNNECESSARY; - добавил после расчета суммы, сумма отличная от старой, но пакеты идут..
Правильно ли я понимаю, что skb->ip_summed = CHECKSUM_UNNECESSARY; - позволяет не обращать внимания на чексумму?

но на выдаче неверная сумма

Как ты это проверяешь? На локальном интерфейсе в Wireshark? Попробуй послать пакеты на другую машину и посмотреть сумму там.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

На стадии до отправки в интерфейс. Точно, спасибо за совет, сегодня проверю.

Voffko ()

Может быть дело в этом:

«If you capture on a recent Ethernet NIC, you may see many such „checksum errors“. This is due to TCP Checksum offloading often being implemented on those NICs and thus, for packets being transmitted by the machine. The checksum will not be calculated until the packet is sent out by the NIC hardware, long long after your capture tool intercepted the packet from the network stack.»

https://wiki.wireshark.org/TCP_Checksum_Verification

alx777 ()

Вообще в одном из заголовков ядра огромный коммент на тему смысла значений ip_summed при приёме и при отправке.

Sorcerer ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.