Я пытаюсь написать функцию NF_INET_LOCAL_OUT
netfilter.Одним из аргументов функции является sk_buff* skb
- буфер сокета, и эта структура имеет sk
, который должен быть сокетом, из которого исходит этот буфер.
Оказывается, однако, что в пакете syn-ack, skb->sk
- это не фактический struct sock
, а struct request_sock
, который вместо этого представляет собой «мини-сокет», созданный для сервера запроса соединения.
struct request_sock
имеет элемент sk
, который указывает на оригиналслушающий сокет, но дело в том, что функция netfilter не знает, является ли skb->sk
действительным struct sock
или struct request_sock
.Функция netfilter, которую я пишу, должна знать адрес этого исходного сокета прослушивания.
Единственный способ, которым я мог бы подумать, это конкретно проверить, является ли это пакет syn-ack, а затем привести skb->sk
к * 1016.* но это кажется действительно хрупким.