udp_tunnel_xmit_skb函数是OVS2.5发送UDP报文的内核入口,在调用该函数之前,headroom空间需要准备完成,且vxlan头已经创建,skb结构体的data指向vxlan头的首地址。
1、udp_tunnel_xmit_skb函数
int udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
__be32 src, __be32 dst, __u8 tos, __u8 ttl,
__be16 df, __be16 src_port, __be16 dst_port,
bool xnet, bool nocheck)
{
struct udphdr *uh;
__skb_push(skb, sizeof(*uh)); //skb增加UDP头,skb报文的headroom大小在vxlan头封装前就完成准备,线性区的空间是充足的
skb_reset_transport_header(skb); //重置报文(外层报文)的transport header的偏移
uh = udp_hdr(skb);
uh->dest = dst_port; //设置目的端口
uh->source = src_port; //设置源端端口
uh->len = htons(skb->len); //设置UDP头中的长度,该长度包括UDP头 + vxlan头 + 用户数据(payload)
udp_set_csum(nocheck, skb, src, dst, skb->len); //UDP头csum计算
return iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP, //IP层封装tunnel发送报文
tos, ttl, df, xnet);
}2、udp_set_csum函数
/* Function
Linux内核4.1.12中VXLAN报文UDP隧道发送分析

本文深入剖析Linux 4.1.12内核中的udp_tunnel_xmit_skb函数,该函数作为Open vSwitch (OVS) 2.5发送UDP报文的入口。在调用此函数前,必须预先准备好headroom空间,并已构建VXLAN头部,skb数据指针指向VXLAN头部。
最低0.47元/天 解锁文章
5794

被折叠的 条评论
为什么被折叠?



