vlan源代码学习

上传人:jin****ng 文档编号:198519091 上传时间:2023-04-08 格式:DOCX 页数:11 大小:40.82KB
收藏 版权申诉 举报 下载
vlan源代码学习_第1页
第1页 / 共11页
vlan源代码学习_第2页
第2页 / 共11页
vlan源代码学习_第3页
第3页 / 共11页
资源描述:

《vlan源代码学习》由会员分享,可在线阅读,更多相关《vlan源代码学习(11页珍藏版)》请在装配图网上搜索。

1、一关于全局变量 g_Vlan_TAB: 此全局变量用于存放当前的交换机上的所有 vlan 信息。1.首先他的第一个字段是:EventQ_T eventQ;结构体EventQ_T的原形是:typedef struct EventQ_S*EventQ_T;分析:(1) 整个程序维护一个事件链表,每个节点存放有:指向下一个节点的指针,指向事件 函数的指针,事件函数的优先级;三个属性段。2他的第二个字段是:VlanEntry *pVlanTABMAX_VID_NUM,其中 MAX_VLAN_NUM 的值 是4096,其中存储的是交换机所能容纳的最大的vlan数目;此数组的下标即vlan的vlan-id

2、,如相应的 vlan存在,指针指向vlan信息块的地址,否则为空。分析:他有六个属性字段,第一个是usVID:用于存放它自己的vlanID号;第二个字 段是szVlanName:用于存放vlan的名字;第三个字段是portMap :用于存放属于这个vlan的端口的端口 列表;第四个字段是pAssoVlan;第五个字段是usRegAdmCtrl;第六个字段是:usTxUnTag;3 .第三个字段是 pSwPortTabMAX_PHYPORT_NUM+MAX_LAG_NUM+1,其是指向交换机端 口的指针数组;其中存放的是交换机各个端口的状态及信息;4第四个字段是rwLock,他用于对全局变量读写

3、的锁定;5.第五个字段是evtLock,用于对事件的锁定;二. vlan 的创建: 命令: vlan 功能:创建vlan并且进入vlan配置模式,在vlan模式中,用户可以配置vlan名称和为该vlan分 配交换机端口;源码命令: CLI (vlan_cli, vlan_cli_cmd, vlan (name WORD|), Vlan Commands$VLAN 命令, Vlan ID $Vlan 标示符 , Vlan name$VLAN 描述,Name$ 描述)源码分析:1 首先调用 GLI_GET_INTEGER_RANGE()宏;2然后由 GLI_GET_INTEGER_RANGE()宏

4、调用 cmd_str2int()将 vlanId号字符 串转换为相应的数值,并将数值返回;3然后由GLI_GET_INTEGER_RANGE()宏检测返回的数值,并作出相应的 判断;4然后再调用fetchConfigVlan()并将vlanId号作为传入参数进行检测;5.然后再由fetchConfigVlan()调用getVlanType()取得此vlanId号对应的类 型,因为创建vlan的时候此vlan还不存在,函数不会改变他的类型,所以他得到的类型是 VLAN_TYPE_ALL,然后就直接调用函数 createVlan(),并传入类型 VLAN_TYPE_UNIVERSAL;6 .而对于

5、函数createVlan():6. 1.此函数首先是加锁;6. 2然后根据类型调用相应的函数,因为创建vlan的时候传入的类 型为 VLAN_TYPE_UNIVERSAL,故调用 createUniversalVlan()创建 vlan,6. 2. 1.对于函数 createUniversalVlan():因为刚创建 vlan 的时候,此vlan暂时不存在,其相应的指针都为空,故其将会跳过函数setUniversalVlan()而直接调用函数 createOneVlan()来创建 vlan,其类型为 VLAN_TYPE_UNIVERSAL;在函数 createOneVlan()中,其先分配 v

6、lan信息记录块的空间,然后将其初始化,接着调用函数drvInsertVlan()在交换机上创建vlan,最后将此 段空间和全局变量g-vlanTAB联系起来,并在全局变量中填充相关的vlan信息(如端口列表,事件列表 等);6. 2. 2.在函数createUniversalVlan()中接下来是遍历交换 机上的所有端口,跳过类型为PORT_TYPE_AGG_MEMBER和PORT_TYPE_ROUTER的端口,在其他的 端口类型中,如果端口的工作模式为Trunk模式则处理方式为:如果端口的pVID等于当前的vlan-ID则 就将当端口加入到当前vlan中去;如果端口的允许通过的vlan链表

