如何使netdev_rx_handler充当tproxy?

时间:2019-07-03 09:26:51

标签: c network-programming kernel-module

我正在编写一个内核模块,并且我有一个通过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;
}

我希望用户空间套接字接受连接。现在什么也没发生。

0 个答案:

没有答案