【Linux4.1.12源码分析】协议栈gro收包之完整流程分析

前面几篇分析了不同协议层的gro实现,本篇分析报文提交协议栈的完整逻辑,其他逻辑例如csum等不深入分析。 本文分析重点是逻辑,功能执行主体可能是有不一致的。

MAC层逻辑

1、网卡设备不支持GRO,提交当前报文到协议栈;

2、当前报文为GRO,提交报文到协议栈;

3、当前报文已已聚合过(frag_list不为空),提交当前报文到协议栈;

4、当前报文csum_bad置为1,提交当前报文到协议栈;


IP层逻辑(IPV4)

1、当前报文IP协议不为4,提交当前报文到协议栈;

2、 当前报文 IP头长度为20 ,提交当前报文到协议栈;

3、当前报文ip csum校验失败,提交当前报文到协议栈;


UDP层逻辑

1、当前报文csum校验失败,提交当前报文到协议栈;

2、 第二次进入UDP聚合,提交当前报文到协议栈;

3、当前报文ip_summed不为CHECKSUM_PARTIAL 且csum_cnt为0 且csum_valid为0,提交当前报文到协议栈;

4、未匹配到VXLAN等offload,提交当前报文到协议栈;


VXLAN层逻辑

1、remcsum校验失败,提交当前报文到协议栈;


TCP层逻辑

1、匹配到同流场景:

1.1 如果之前处理中flush已经置1,提交匹配报文到协议栈;

1.2 如果如果IP报文的id不一致(通过flush_id表示,多个报文之间IP头的ID是累加的),提交匹配报文到协议栈;

1.3 匹配报文携带CWR标记,提交匹配报文到协议栈;

1.4 当前报文和匹配报文在(TCP_FLAG_CWR | TCP_FLAG_FIN | TCP_FLAG_PSH)标记之外的标记不相同,提交匹配报文到协议栈;

1.5 当前报文和匹配报文的ack_seq不一致,提交匹配报文到协议栈;

1.6 TCP头option信息存在且不一致,提交匹配报文到协议栈;

1.7 当前报文payload长度大于mss,提交匹配报文到协议栈;

1.8 匹配报文和当前报文seq不连续,提交匹配报文到协议栈;

1.9 当前报文合并到匹配报文导致报文长度超过65536,提交匹配报文到协议栈;

1.10 不提交匹配报文到协议栈, 当前报文是否提交协议栈等同于未匹配同流场景;

2、未匹配到同流场景:

2.1 当前报文数据区长度为0,提交当前报文到协议栈;

2.2 当前报文携带TCP_FLAG_URG | TCP_FLAG_PSH | TCP_FLAG_RST | TCP_FLAG_SYN | TCP_FLAG_FIN,提交当前报文到协议栈;

2.3 不满足上述条件,但是加入当前报文后如果导致gro_list中报文数超过设定值,提交最早的报文到协议栈,把当前报文加入到gro_list中;


上图覆盖了主要的逻辑,为了在一张图中显示,部分逻辑或操作被忽略。 从结果来看,gro收包有以下五种结果:

1、当前报文被提交到协议栈;

2、匹配报文被提交到协议栈;

3、匹配报文和当前报文被提交到协议栈;

4、当前报文被合并到匹配报文;

5、gro_list中最早的报文被提交到协议栈,当前报文被加入到gro_list;

你可能感兴趣的:(源码,linux,网络,GRO,gro_receive)