Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15475
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 42
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-23 09:16
文章分类
文章存档

2014年(5)

我的朋友

分类: LINUX

2014-06-20 21:02:55

首先,创建一个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,继续发送。

阅读(1977) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~