Получение заголовка TCP

Взгляд изнутри

Модератор: Модераторы разделов

IMB
Сообщения: 2501
ОС: Debian

Получение заголовка TCP

Сообщение IMB »

Доброго дня!
Разбираюсь с разбором сетевых пакетов в драйвере и что-то застопорился на получении заголовка 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?
Спасибо.
Спасибо сказали:

IMB
Сообщения: 2501
ОС: Debian

Re: Получение заголовка TCP

Сообщение IMB »

Пока решил так:

Код: Выделить всё

const struct iphdr *ip = ip_hdr(skb);
struct tcphdr _tcp;
struct tcphdr *tcp = skb_header_pointer(skb, ip_hdrlen(skb), sizeof(_tcp), &_tcp);
Спасибо сказали: