int netif_receive_skb(struct sk_buff *skb) //RPS 处理逻辑,先忽略 return __netif_receive_skb(skb); } static int __netif_receive_skb(struct sk_buff *skb) ret = __netif_receive_skb_core(skb, false);}static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc){ //p...
1. netif_receive_skb 将数据给到 __netif_receive_core。 6. __netif_receive_core 将数据给到系统中可能存在的 taps(前文“packet tap 投递”一节)(比如 PCAP,https://www.tcpdump.org/manpages/pcap.3pcap.html)。 7. __netif_receive_core 将数据给到协议层注册的 handlers(前文“协议层投递”一...
1. netif_receive_skb 将数据给到 __netif_receive_core。 6. __netif_receive_core 将数据给到系统中可能存在的 taps(前文“packet tap 投递”一节)(比如 PCAP,https://www.tcpdump.org/manpages/pcap.3pcap.html)。 7. __netif_receive_core 将数据给到协议层注册的 handlers(前文“协议层投递”一...
int netif_receive_skb(struct sk_buff *skb){ //RPS处理逻辑,先忽略 ... return __netif_receive_skb(skb); } static int __netif_receive_skb(struct sk_buff *skb){ ... ret = __netif_receive_skb_core(skb, false);}static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmem...
netif_rx通常在驱动的中断处理程序(严格意义来说,应该是中断服务例程,ISR)中被调用,但是也有例外,那就是回环设备。 Code 这段代码关键是,将这个SKB加入到相应的input_pkt_queue队列中,并调用netif_rx_schedule(),而对于NAPI方式,它没有使用input_pkt_queue队列,而是使用私有的队列,所以它没有这一个步骤。
本文就以netif_receive_skb()和dev_queue_xmit()为起始,简要介绍一下报文在IP层的处理过程。 先来一张图: 报文接收(图中橙色箭头所指) netif_receive_skb() 对每一种已注册的协议类型调用deliver_skb(),从而调用到其packet_type->func()函数。
出现flush GRO packet,先调用 gro_complete,再调用 netif_receive_skb 将包送到协议栈(出现在软中断中budget被耗尽,NAPI的处理被转入下一次软中断) 可以看到GRO核心处理函数是gro_receive,本篇文章不讨论,有兴趣可参考[6]。 netif_receive_skb 这里处理的复杂性来源于RPS。一些网卡支持多队列,这意味着收进来的包...
netif_receive_skb函数会根据包的协议,假如是udp包,会将包依次送到ip_rcv(),udp_rcv()协议处理函数中进行处理。 //file: net/core/dev.cintnetif_receive_skb(struct sk_buff*skb){//RPS处理逻辑,先忽略 ...return__netif_receive_skb(skb);}staticint__netif_receive_skb(struct sk_buff*skb){...ret...
在netif_receive_skb中,数据包将被送到协议栈中。声明,以下的3.3, 3.4, 3.5也都属于软中断的处理过程,只不过由于篇幅太长,单独拿出来成小节。 3.3 网络协议栈处理 netif_receive_skb函数会根据包的协议,假如是udp包,会将包依次送到ip_rcv(),udp_rcv()协议处理函数中进行处理。 图10 网络协议栈处理 AI检测...
netif_receive_skb函数会根据包的协议,假如是udp包,会将包依次送到ip_rcv(),udp_rcv()协议处理函数中进行处理。 //file: net/core/dev.cintnetif_receive_skb(struct sk_buff*skb){//RPS处理逻辑,先忽略 ...return__netif_receive_skb(skb);}staticint__netif_receive_skb(struct sk_buff*skb){...ret...