<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">网卡驱动接收到报文后,通过netif_receive_skb提交报文到协议栈处理,由于网络设备MTU一般都设置为1500,对于TCP报文如果收到报文后就提交给协议栈处理是非常低效的,一般是通过聚合后再提交给协议栈,可以极大的降低内核的开销。 内核提供了napi_gro_receive函数,通过该函数可以实现报文聚合后再提交给协议栈。</span>
1、napi_gro_receive函数
gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
{
trace_napi_gro_receive_entry(skb);
skb_gro_reset_offset(skb); //初始化NAPI_GRO_CB结构体
return napi_skb_finish(dev_gro_receive(napi, skb), skb); //gro收包并提交给协议栈处理,dev_gro_receive函数的返回值决定如何处理报文
}
2、napi_skb_finish函数
static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
{
switch (ret) {
case GRO_NORMAL:
if (netif_receive_skb_internal(skb)) //返回值为normal