Linux内核中VLAN的实现过程(1)-主要数据结构(Linux vlan)

网友投稿 345 2022-09-08


Linux内核中VLAN的实现过程(1)-主要数据结构(Linux vlan)

Linux内核中VLAN的实现过程(1)

Linux内核中vlan相关的代码主要位于net/8021q目录中。Linux中的VLAN是一种特殊的虚拟设备,所有VLAN设备必须依赖于它的宿主设备才能存在。

主要结构

vlan协议

enum vlan_protos { // vlan: 8.2.1q VLAN_PROTO_8021Q = 0, // qinq: 802.1ad VLAN_PROTO_8021AD, VLAN_PROTO_NUM, };

vlan的proc文件系统信息

struct vlan_net { // proc文件系统中vlan的顶层目录节点:/proc/net/vlan struct proc_dir_entry *proc_vlan_dir; // proc文件系统中vlan的配置节点:/proc/net/vlan/config struct proc_dir_entry *proc_vlan_conf; // vlan设备的名字风格,默认为eth0.10风格 unsigned short name_type; }; vlan_net是vlan模块公有的空间

vlan设备信息

struct vlan_info { // 真实的宿主设备,vlan附加在其之上 struct net_device *real_dev; // vlan组,记录了所有绑定在该宿主设备上的vlan设备 struct vlan_group grp; // vlan id的链表头 struct list_head vid_list; // 记录了该vlan id链表中节点个数 unsigned int nr_vids; // 用于rcu的回调结构 struct rcu_head rcu; };

同一个宿主设备下的vlan组信息

struct vlan_group { // 该vlan组中的vlan设备个数 unsigned int nr_vlan_devs; // 哈希链表节点,vlan组是通过全局变量hash链表链接在一起的 struct hlist_node hlist; // 记录了该vlan组中包含的所有vlan虚拟设备 struct net_device **vlan_devices_arrays[VLAN_PROTO_NUM] [VLAN_GROUP_ARRAY_SPLIT_PARTS]; };

vlan设备私有信息

struct vlan_dev_priv { // 入口优先级映射个数 unsigned int nr_ingress_mappings; // 入口优先级map u32 ingress_priority_map[8]; // 出口优先级映射个数 unsigned int nr_egress_mappings; // 出口优先级map struct vlan_priority_tci_mapping *egress_priority_map[16]; // vlan协议 __be16 vlan_proto; // vlan id u16 vlan_id; // vlan标志 u16 flags; // 真实宿主网络设备 struct net_device *real_dev; // 真实宿主设备引用基数跟踪器 netdevice_tracker dev_tracker; // 真实宿主网络设备地址 unsigned char real_dev_addr[ETH_ALEN]; // proc文件系统目录 struct proc_dir_entry *dent; // 每个cpu上的vlan统计信息 struct vlan_pcpu_stats __percpu *vlan_pcpu_stats; #ifdef CONFIG_NET_POLL_CONTROLLER // netpoll机制支持:linux内核提供了一种方式,在内核挂掉(crash)的时候,设备驱动仍然可以接收和发送数据,相应的API被称作Netpoll struct netpoll *netpoll; #endif }; 每个vlan设备都有一个私有空间vlan_dev_prev,注意区别于vlan_net

vlan ioctl命令

/* Passed in vlan_ioctl_args structure to determine behaviour. */ enum vlan_ioctl_cmds { // 添加vlan ADD_VLAN_CMD, // 删除vlan DEL_VLAN_CMD, // 设置vlan入口优先级 SET_VLAN_INGRESS_PRIORITY_CMD, // 设置vlan出口优先级 SET_VLAN_EGRESS_PRIORITY_CMD, // 获取vlan入口优先级 GET_VLAN_INGRESS_PRIORITY_CMD, // 获取vlan出口优先级 GET_VLAN_EGRESS_PRIORITY_CMD, // 设置vlan名字风格 SET_VLAN_NAME_TYPE_CMD, // 设置vlan flag SET_VLAN_FLAG_CMD, // 获取vlan真实宿主设备名称 GET_VLAN_REALDEV_NAME_CMD, /* If this works, you know it's a VLAN device, btw */ // 获取vlan id GET_VLAN_VID_CMD /* Get the VID of this VLAN (specified by name) */ };

vlan ioctl参数

struct vlan_ioctl_args { // 上面的vlan_ioctl_cmds枚举之一 int cmd; /* Should be one of the vlan_ioctl_cmds enum above. */ // 用户传入的设备名,用于内核查找实际对应的设备调用ADD_VLAN_CMD时,该参数传入的是vlan的宿主设备名,调用SET_VLAN_NAME_TYPE_CMD时,该参数不用填,调用其他命令时,该参数传入的是vlan设备名 char device1[24]; union { // vlan设备名 char device2[24]; // vlan id int VID; unsigned int skb_priority; unsigned int name_type; unsigned int bind_type; unsigned int flag; /* Matches vlan_dev_priv flags */ } u; short vlan_qos; };


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何读取properties或yml文件数据并匹配
下一篇:如何选择适合的服务器【5大注意事项】?(服务器区域怎么选择)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~