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)) {
JJJ:桥接转发的代码是如何在接收流程中完成转发的
最新推荐文章于 2025-12-05 17:02:52 发布
本文解析了Linux内核中的netdev_rx_handler_register函数,用于为网络设备注册接收处理程序,以及__netif_receive_skb及其相关函数如何调用接收处理程序。
1235

被折叠的 条评论
为什么被折叠?



