C IPv4数据包的附加头可以用GSO分割?

C IPv4数据包的附加头可以用GSO分割?,c,networking,tcp,kernel,gso,C,Networking,Tcp,Kernel,Gso,我在数据包分割方面遇到了麻烦。我已经读过很多关于GSO的资料,GSO是一种通用的方法,用于分割大小大于以太网MTU(1500 B)的数据包。然而,我还没有找到一个解决我心中疑虑的答案 如果我们在L2和L3层之间添加一组新的字节(例如,一个名为“NH”的新头),内核必须能够通过NH并调整指向L3开头的sk_buff指针,以根据L3协议类型的“策略”(例如IPv4分段)卸载数据包。我的想法是修改skb_网络协议()函数。如果我没有记错的话,此函数将启用skb_mac_gso_segment()为不同

我在数据包分割方面遇到了麻烦。我已经读过很多关于GSO的资料,GSO是一种通用的方法,用于分割大小大于以太网MTU(1500 B)的数据包。然而,我还没有找到一个解决我心中疑虑的答案

如果我们在L2和L3层之间添加一组新的字节(例如,一个名为“NH”的新头),内核必须能够通过NH并调整指向L3开头的sk_buff指针,以根据L3协议类型的“策略”(例如IPv4分段)卸载数据包。我的想法是修改skb_网络协议()函数。如果我没有记错的话,此函数将启用skb_mac_gso_segment()为不同类型的L3协议正确调用gso函数。但是,我无法正确地分割数据包

我有一个通过网络转发数据包的内核模块(OVS,openvswitch)。在我正在运行的测试(h1--ping--h2)中,主机生成大型ICMP数据包,然后发送小于或等于MTU大小的数据包。这些数据包由连接新报头NH的第一个交换机接收,因此,如果数据包有1500B,它将变为1500B+NH长度。问题是,交换机已经从主机接收到一个碎片数据包,并且交换机在数据包中添加了更多字节(类似于VLAN)

因此,一开始,我尝试ping大数据包,但没有成功。在OVS中,在调用dev\u queue\u xmit()之前,可以通过调用skb\u gso\u segment()对数据包进行分段。但是,数据包需要经过netif\u needs\u gso()检查的条件。。但是我不确定是否必须使用skb\u gso\u segment()来正确分割数据包

我还注意到,要使需要\u gso_segment()函数为真,skb_shinfo(skb)->gso_size必须为真。然而,对于所有接收的数据包,gso_大小始终为零值。因此,我通过将一个随机值归因于gso_大小(例如1448B)进行了测试。现在,在我的测试中,我能够从h1 ping到h2,但是前两个数据包丢失了。在另一个测试中,TCP的性能非常差。从那以后,我一直收到一个内核警告:“[5212.694418][c1642e50]?skb_warn_bad_offload+0xd0/0xd8 "

对于小数据包( 有人知道发生了什么吗?当我收到大数据包时,是否应该始终使用GSO?是否可以对一个碎片化的IPv4数据包进行分段

由于新的报头位于L2和L3之间,我猜由于额外的报头,IPv4数据包的扩大与VLAN的情况类似。VLAN如何处理分段问题

提前感谢,