收藏 分享(赏)

vlan源代码学习.doc

上传人:wspkg9802 文档编号:7049334 上传时间:2019-05-04 格式:DOC 页数:11 大小:150KB
下载 相关 举报
vlan源代码学习.doc_第1页
第1页 / 共11页
vlan源代码学习.doc_第2页
第2页 / 共11页
vlan源代码学习.doc_第3页
第3页 / 共11页
vlan源代码学习.doc_第4页
第4页 / 共11页
vlan源代码学习.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、第 1 页 共 11 页一关于全局变量 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 数目;此数组的下

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

3、4第四个字段是 rwLock,他用于对全局变量读写的锁定;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_R

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

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

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

7、的 vlan-ID 则就将当端口加入到当前 vlan 中去;如果端口的允许通过的 vlan 链表中有当前的 vlan-ID 号,那么也将端口加入到当前 vlan 中;其他情况就跳过;如果端口的工作模式为 Access 模式其处理方式为:如果端口的pVID 等于当前的 vlan-ID 号,那么就将端口加入到当前 vlan 中,否则就跳过;623在函数 createUniversalVlan()中的最后是调用函数updateVlanPortMap(VlanEntry_T *pVlanEntry, Port_T *pPortMap)更新 vlan 的端口列表,然后删除不用的空间,到此就可以返回 OK

