VLAN学习总结(VLAN内部原理).docx_第1页
VLAN学习总结(VLAN内部原理).docx_第2页
VLAN学习总结(VLAN内部原理).docx_第3页
VLAN学习总结(VLAN内部原理).docx_第4页
VLAN学习总结(VLAN内部原理).docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux VLAN学习总结1 环境说明文档后续描述的都是内核处理VLAN标签,即关闭了NETIF_F_HW_VLAN_RX/TX。NETIF_F_HW_VLAN_RX/TX开启:由网卡驱动操作VLAN标签;NETIF_F_HW_VLAN_RX/TX关闭:由内核操作VLAN标签。2 Linux命令行配置步骤配置命令:vconfig add eth1 100 / 创建虚拟子接口vconfig add eth2 100brctl addbr vswitch100 / 创建虚拟网桥brctl addif vswitch100 eth1.100 / 将接口加入到虚拟网桥brctl addif vswitch100 eth2.100ip link set dev vswitch100 address 00:11:22:33:44:55ip addr add 100.0.0.1/24 brd + dev vswitch100ifconfig eth1.100 upifconfig eth2.100 upifconfig vswitch100 up查看命令: # brctl show vlan10bridge name bridge id STP enabled interfacesvswitch100 8000.001122334455 no eth1.100 eth2.1003 802.1Q帧3.1 802.1Q帧格式标准以太帧承载的payload为461500字节,由于802.1Q标签占用了4字节,因此802.1Q以太帧承载的payload长度为421496,即(46-4)(1500-4)。在插入和移除VLAN标签时,都需要重新对FCS进行校验和计算。EtherTypeTrunk接口接收到帧后,读取该字段,值为0x8100表明是802.1Q标签PRI优先级字段,用于QoSCFI以太网络设置为 0,令牌环(Token Ring)网络设置为 1VLAN ID标识数据帧所属的VLAN,如果VLAN ID为0,则表示是优先级帧。VLAN ID 4095为保留ID3.2 802.1Q帧的数据结构Source file : linux-2.6.37includelinuxIf_vlan.hvlan_ethhdr为802.1Q帧头,其中h_vlan_encapsulated_proto是标准以太帧的typy部分。4 802.1Q的注册4.1 模板Source file : linux-2.6.37net8021qVlan.c协议类型:ETH_P_8021Q处理函数:vlan_skb_recv()4.2 VLAN处理函数Source file : linux-2.6.37net8021qVlan_dev.c4.3 注册Source file : linux-2.6.37net8021qVlan.c在vlan_proto_init()中: 调用dev_add_pack()注册8021Q; 调用vlan_ioctl_set()提供用户操作接口。5 802.1Q数据帧的接收1、驱动调用netif_receive_skb()函数,随后进入_netif_receive_skb()。Source file : linux-2.6.37netcoreDev.c2、调用deliver_skb()函数。在return pt_prev-func(skb, skb-dev, pt_prev, orig_dev);调用802.1Q的注册函数,此时的dev是真实接口(如eth1)。3、进入vlan_skb_recv()函数。 Source file : linux-2.6.37net8021qVlan_dev.c 4、在skb_share_check()中查看skb是否被其他协议共用。 5、调用pskb_may_pull(),传参时传入VLAN_HLEN,该宏定义的数值是4(字节)。 最后在return了_pskb_pull_tail()的判断结果。 展开pskb_may_pull():6、虽然是802.1Q数据帧,但在驱动中仍可以将携带802.1标签的数据帧当做标准以太帧来剥掉二层帧头。从下图可以看到,在没有VLAN标签的标准以太帧中,“长度/以太网类型”为2字节,同时如果携带VLAN标签,标签中的EtherType也是2字节。将携带802.1Q标签的二层数据帧当做标准以太帧,在剥离掉DA、SA和EtherType后,dev-data将从PRI开始,因此,赋值后vlan_hdr *vhdr指向了PRI的位置。需要明确的是,二层帧头还剩下2字节的TCI(PRI + CFI + VID),当需要彻底抹干净VLAN标签时,只需偏移TCI的2字节即可。 7、在vlan_find_dev(dev, vlan_id)函数中根据dev和vlan_id查找虚拟设备是否存在。例如,当前dev是eth1,vlan_id为100,则查找eth1.100虚拟设备是否存在,并返回vlan_dev。可以在vlan_find_dev()中看到,dev传参后的名称为real_dev。如果存在,下面的else中赋值:skb-dev = vlan_dev;此时dev已经是虚拟设备了,即skb-dev = eth1.100 8、在skb_pull_rcsum()中临时将skb的len偏移掉VLAN标签,重新计算校验和,并将指针偏移回原位。 下面展开的skb_pull_rcsum()图中,其中两个BUG_ON是两个断言,没有实际的操作动作。skb-len -= len将skb的长度减去了VLAN标签的4字节,随后调用skb_postpull_rcsum()计算校验和。 9、在vlan_set_encap_proto()函数中将VLAN标签的下一层封装协议类型取出来并赋值给skb-protocol。根据前面可以知道,由于VLAN标签后面跟的是标准以太帧的“长度/以太网类型”,因此如果是IP类型,当前的proto应该是0x800。判断proto是否大于1536(0x600),如果大于0x600将直接返回,否则进行其他处理(如802.2 LLC)。 大于0x600的常见协议如下:10、在vlan_check_reorder_header()函数中通过memmove()抹掉VLAN标签。 原型:void *memmove( void* dest, const void* src, size_t count );功能:由src所指内存区域复制count个字节到dest所指内存区域。ETH_HLEN为14字节,VLAN_ETH_HLEN为18字节,VLAN_HLEN为4字节。memmove(skb-data - 14, skb-data - 18, 12);从skb-data - 18的位置取出12字节(即DA + SA)拷贝到skb-data - 14,拷贝后就恢复成了图中右侧的标准以太帧了。最后,将skb-mac_header的地址向后偏移4字节,完成了全部去VLAN标签工作。 11、此时已经是没有VLAN标签的标准以太帧,输入设备是虚拟设备(如eth1.100)。重新调用netif_rx(skb)。(根据虚拟设备(如eth1.100),可以找到所属的虚拟网桥) 6 802.1Q数据帧的发送1、三层通过路由查询找到出接口为虚拟接口(如eth1.100),通过dev_queue_xmit()调用dev-hard_start_xmit(),进而调用了vlan_dev_hard_start_xmit()。此时进入的帧已经是标准以太帧了。Source file : linux-2.6.37netcoreDev.cSource file : linux-2.6.37netcoreVlan_dev.c2、进入vlan_dev_hard_start_xmit()后,veth得到了skb-data的指针。此时,skb-dev网卡(如eth1.100)。 3、通过vlan_dev_info(dev)-vlan_id得到VID,调用_vlan_put_tag()进行LAN打标。 4、在_vlan_put_tag()中,更新了skb-data和skb-len,此时skb-data从标准以太首部向上偏移了4字节。 在memmove()中通过skb-data + VLAN_HLEN得到标准以太帧的首部,取出DA和SA(2 * VLAN_ETH_ALEN)拷贝到skb-data位置,随后向上偏移了skb-mac_header指针,使它指向插入VLAN标签后的帧头。此时802.1Q帧头的DA和SA的填写

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论