Как заставить netdev_rx_handler действовать как tproxy? - PullRequest
0 голосов
/ 03 июля 2019

Я пишу модуль ядра, и у меня есть обработчик RX, зарегистрированный через netdev_rx_handler_register.В этом обработчике я хочу пересылать пакеты в сокет пространства пользователя (прослушивание на локальном хосте с установленным флагом IP_TRANSPARENT).Как мне это сделать?

Я могу найти сокет через 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;
}

Я ожидаю, что сокет пользовательского пространства примет соединение.Ничего не происходит сейчас.

...