7、中有当前的vlan-ID号,那么也将端口 加入到当前vlan中;其他情况就跳过;如果端口的工作模式为Access模式其处理方式为:如果端口的 pVID等于当前的vlan-ID号,那么就将端口加入到当前vlan中,否则就跳过;6. 2. 3.在函数createUniversalVlan()中的最后是调用函数 updateVlanPortMap(VlanEntry_T *pVlanEntry, Port_T *pPortMap)更新 vlan 的端 口列表,然后删除不用的空 间,到此就可以返回 OK 了;6. 3然后是解锁;到此就基本完成了 vlan的创建工作;7如果有命名参数则由CLI调用set

8、VlanName_sh(),而它又调用 setVlanName(),由 setVlanName()来完成 vlan 名字的设定;8 .函数setVlanName()首先调用RWPRI_writeLock()来锁定对vlan名字的写, 接着调用updateVlanName()来更新vlan的名字,最后再调用函数RWPRI_writeUnlock()将其解锁;三.Vlan的删除: 命令: no vlan 功能:删除指定的 vlan 源码命令: CLI (no_vlan_cli,no_ vlan_cli_cmd,no vlan ,Negate a command or set its default

9、$取消某命令或配置交换机缺省值, Vlan Commands$VLAN 命令,Vlan ID $Vlan 标示符 )源码分析:1. 首先由CLI调用宏CLI_GET_INTEGER_RANGE()来取得用户输入的将要删除的 vlan 的 ID 号;2. 然后由CLI调用函数deleteVlan_sh()并以vlan的ID号为参数传入;3. 然后再由函数deleteVlan_sh()调用函数getVlanType()得到此vlan的类型然后由函数 deleteVlan_sh()判断该类型的vlan是否可以删除,如否,返回ERROR,否则调用函 数 destroyVlan()来删除 vlan,而函

10、数 destroyVlan()又调用函数 destroyOneVlan()来进 行处理,并在处理的过程中需要用到全局变量来进行加锁;3. 1 .其中函数destroyOneVlan()首先在全局变量g_VlanTAB中的pvlantab指 针数组字段中查看是否有该ID号的vlan(即指针pvlantabv-id非空),如没有则 返回错误,否则交进一步处理;3. 2.对于交换机的每一个端口(包括物理端口和逻辑端口)进行遍历,首先判 断它端口类型是否为PORT_TYPE_AGG_MEMBER类型,如是,则跳过该端 口检查下一个;否则检查该端口的工作模式,并根据不同的工作模式进行相应 的处理;3.

11、3.如为 PORT_MODE_TRUNK 模式处理方式为: (1 )首先检查pSwPort-usPVID字段看此端口所属的vlan是否为将 要删除的 vlan,如是则调用函数 setSwPortTrkNativeVlanBySwPort(pSwPort- portID, DEFAULT_PVID)进行处理(将指定端口的PVID改为默认vlan,即 vlan-1);(2) 然后检查端口的允许通过的vlan列表是否为空,如不是则将当 前vlan-ID从端口的允许通过的vlan列表中的删除掉并同时将它从当前vlan的 port-map 列表中删除,如是为空则直接调用函数 delAssoPortFro

12、mVlan(VlanEntry_T *pVlanEntry, PORTID_T portID) 将端口从当 前vlan的端口列表中删除掉;(3) 最后就可以跳出switch语句了;3. 4.如为PORT_MODE_ACCESS模式,处理方式为: 检查pSwPort-usPVID字段看此端口所属的vlan是否为将要删除的 vlan,如是则调用函数setSwPortAccVlanBySwPort()进行处理(将指定端口的所 属vlan改为默认vlan,即vlan-1,来删除指定的vlan的端口);3. 5.如为其他模式,不做处理,直接交给后面的程序;3. 6.接着检查vlan的ustype字段做相

13、应的处理:(1) 如为:VLAN_TYPE_PRIMARY,则调用函数 setAssoPVlan();(2) 如为:VLAN_TYPE_COMMUNITY 和 VLAN_TYPE_ISOLATE, 处理方式为:(3) 如为:VLAN_TYPE_MCASTASSOC 处理方式为:(4) 如为: VLAN_TYPE_MULTICAST ,处理方式为:直接将全局变 量 multicastVlanNum 赋值为零;(5) 如为:VLAN_TYPE_DYNAMIC,VLAN_TYPE_UNIVERSAL和 VLAN_TYPE_INTERNAL,处理方式为:直接跳过这一阶段。(6) 如为其他的值,处理方式

