Linux 802.1Q VLAN网络报文收发分析

本文分析了Linux 4.4.4内核处理802.1Q VLAN网络报文的过程,从接收和发送两个方面进行探讨。在接收时,内核在__netif_receive_skb_core函数中剥除VLAN头,然后根据vlan_id在vlan_do_receive函数中寻找匹配的接口。在发送时,VLAN接口如eth1.101的报文由vlan_dev_hard_start_xmit处理,添加VLAN头后通过物理接口发送。对于找不到匹配接口的报文,会在转发过程中重新插入VLAN头。
摘要由CSDN通过智能技术生成


前段时间对新版Linux Kernel处理VLAN网络报文存在些疑惑,现对linux-4.4.4内核VLAN处理粗略的分析解除疑惑,即新版Linux内核在__netif_receive_skb_core函数中脱掉网络报文VLAN头部信息后,在没有对应的VLAN网络接口接收处理的情况下,VLAN网络报文将如何转发。



VLAN网络报文接收:

Linux网络协议栈接收处理物理网卡的网络报文,基本由netif_receive_skb函数开始,netif_receive_skb函数可以说是自底向上的网络协议栈的入口,在该入口函数实现不同网络协议报文的分发处理,例:ARP802.1QIP协议等。


函数int netif_receive_skb(struct sk_buff *skb)定义在net/core/dev.c文件内,该函数定义如下:




Linux网络报文在由netif_receive_skb函数接收处理函数调用过程如下:


int netif_receive_skb(struct sk_buff *skb)-> static int netif_receive_skb_internal(struct sk_buff *skb) -> staticint __netif_receive_skb(struct sk_buff *skb) -> static int__netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc),该网络报文最终由__netif_receive_skb_core函数处理,根据网络报文协议类型分发至不同的网络报文协议处理模块。


网络报文在static int __netif_receive_skb_core(struct sk_buff *skb, boolpfmemalloc)函数的处理流程如下:


1)检查该网络报文是否为ETH_P_8021Q/ETH_P_8021AD协议类型,若是则由skb_vlan_untag

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值