Linux vlan知识总结(beta 1)
——by moonflow
qq:171932120
(总结自互联网)
xinxin
目录
cor是什么意思前言 3
第一章 vlan的基本概念 4
1.1 vlan的作用 4
1.2 vlan的实现原理 4
1.3 vlan的分类 4
1.4 vlan帧结构 4
第二章 重要结构 6
2.1 /include/linux/if_vlan.h 6
第三章 主要函数 20
3.1 vlan_proto_init [net\8021q\vlan.c] 20
3.2 register_pernet_subsys [net\8021q\vlan.c] 21
3.3 register_netdevice_notifier [/net/core/dev.c] 21
3.4 dev_add_pack [/net/core/dev.c] 21
3.5 vlan_skb_recv [/net/core/dev.c] 22
3.5 vlan_ioctl_t [ /net/socket.c] 25
第四章 总结 26
参考资料 27
前言
此文档是本人这段时间内学习Linux网络协议栈vlan嫩芽是什么意思功能相关知识,总结并且整理出来的文档。本文中的参考内核代码为2.6.24(相关的资料较多,便于开展),当然也是对互联网资源的整合。
参考了锐捷的一份文档,并且参考了网上很多资源。可以说基本上总结自互联网。参考中附上我学习时参考的资料,很多,而且他们写的都非常好,导致我都不知道写啥了。不过仅仅只是为了借这次总结的机会,让个人对Linux vlan部分更加深入。
因为本人初学Linux协议栈,对很多部分都还很迷茫,所以很多地方会出现失误或者不够清楚。我接触Linux时间很短,但是非常喜爱Linux,同时对网络部分非常喜爱,希望大家喜欢并且与我交流,共同进步。
第一章 vlan的基本概念
1.1 vlan的作用
虚拟局域网VLAN是一组逻辑上的设备和用户,这些设备和用户并不受物理网段的限制,可以根据功能、部门及应用等因素将它们组织起来,相互之间的通信就好像它们在同一个网段中一样,由此得名虚拟局域网。VLANcruelty是一种比较新的技术,工作在OSI参考模型的第2层和第3层,一个VLAN就是一个广播域,VLAN之间的通信是通过第3层的路由器来完成的。
1.2 vlan的实现原理
当VLAN交换机从工作站接收到数据后,会对数据的部分内容进行检查,并与一个VLAN配置数据库(该数据库含有静态配置的或者动态学习而得到的MAC地址等信息)中的内容进行比较后,确定数据去向,如果数据要发往一个VLANmariner设备(VLAN-aware),一个标记(Tag)或者VLAN标识就被加到这个数据上,根据VLAN标识和目的地址,VLAN交换机就可以将该数据转发到同一VLAN上适当的目的地;如果数据发往非VLAN设备(VLAN-unaware),则VLAN交换机发送不带VLAN标识的数据。
1.3 vlan的分类
a.基于端口的VLAN
b.基于MAC地址的VLAN
c.基于路由的VLAN
d.基于策略的VLAN
1.4 vlan帧结构
每一个支持802.1Q协议的主机,在发送数据包时,都在原来的以太网桢头中的源地址后增加了一个4descriptions字节的802.1Q桢头,之后接原来以太网的长度或类型域,关于以太网桢头的封装格式,参见以太网方面的培训教材。
图1 带有802.1Q标签头的以太网桢
这4个字节的802.1Q标签头包含了2个字节的标签协议标(TPID--Tag Protocol Identifier,它的值是8100),和两个字节的标签控制信息(TCI--Tag Control Information),TPID是IEEE定义的新的类型,表明这是一个加了802.1Q标签的本文,图2显示了802.1Q标签头的详细内容。
图2 802.1Q标签头
该标签头中的信息解释如下:
LAN Identified( VLAN ID ): 这是一个12位的域,指明VLAN的ID,一共4096个,每个支持802.1Q协议的主机发送出来的数据包都会包含这个域,以指明自己属于哪一个VLAN,目前TNETX 3270neck只支持32个VLAN。
Canonical Format Indicator( cfi ):这一位主要用于总线型的以太网与FDDI、令牌环网交换数据时的桢格式,TNETX 3270忽略此位。
Priority:这3 school是什么意思英语位指明桢的优先级。一共有8种优先级,主要用于当交换机阻塞时,优先发
送哪个数据包。TNETX 3270和TNETX 4090只支持一种优先级,所以这一位也没有用,
第2章 重要结构
2.1 /include/linux/if_vlan.h
在/include/linux/if_vlan.h中定义vlan相关的基本数据结构
//每一个支持802.1q协议的主机,在发送数据包时,都在原来的以太网帧头中的源地址后增加了一个4字节的802.1q帧头
#define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header)
* that VLAN requires.
*/
//VLAN以太网头部的地址长度字节
#define VLAN_ETH_ALEN 6 /* Octets in one ethernet addr */
//VLAN以太网头部的长度字节
#define VLAN_ETH_HLEN 18 /* Total octets in header. */
//VLAN以太网不含CRC校验的数据最小长度
#define VLAN_ETH_ZLEN 64 /* Min. octets in frame sans FCS */
/*备注以太网的情况
#define ETH_ALEN 6 /*以太网地址,即MAC地址,6字节*/
#define ETH_HLEN 14 /*以太网头部的总长度*/
#define ETH_ZLEN 60 /*不含CRC校验的数据最小长度*/
英语音素#define ETH_DATA_LEN 1500 /*帧内数据的最大长度*/
#define ETH_FRAME_LEN 1514 /*不含CRC校验和的最大以太网数据长度*/
*/
/*
* According to 802.3ac, the packet can be 4 bytes longer. --Klika Jan
*/
//VLAN帧内数据的最大长度
#define VLAN_ETH_DATA_LEN 1500 /* Max. octets in payload */
//VLAN中不含CRC校验和的最大以太网数据长度
#define VLAN_ETH_FRAME_LEN 1518 /* Max. octets in frame sans FCS */
/*
* struct vlan_hdr - vlan headerpiss off
* @h_vlan_TCI: priority and VLAN ID
* @h_vlan_encapsulated_proto: packet type ID or len
*/
struct vlan_hdr {
__be16 h_vlan_TCI; //TCI:802.1q标签头部分的priority and vlan id,标签控制信息
__be16 h_vlan_encapsulated_proto; //包类型ID或者长度
};