14、为:返回 error。3. 7.最后调用函数deleteOneVlan()来删除指定的vlan,并将全局变量的相应 字段的值置空;就可以返回ok 了。(1)在函数deleteOneVlan()中,首先调用函数notifyVlanEvent()进行事 件通知:其具体处理过程为:首先声明一个vlan消息变量,并将其消息号设置成删除vlan;:然后 分配一个VlanVlanEvent_T类型的空间,并将其填充将要删除的vlan的信息, 然后将其作为消息变量的内容;最后调用函数msgQSend()将消息发送出 去。(2) 接着调用函数drvDeleteVlan()来删除交换机上的vlan;(3) 最后

15、是调用函数freeVlanEntry()来释放空间;4.到此删除vlan的CLI命令分析完成。四设置删除当前vlan的名字: 命令及功能:name 设置 vlan 的名字no name删除vlan的名字(或者称:恢复vlan的默认名字)原码命令:(一):CLI (name_vlanname_cli, name_vlanname_cli_cmd, /* name*(VlanID) */ name WORD, /VlanID=CONTEXT VLANID Set Vlan unique name$设置 Vlan 名称,The unique name of this Vlan character$该

16、 Vlan 唯一的名称 字符)(二):CLI (no_name_vlanname_cli, no_name_vlanname_cli_cmd, /* no*name*(VlanName)*(VlanID) */ no name,/VlanName=null; VlanID=CONTEXT VLANIDNegate a command or set its default$取消某命令或配置交换机缺省值, Set Vlan unique name$设置 Vlan 名称);原码分析:(一) :设置vlan的名字:1. 首先调用函数cmd_str2int()来取得将被命名的vlan的id号;2. 检查

17、输入的vlan的名字的字符串长度是否满足条件,如否返回error;3. 然后调用函数setVlanName_sh(),来设置vlan的名字;(1) 函数setVlanName_sh()将任务直接交给函数setVlanName()来完成;(2) 在函数setVlanName()中,其先做一些基本的条件检测,然后采用加锁的方式 对vlan的名字进行设定,进行名字设定的函数是updateVlanName();(3) 在函数updateVlanName()中,同样是先进行基本的检测,然后是将vlan的名 字写入临时变量中(如有指定名字则写指定名字,如无指定名字则写入默认名 字);如指定的名字和vlan

18、的当前名字相同,则直接返回ok,否则交下一步处 理;(4) 首先遍历全局变量g_VlanTAB中的所有vlan节点,检查是否已经有别的vlan 名字和当前要指定的vlan的名字相同,如有就返回error;否则就将临时变量 中的vlan的名字拷贝到全局变量g_VlanTAB中的相应字段中去,最后就可以 返回ok 了;(5) 到此就完成了 vlan的命名。(二) :删除vlan的名字(恢复vlan的默认名字)其函数调用关系和vlan的名字的设置的函数调用关系相同,不同的是在删除 vlan的名字的时候,函数setVlanName_sh()传入的名字参数字符串指针为空。五.为交换机分配端口: 命令:分

19、配命令: switchport interface 删除命令: no switchport interface 功能:将指定的端口列表分配给当前的vlan;或将指定的端口列表从当前vlan中删除掉。(默认 的端口工作模式为access模式)原码命令:分配命令:CLI (switchport_if_cli, switchport_if_cli_cmd, /*switchport*interface*ethernet|port-channel*(VlanID) */ switchport interface (ethernet|port-channel |) IFNAME,/VlanID=CONT

20、EXT VLANID Switchport information$ 交换端口信息,Interface information* 接口信息, Ethernet interface* 以太网接口, Port-Channel$ 以太网接口,Interface name or number$ft 口名称或序号)删除命令:CLI (no_switchport_if_cli, no_switchport_if_cli_cmd, /* no*switchport*interface*ethernet|port-channel*(VlanID) */ no switchport interface (eth

21、ernet|port-channel |) IFNAME,/VlanID=CONTEXT VLANID Negate a command or set its default$取消某命令或配置交换机缺省值, Switchport information$ 交换端口信息, Interface information$ 接口信息, Ethernet interface$ 以太网接口,Port-Channel$ 以太网接口, Interface name or number$ft 口名称或序号)原码分析:(一).分配命令:1. 首先根据参数的个数来确定交换端口列表及其类型(是e x/x/x还是ex/

22、x/x);2. 然后调用函数cmd_str2int ()来取得当前vlan的vid号;3. 最后调用函数addAccPortsToVlan_sh()来将交换端口列表加入到指定的vlan中。:在函数addAccPortsToVlan_sh()中首先调用函数format_port_name()将用户输入 的参数列表转化为交换机所能识别的标准形式返回并带有差错功能(如输入错误就 返回 error); :然后就调用函数setSwPortAccVlan_sh()将交换端口列表中的端口号依次加入到 指定的vlan中去,最后再将用过的地址空间释放掉;到此就完成了 vlan的交换端 口的分配。而在函数中set

