前段时间对新版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协议类型,若是则由skb_vlan_untag