这个问题发生在
RHEL-7客户端虚拟机;RHEL-8作为主机系统;
同时RHEL-7的UFO打开;
此时可能出现小范围的打包丢失情况;怎么个小范围内,也就是某个大小值(UDP长度大约是1478)左右四个字节内的变化。
后续处理时,在bridge中做is_skb_forwardable时,
包UDP长度1478字节左右有那面四个字节范围内的包,会被一种逻辑给吃掉,传递不下去。这种包被判定为,既不属于GSO的包,同时整个长度还大于出端口的MTU值,然后被丢掉。
为什么会出现这种情况呢?如果去看相应内核版本的changelog,我们可以发现如下的两个commi;关于gso的一些性能优化;作用就是对小包做了判断,如果是小包,就不要走GSO的逻辑。
主机内核版本带有如下两个commit
- net: be more gentle about silly gso requests coming from user (Paolo Abeni) [2018437]
- net: check untrusted gso_size at kernel entry (Paolo Abeni) [2018437]
因为这两个改动,牵扯到一处改动;作用是对于小包,没有必要走入GSO的逻辑;
/* Too small packets are not really GSO ones. */
if (skb->len - p_off > gso_size) {
https://download.csdn.net/download/qq_36428903/86503284
https://bugzilla.redhat.com/show_bug.cgi?id=2123369