根据之前VXLAN之csum和remcsum实现分析(发包)的分析,由csum配置决定发送端是否计算UDP层的csum。 remcsum会在vxlan头中保存相关信息,然后在接收端进行处理,先看发送端如何构造vxlan头信息。
vxlan_xmit_skb函数(片段,发送方向)
if (type & SKB_GSO_TUNNEL_REMCSUM) { //配置remcsum场景
u16 hdrlen = sizeof(struct vxlanhdr); //vxlan头长度
u32 data = (skb_checksum_start_offset(skb) - hdrlen) >> //内层mac+ip头长度再除2, 长度值为偶数,除2信息不会丢失。 减去vxlan头
VXLAN_RCO_SHIFT; //是因为当前的报文已经增加了vxlan头,所以要减去。
if (skb->csum_offset == offsetof(struct udphdr, check)) //判断是否为UDP报文,data与上0x80
data |= VXLAN_RCO_UDP;
vxh->vx_vni |= htonl(data); //data值为低8位值
vxh->vx_flags |= htonl(VXLAN_HF_RCO); //vxlan头的flag增加VXLAN_HF_RCO标记
if (!skb_