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 */4705intnetdev_rx_handler_register(structnet_device*dev,4706rx_handler_func_t*rx_handler,//此hook会在 __netif_receive_skb 中被调用4707void*rx_handler_data)4708{4709if(netdev_is_rx_handler_busy(dev))4710return-EBUSY;47114712if(dev->priv_flags & IFF_NO_RX_HANDLER)4713return-EINVAL;47144715/* Note: rx_handler_data must be set before rx_handler */4716rcu_assign_pointer(dev->rx_handler_data, rx_handler_data);4717rcu_assign_pointer(dev->rx_handler, rx_handler);47184719return0;4720}5055staticint__netif_receive_skb(structsk_buff*skb)5056{5057int ret;50585059if(sk_memalloc_socks()&&skb_pfmemalloc(skb)){5060unsignedint noreclaim_flag;50615062/*
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);5073memalloc_noreclaim_restore(noreclaim_flag);5074}else5075 ret =__netif_receive_skb_one_core(skb, false);50765077return ret;5078}4955staticint__netif_receive_skb_one_core(structsk_buff*skb, bool pfmemalloc)4956{4957structnet_device*orig_dev = skb->dev;4958structpacket_type*pt_prev =NULL;4959int ret;49604961 ret =__netif_receive_skb_core(&skb, pfmemalloc,&pt_prev);4962if(pt_prev)4963 ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);4964return ret;4965}
__netif_receive_skb_core中相关的代码片段如下:
4879 rx_handler =rcu_dereference(skb->dev->rx_handler);4880if(rx_handler){4881if(pt_prev){4882 ret =deliver_skb(skb, pt_prev, orig_dev);4883 pt_prev =NULL;4884}4885switch(rx_handler(&skb)){