




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一关于全局变量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,如相应的vlan存在,指针指向vlan信息块的地址,否则为空。分析:他有六个属性字段,第一个是usVID:用于存放它自己的vlanID号;第二个字段是 szVlanName:用于存放vlan的名字;第三个字段是portMap:用于存放属于这个vlan的端口的端口列表;第四个字段是pAssoVlan;第五个字段是usRegAdmCtrl;第六个字段是:usTxUnTag;3第三个字段是pSwPortTabMAX_PHYPORT_NUM+MAX_LAG_NUM+1,其是指向交换机端口的指针数组;其中存放的是交换机各个端口的状态及信息;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_RANGE()宏;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,然后就直接调用函数createVlan(),并传入类型VLAN_TYPE_UNIVERSAL;6而对于函数createVlan():61此函数首先是加锁;62然后根据类型调用相应的函数,因为创建vlan的时候传入的类型为VLAN_TYPE_UNIVERSAL,故调用createUniversalVlan()创建vlan,621对于函数createUniversalVlan():因为刚创建vlan的时候,此vlan暂时不存在,其相应的指针都为空,故其将会跳过函数setUniversalVlan()而直接调用函数createOneVlan()来创建vlan,其类型为VLAN_TYPE_UNIVERSAL;在函数createOneVlan()中,其先分配vlan信息记录块的空间,然后将其初始化,接着调用函数drvInsertVlan()在交换机上创建vlan,最后将此段空间和全局变量g-vlanTAB联系起来,并在全局变量中填充相关的vlan信息(如端口列表,事件列表等);622在函数createUniversalVlan()中接下来是遍历交换机上的所有端口,跳过类型为PORT_TYPE_AGG_MEMBER和PORT_TYPE_ROUTER的端口,在其他的端口类型中,如果端口的工作模式为Trunk模式则处理方式为:如果端口的pVID等于当前的vlan-ID则就将当端口加入到当前vlan中去;如果端口的允许通过的vlan链表中有当前的vlan-ID号,那么也将端口加入到当前vlan中;其他情况就跳过;如果端口的工作模式为Access模式其处理方式为:如果端口的pVID等于当前的vlan-ID号,那么就将端口加入到当前vlan中,否则就跳过;623在函数createUniversalVlan()中的最后是调用函数updateVlanPortMap(VlanEntry_T *pVlanEntry, Port_T *pPortMap)更新vlan的端口列表,然后删除不用的空间,到此就可以返回OK了;63然后是解锁;到此就基本完成了vlan的创建工作;7如果有命名参数则由CLI调用setVlanName_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$取消某命令或配置交换机缺省值,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,而函数destroyVlan()又调用函数destroyOneVlan()来进行处理,并在处理的过程中需要用到全局变量来进行加锁;31其中函数destroyOneVlan()首先在全局变量g_VlanTAB中的pvlantab指针数组字段中查看是否有该ID号的vlan(即指针pvlantabv-id非空),如没有则返回错误,否则交进一步处理; 32对于交换机的每一个端口(包括物理端口和逻辑端口)进行遍历,首先判断它端口类型是否为PORT_TYPE_AGG_MEMBER类型,如是,则跳过该端口检查下一个;否则检查该端口的工作模式,并根据不同的工作模式进行相应的处理;33如为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列表中删除,如是为空则直接调用函数delAssoPortFromVlan(VlanEntry_T *pVlanEntry, PORTID_T portID)将端口从当前vlan的端口列表中删除掉;(3)最后就可以跳出switch语句了;34如为PORT_MODE_ACCESS模式,处理方式为:检查pSwPort-usPVID字段看此端口所属的vlan是否为将要删除的vlan,如是则调用函数setSwPortAccVlanBySwPort()进行处理(将指定端口的所属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) 如为:VLAN_TYPE_DYNAMIC,VLAN_TYPE_UNIVERSAL和VLAN_TYPE_INTERNAL,处理方式为:直接跳过这一阶段。(6) 如为其他的值,处理方式为:返回error。37最后调用函数deleteOneVlan()来删除指定的vlan,并将全局变量的相应字段的值置空;就可以返回ok了。(1) 在函数deleteOneVlan()中,首先调用函数notifyVlanEvent()进行事件通知:其具体处理过程为:首先声明一个vlan消息变量,并将其消息号设置成删除vlan; :然后分配一个VlanVlanEvent_T类型的空间,并将其填充将要删除的vlan的信息,然后将其作为消息变量的内容;最后调用函数msgQSend()将消息发送出去。(2) 接着调用函数drvDeleteVlan()来删除交换机上的vlan; (3) 最后是调用函数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$该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 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()中,其先做一些基本的条件检测,然后采用加锁的方式对vlan的名字进行设定,进行名字设定的函数是updateVlanName();(3) 在函数updateVlanName()中,同样是先进行基本的检测,然后是将vlan的名字写入临时变量中(如有指定名字则写指定名字,如无指定名字则写入默认名字);如指定的名字和vlan的当前名字相同,则直接返回ok,否则交下一步处理;(4) 首先遍历全局变量g_VlanTAB中的所有vlan节点,检查是否已经有别的vlan名字和当前要指定的vlan的名字相同,如有就返回error;否则就将临时变量中的vlan的名字拷贝到全局变量g_VlanTAB中的相应字段中去,最后就可以返回ok了;(5) 到此就完成了vlan的命名。(二):删除vlan的名字(恢复vlan的默认名字)其函数调用关系和vlan的名字的设置的函数调用关系相同,不同的是在删除vlan的名字的时候,函数setVlanName_sh()传入的名字参数字符串指针为空。五为交换机分配端口:命令:分配命令: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=CONTEXT VLANID Switchport information$交换端口信息, Interface information$接口信息, Ethernet interface$以太网接口, Port-Channel$以太网接口, 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 information$交换端口信息, 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中。:在函数addAccPortsToVlan_sh()中首先调用函数format_port_name()将用户输入的参数列表转化为交换机所能识别的标准形式返回并带有差错功能(如输入错误就返回error);:然后就调用函数setSwPortAccVlan_sh()将交换端口列表中的端口号依次加入到指定的vlan中去,最后再将用过的地址空间释放掉;到此就完成了vlan的交换端口的分配。而在函数中setSwPortAccVlan_sh()中它的具体操作为:(1) 首先通过调用函数getSerialDevByName()将交换端口的名字转化为对应的交换端口id号;(2) 然后调用函数setSwPortAccVlan()将指定的端口加入到指定的vlan中去;而在函数setSwPortAccVlan()中其操作过程为:在对传入的端口ID和vlan号进行必须的检查之后就调用函数setSwPortAccVlanBySwPort(PORTID_T portID,UINT16_T usVID)来完成工作,并且在调用此函数时需对全局变量做加锁处理; (3) 在函数setSwPortAccVlanBySwPort()中验证合法性后,首先调用函数delAssoPortFromVlan(VlanEntry_T *pVlanEntry, PORTID_T portID)在指定的端口原来所属的vlan中将指定的端口删除(即将端口在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的工作就完成了。(二).删除命令:其操作过程和上面的分配命令基本相同,不同的只是删除的时候是将将要删除的端口固定加入到vlan1中去。六设置交换机端口工作模式:命令:1switchport mode trunk | access;2no switchport mode trunk | access功能:1设置当前端口为trunk或access端口;2取消设置当前端口的工作模式(即恢复成为默认的工作模式:access模式)原码命令:1CLI (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 (no_switchport_mode_cli, no_switchport_mode_cli_cmd, /* no*switchport*mode*(access)*(InterfaceName) */ 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()来检测用户当前的端口列表中是否只有一个端口,如是就直接调用函数setSwPortMode_sh()将指定的端口设置成指定的端口类型;如不是只有一个端口则:先调用函数format_port_name()将用户输入的端口列表格式化为标准的形式,然后依次调用函数setSwPortMode_sh()将所有指定的端口设置成指定的端口类型;2 在函数setSwPortMode_sh(CHAR_T *szIfName, INT32_T uMode)中,其再根据传入的用户设定的端口工作模式调用函数setSwPortMode(PORTID_T portID,UINT16_T usMode)将指定的端口的工作模式设置成为指定的工作模式;3 在函数setSwPortMode()中其进行必要的检查后调用函数setSwPortModeBySwPort(PORTID_T portID,UINT16_T usMode)来进行处理,而在调用此函数的时候需要用到全局变量进行加锁;4 而在函数setSwPortModeBySwPort()中首先是检查端口的存在性和当前端口是否已经设置成为了当前的模式(如果已经设置成为了当前的工作模式那就没有必要再次设置了,直接返回ok就可以了),然后就调用函数updatePortMode(SwitchPort_T *pSwPort, UINT16_T usMode)来设置端口的工作模式;5 在函数updatePortMode()中首先将全局变量中的端口信息块中的usPVID字段设置为系统默认的PVID,然后就是usMode字段设置为指定的模式,接着就是清空端口的pAllowed链表,发送端口的工作模式改变的事件;最后就返回到函数setSwPortModeBySwPort()中继续执行;6 在函数setSwPortModeBySwPort()中接下来的处理为:针对端口的不同工作模式进行不同的处理,如果工作模式为ACCESS则遍历交换机中的所有vlan,将当前端口加入到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 portID)将vlan中的当前端口删除掉,否则就将当前端口加入到vlan中去并置标记usTag置成VLAN_PORT_TX_TAG(vlan1除外,它的usTag为VLAN_PORT_TX_UNTAG),最后调用函数setPVIDBySerialDev()将端口的PVID设置为系统默认的PVID; 7 最后释放不用的空间返回结果(成功 或 错误);(二):取消交换机端口特性设置(或者是恢复交换机端口特性的默认设置):它的工作过程和上面的工作过程相同,只是它将端口的工作模式恢复成为ACCESS模式(系统的默认模式)七设置trunk端口允许通过的vlan列表:命令及功能: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),/InterfaceName=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_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 characteristics 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列表设置成当前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; (2).如果szAllowVlans不为空(即指定了vlan列表),则调用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).在函数setSwPortTrkAllowVlan()中,其首先根据不同配置做不同的预处理(用不同的宏分割),最后调用函数setSwPortTrkAllowVlanBySwPort(PORTID_T portID,VIDLstNode_T* pVlanLst)进行处理,在调用此函数的时候要对全局变量进行加锁,处理完后要进行解锁; (6).在函数setSwPortTrkAllowVlanBySwPort()中,先判断指定的port是否存在,如果存在,那它是否工作在trunk模式下;然后将当前的允许通过的vlan列表与用户指定的vlan列表相比较,如果相同则就不必额外的设置了,否则就检查链表中的各个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).在函数addAssoPortToVlan()中需要根据不同的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,PORTID_T portID)判断当前的端口的设置是否和即将要设置的设置是否相同,如果相同就没有必要再次设置了直接返回ok,否则调用函数insertToPortLst(Port_T *ppPortLstHead,PORTID_T portID, UINT16_T usTag)将当前端口加入到指定的vlan的portmap中去并填充相应的usTag字段,接着是调用函数drvUpdateVlan(VlanEntry_T *pVlanEntry)来更新vlan的设置,最后是将相应的事件消息发送出去,到此就可以返回ok了; (8).在函数delAssoPortFromVlan(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的端口列表中,如不在,表示已经删除了,所以就直接返回,已完成了操作;如在则调用函数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 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, /* 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 ID $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$设置交换机端口特性, 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 ()将当前端口的PVID设置成指定的PVID;2 在函数setSwPortTrkNativeVlan_sh ()中其处理过程为:(1).首先判断指定的端口名字是否存在,如果存在则调用函数setSwPortTrkNativeVlan(PORTID_T portID,UINT16_T usVID)来进行处理,否则返回错误;(2).在函数setSwPortTrkNativeVlan()中也是根据不同的配置做不同的处理(不同的配置用不同的宏分割),但是最后都将调用函数setSwPortTrkNativeVlanBySwPort(PORTID_T portID,UINT16_T usVID)进行处理,在此处理过程中需要用全局变量进行加锁和解锁; (3).在函数setSwPortTrkNativeVlanBySwPort()中首先是对端口及端口工作模式的合法性验证,然后检查端口的PVID,如果它与指定的PVID相同则直接返回OK,不必重新设置;否则再检查PVID的合法性,端口当前的PVID是否存在以及指定的PVID是否存在;然后根据PVID的不同属性(由usType字段指定)来判断设置的可行性,如果可行则转入(4),否则返回ERROR; (4).首先将端口在全局变量g_VlanTAB中的对应的信息块的PVID字段设置成为指定的PVID;接着,如果端口的允许通过的Vlan列表为空或者在端口的允许通过的vlan列表中可以找到指定的PVID,就调用函数addAssoPortToVlan(VlanEntry_T *pVlanEntry, PORTID_T portID, UINT16_T usTag)进行处理,否则调用函数delAssoPortFromVlan(VlanEntry_T *pVlanEntry, PORTID_T portID)进行处理; (5).在函数addAssoPortToVlan()中首先是端口的和相应的vlan(包括端口的当前PVID和即将要设置的PVID所对应的vlan)以及端口的工作模式等的合法性检查;然后是将全局变量的端口信息块对应的PVID字段填充为即将要设置的PVID,接着是条件判断:如果端口的允许通过的vlan的列表为空或者在端口的允许通过的vlan列表中能找到端口原来的PVID对应的vlan,那么就将当前端口加入到端口原来的PVID所对应的vlan中去并将vlan的信息块的usTxUnTag字段填充为VLAN_PORT_TX_TAG;否则将当前端口从端口原来的PVID所对应的vlan中的portmap中删除掉;然后接着是将当前端口加入到将要设置的PVID对应的vlan中的portmap中去;再接着是调用函数setPVIDBySerialDev(struct SerialDev *sdev , unsigned short pvid)来在物理交换机上将端口的PVID更新为设定值;最后是将端口的PVID值改变的事件消息发送出去并返回ok; (6).到此,函数的功能就完成了;3 到此,此命令就完成了。(二):删除交换机trunk端口的PVID:No switchport trunk native vlan在此的操作过程和上面的操作过程基本相同,不同的是在此是将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=IFNAMESet switching port characteristics$设置交换机端口特性,Set access mode characteristics of the interface$设置端口的中继模式,Set Vlan when interface is in access mode$接入模式下的Vlan,Vlan ID $Vlan标示符 )CLI (no_switchport_access_cli,no_switchport_access_cli_cmd,/* no*switchport*access*vlan*(VlanID)*(InterfaceName) */no switchport access vlan,/VlanID=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$接入模式下的Vlan)原码分析:(一):设置交换机端口加入指定的vlan1首先是调用宏CLI_GET_INTEGER_RANGE()取得用户输入的v
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 03 第11讲 圆周运动 【答案】听课手册
- Module 5Unit 3 Language practice (2) 说课稿 2023-2024学年外研版八年级英语上册
- 三 经济全球化的世界说课稿高中历史人民版必修第二册-人民版2004
- 保姆家政知识培训内容课件
- 口腔业务知识培训资料课件
- 高级验光师考试题及答案
- 钢铁企业考试题库及答案
- Unit 1 I wanted to see the Beijing Opera.说课稿初中英语外研版2012八年级上册-外研版2012
- 全国江西科学技术版小学信息技术三年级上册第二单元第5课《在线学习有平台》教学设计
- 保健知识培训纪实课件
- 《深圳市工程建设监理合同》标准文本
- 音乐情感及情绪 课件-2024-2025学年高中音乐人音版(2019)必修 音乐鉴赏
- DB14T 2922-2023 公路机电工程标准工程量清单及计量规范
- 新苏教版科学五年级上册《热对流》课件
- 2024年03月黑龙江省绥化市2024年度“市委书记进校园”引才活动引进1523名人才(第一阶段)笔试历年典型考题及考点研判与答案解析
- 喉癌“一病一品”
- 公路养护安全作业规程-公路养护作业安全的规定
- 新概念英语青少版入门 A-Unit-1课件(共98张)
- 建筑垃圾减量化专项方案
- 2023全国技能竞赛-职业素养考核试题及答案
- 实验室搅拌器实验室搅拌器安全操作及保养规程
评论
0/150
提交评论