JJJ:桥接转发的代码是如何在接收流程中完成转发的

本文解析了Linux内核中的netdev_rx_handler_register函数,用于为网络设备注册接收处理程序,以及__netif_receive_skb及其相关函数如何调用接收处理程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

br_add_if -》 err = netdev_rx_handler_register(dev, br_handle_frame, p);


4691 /**
4692  *  netdev_rx_handler_register - register receive handler
4693  *  @dev: device to register a handler for
4694  *  @rx_handler: receive handler to register
4695  *  @rx_handler_data: data pointer that is used by rx handler
4696  *
4697  *  Register a receive handler for a device. This handler will then be
4698  *  called from __netif_receive_skb. A negative errno code is returned
4699  *  on a failure.
4700  *
4701  *  The caller must hold the rtnl_mutex.
4702  *
4703  *  For a general description of rx_handler, see enum rx_handler_result.
4704  */
4705 int netdev_rx_handler_register(struct net_device *dev,
4706                    rx_handler_func_t *rx_handler, //此hook会在 __netif_receive_skb 中被调用
4707                    void *rx_handler_data)
4708 {
4709     if (netdev_is_rx_handler_busy(dev))
4710         return -EBUSY;
4711
4712     if (dev->priv_flags & IFF_NO_RX_HANDLER)
4713         return -EINVAL;
4714
4715     /* Note: rx_handler_data must be set before rx_handler */
4716     rcu_assign_pointer(dev->rx_handler_data, rx_handler_data);
4717     rcu_assign_pointer(dev->rx_handler, rx_handler);
4718
4719     return 0;
4720 }




5055 static int __netif_receive_skb(struct sk_buff *skb)
5056 {
5057     int ret;
5058
5059     if (sk_memalloc_socks() && skb_pfmemalloc(skb)) {
5060         unsigned int noreclaim_flag;
5061
5062         /*
5063          * PFMEMALLOC skbs are special, they should
5064          * - be delivered to SOCK_MEMALLOC sockets only
5065          * - stay away from userspace
5066          * - have bounded memory usage
5067          *
5068          * Use PF_MEMALLOC as this saves us from propagating the allocation
5069          * context down to all allocation sites.
5070          */
5071         noreclaim_flag = memalloc_noreclaim_save();
5072         ret = __netif_receive_skb_one_core(skb, true);
5073         memalloc_noreclaim_restore(noreclaim_flag);
5074     } else
5075         ret = __netif_receive_skb_one_core(skb, false);
5076
5077     return ret;
5078 }




4955 static int __netif_receive_skb_one_core(struct sk_buff *skb, bool pfmemalloc)
4956 {
4957     struct net_device *orig_dev = skb->dev;
4958     struct packet_type *pt_prev = NULL;
4959     int ret;
4960
4961     ret = __netif_receive_skb_core(&skb, pfmemalloc, &pt_prev);
4962     if (pt_prev)
4963         ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
4964     return ret;
4965 }




__netif_receive_skb_core中相关的代码片段如下:
4879     rx_handler = rcu_dereference(skb->dev->rx_handler);
4880     if (rx_handler) {
4881         if (pt_prev) {
4882             ret = deliver_skb(skb, pt_prev, orig_dev);
4883             pt_prev = NULL;
4884         }
4885         switch (rx_handler(&skb)) {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值