Разбираюсь с разбором сетевых пакетов в драйвере и что-то застопорился на получении заголовка TCP пакета:
Код: Выделить всё
const struct iphdr *ip = ip_hdr(skb);
const struct tcphdr *tcp = (const struct tcphdr *)((__u32 *)ip + ip->ihl); // найденый хак
const struct tcphdr *tcp2 = tcp_hdr(skb);
pr_debug("tcp %p (%hu -> %hu), tcp2 %p (%hu -> %hu)",
tcp, ntohs(tcp->source), ntohs(tcp->dest),
tcp2, ntohs(tcp2->source), ntohs(tcp2->dest));
И вывод:
Код: Выделить всё
[13209.892329] tcp ffff8801a66a8c62 (995 -> 33562), tcp2 ffff8801a66a8c4e (17664 -> 52)
[13212.448366] tcp ffff8801a201e862 (80 -> 36509), tcp2 ffff8801a201e84e (17664 -> 52)
Вывод показывает, что указатель возвращённый функцией tcp_hdr() указывает несколько не туда.
Вопрос - как получить корректный указатель на заголовок TCP?
Спасибо.