发明内容
有鉴于此,本发明一方面提供一种实现灵活QinQ的方法,该方法能够降低成本。
本发明另一方面提供一种实现灵活QinQ的设备,该设备的成本比较低。
本发明所提供的实现灵活QinQ的方法,包括:预先在芯片中设置灵活QinQ配置策略所需数据,该方法还包括:
A、接收报文,根据所接收报文的内、外层虚拟局域网标识VLAN ID以及优先级从灵活QinQ配置策略所需数据中进行查询;通过查询从灵活QinQ配置策略数据中获取所需数据;
B、使用所获取的数据对报文进行QinQ操作。
较佳地,预先在芯片中还设置普通QinQ配置策略所需数据;则步骤A中在接收到报文后,进一步包括:
根据所接收报文的外层VLAN ID从普通QinQ配置策略所需数据中获取配置策略类型;
根据获取的配置策略类型,确定使用普通QinQ配置策略所需数据或灵活QinQ配置策略所需数据;
若确定使用普通QinQ配置策略所需数据,则从普通QinQ配置策略数据中获取所需数据;
若确定使用灵活QinQ配置策略所需数据,则执行所述根据所接收报文的内、外层VLAN ID以及优先级从灵活QinQ配置策略数据中进行查询的操作。
较佳地,预先在芯片中设置标签协议标识TPID,并且该TPID可由用户根据需要进行配置,供进行QinQ操作时使用。
其中,所述确定使用的数据的方法为:若所述配置策略类型显示为选用普通QinQ配置策略所需数据,则确定使用普通QinQ配置策略所需数据;若配置策略类型显示为选用灵活QinQ配置策略所需数据,则确定使用灵活QinQ配置策略所需数据。
其中,所述普通QinQ配置策略所需数据和灵活QinQ配置策略所需数据分别存储在第一表和第二表中。
其中,若确定使用第二表中的数据,则所述根据所接收报文的内、外层VLAN ID以及优先级从灵活QinQ配置策略所需数据中进行查询,具体包括:
A1、根据所述第一表中的掩码取值对所接收报文的内、外层VLAN ID以及优先级进行掩码,并对掩码结果进行哈希计算,利用哈希计算结果查询第二表,得到第二表中与哈希计算结果对应的当前表项;
A2、判断当前表项中的VLAN ID和优先级是否分别与报文的VLAN ID和优先级一致,如果一致,则从当前表项中执行所述获取所需数据的操作,结束;否则,执行步骤A3;
A3、利用当前表项中的链表子节点地址查询第二表中的下一个表项,之后返回执行步骤A2。
其中,所述根据获取的配置策略类型,确定使用普通QinQ配置策略所需数据或灵活QinQ配置策略所需数据之前进一步包括:根据所述第一表中的操作类型的值,确定QinQ的操作类型。
其中,所述获取所需数据之前,进一步包括:从所确定的数据中获取操作类型的值,根据所获取的操作类型的值,确定QinQ的操作类型。
其中,所述确定QinQ的操作类型为添QinQ封装操作;
若确定从第一表中获取所需数据,则所述获取所需数据具体包括:
B 1、从所述第一表的表项中读取新VLAN ID的值作为新虚拟局域网标签VLAN Tag的VLAN ID;
B2、判断第一表的表项中的优先级类型,如果优先级类型为更换优先级,执行步骤B3;否则,执行步骤B4;
B3、从第一表的表项中读取新优先级的值作为新VLAN Tag的优先级,然后执行步骤B;
B4、取出原VLAN Tag的优先级作为新VLAN Tag的优先级;
则所述步骤B为:利用新VLAN ID、新优先级以及从芯片中获取的标签协议标识TPID完成添QinQ封装操作。
其中,所述确定QinQ的操作类型为添QinQ封装操作;
若确定从第二表中获取所需数据,则所述获取所需数据具体包括:
C1、从所述第二表的表项中读取新外层VLAN ID的值作为新VLAN Tag的VLAN ID,读取新优先级的值作为新VLAN Tag的优先级;
则步骤B具体为:利用新VLAN ID、新优先级以及从芯片中获取的标签协议标识完成添QinQ封装操作。
其中,所述确定QinQ的操作类型为去QinQ封装操作;
该方法还包括:将所述报文的外层VLAN Tag去掉,还原成普通报文。
其中,所述确定QinQ的操作类型为变换QinQ封装操作;
若确定从第一表中获取所需数据,则所述获取所需数据具体包括:
D1、从所述第一表的表项中读取新VLAN ID的值替换报文外层VLANTag的VLAN ID;
D2、判断表项中的优先级类型,如果优先级类型为更换优先级,执行步骤D3;否则,执行步骤B;
D3、从表项中读取新优先级的值替换外层VLAN Tag的优先级;
则所述步骤B为:利用新VLAN ID、新优先级完成变换QinQ封装操作。
其中,所述确定QinQ的操作类型为变换QinQ封装操作;
若确定从第二表中获取所需数据,则所述获取所需数据具体包括:
从所述第二表的表项中读取新外层VLAN ID的值替换外层VLAN Tag的VLAN ID,读取新内层VLAN ID的值替换内层VLAN Tag的VLAN ID,读取新优先级的值替换外层VLAN Tag的优先级;
则所述步骤B为:利用新外层VLAN ID、新内层VLAN ID以及新优先级完成变换QinQ封装操作。
其中,所述根据所接收报文的内、外层VLAN ID以及优先级从灵活QinQ配置策略所需数据中进行查询为:将内、外层VLAN ID以及优先级的线性组合作为索引从灵活QinQ配置策略所需数据中进行查询;或将内、外层VLAN ID以及优先级进行哈希计算的结果作为索引从灵活QinQ配置策略所需数据中进行查询。
其中,所述从灵活QinQ配置策略数据中获取所需数据之前进一步包括:从灵活QinQ配置策略数据获取QinQ操作类型,根据所确定的QinQ操作类型,获取所需数据。
其中,所述确定的QinQ操作类型为:添QinQ封装操作,则所述获取所需数据具体包括:
E1、从所述灵活QinQ配置策略数据读取新VLAN ID的值作为新VLANTag的VLAN ID;
E2、判断灵活QinQ配置策略数据中的优先级类型,如果优先级类型为更换优先级,执行步骤E3;否则,执行步骤E4;
E3、从灵活QinQ配置策略数据中读取新优先级的值作为新VLAN Tag的优先级,然后执行步骤B;
E4、取出原VLAN Tag的优先级作为新VLAN Tag的优先级;
则所述步骤B为:利用新VLAN ID、新优先级以及从芯片中获取的标签协议标识TPID完成添QinQ封装操作。
其中,所述确定的QinQ操作类型为:变换QinQ封装操作,则所述获取所需数据具体包括:
根据灵活QinQ配置策略数据中掩码的类型,获取变换QinQ封装所需的数据;
则步骤B具体为:根据所获取的数据完成变换QinQ封装操作。
本发明所提供的实现灵活QinQ的设备包括:中央处理器CPU、至少一个灵活QinQ接口板、二层交换芯片、普通低速接口板,其中,灵活QinQ接口板包括至少一个端口,
CPU,对灵活QinQ接口板的每个端口和二层交换芯片进行配置,并对存储在灵活QinQ接口板每个端口中的进行灵活QinQ操作所需数据进行配置;
普通低速接口板,接收来自用户网络的普通报文,将接收的报文传送给二层交换芯片;接收来自二层交换芯片转发的去掉外层VLAN Tag的VALN报文,发送给用户网络;
二层交换芯片,接收来自普通低速接口板的普通报文,将该普通报文转发给灵活QinQ接口板;接收来自灵活QinQ接口板的去QinQ封装后的报文,将报文转发给普通低速接口板;接收来自灵活QinQ接口板的变换QinQ封装后的报文,将报文转发给其它灵活QinQ接口板,或转发给该灵活QinQ接口板的其它端口;
灵活QinQ接口板的每个端口接收来自二层交换芯片的报文,使用进行灵活QinQ操作所需数据对报文进行添QinQ封装操作,并将添QinQ封装后的报文发送给骨干网络,或将接收到的报文直接发送给骨干网络;接收来自骨干网络的报文,使用进行灵活QinQ操作所需数据对报文进行去QinQ封装或变换QinQ封装操作,将操作后的报文发送给二层交换芯片;
所述进行灵活QinQ操作所需数据存储在灵活QinQ接口板的每个端口中。
较佳地,该设备进一步包括:普通高速接口板,接收来自所述二层交换芯片转发的变换QinQ封装后的报文,将所接收的报文发送给骨干网络;
所述二层交换芯片进一步用于:接收来自灵活QinQ接口板的变换QinQ封装后的报文,将报文转发给普通高速接口板。
较佳地,所述灵活QinQ接口板的每个端口都采用可编程逻辑门阵列FPGA实现,或都采用专用集成电路ASIC实现,或灵活QinQ接口板的部分端口采用FPGA实现,部分端口采用ASIC实现。
从上述方案可以看出,本发明预先在非NP的价格便宜的芯片中设置灵活QinQ配置策略所需数据以及标签协议标识TPID,然后对接收的报文使用该芯片中存储的数据进行灵活QinQ操作,无需使用昂贵的NP,从而降低了成本。
此外,由于目前也存在很多普通QinQ操作,而普通QinQ操作所需数据相对较少,为了提高QinQ操作的速度,可将进行普通QinQ操作所需数据进行单独设置,并可将普通QinQ配置策略所需数据和灵活QinQ配置策略所需数据分别存储在芯片中的第一表和第二表中,第一表用于实现一般的QinQ配置策略,第二表用于实现灵活QinQ的配置策略;然后根据所接收到的报文的外层VLAN ID查寻第一表,根据第一表中的配置策略类型,使用第一表或第二表中的数据对报文进行QinQ操作。可见,通过将普通QinQ操作和灵活QinQ操作进行单独管理,从而大大提高了实际运行中的速度。
此外,利用掩码将不需要作为配置策略中判断条件的项进行屏蔽,从而通过对掩码进行不同设置,便可实现各种组合的配置策略;并通过利用哈希(HASH)计算结果,并取HASH计算结果的低12位,作为索引,达到了缩减线性表尺寸的目的。
最后,本发明中的TPID可动态配置,从而实现了不同厂家之间网络设备的兼容。
具体实施方式
本发明的基本思想是:预先在芯片中设置灵活QinQ配置策略所需数据,接收报文,根据所接收报文的内、外层VLAN ID以及优先级从灵活QinQ配置策略数据中获取所需数据,使用所获取的数据对报文进行QinQ操作。其中,芯片可以为FPGA,也可以为ASIC等非NP的芯片。
进一步地,还可在芯片中预先设置普通QinQ配置策略所需数据,接收到报文后,根据所接收的报文的VLAN ID从普通QinQ配置策略所需数据中获取配置策略类型;根据获取的配置策略类型,确定使用普通QinQ配置策略所需数据或灵活QinQ配置策略所需数据,并从所确定的数据中获取所需数据对报文进行QinQ操作。
若确定使用普通QinQ配置策略所需数据,则直接从普通QinQ配置策略数据中获取所需数据,使用所获取的数据对报文进行QinQ操作;若确定使用灵活QinQ配置策略所需数据,则根据所接收报文的内、外层VLAN ID以及优先级从灵活QinQ配置策略数据中获取所需数据,使用所获取的数据对报文进行QinQ操作。
其中,根据报文的内、外层VLAN ID以及优先级从灵活QinQ配置策略数据中获取所需数据时,可以直接将内、外层VLAN ID以及优先级的各种组合作为索引从灵活QinQ配置策略数据中查询所需数据,也可以先对内、外层VLAN ID以及优先级进行哈希计算,将哈希计算结果作为索引从灵活QinQ配置策略数据中查询所需数据。
具体实现时,可将普通QinQ配置策略所需数据和灵活QinQ配置策略所需数据分别存储在芯片中的两个表中,即第一表和第二表中;也可以将二者存储在芯片的一个表中,当设置在一个表中时,因为灵活QinQ配置策略包括有普通QinQ配置策略,所以此时也可以理解为只在芯片中设置了灵活QinQ配置策略所需数据,接收到报文后,根据所接收报文的内、外层VLANID以及优先级从灵活QinQ配置策略数据中获取所需数据,使用所获取的数据对报文进行QinQ操作。
此外,为了实现标签协议标识TPID可配置,可在芯片中设置TPID,并且该TPID可由用户根据需要进行配置,用于在添加QinQ封装时使用。
为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本发明进一步详细说明。
为了叙述方便,本发明中对外层VLAN Tag作如下规定:如果报文中只有一层VLAN Tag,该层VLAN Tag即称为外层VLAN Tag;如果报文有一层以上VLAN Tag,即二层VLAN Tag,则将最靠近MAC地址头的VLANTag,即后添加的VLAN Tag称为外层VLAN Tag。
本发明中对每个用户端口所支持的灵活QinQ的配置策略如表一所示,为了描述简洁,表中用Q代表VLAN Tag。
表一
表一中的配置策略指的是基于所接收报文的哪些信息来完成QinQ的操作,配置方案分别表示基于配置策略,所能完成的操作。对于表一中的第一行可以理解为基于普通QinQ配置策略及所能完成的操作。
下面结合具体实施例对本发明的提供的实现灵活QinQ的方法及设备进行详细描述。
方法实施例一
本实施例中,采用FPGA芯片来实现灵活QinQ,预先设置有普通QinQ配置策略所需数据和灵活QinQ配置策略所需数据,并将普通QinQ配置策略所需数据和灵活QinQ配置策略所需数据分别写入两个表中,即第一表和第二表。第一表为VLAN表,用于存储普通QinQ配置策略所需的数据,第二表为VLAN哈希(VLAN_HASH)表,用于存储灵活QinQ配置策略所需的数据。本实施例中将完成添加QinQ封装所需的TPID存储在FPGA芯片的寄存器中,并且该TPID可配置,用户根据实际需要配置TPID值,实现和不同网络互联时对报文识别时的兼容。关于如何应用两个表及TPID值进行具体灵活QinQ操作的过程参见后面图4至图9所示流程的介绍。
其中,VLAN表和VLAN_HASH表都是存储在FPGA芯片的存储器中,假设存储器的每个存储单元为32比特,并且存储单元之间是通过地址查询的,每张表都有一个基础地址,即起始地址。VLAN表和VLAN_HASH表中都包括很多表项,表项指的是完成特定功能的最小数据集合,表项中各参数的取值决定了对报文进行的具体QinQ操作,不同表项中各参数的取值不同。每个表项可能会包含不只一个存储单元,因此在寻找每个表项时,可根据基础地址以及该表项的索引值找到表项的位置,寻找表项中每个具体内容时,可根据所找到表项中所包含的存储单元偏移,找到相应的存储单元,再根据该存储单元中所存储内容占用的比特位置,获得具体内容。
其中,第一表VLAN表用于存储一般的QinQ配置策略所需的数据,即表一中配置策略为外层Q时,执行表一中的第一行配置方案所需的数据,同时该表中还存储有配置策略类型参数,根据该配置策略类型,决定使用VLAN表,还是VLAN_HASH表;并存储有对配置策略进行配置的掩码(MASK)参数,通过对MASK进行不同设置,可完成不同配置策略。具体内容参见图2和下面的表二。
参见图2,图2为本发明实施例中VLAN表中一个表项的结构示意图。如图2所示,该表项包含一个存储单元,即图中起始位置为0的一行。该VLAN表项中包括:起始位(Primary)、预留位(RSV)、掩码(MASK)、新优先级(N_PRI)以及新VLAN ID(NEW_VLAN),并且Primary中包括:报文标志(VALID)、操作类型(VLAN_ACTION)、上送CPU标志(TO_CPU)、配置策略类型(DBL_VLAN_EN)以及优先级类型(PRI_CHANGE)。各部分的具体含义及内容如表二所示:
表二
基于表二的VLAN的索引值为报文的VLAN ID,根据报文的VLAN ID以及基础地址,可以找到VLAN ID对应的表项。表中通过设置MASK,并对MASK设置不同的值,可以实现灵活QinQ的各种配置策略。如:假设配置策略为表一第二行中的配置策略,即基于外层Q+优先级,则MASK取值为010;假设配置策略为表一最后一行中的配置策略,即基于外层Q+内层Q+优先级,则MASK取值为000;假设配置策略为表一倒数第二行中的配置策略,即基于外层Q+内层Q,则MASK取值为001,依次类推。
第二表VLAN_HASH表,用于存储灵活QinQ配置策略所需的数据,即存储执行表一中所有配置方案所需的数据,根据VLAN表中的MASK进行HASH计算,用HASH计算结果作为索引,找到对应于该配置策略的数据,同时该表中也可以存储配置策略类型等参数,具体内容参见下面的图3和表三。
参见图3,图3为本发明实施例中VLAN_HASH表中一个表项的结构示意图。如图3所示,该表项包含三个存储单元,即图中起始位置为0、1以及2的三行。该VLAN_HASH表项包括:Primary、原优先级(PRI)、原外层VLAN ID(SPVLAN)、原内层VLAN ID(CVLAN)、RSV、N_PRI、新外层VLAN ID(N_SPVLAN)、新内层VLAN ID(N_CVLAN)、链表头(H)、链表父节点地址(PNOD)、链表尾(T)以及链表子节点地址(CNOD),并且Primary包括:报文标志(VALID)、操作类型(VLAN_ACTION)、上送CPU标志(TO_CPU)、配置策略类型(DBL_VLAN_EN)。各部分的具体含义及内容如表三所示:
表三
基于表三的VLAN_HASH表的索引值为根据VLAN表中MASK的设置,计算出的报文各种配置策略下的HASH结果,之所以采用HASH结果作为索引,是因为802.1Q协议中定义的VLAN Tag有12比特,因此VLANID可有212=4096个,又因为优先级一般为8个,如果采用线性索引,则为了实现报文的各种配置策略,所需要的索引值在基于外层VLAN ID、内层VLAN ID以及优先级的情况下,会有4096×4096×8个表项,表的尺寸会非常的大,因此本实施例中采用对各种配置策略进行HASH计算,计算方法可以采用标准的循环冗余校验(CRC32)算法,并截取得到的低12位作为索引值,这样本实施例中的VLAN_HASH表的大小便可以设置为4K,即包含4096个表项。实际应用中,对于HASH计算还可以采用其它现有算法,此处不再赘述。对于计算结果的取值以及表的大小也可以有其它的设置,如截取低16位等,总之根据实际情况进行截取。
其中对于HASH计算,会存在不同的配置策略产生相同HASH结果的情况,例如:假设报文1的外层VLAN ID为123,内层VLAN ID为456,优先级为7,则若MASK值为010时,得到HASH算子为1230007;若报文2的外层VLAN ID为123,内层VLAN ID为896,优先级为7,MASK值为010时,同样得到HASH算子为1230007。为了解决这种情况,在VLAN_HASH表中设置了链表子节点地址CNOD和链表父节点地址PNOD,将具有相同HASH值的表项链接起来,其中第一个表项没有PNOD,最后一个表项没有CNOD。在通过索引找到VLAN_HASH链表后,根据报文的VLAN ID以及优先级与当前VLAN_HASH表项中的VLAN ID以及优先级进行对比,如果一样,则说明找到匹配表项,否则根据CNOD找到下一个表项,再进行匹配判断,直到找到对应表项,执行相应QinQ操作;或者达到最大查表次数时退出。
其中,PNOD用于维护整个链表的连续性。例如:A表项中的CNOD指向了B表项,B表项的CNOD指向了C表项,因此B表项中的PNOD就是A表项的地址,如果此时需要删除B表项,则需要先根据B表项中的PNOD找到A表项,将A表项中的CNOD由指向B表项改为指向C表项,再删除B表项。
基于上述第一表VLAN表和第二表VLAN_HASH表中的内容,具体执行灵活QinQ的实现过程时,可以有很多种实现方式,下面列举两种实现方式。其中假设VLAN表和VLAN_HASH表已经设置在FPGA芯片中,并且TPID也已经设置在FPGA芯片的寄存器中。
方式一:先从VLAN表中获取QinQ操作类型,然后再从VLAN表中获取配置策略类型,根据配置策略类型,确定需使用VLAN表还是VLAN_HASH表,然后根据QinQ操作类型,使用所确定的表中的数据对报文进行QinQ操作。
参见图4,图4为本发明实施例中采用方式一实现灵活QinQ的方法流程图,该流程包括如下步骤:
步骤401,用户端口接收到报文。
步骤402,根据报文的外层VLAN ID查询VLAN表。
本步骤中,将报文的外层VLAN ID作为索引,查询VLAN表,找到相应的表项。
步骤403,判断所找到的VLAN表项中VLAN_ACTION的类型,如果VLAN_ACTION为PUSH,则执行步骤404;如果VLAN_ACTION为POP,则执行步骤405;如果VLAN_ACTION为SWAP,则执行步骤406;否则,结束本流程。
步骤404,执行添QinQ封装操作,然后结束本流程。
本步骤中的具体实现过程参见后面图5所示的添QinQ封装的流程。
步骤405,执行去QinQ封装操作,然后结束本流程。
本步骤中,直接将所添加的外层VLAN Tag去掉,将报文还原成普通报文形式。
步骤406,执行变换QinQ封装操作,然后结束本流程。
本步骤中的具体实现过程参见后面图6所示的变换VLAN Tag的流程。
在图4所示流程中,步骤402与步骤403之间,还可以进一步包括:判断VLAN表中的VALID值,如果VALID值为有效,则对该报文执行步骤403;否则,将该报文丢弃。当VALID值为有效时,还可以再对VLAN表中的TO_CPU值进行判断,如果TO_CPU值为上报CPU,则将该报文上送至CPU进行监控;否则,正常处理,执行步骤403。
在上述图4所示步骤404中的添QinQ封装,即添加一层新的VLAN Tag,需要三个数据,包括TPID、VLAN ID以及优先级。添QinQ封装的流程如图5所示,图5为图4所示流程中执行添QinQ封装操作的流程图,该流程包括如下步骤:
步骤501,用户端口判断VLAN表项中DBL_VLAN_EN的值,如果该值为1,即表示根据两层VLAN标签+优先级变换/添加VLAN ID,执行步骤506;否则,即表示根据一层VLAN标签变换/添加VLAN ID,执行步骤502。
步骤502,从VLAN表项中读取NEW_VLAN的值作为新VLAN Tag的VLAN ID。
步骤503,判断VLAN表中PRI_CHANGE的值,如果该值为1,即表示新VLAN Tag中的优先级采用VLAN表中N_PRI配置的优先级,执行步骤504;否则,即表示新VLAN Tag中的优先级直接采用原外层VLAN Tag中的优先级,执行步骤505。
步骤504,从VLAN表中读取N_PRI的值作为新VLAN Tag的优先级,然后执行步骤512。
步骤505,取出原VLAN Tag的优先级作为新VLAN Tag的优先级,然后执行步骤512。
步骤506,根据VLAN表中的MASK进行HASH计算。
本步骤中,MASK不同的取值表示不同的配置策略,其中MASK的某一位取值为1时,则对应的外层VLAN ID、内层VLAN ID或优先级直接用全0代替。例如:假设外层VLAN ID为123,内层VLAN ID为456,优先级为7,则若MASK值为000时,得到HASH算子为1234567;若MASK值为010时,即不关心原报文的内层VLAN,得到HASH算子为1230007。然后对HASH算子进行HASH计算,计算方法可以采用标准CRC32算法,特征多项式为1+X+X2+X4+X5+X7+X8+X10+X11+X12+X16+X22+X23+X26+X32,具体计算过程现有技术中有详细介绍,此处不再赘述。
HASH计算完成后,取计算结果的低12位作为最终结果。
步骤507,根据HASH计算结果查询VLAN_HASH表。
本步骤中,将步骤506中HASH计算的结果作为索引查询VLAN_HASH表。
步骤508,判断报文的VLAN ID及优先级是否与表项匹配。如果是,则执行步骤511;否则,执行步骤509。
本步骤中,将报文的外层VLAN ID与所找到的VLAN_HASH表项中的SPVLAN进行对比,将报文的外层优先级与VLAN_HASH表项中的PRI进行对比,如果二者相同,则表示找到匹配的VLAN_HASH表项;如果二者不相同,则表示该VLAN_HASH表项不是匹配的VLAN_HASH表项。
步骤509,将查表次数加1,并判断查表次数是否达到预设的查表次数的最大值,如果达到,则丢弃该报文,并结束本流程;否则,执行步骤510。
本步骤中,为了防止错误报文出现等,对查表次数进行限定,预先设置一个查表次数最大值。其中,查表次数初值可设置为0,每查一次,查表次数加1。
步骤510,根据表中的子节点地址CNOD查询下一个VLAN_HASH表项,之后返回执行步骤508。
步骤511,从VLAN_HASH的表项中读取N_SPVLAN作为新VLAN Tag的VLAN ID,读取N_PRI作为新VLAN Tag的优先级。
步骤512,从FPGA寄存器中读取TPID值,将所读取的TPID值作为新VLAN Tag的TPID值。
步骤513,根据获取的新VLAN Tag的VLAN ID、优先级以及TPID完成新VLAN Tag的添加。
至此,添QinQ封装的流程结束。
在图5所示流程中,步骤511之前,还可以进一步包括:对匹配的VLAN_HASH表项中的VLAN_ACTION值以及DBL_VLAN_EN值进行校验,检验这两个值是否与VLAN表项中的值一致,如果一致,则执行步骤511;否则,提示配置错误,结束本流程。
此外,还可以对VLAN_HASH表项中的VALID值以及TO_CPU值进行校验,如果与VLAN表项中的值一致,则执行步骤511;否则,提示配置错误,结束本流程。
在上述图4所示步骤406中变换QinQ封装时,根据配置需要,完成外层VLAN ID,内层VLAN ID,或外层优先级的替换工作。变换VLAN Tag的流程如图6所示,图6为图4所示流程中执行变换QinQ封装操作的流程图,该流程包括如下步骤:
步骤601,用户端口判断VLAN表项中DBL_VLAN_EN的值,如果该值为1,执行步骤605;否则,执行步骤602。
步骤602,从VLAN表项中读取NEW_VLAN的值替换报文外层VLANTag的VLAN ID。
步骤603,判断VLAN表中PRI_CHANGE的值,如果该值为1,执行步骤604;否则,执行步骤611。
步骤604,从VLAN表中读取N_PRI的值替换外层VLAN Tag的优先级,然后执行步骤611。
步骤605,根据VLAN表中的MASK进行HASH计算。
本步骤中的具体计算过程可同图5所示步骤506中的介绍。
步骤606,根据HASH计算结果查询VLAN_HASH表。
步骤607,判断报文的VLAN ID及优先级是否与表项匹配。如果是,则执行步骤610;否则,执行步骤608。
本步骤中,将报文的外层VLAN ID与所找到的VLAN_HASH表项中的SPVLAN进行对比,将报文的内层VLAN_ID与VLAN_HASH表项中CVLAN进行对比,将报文的外层优先级与VLAN_HASH表项中的PRI进行对比,如果三者相同,则表示找到匹配的VLAN_HASH表项;如果三者不相同,则表示该VLAN_HASH表项不是匹配的VLAN_HASH表项。
步骤608,将查表次数加1,并判断查表次数是否达到预设的查表次数的最大值,如果达到,则丢弃该报文,并结束本流程;否则,执行步骤609。
本步骤中,也预先设置查表次数最大值,并可以设置查表次数初值为0。
步骤609,根据表中的子节点地址CNOD查询下一个VLAN_HASH表项,之后返回执行步骤607。
步骤610,从VLAN_HASH的表项中读取N_SPVLAN替换外层VLANTag的VLAN ID,读取N_CVLAN替换内层VLAN Tag的VLAN ID,读取N_PRI替换外层VLAN Tag的优先级。
步骤611,利用所读取的数据完成QinQ封装的变换。
至此,变换QinQ封装的流程结束。
在图6所示流程中,步骤610之前,还可以进一步包括:对匹配的VLAN_HASH表项中的VLAN_ACTION值以及DBL_VLAN_EN值进行校验,检验这两个值是否与VLAN表项中的值一致,如果一致,则执行步骤610;否则,提示配置错误,结束本流程。
此外,还可以对VLAN_HASH表项中的VALID值以及TO_CPU值进行校验,如果与VLAN表项中的值一致,则执行步骤610;否则,提示配置错误,结束本流程。
在方式一中,如果不需要对配置进行校验,可以将第二表即VLAN_HASH中的Primary项去掉,而直接根据第一表即VLAN表中的Primary进行相应判断。
方式二:先从VLAN表中获取配置策略类型,根据配置策略类型,确定需使用VLAN表还是VLAN_HASH表,然后从所确定的表中获取QinQ操作类型,根据QinQ操作类型,使用所确定的表中的数据对报文进行QinQ操作。
参见图7,图7为本发明实施例中采用方式二实现灵活QinQ的方法流程图,该流程包括如下步骤:
步骤701,用户端口接收到报文。
步骤702,根据报文的外层VLAN ID查询VLAN表。
本步骤中,将报文的外层VLAN ID作为索引,查询VLAN表,找到相应的表项。
步骤703,判断VLAN表项中DBL_VLAN_EN的值,如果该值为1,执行步骤705;否则,执行步骤704。
步骤704,使用VLAN表项中的数据执行QinQ操作,结束本流程。
本步骤中,具体实现方式可参照图8所示流程。
步骤705,根据VLAN表中的MASK进行HASH计算。
步骤706,根据HASH计算结果查询VLAN_HASH表。
步骤707,判断报文的VLAN ID及优先级是否与表项匹配。如果是,则执行步骤710;否则,执行步骤708。
步骤708,将查表次数加1,并判断查表次数是否达到预设的查表次数的最大值,如果达到,则丢弃该报文,并结束本流程;否则,执行步骤709。
本步骤中,也预先设置查表次数最大值,并可以设置查表次数初值为0。
步骤709,根据表中的子节点地址CNOD查询下一个VLAN_HASH表项,之后返回执行步骤707。
步骤710,使用VLAN_HASH表项中的数据执行QinQ操作。结束本流程。
本步骤中,具体实现方式可参照图9所示流程。
在图7所示流程中,步骤710之前,可以进一步包括:对VLAN_HASH表项中的DBL_VLAN_EN值进行校验,检验这个值是否与VLAN表项中的值一致,如果一致,则执行步骤710;否则,提示配置错误,结束本流程。
在上述图7所示步骤704中,使用VLAN表项中的数据执行QinQ操作的流程如图8所示,图8为图7所示流程中使用VLAN表项中的数据执行QinQ操作的流程图,该流程包括如下步骤:
步骤801,判断VLAN表项中VLAN_ACTION的类型,如果VLAN_ACTION为PUSH,则执行步骤802;如果VLAN_ACTION为POP,则执行步骤808;如果VLAN_ACTION为SWAP,则执行步骤809;否则,结束本流程。
步骤802,从VLAN表项中读取NEW_VLAN的值作为新VLAN Tag的VLAN ID。
步骤803,判断VLAN表中PRI_CHANGE的值,如果该值为1,执行步骤804;否则,执行步骤805。
步骤804,从VLAN表中读取N_PRI的值作为新VLAN Tag的优先级,然后执行步骤806。
步骤805,取出原VLAN Tag的优先级作为新VLAN Tag的优先级,然后执行步骤806。
步骤806,从FPGA寄存器中读取TPID值,将所读取的TPID值作为新VLAN Tag的TPID值。
步骤807,根据获取的新VLAN Tag的VLAN ID、优先级以及TPID完成新VLAN Tag的添加。结束本流程。
步骤808,去掉所封装的外层VLAN Tag,还原成普通报文。结束本流程。
步骤809,从VLAN表项中读取NEW_VLAN的值替换报文外层VLANTag的VLAN ID。
步骤810,判断VLAN表中PRI_CHANGE的值,如果该值为1,执行步骤811;否则,执行步骤812。
步骤811,从VLAN表中读取N_PRI的值替换外层VLAN Tag的优先级。
步骤812,根据所获取的NEW_VLAN以及优先级,完成QinQ封装的变换,然后结束本流程。
在上述图7所示步骤710中,使用VLAN_HASH表项中的数据执行QinQ操作的流程如图9所示,图9为图7所示流程中使用VLAN_HASH表项中的数据执行QinQ操作的流程图,该流程包括如下步骤:
步骤901,判断VLAN_HASH表项中VLAN_ACTION的类型,如果VLAN_ACTION为PUSH,则执行步骤902;如果VLAN_ACTION为POP,则执行步骤905;如果VLAN_ACTION为SWAP,则执行步骤906;否则,结束本流程。
步骤902,从VLAN_HASH的表项中读取N_SPVLAN作为新VLAN Tag的VLAN ID,读取N_PRI作为新VLAN Tag的优先级。
步骤903,从FPGA寄存器中读取TPID值,将所读取的TPID值作为新VLAN Tag的TPID值。
步骤904,根据获取的新VLAN Tag的VLAN ID、优先级以及TPID完成新VLAN Tag的添加。结束本流程。
步骤905,去掉所封装的外层VLAN Tag,还原成普通报文。结束本流程。
步骤906,从VLAN_HASH的表项中读取N_SPVLAN替换外层VLANTag的VLAN ID,读取N_CVLAN替换内层VLAN Tag的VLAN ID,读取N_PRI替换外层VLAN Tag的优先级。
步骤907,利用获取的N_SPVLAN、N_CVLAN以及N_PRI完成QinQ封装的变换,结束本流程。
在图8和图9所示流程中,步骤801以及步骤901之前,均可以进一步包括:判断VLAN表中的VALID值,如果VALID值为有效,则对该报文执行步骤801或步骤901;否则,将该报文丢弃。当VALID值为有效时,还可以再对VLAN表中的TO_CPU值进行判断,如果TO_CPU值为上报CPU,则将该报文上送至CPU进行监控;否则,正常处理,执行步骤801或901。
方法实施例二
本实施例中,也采用FPGA芯片来实现灵活QinQ,但只设置有灵活QinQ配置策略所需数据,并将灵活QinQ配置策略所需数据写入一个表中,因为灵活QinQ配置策略中包括普通QinQ配置策略,所以此时也可理解为将普通QinQ配置策略所需数据和灵活QinQ配置策略所需数据存储在芯片中的一个表中。
具体实现时,根据报文的内、外层VLAN ID以及优先级从灵活QinQ配置策略数据中荻取所需数据,使用所获取的数据对报文进行QinQ操作。
其中,根据报文的内、外层VLAN ID以及优先级从灵活QinQ配置策略数据中获取所需数据的方法至少有两种,一种为:直接将内、外层VLANID以及优先级的各种组合作为索引从灵活QinQ配置策略数据中查询所需数据。另一种为:先对内、外层VLAN ID以及优先级进行哈希计算,将哈希计算结果作为索引从灵活QinQ配置策略数据中查询所需数据。
下面分别对采用上述两种实现方法实现灵活QinQ的方法进行详细描述。
采用实现方式一:直接将内、外层VLAN ID以及优先级的各种组合作为索引。
本实现方式中,将存储灵活QinQ配置策略所需数据的表记为灵活配置表,并将灵活配置表存储在FPGA芯片的存储器中,并同方法实施例一中一样,仍然假设存储器的每个存储单元为32比特,并且存储单元之间是通过地址查询的,每张表都有一个基础地址,即起始地址。灵活配置表也包括很多表项,表项中各参数的取值决定了对报文进行的具体QinQ操作,不同表项中各参数的取值不同。
参见图10,图10为本发明方法实施例二中灵活配置表中一个表项的结构示意图。如图10所示,该表项包含两个存储单元,即图中起始位置为0和1的二行。该灵活配置表项包括:Primary、新优先级(N_PRI)、新外层VLAN ID(N_SPVLAN)、新内层VLAN ID(N_CVLAN)以及掩码(MASK)。其中Primary包括:报文标志(VALID)、操作类型(VLAN_ACTION)、上送CPU标志(TO_CPU)。各部分的具体含义及内容如表四所示:
表四
基于表四的灵活配置表的索引值为内、外层VLAN ID以及优先级的线性组合,根据该线性组合值以及基础地址,找到灵活配置表的对应表项。因为采用线性索引,因此该表便会有4096×4096×8个表项,尺寸较大。但是这种实现时,表的结构简单,实现容易。因此具体实现时,也是可以采用的。
参见图11,图11为本发明方法实施例二中采用实现方式一的实现灵活QinQ的方法流程图。该流程包括如下步骤:
步骤1101,用户端口接收到报文。
步骤1102,根据报文的内、外层VLAN ID及优先级的线性组合查询灵活配置表。
本步骤中,将报文的内、外层VLAN ID及优先级的线性组合作为索引,查询灵活配置表,找到相应的表项。
步骤1103,判断所找到的灵活配置表项中VLAN_ACTION的类型,如果VLAN_ACTION为PUSH,则执行步骤1104;如果VLAN_ACTION为POP,则执行步骤1110;如果VLAN_ACTION为SWAP,则执行步骤1111;否则,结束本流程。
步骤1104,读取N_SPVLAN作为新VLAN Tag的VLAN ID。
步骤1105,判断MASK的BIT[31]的取值,如果为1,则执行步骤1106;否则,执行步骤1107。
本步骤中,目的是判断优先级是否需要变更,因为在表四中用标志位BIT[31]来表示这个情况,所以本实施例的步骤1105需要判断BIT[31]的取值,具体实现时,可根据实际情况设置表示优先级相关情况的标志。
步骤1106,读取N_PRI作为新VLAN Tag的优先级,然后执行步骤1108。
步骤1107,取出原VLAN Tag中的优先级作为新VLAN Tag的优先级。
步骤1108,从寄存器中读取TPID,作为新VLAN Tag的TPID。
步骤1109,根据获取的新VLAN Tag的VLAN ID、优先级以及TPID完成新VLAN Tag的添加。结束本流程。
步骤1110,去掉所封装的外层VLAN Tag,还原成普通报文。结束本流程。
步骤1111,根据MASK的取值获取变换QinQ封装所需数据。
本实施例的步骤1111中,具体包括:判断MASK中每一位的取值,包括:BIT[31]、BIT[30]以及BIT[29]的值。当BIT[31]为1时,则读取N_PRI替换外层VLAN Tag的优先级,否则保留原来的优先级;当BIT[30]为1时,则读取N_SPVLAN替换外层VLAN Tag的VLAN ID,否则保留原来的外层VLAN ID;当BIT[29]为1时,则读取N_CVLAN替换内层VLAN Tag的VLAN ID,否则保留内层的VLAN ID。
步骤1112,根据获取的变换QinQ封装所需的数据,完成QinQ封装的变换。结束本流程。
图11所示流程中,也可以在步骤1102和步骤1103之间进一步包括:判断VLAN ID位是否有效,如果有效,则可继续判断TO_CPU位是否有效,或者执行步骤1103;如果无效,则结束操作。
在判断TO_CPU位是否有效时,若判断TO_CPU位有效,则上报CPU;若判断TO_CPU位无效,则执行步骤1103。
至此,采用实现方式一的方法流程描述完毕。
采用实现方式二:先对内、外层VLAN ID以及优先级进行哈希计算,将哈希计算结果作为索引。
本实现方式中,将存储灵活QinQ配置策略所需数据的表记为灵活配置哈希表,并同样将灵活配置哈希表存储在FPGA芯片的存储器中。
参见图12,图12为本发明方法实施例二中灵活配置哈希表中一个表项的结构示意图。如图12所示,该表项包含三个存储单元,即图中起始位置为0、1和2的三行。该灵活配置哈希表项包括:Primary、新优先级(N_PRI)、新外层VLAN ID(N_SPVLAN)、新内层VLAN ID(N_CVLAN)、掩码(MASK)、链表头(H)、链表尾(T)、链表父节点地址(PNOD)、原内层VLAN ID(CVLAN)、链表子节点地址(CNOD)、原优先级(PRI)以及原外层VLAN ID(SPVLAN)。其中Primary包括:报文标志(VALID)、操作类型(VLAN_ACTION)、上送CPU标志(TO_CPU)。各部分的具体含义及内容如表五所示:
表五
基于表五的灵活配置哈希表的索引值为根据内、外层VLAN ID以及优先级进行哈希计算的哈希结果值。其中对于所接收的报文没有的项,如外层VLAN ID等,则没有的项用全零代替,之后再进行哈希计算,并且计算方法也可以采用标准的循环冗余校验(CRC32)算法,且也可以截取得到的低12位作为索引值。实际应用中,哈希计算也可以采用其它现有算法。
对于哈希计算,同样会存在产生相同结果的情况,因为同样受配置策略等因素的影响,因此使用灵活配置哈希表实现灵活QinQ操作时,也需要有校验过程。
参见图13,图13为本发明方法实施例二中采用实现方式二的实现灵活QinQ的方法流程图。该流程包括如下步骤:
步骤1301,用户端口接收到报文。
步骤1302,根据报文的内、外层VLAN ID及优先级的哈希计算结果查询灵活配置哈希表。
本步骤中,将报文的内、外层VLAN ID及优先级的哈希计算结果作为索引,查询灵活配置哈希表,找到相应的表项。
步骤1303,判断所找到的灵活配置表项中VLAN_ACTION的类型,如果VLAN_ACTION为PUSH,则执行步骤1305;如果VLAN_ACTION为POP,则执行步骤1304;如果VLAN_ACTION为SWAP,则执行步骤1312;否则,结束本流程。
步骤1304,去掉所封装的外层VLAN Tag,还原成普通报文。结束本流程。
步骤1305,根据报文VLAN ID及优先级找到匹配的表项。
本步骤中的操作可以与图5所示流程中的步骤508~步骤510相同。即判断报文的VLAN ID及优先级是否与表项匹配。如果是,则执行步骤1316;否则,将查表次数加1,并判断查表次数是否达到预设的查表次数的最大值,如果达到,则丢弃该报文,并结束本流程;否则,根据表中的子节点地址CNOD查询下一个VLAN_HASH表项,然后反复执行,直到找到匹配的表项。详细过程参见图5所示流程中的步骤508~步骤510。
本步骤中在判断报文的VLAN ID及优先级是否与表项匹配时,是将报文的外层VLAN ID与所找到的VLAN_HASH表项中的SPVLAN进行对比,将报文的外层优先级与VLAN_HASH表项中的PRI进行对比。
步骤1306~步骤1311与图11所示流程中步骤1104~步骤1109相同。
步骤1312,根据报文VLAN ID及优先级找到匹配的表项。
本步骤中的操作可以与图6所示流程中的步骤607~步骤609相同。即判断报文的VLAN ID及优先级是否与表项匹配。如果是,则执行步骤1316;否则,将查表次数加1,并判断查表次数是否达到预设的查表次数的最大值,如果达到,则丢弃该报文,并结束本流程;否则,根据表中的子节点地址CNOD查询下一个VLAN_HASH表项,然后反复执行,直到找到匹配的表项。详细过程参见图6所示流程中的步骤607~步骤609。
本步骤中在判断报文的VLAN ID及优先级是否与表项匹配时,是将报文的外层VLAN ID与所找到的VLAN_HASH表项中的SPVLAN进行对比,将报文的内层VLAN ID与VLAN_HASH表项中CVLAN进行对比,将报文的外层优先级与VLAN_HASH表项中的PRI进行对比。
步骤1313~步骤1314与图11所示流程中步骤1111~步骤1112相同。
以上对本发明中实现灵活QinQ的方法进行了详细描述,下面再对本发明中基于上述方法的设备进行详细描述。
参见图14,图14为本发明实施例中实现灵活QinQ的设备的结构示意图。如图14所示,该设备包括:中央处理器(CPU)、至少一个灵活QinQ接口板、二层交换芯片、普通低速接口板以及普通高速接口板。其中,灵活QinQ接口板包括至少一个端口,每个端口都采用FPGA实现,或者每个端口都采用ASIC,或者部分端口采用FPGA、部分端口采用ASIC等。
其中,CPU用于对灵活QinQ接口板和二层交换芯片进行配置,并配置存储在灵活QinQ接口板中的第一表,即VLAN表、第二表,即VLAN_HASH表中相应参数以及寄存器中的TPID。
普通低速接口板用于接收来自用户网络的普通报文,将接收的报文传送给二层交换芯片;并接收来自二层交换芯片转发的去掉外层VLAN Tag的VALN报文,发送给用户网络。
二层交换芯片用于接收来自普通低速接口板的普通报文,根据该报文的外层VLAN Tag和MAC地址,将报文转发给灵活QinQ接口板;并接收来自灵活QinQ接口板的去QinQ封装后的报文,根据外层VLAN Tag和MAC地址,将报文转发给普通低速接口板,接收来自灵活QinQ接口板的变换QinQ封装后的报文,根据外层VLAN Tag和MAC地址,将报文转发给普通高速接口板或其它的灵活QinQ接口板,或回送给该灵活QinQ接口板的其它端口。
普通高速接口板用于接收来自二层交换芯片转发的变换QinQ封装后的报文,将所接收的报文发送给骨干网络。
灵活QinQ接口板用于存储进行灵活QinQ操作所需数据以及TPID,其中,进行灵活QinQ操作所需数据,可以为实施例一中的第一表,即VLAN表中的数据和第二表,即VLAN_HASH表中的数据,也可以为实施例二中灵活配置表中的数据,或灵活配置哈希表中的数据。灵活QinQ接口板接收来自二层交换芯片的报文,根据报文的外层VLAN Tag的VLAN ID查询VLAN表,根据VLAN表中的配置策略类型DBL_VLAN_EN的值,使用进行灵活QinQ操作所需数据对报文进行添QinQ封装操作,并将执行完添QinQ封装操作的报文发送给骨干网络,或将接收的报文直接发送给骨干网络;接收来自骨干网络的报文,根据报文的外层VLAN Tag的VLAN ID查询VLAN表,根据VLAN表中DBL_VLAN_EN的值,使用进行灵活QinQ操作所需数据对报文进行去QinQ封装或变换QinQ封装的操作,并将执行完去QinQ封装以及变换QinQ封装的报文发送给二层交换芯片。
其中,灵活QinQ接口板的每个端口都可以采用FPGA来实现,即每个端口上都使用FPGA存储进行灵活QinQ操作所需数据以及TPID。并且存储TPID的寄存器可以设置2个字节的长度,因此TPID可以有216个值,用户可根据实际情况进行配置;或者灵活QinQ接口板的每个端口都可以采用ASIC来实现,即每个端口上都使用ASIC存储进行QinQ操作所需数据以及TPID;或者灵活QinQ接口板的部分端口采用FPGA实现,部分端口采用ASIC实现。
其中,灵活QinQ接口板在使用进行灵活QinQ操作所需数据进行灵活QinQ操作时,其实现方法可以与方法实施例一中描述的情况相同,也可以与方法实施二中描述的情况相同。
实际应用中,可以没有普通高速接口板,根据具体情况决定是否使用高速接口板。而且CPU只是在初始配置时使用,对灵活QinQ接口板及二层交换芯片配置好后,可以无需CPU参与灵活QinQ的实现过程。
本设备中的第一表和第二表的设置及内容可以同上述方法中VLAN表和VLAN_HASH表,在灵活QinQ接口板中进行QinQ操作的过程也可以同上述方法中介绍的各种实现方式。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。