前段时间对新版Linux Kernel处理VLAN网络报文存在些疑惑,现对linux-4.4.4内核VLAN处理粗略的分析解除疑惑,即新版Linux内核在__netif_receive_skb_core函数中脱掉网络报文VLAN头部信息后,在没有对应的VLAN网络接口接收处理的情况下,VLAN网络报文将如何转发。
VLAN网络报文接收:
Linux网络协议栈接收处理物理网卡的网络报文,基本由netif_receive_skb函数开始,netif_receive_skb函数可以说是自底向上的网络协议栈的入口,在该入口函数实现不同网络协议报文的分发处理,例:ARP、802.1Q、IP协议等。
函数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协议类型,若是则由

本文分析了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头。
最低0.47元/天 解锁文章
9235

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



