首先,创建一个VLAN端口后,就向内核注册了一个网口,就相当于有一个这个网口存在。
在8021q模块注册的时候,会向内核协议栈注册一个8021q协议:
static struct packet_type vlan_packet_type = {
.type = cpu_to_be16(ETH_P_8021Q),
.func = vlan_skb_recv, /* VLAN receive method */
};
接收流程:
在netif_receive_skb中,可以找到type为8021q的ptype,然后调用vlan_skb_recv,处理完后又交给netif_rx,此时已经剥离了vlan头继续处理。
发送流程:
在L3层一方面包装好skb,调用ip_route_output_flow路由查找函数,找到net_device网卡设备,找到的就是虚拟网口(eth2.1),所以skb对应的dev是vlan 设备,然后会调用vlan_dev_hard_start_xmit发送。
在创建VLAN端口的时候,会调用vlan_setup,初始化dev->netdev_ops = &vlan_netdev_ops;而vlan_netdev_ops在vlan模块初始化的时候把
它初始化,其中一项.ndo_start_xmit = vlan_dev_hard_start_xmit,所以dev为vlan设备时,会调用vlan_dev_hard_start_xmit,
在这里生成vlan_tag并放入skb中,然后找到真实的网络设备(real_dev),再次调用dev_queue_xmit,继续发送。
阅读(2024) | 评论(0) | 转发(0) |