我正在编写一个内核模块,并且我有一个通过netdev_rx_handler_register注册的RX处理程序。在此处理程序中,我想将数据包转发到用户空间套接字(在设置了IP_TRANSPARENT标志的localhost上侦听)。我该怎么办?
我可以通过inet_lookup_listener找到套接字,但是下一步该怎么做?我试过更改skb-> sk并返回RX_HANDLER_PASS。我还尝试将skb-> dev更改为net-> loopback_dev并返回RX_HANDLER_CONSUMED。我的用户空间套接字的接受处理程序从未被调用。
我使用的rx处理程序的简化代码:
rx_handler_result_t fw_frame_handler(struct sk_buff **pskb)
{
struct sk_buff *skb = skb_share_check(*pskb, GFP_ATOMIC);
if (unlikely(!skb))
return RX_HANDLER_CONSUMED;
*pskb = skb;
// Check for IPv4, TCP ...
// saddr, sport - packet's source IP:PORT
// laddr, lport - userspace socket IP:PORT
struct sock *sk = inet_lookup_listener(net, &tcp_hashinfo, saddr, sport, laddr, lport, skb->skb_iif);
skb_set_owner_w(skb, sk);
skb_push(skb, ETH_HLEN);
skb->dev = net->loopback_dev;
dev_queue_xmit(skb);
return RX_HANDLER_CONSUMED;
}
我希望用户空间套接字接受连接。现在什么也没发生。