8、 了;63然后是解锁;到此就基本完成了 vlan 的创建工作;第 2 页 共 11 页7如果有命名参数则由 CLI 调用 setVlanName_sh(),而它又调用setVlanName(),由 setVlanName()来完成 vlan 名字的设定;8函数 setVlanName()首先调用 RWPRI_writeLock()来锁定对 vlan 名字的写,接着调用 updateVlanName()来更新 vlan 的名字,最后再调用函数 RWPRI_writeUnlock()将其解锁;三Vlan 的删除:命令:no vlan 功能:删除指定的 vlan源码命令:CLI (no_vlan_c

9、li,no_vlan_cli_cmd,“no vlan “,“Negate a command or set its default$取消某命令或配置交换机缺省值“,“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 的类型然

10、后由函数deleteVlan_sh()判断该类型的 vlan 是否可以删除,如否,返回 ERROR,否则调用函数 destroyVlan()来删除 vlan,而函数 destroyVlan()又调用函数 destroyOneVlan()来进行处理,并在处理的过程中需要用到全局变量来进行加锁;31其中函数 destroyOneVlan()首先在全局变量 g_VlanTAB 中的 pvlantab 指针数组字段中查看是否有该 ID 号的 vlan(即指针 pvlantabv-id非空) ,如没有则返回错误,否则交进一步处理; 32对于交换机的每一个端口(包括物理端口和逻辑端口) 进行遍历,首先判断

11、它端口类型是否为 PORT_TYPE_AGG_MEMBER 类型,如是,则跳过该端口检查下一个;否则检查该端口的工作模式,并根据不同的工作模式进行相应的处理;33如为 PORT_MODE_TRUNK 模式处理方式为:(1)首先检查 pSwPort-usPVID 字段看此端口所属的 vlan 是否为将要删除的 vlan,如是则调用函数 setSwPortTrkNativeVlanBySwPort(pSwPort-portID, DEFAULT_PVID)进行处理 ( 将指定端口的 PVID 改为默认 vlan,即vlan-1);(2)然后检查端口的允许通过的 vlan 列表是否为空,如不是则将当

12、前 vlan-ID 从端口的允许通过的 vlan 列表中的删除掉并同时将它从当前 vlan的 port-map 列表中删除,如是为空则直接调用函数delAssoPortFromVlan(VlanEntry_T *pVlanEntry, PORTID_T portID)将端口从当前 vlan 的端口列表中删除掉;(3)最后就可以跳出 switch 语句了;34如为 PORT_MODE_ACCESS 模式,处理方式为:检查 pSwPort-usPVID 字段看此端口所属的 vlan 是否为将要删除的vlan,如是则调用函数 setSwPortAccVlanBySwPort()进行处理(将指定端口的

13、所属 vlan 改为默认 vlan,即 vlan-1,来删除指定的 vlan 的端口);35如为其他模式,不做处理,直接交给后面的程序;36接着检查 vlan 的 ustype 字段做相应的处理:(1) 如为:VLAN_TYPE_PRIMARY,则调用函数 setAssoPVlan();(2) 如为:VLAN_TYPE_COMMUNITY 和 VLAN_TYPE_ISOLATE,处理方式为:(3) 如为:VLAN_TYPE_MCASTASSOC 处理方式为:(4) 如为:VLAN_TYPE_MULTICAST,处理方式为:直接将全局变量 multicastVlanNum 赋值为零;(5) 如为

14、:VLAN_TYPE_DYNAMIC,VLAN_TYPE_UNIVERSAL 和VLAN_TYPE_INTERNAL,处理方式为:直接跳过这一阶段。(6) 如为其他的值,处理方式为:返回 error。37最后调用函数 deleteOneVlan()来删除指定的 vlan,并将全局变量的相应字段的值置空;就可以返回 ok 了。(1) 在函数 deleteOneVlan()中,首先调用函数 notifyVlanEvent()进行事件通知:其具体处理过程为:第 3 页 共 11 页:首先声明一个 vlan 消息变量,并将其消息号设置成删除 vlan; :然后 1 2分配一个 VlanVlanEven

15、t_T 类型的空间,并将其填充将要删除的 vlan 的信息,然后将其作为消息变量的内容; 最后调用函数 msgQSend()将消息发送出去。 3(2) 接着调用函数 drvDeleteVlan()来删除交换机上的 vlan;(3) 最后是调用函数 freeVlanEntry()来释放空间;4 到此删除 vlan 的 CLI 命令分析完成。四设置删除当前 vlan 的名字:命令及功能:name 设置 vlan 的名字no name 删除 vlan 的名字(或者称:恢复 vlan 的默认名字)原码命令:(一):CLI (name_vlanname_cli,name_vlanname_cli_cmd

16、,/* name*(VlanID) */“name WORD“, /VlanID=CONTEXT VLANID“Set Vlan unique name$设置 Vlan 名称“,“The unique name of this Vlan character$该 Vlan 唯一的名称 字符“)(二):CLI (no_name_vlanname_cli,no_name_vlanname_cli_cmd,/* no*name*(VlanName)*(VlanID) */“no name“, /VlanName=null; VlanID=CONTEXT VLANID“Negate a command

17、or set its default$取消某命令或配置交换机缺省值“,“Set Vlan unique name$设置 Vlan 名称“) ;原码分析:(一):设置 vlan 的名字:1 首先调用函数 cmd_str2int()来取得将被命名的 vlan 的 id 号;2 检查输入的 vlan 的名字的字符串长度是否满足条件,如否返回 error;3 然后调用函数 setVlanName_sh(),来设置 vlan 的名字;(1) 函数 setVlanName_sh()将任务直接交给函数 setVlanName()来完成;(2) 在函数 setVlanName()中,其先做一些基本的条件检测,

18、然后采用加锁的方式对 vlan 的名字进行设定,进行名字设定的函数是 updateVlanName();(3) 在函数 updateVlanName()中,同样是先进行基本的检测,然后是将 vlan 的名字写入临时变量中(如有指定名字则写指定名字,如无指定名字则写入默认名字);如指定的名字和 vlan 的当前名字相同,则直接返回 ok,否则交下一步处理;(4) 首先遍历全局变量 g_VlanTAB 中的所有 vlan 节点,检查是否已经有别的 vlan名字和当前要指定的 vlan 的名字相同,如有就返回 error;否则就将临时变量中的 vlan 的名字拷贝到全局变量 g_VlanTAB 中的

19、相应字段中去,最后就可以返回 ok 了;(5) 到此就完成了 vlan 的命名。(二):删除 vlan 的名字(恢复 vlan 的默认名字)其函数调用关系和 vlan 的名字的设置的函数调用关系相同,不同的是在删除vlan 的名字的时候,函数 setVlanName_sh()传入的名字参数字符串指针为空。五为交换机分配端口:命令:分配命令:switchport interface 删除命令:no switchport interface 功能:将指定的端口列表分配给当前的 vlan;或将指定的端口列表从当前 vlan 中删除掉。(默认的端口工作模式为 access 模式)原码命令:分配命令:第

20、 4 页 共 11 页CLI (switchport_if_cli,switchport_if_cli_cmd,/*switchport*interface*ethernet|port-channel*(VlanID) */“switchport interface (ethernet|port-channel |) IFNAME“,/VlanID=CONTEXT VLANID“Switchport information$交换端口信息“,“Interface information$接口信息“,“Ethernet interface$以太网接口“,“Port-Channel$以太网接口“,“

21、Interface name or number$接口名称或序号“)删除命令:CLI (no_switchport_if_cli,no_switchport_if_cli_cmd,/* no*switchport*interface*ethernet|port-channel*(VlanID) */“no switchport interface (ethernet|port-channel |) IFNAME“,/VlanID=CONTEXT VLANID“Negate a command or set its default$取消某命令或配置交换机缺省值“,“Switchport info

22、rmation$交换端口信息“,“Interface information$接口信息“,“Ethernet interface$以太网接口“,“Port-Channel$以太网接口“,“Interface name or number$接口名称或序号“)原码分析:(一).分配命令:1 首先根据参数的个数来确定交换端口列表及其类型(是 e x/x/x 还是 ex/x/x) ;2 然后调用函数 cmd_str2int ()来取得当前 vlan 的 vid 号;3 最后调用函数 addAccPortsToVlan_sh()来将交换端口列表加入到指定的 vlan 中。:在函数 addAccPorts

23、ToVlan_sh()中首先调用函数 format_port_name()将用户输入 1的参数列表转化为交换机所能识别的标准形式返回并带有差错功能(如输入错误就返回 error);:然后就调用函数 setSwPortAccVlan_sh()将交换端口列表中的端口号依次加入到 2指定的 vlan 中去,最后再将用过的地址空间释放掉;到此就完成了 vlan 的交换端口的分配。而在函数中 setSwPortAccVlan_sh()中它的具体操作为:(1) 首先通过调用函数 getSerialDevByName()将交换端口的名字转化为对应的交换端口 id 号;(2) 然后调用函数 setSwPort

24、AccVlan()将指定的端口加入到指定的 vlan 中去;而在函数 setSwPortAccVlan()中其操作过程为:在对传入的端口 ID 和 vlan号进行必须的检查之后就调用函数 setSwPortAccVlanBySwPort(PORTID_T portID,UINT16_T usVID)来完成工作,并且在调用此函数时需对全局变量做加锁处理; (3) 在函数 setSwPortAccVlanBySwPort()中验证合法性后,首先调用函数delAssoPortFromVlan(VlanEntry_T *pVlanEntry, PORTID_T portID)在指定的端口原来所属的 v

25、lan 中将指定的端口删除(即将端口在 vlan 的 portmap链表中的对应节点删除),然后就调用函数addAssoPortToVlan(VlanEntry_T *pVlanEntry, PORTID_T portID, UINT16_T usTag)将指定的端口加入当前的 vlan 中(即在当前 vlan 的portmap 链表中增加相应的节点),接着就调用函数setPVIDBySerialDev(struct SerialDev *sdev , unsigned short pvid)将端口的PVID 设置成为当前 vlan;(4) 到此,将端口加入到 vlan 的工作就完成了。(二)

26、.删除命令:其操作过程和上面的分配命令基本相同,不同的只是删除的时候是将将要删除的端口固定加入到 vlan1 中去。六设置交换机端口工作模式:命令:1switchport mode trunk | access;2no switchport mode trunk | access第 5 页 共 11 页功能:1设置当前端口为 trunk 或 access 端口;2取消设置当前端口的工作模式(即恢复成为默认的工作模式:access 模式)原码命令:1CLI (switchport_mode_cli,switchport_mode_cli_cmd,/* switchport*mode*access

27、|trunk*(InterfaceName) */“switchport mode (access|trunk)“, /InterfaceName=IFNAME“Set switching port characteristics$设置交换机端口特性“,“Set trunking mode of the interface$设置端口的中继模式“,“Access mode$接入模式“,“Trunk mode$中继模式“)2CLI (no_switchport_mode_cli,no_switchport_mode_cli_cmd,/* no*switchport*mode*(access)*(I

28、nterfaceName) */“no switchport mode“, /access=0; InterfaceName=IFNAME“Negate a command or set its default$取消某命令或配置交换机缺省值“,“Set switching port characteristics$设置交换机端口特性“,“Set trunking mode of the interface$设置端口的中继模式“)原码分析:(一):设置交换机端口特性:1 首先调用函数 pal_is_has_only_one_port()来检测用户当前的端口列表中是否只有一个端口,如是就直接调用函

29、数 setSwPortMode_sh()将指定的端口设置成指定的端口类型;如不是只有一个端口则:先调用函数 format_port_name()将用户输入的端口列表格式化为标准的形式,然后依次调用函数 setSwPortMode_sh()将所有指定的端口设置成指定的端口类型;2 在函数 setSwPortMode_sh(CHAR_T *szIfName, INT32_T uMode)中,其再根据传入的用户设定的端口工作模式调用函数 setSwPortMode(PORTID_T portID,UINT16_T usMode)将指定的端口的工作模式设置成为指定的工作模式;3 在函数 setSwPo

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

31、de()中首先将全局变量中的端口信息块中的 usPVID 字段设置为系统默认的 PVID,然后就是 usMode 字段设置为指定的模式,接着就是清空端口的 pAllowed 链表,发送端口的工作模式改变的事件;最后就返回到函数setSwPortModeBySwPort()中继续执行;6 在函数 setSwPortModeBySwPort()中接下来的处理为:针对端口的不同工作模式进行不同的处理,如果工作模式为 ACCESS 则遍历交换机中的所有 vlan,将当前端口加入到 vlan1 中去,在其它的 vlan 中如果包含当前端口则在那些 vlan 中将当前端口删除掉,最后调用函数 setPVI

32、DBySerialDev(struct SerialDev *sdev , unsigned short pvid)将端口的 PVID 设置为系统默认的 PVID;如果工作模式为 TRUNK 模式则同样是遍历交换机中的所有 vlan,对于 vlan 类型既不为VLAN_TYPE_DYNAMIC 类型也不为 VLAN_TYPE_UNIVERSAL 的 vlan 就调用函数 delAssoPortFromVlan(VlanEntry_T *pVlanEntry, PORTID_T portID)将 vlan 中的当前端口删除掉,否则就将当前端口加入到 vlan 中去并置标记 usTag 置成VLA

33、N_PORT_TX_TAG(vlan1 除外,它的 usTag 为 VLAN_PORT_TX_UNTAG),最后调用函数 setPVIDBySerialDev()将端口的 PVID 设置为系统默认的 PVID; 7 最后释放不用的空间返回结果(成功 或 错误) ;(二):取消交换机端口特性设置(或者是恢复交换机端口特性的默认设置):它的工作过程和上面的工作过程相同,只是它将端口的工作模式恢复成为ACCESS 模式(系统的默认模式)七设置 trunk 端口允许通过的 vlan 列表:第 6 页 共 11 页命令及功能:1 Switchport trunk allowed vlan | all 设

34、置 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)“,/InterfaceName=IFNAME“Set switching port character

35、istics$设置交换机端口特性“,“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_switchport_trunk_allowed_cli_cmd,/* no*sw

36、itchport*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 characteristics of the interface$设置接口的中继模式特性“,“S

37、et 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 列表设置成当前 trunk 端口允许通过的 vlan;如有多个端口,则

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

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

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

41、,如果都满足就将原来的允许通过的 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).在函数 addAssoPortToVlan

42、()中需要根据不同的 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 和端口的合法性,然后调用函数第 7 页 共 11 页findSwPortInLst(Port_T *pVIDLstHe

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

44、Vlan(VlanEntry_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 的端口列表中,如不在,表示已经删除了

45、,所以就直接返回,已完成了操作;如在则调用函数 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 s

46、witchport trunk 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_tr

47、unk_native_cli_cmd,/* switchport*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 I

48、D $Vlan ID “)2CLI (no_switchport_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$

49、设置交换机端口特性“,“Set trunking characteristics 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)来将当前端口的 PVID 设置成为指定的 PVID,如有多个端口,则先调用函数format_port_name()将端口列表格式化为系统标准的端口列表形式,然后依次对每个端口调用函数 setSwPortTrkNativeVlan_sh

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报