23、SwPortAccVlan_sh()中它的具体操作为:(1) 首先通过调用函数getSerialDevByName()将交换端口的名字转化为对应的 交换端口 id号;(2) 然后调用函数setSwPortAccVlan(將指定的端口加入到指定的vlan中去; 而在函数setSwPortAccVlan()中其操作过程为:在对传入的端口 ID和vlan 号进行必须的检查之后就调用函数 setSwPortAccVlanBySwPort(PORTID_T portID,UINT16_T usVID)来完成工作,并且在调用此函数时需对全局变量 做加锁处理;(3) 在函数setSwPortAccVlanB

24、ySwPort()中验证合法性后,首先调用函数 delAssoPortFromVlan(VlanEntry_T *pVlanEntry, PORTID_T portID) 在指定 的端口原来所属的vlan中将指定的端口删除(即将端口在vlan的portmap 链表中的对应节点删除),然后就调用函数 addAssoPortToVlan(VlanEntry_T *pVlanEntry, PORTID_T portID, UINT16_T usTag)将指定的端口加入当前的vlan中(即在当前vlan的 portmap 链表中增加相应的节点),接着就调用函数 setPVIDBySerialDev(s

25、truct SerialDev *sdev , unsigned short pvid)将端口的 PVID设置成为当前vlan;(4) 到此,将端口加入到vlan的工作就完成了。(二).删除命令: 其操作过程和上面的分配命令基本相同,不同的只是删除的时候是将将要删除 的端口固定加入到 vlan1 中去。六.设置交换机端口工作模式: 命令:1. switchport mode trunk | access;2. no switchport mode trunk | access1设置当前端口为 trunk 或 access 端口;2取消设置当前端口的工作模式(即恢复成为默认的工作模式:acces

26、s模式) 原码命令:1 CLI (switchport_mode_cli,switchport_mode_cli_cmd,/* switchport*mode*access|trunk*(InterfaceName) */ switchport mode (access|trunk), /InterfaceName=IFNAME Set switching port characteristics* 设置交换机端口特性, Set trunking mode of the interface$ 置端口的中继模式, Access mode$ 接入模式, Trunk mode$ 中继模式)2CLI

27、(no_switchport_mode_cli,no_switchport_mode_cli_cmd,/* no*switchport*mode*(access)*(InterfaceName) */no switchport mode,/access=0;InterfaceName=IFNAMENegate a command or set its default$取消某命令或配置交换机缺省值, Set switching port characteristics$ 设置交换机端口特性, Set trunking mode of the interface$ 置端口的中继模式)原码分析:(一

28、) :设置交换机端口特性:1 首先调用函数pal_is_has_only_one_port()来检测用户当前的端口列表中是否只有一 个端口,如是就直接调用函数setSwPortMode_sh()将指定的端口设置成指定的端口 类型;如不是只有一个端口则:先调用函数format_port_name()将用户输入的端口 列表格式化为标准的形式,然后依次调用函数setSwPortMode_sh()将所有指定的端 口设置成指定的端口类型;2 在函数 setSwPortMode_sh(CHAR_T *szIfName, INT32_T uMode) 中,其再根据传入 的用户设定的端口工作模式调用函数set

29、SwPortMode(PORTID_T portID,UINT16_T usMode)将指定的端口的工作模式设置成为指定的工作模式;3. 在函数setSwPortMode()中其进行必要的检查后调用函数 setSwPortModeBySwPort(PORTID_T portID,UINT16_T usMode)来进行处理,而在调 用此函数的时候需要用到全局变量进行加锁;4. 而在函数setSwPortModeBySwPort()中首先是检查端口的存在性和当前端口是否已 经设置成为了当前的模式(如果已经设置成为了当前的工作模式那就没有必要再次 设置了,直接返回ok就可以了),然后就调用函数upd

30、atePortMode(SwitchPort_T *pSwPort, UINT16_T usMode)来设置端口的工作模式;5. 在函数updatePortMode()中首先将全局变量中的端口信息块中的usPVID字段设置 为系统默认的PVID,然后就是usMode字段设置为指定的模式,接着就是清空端 口的pAllowed链表,发送端口的工作模式改变的事件;最后就返回到函数 setSwPortModeBySwPort()中继续执行;6. 在函数setSwPortModeBySwPort()中接下来的处理为:针对端口的不同工作模式进 行不同的处理,如果工作模式为ACCESS则遍历交换机中的所有v

31、lan,将当前端 口加入到vlan1中去,在其它的vlan中如果包含当前端口则在那些vlan中将当前端 口删除掉,最后调用函数 setPVIDBySerialDev(struct SerialDev *sdev , unsigned short pvid)将端口的PVID设置为系统默认的PVID ;如果工作模式为TRUNK模式则同 样是遍历交换机中的所有vlan,对于vlan类型既不为VLAN_TYPE_DYNAMIC类 型也不为VLAN_TYPE_UNIVERSAL的vlan就调用函数 delAssoPortFromVlan(VlanEntry_T *pVlanEntry, PORTID_T

32、 portID)将 vlan 中的当前 端口删除掉,否则就将当前端口加入到vlan中去并置标记usTag置成 VLAN_PORT_TX_TAG (vlan1 除外,它的 usTag 为 VLAN_PORT_TX_UNTAG ),最后调用函数 setPVIDBySerialDev(將端口的 PVID 设置为系统默认的 PVID;7 最后释放不用的空间返回结果(成功或错误);(二) :取消交换机端口特性设置(或者是恢复交换机端口特性的默认设置):它的工作过程和上面的工作过程相同,只是它将端口的工作模式恢复成为 ACCESS模式(系统的默认模式)七设置 trunk 端口允许通过的 vlan 列表:

33、命令及功能:1 Switchport trunk allowed vlan | all 设置 trunk 端口允许通过的 vlan。 2 No switchport trunk allowed vlan 删除 trunk 端口允许通过的 vlan。原码命令:1CLI (switchport_trunk_allowed_cli, switchport_trunk_allowed_cli_cmd, /* switchport*trunk*allowed*vlan*all|*(InterfaceName) */ switchport trunk allowed vlan (all|WORD),/In

34、terfaceName=IFNAME Set switching port characteristics* 设置交换机端口特性,Set trunking characteristics of the interface$ 置接口的中继模式特性, Set allowed VLAN characteristics$allowed Vlan 特性, Set allowed Vlans$设置 allowed Vlan , Set all Vlan IDs$设置全部 Vlan ID, Vlan id$Vlan 标示符)2CLI (no_switchport_trunk_allowed_cli, no_

35、switchport_trunk_allowed_cli_cmd, /* no*switchport*trunk*allowed*vlan*(all)*(VIDList)*(InterfaceName) */ no switchport trunk allowed vlan,/all=0;VIDList=null; InterfaceName=IFNAME Negate a command or set its default$取消某命令或配置交换机缺省值, Set switching port characteristics$ 设置交换机端口特性, Set trunking characte

36、ristics of the interface$ 置接口的中继模式特性, Set allowed VLAN characteristics$allowed Vlan 特性, Set allowed Vlans$设置 allowed Vlan)原码分析:(一):设置 trunk 端 口允许通过的 vlan 列表:Switchport trunk allowed vlan | all1. 首先调用函数pal_is_has_only_one_port()来检测用户当前的trunk端口列表中是否只 有一个端口,如是就直接调用函数setSwPortTrkAllowVlan_sh()将指定的vlan列表

37、 设置成当前trunk端口允许通过的vlan;如有多个端口,则先调用函数 format_port_name ()将端口列表格式化为系统标准的端口列表形式,然后依次对每个 端口调用函数setSwPortTrkAllowVlan_sh()将指定的vlan列表设置成当前trunk端口 允许通过的vlan列表;2. 在函数 setSwPortTrAllowVlan_sh(CHAR_T *szIfName,CHAR_T *szAllowVlans,INT32_T nAll)中其操作过程为:(1).先调用getSerialDevByName()取得端口的portID ; .如果 szAllowVlans

38、不为空(即指定了 vlan 列表),则调用 CheckNoList(CHAR_T* szNoList,VIDLstNode_T *ppVlanLst);.在 CheckNoList()中,其先检查数字链的合法 性,并将字符串的数字链解析为整数数组形式的数字链;然后调用 insertToVIDLst(VIDLstNode_T *ppVIDLstHead,UINT16_T usVID)将数字链添加成为 VIDLstNode_T 的结构体链表; (4).接着调用 setSwPortTrkAllowVlan(PORTID_T portID,VIDLstNode_T* pVlanLst); (5).在函

39、数 setSwPortTrkAllowVlan()中,其首先根据 不同配置做不同的预处理(用不同的宏分割),最后调用函数 setSwPortTrkAllowVlanBySwPort(PORTID_T portID,VIDLstNode_T* pVlanLst)进行处理, 在调用此函数的时候要对全局变量进行加锁,处理完后要进行解锁; (6).在函数 setSwPortTrkAllowVlanBySwPort()中,先判断指定的port是否存在,如果存在,那它是 否工作在trunk模式下;然后将当前的允许通过的vlan列表与用户指定的vlan列表相比 较,如果相同则就不必额外的设置了,否则就检查链

40、表中的各个vlan是否都满足条 件,如果都满足就将原来的允许通过的vlan列表删除,拷贝上新设置的;最后对交换 机上的所有vlan,其中在允许通过的vlan列表中的vlan则调用函数 addAssoPortToVlan(VlanEntry_T *pVlanEntry, PORTID_T portID,UINT16_T usTag )将 vlan设置为允许通过;其中不在允许通过的vlan列表中的vlan则调用函数 delAssoPortFromVlan(VlanEntry_T* pVlanEntry,PORTID_T portID)将 vlan 设置为不允许 通过;(7).在函数addAssoP

41、ortToVlan()中需要根据不同的vlan类型(usType字段)做不同 的处理,所以当类型为 VLAN_TYPE_DYNAMIC、VLAN_TYPE_UNIVERSAL、 VLAN_TYPE_INTERNAL、VLAN_TYPE_MULTICAST 时其处理方式为:调用函数 addVlanAssoPort(VlanEntry_T *pVlanEntry, PORTID_T portID, UINT16_T usTag);在函 数addVlanAssoPort()中首先判断指定的vlan和端口的合法性,然后调用函数 findSwPortInLst(Port_T *pVIDLstHead,P

42、ORTID_T portID) 判断当前的端口的设置是否和 即将要设置的设置是否相同,如果相同就没有必要再次设置了直接返回Ok,否则调用 函数 insertToPortLst(Port_T *ppPortLstHead,PORTID_T portID, UINT16_T usTag)将当前 端口加入到指定的vlan的portmap中去并填充相应的usTag字段,接着是调用函数 drvUpdateVlan(VlanEntry_T *pVlanEntry)来更新vlan的设置,最后是将相应的事件消息 发送出去,到此就可以返回ok 了; (8).在函数delAssoPortFromVlan(Vlan

43、Entry_T *pVlanEntry, PORTID_T portID)中同样也是要根据不同的vlan类型(usType字段)做不同 的处理,所以当类型为:VLAN_TYPE_DYNAMIC、VLAN_TYPE_UNIVERSAL、 VLAN_TYPE_INTERNAL、VLAN_TYPE_MULTICAST 时,其处理方式为:调用函数 delVlanAssoPort(VlanEntry_T *pVlanEntry, PORTID_T portID) ;在函数 delVlanAssoPort() 中首先判断指定的端口是否在指定的vlan的端口列表中,如不在,表示已经删除了, 所以就直接返回,

44、已完成了操作;如在则调用函数deleteFromPortLst(Port_T *ppPortLstHead,PORTID_T portID)将其删除,然后调用函数 drvUpdateVlan(VlanEntry_T *pVlanEntry)更新,最后调用函数 notifyVlanEvent(UINT32_T uEvent,VOID_T *pPara)做删除事件通知;(9).到此,函数 setSwPortTrAllowVlan_sh()的功能就完成了。3 释放用过的空间,并返回操作结果;(二):恢复trunk端口允许通过的vlan为系统默认的vlan列表:No switchport trunk

45、allowed vlan 它的工作过程和上面的设置trunk端口允许通过的vlan列表的操作过程基本相 同,不同的是在此过程中是将trunk的允许通过的vlan设置为全部vlan都允许 通过。八:设置删除trunk端口的PVID 命令及功能:1 Switchport trunk native vlan 设置 trunk 端口的 pvid。2 No switchport trunk native vlan 删除 trunk 端口的 pvid。原码命令:1CLI (switchport_trunk_native_cli, switchport_trunk_native_cli_cmd, /* sw

46、itchport*trunk*native*vlan*(InterfaceName) */ switchport trunk native vlan ,/InterfaceName=IFNAME Set switching port characteristics* 设置交换机端口特性, Set trunking characteristics of the interface$ 置接口的中继模式特性, Set native characteristics$ 设置本地特性, Set native Vlan$置本地 Vlan, Vlan ID $Vlan ID )2CLI (no_switchp

47、ort_trunk_native_cli, no_switchport_trunk_native_cli_cmd, /* no*switchport*trunk*native*vlan*(VlanID)*(InterfaceName) */ no switchport trunk native vlan,/VlanID=1;InterfaceName=IFNAME Negate a command or set its default$取消某命令或配置交换机缺省值, Set switching port characteristics$ 设置交换机端口特性, Set trunking char

48、acteristics of the interface$ 置接口的中继模式特性, Set native characteristics$ 设置本地特性, Set native Vlan$置本地 Vlan)原码分析:(一):设置交换机 trunk 端口的 PVID: Switchport trunk native vlan 1.首先调用函数pal_is_has_only_one_port()来检测用户当前的trunk端口列表中 是否只有一个端口,如是就直接调用函数 setSwPortTrkNativeVlan_sh(CHAR_T *szIfName,UINT32_T uNativeVlan)来

49、将当 前端口的PVID设置成为指定的PVID,如有多个端口,则先调用函数 format_port_name ()将端口列表格式化为系统标准的端口列表形式,然后依次 对每个端口调用函数setSwPortTrkNativeVlan_sh ()将当前端口的PVID设置成 指定的 PVID;2 在函数 setSwPortTrkNativeVlan_sh ()中其处理过程为: (1).首先判断指定的端 口名字是否存在,如果存在则调用函数 setSwPortTrkNativeVlan(PORTID_T portID,UINT16_T usVID)来进行处理,否则返回错误;.在函数 setSwPortTrk

50、NativeVlan ()中也是根据不同的配置做不同的处理(不同的配置用 不同的宏分割),但是最后都将调用函数 setSwPortTrkNativeVlanBySwPort(PORTID_T portID,UINT16_T usVID)进行处 理,在此处理过程中需要用全局变量进行加锁和解锁; (3).在函数 setSwPortTrkNativeVlanBySwPort()中首先是对端口及端口工作模式的合法性 验证,然后检查端口的PVID,如果它与指定的PVID相同则直接返回0K, 不必重新设置;否则再检查PVID的合法性,端口当前的PVID是否存在以及 指定的PVID是否存在;然后根据PVID

51、的不同属性(由usType字段指定)来判 断设置的可行性,如果可行则转入(4),否则返回ERROR;首先将端口在 全局变量g_VlanTAB中的对应的信息块的PVID字段设置成为指定的PVID; 接着,如果端口的允许通过的Vlan列表为空或者在端口的允许通过的vlan列 表中可以找到指定的PVID,就调用函数addAssoPortToVlan(VlanEntry_T *pVlanEntry, PORTID_T portID, UINT16_T usTag )进行处理,否则调用函数 delAssoPortFromVlan(VlanEntry_T *pVlanEntry, PORTID_T por

52、tID)进行处理; (5).在函数addAssoPortToVlan()中首先是端口的和相应的vlan (包括端口的当 前PVID和即将要设置的PVID所对应的vlan)以及端口的工作模式等的合法 性检查;然后是将全局变量的端口信息块对应的PVID字段填充为即将要设置 的PVID,接着是条件判断:如果端口的允许通过的vlan的列表为空或者在端 口的允许通过的vlan列表中能找到端口原来的PVID对应的vlan,那么就将 当前端口加入到端口原来的PVID所对应的vlan中去并将vlan的信息块的 usTxUnTag字段填充为VLAN_PORT_TX_TAG ;否则将当前端口从端口原来 的PVID

53、所对应的vlan中的portmap中删除掉;然后接着是将当前端口加入到 将要设置的PVID对应的vlan中的portmap中去;再接着是调用函数 setPVIDBySerialDev(struct SerialDev *sdev , unsigned short pvid)来在物理交换 机上将端口的PVID更新为设定值;最后是将端口的PVID值改变的事件消息 发送出去并返回 ok; (6).到此,函数的功能就完成了;3 到此,此命令就完成了。(二):删除交换机 trunk 端口的 PVID: No switchport trunk native vlan在此的操作过程和上面的操作过程基本相同,

54、不同的是在此是将trunk端口的 PVID固定设置成为系统默认的PVID。九:设置 access 端口:命令:switchport access vlan no switchport access vlan功能:将当前端口加入/退出指定的 vlan原码命令:CLI (switchport_access_cli,switchport_access_cli_cmd,/* switchport*access*vlan*(InterfaceName) */ switchport access vlan , /InterfaceName=IFNAME Set switching port charact

55、eristics$ 设置交换机端口特性, Set access mode characteristics of the interface$ 设置端口的中继模式, Set Vlan when interface is in access mode$ft入模式下的 Vlan, Vlan ID $Vlan 标示符 )CLI (no_switchport_access_cli,no_switchport_access_cli_cmd,/* no*switchport*access*vlan*(VlanID)*(InterfaceName) */no switchport access vlan,/V

56、lanID=1; InterfaceName=IFNAMENegate a command or set its default$取消某命令或配置交换机缺省值, Set switching port characteristics$ 设置交换机端口特性,Set access mode characteristics of the interface$ 设置端口的中继模式,Set Vlan when interface is in access mode$ft入模式下的 Vlan)原码分析:(一):设置交换机端口加入指定的 vlan1. 首先是调用宏CLI_GET_INTEGER_RANGE()

57、取得用户输入的vlan的ID 号;2. 然后调用函数pal_is_has_only_one_port()来判断用户当前命令模式下是一个 还是一组端口号,如是一个则调用函数 setSwPortAccVlan_sh(CHAR_T *szIfName,UINT32_T uAccVlan)来 将当前端口加入到指定的vlan中去;3. 在函数setSwPortAccVlan_sh()中首先对当前端口做正确性判断,然后调用 函数 setSwPortAccVlan(PORTID_T portID,UINT16_T usVID),而它又调用函数 setSwPortAccVlanBySwPort(PORTID_

58、T portID,UINT16_T usVID),并在调用此函数时还要对它进行加锁;4. 在函数setSwPortAccVlanBySwPort()中,首先是对相应的端口及vlan的正 确性检查,然后判断指定的端口是否已经被设置为了指定vlan的端口,是就直接返回ok,否则就进行下 一步;5. 接下来先调用函数 delAssoPortFromVlan(VlanEntry_T *pVlanEntry, PORTID_T portID),当前端口如果原来属于别的vlan,那么首先要在此端口原来属于的vlan中的portmap 链表中将此端口删除,此函数的作用就是完成此功能;在函数delAssoPo

59、rtFromVlan()中,它首先根据vlan 的不同类型进行不同的处理,接着就调用函数delVlanAssoPort(VlanEntry_T *pVlanEntry, PORTID_T portID),它首先检查当前端口的合法性(它是否在vlan的portmap链表中),如果不存在就表示已经删 除,不需要额外的处理了直接返回ok,否则调用函数deleteFromPortLst(Port_T *ppPortLstHead,PORTID_T portID)将当前端口从vlan的portmap链表中删除,再调用函数 deleteFromPortLst(Port_T *ppPortLstHead,P

60、ORTID_T portID)更新 vlan,并发送端口被删除的消息。到此在 当前端口原来属于的vlan就将此端口从它的portmap链表中删除了;6. 然后调用函数 addAssoPortToVlan(VlanEntry_T *pVlanEntry, PORTID_T portID, UINT16_T usTag)将当前端口加入到指定的vlan中去;在函数addAssoPortToVlan()中,它首先根据 指定的vlan的不同类型做不同的处理,然后就调用函数addVlanAssoPort(VlanEntry_T *pVlanEntry, PORTID_T portID, UINT16_T

61、usTag)将当前端口加入到指定的 vlan 中,在函数 addVlanAssoPort()中,首先 是调用函数 findSwPortInLst(Port_T *pVIDLstHead,PORTID_T portID)在 vlan的 portmap 链表中找当前端 口,如果找到就直接返回 ok,否则就调用函数 insertToPortLst(Port_T *ppPortLstHead,PORTID_T portID, UINT16_T usTag)将当前端口加入到指定的vlan中去,最后调用函数drvUpdateVlan(VlanEntry_T *pVlanEntry)来更新指定的vlan,并

62、将端口加入vlan的消息发送出去。7. 最后在函数 setSwPortAccVlanBySwPort(PORTID_T portID,UINT16_T usVID) 中接下来调用函数 setPVIDBySerialDev(struct SerialDev *sdev , unsigned short pvid)将端口的 PVID 设置为指 定vlan;到此就完全完成了将当前端口加入到指定vlan的功能了。(二):将当前端口从它所属的vlan中删除此功能的处理过程和将交换机端口加入到指定的vlan去的处理过程完全相同,不同的只是后者是由用户指定vlan,而前者是固定vlan1 (即默认的vlan

63、)。十:配置 private VLAN命令及功能: private-vlan primary|isolated|community 将当前 vlan设置成 private VLAN no private-vlan 将当前 private VLAN 还原成普通 vlan原码命令:1 . CLI (private_vlan_cli, private_vlan_cli_cmd, /* private-vlan*primary|community|isolated*(VlanID) */ private-vlan (primary|community|isolated), /VlanID=CONTEXT VLANID Configure private vlan$配置私有 Vlan,Configure the Vlan as a primary private VLAN$配置为基本 Vlan,Configure the Vlan as a community private VLAN$配置

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!