【Linux4.1.12源码分析】VXLAN报文内核协议栈处理

本文主要分析Linux 4.1.12内核中关于VXLAN报文的处理,指出内核已支持报文聚合功能,并详细探讨了encap_rcv函数在vxlan报文处理中的作用,以及如何通过vxlan_udp_encap_recv函数进行报文处理。
摘要由CSDN通过智能技术生成

4.1.12内核已经支持vxlan报文的gro功能,意味着vxlan报文交给协议栈之前,已经被聚合过了,而在早期的内核中聚合逻辑是在encap_rcv函数之后实现的。

之前分析的UDP报文处理中,可以知道如果udp_sock定义了encap_rcv函数,将会把报文交给该函数处理,而不是传统的保存到sock队列,唤醒进程收包。

udp_sock定义的encap_rcv函数是在vxlan_socket_create函数中设置的,实际是vxlan_udp_encap_recv函数。

vxlan_udp_encap_recv函数

/* Callback from net/ipv4/udp.c to receive packets */
static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
{
	struct vxlan_sock *vs;
	struct vxlanhdr *vxh;
	u32 flags, vni;
	struct vxlan_metadata md = {0};

	/* Need Vxlan and inner Ethernet header to be present */
	if (!pskb_may_pull(skb, VXLAN_HLEN))	//报文长度检测
		goto error;

	vxh = (struct vxlanhdr *)(udp_hdr(skb) + 1);	//得到vxlan头指针,和UDP头长度相同,所以可以这么操作
	flags = ntohl(vxh->vx_flags);	
	vni = ntohl(vxh->vx_vni);

	if (flags & VXLAN_HF_VNI) {		//发送的vxlan报文,该flag必须置1
		flags &= ~VXLAN_HF_VNI;
	} else {
		/* VNI flag always required to be set */
		goto bad_flags;
	}

	if (iptunnel_pull_header(skb, VXLAN_HLEN, htons(ETH_P_TEB)))	//报文移动到内层报文
		goto drop;
	vxh = (struct vxlanhdr *)(udp_hdr(skb) + 1);

	vs = rcu_de
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值