一种基于网络处理器实现硬件表遍历的方法及装置的制造方法_2

文档序号:9921840阅读:来源:国知局
[0059]在本发明具体的实施例中,利用网络处理器的逻辑多播模块和微码模块实现大容量硬件表的快速遍历,并将匹配表项缓存,使CPU能直接读取匹配表项。当需要遍历某硬件表时,CPU会向网络处理器发送CPU报文,且该CPU报文头部携带该硬件表表项的匹配特征,表项的匹配特征是指表项的某个字段或者某几个字段等于CPU软件的指定值。如果CPU软件未指定硬件表项的任何字段的取值,则是要求获取该硬件表中所有有效的表项。接着CPU报文进入网络处理器的微码模块,对应的微码程序配置复制寄存器,该复制寄存器的数值为该报文的复制份数,复制份数等于该硬件表的表项总数。其中,微码模块是一般网络处理器共有的报文处理模块,可以存储多个微码程序;通过配置,不同来源的报文可以对应不同的微码程序。当报文进入微码模块后,相应的微码程序就开始处理该报文。其中,CPU报文对应的微码程序,其主要流程就是配置CPU报文的复制寄存器,复制寄存器保存报文的复制份数,应等于硬件表的表项总数N。然后CPU报文被送到逻辑多播模块进行复制,并且复制后的每份报文都携带一个复制序号,复制序号为CPU报文复制时的顺序号,其中,逻辑多播模块代指一般网络处理器中实现报文复制的硬件单元。复制寄存器值大于I的报文都会在逻辑多播模块中进行复制,并且复制后的每份报文都被分配一个复制序号,保存在特定寄存器中。其中,CPU报文在逻辑多播模块中被复制成N份,每份报文对应O?N-1之间的一个复制序号。逻辑多播模块复制完CPU报文之后,每份复制后报文回到微码模块,对应的微码程序都会读取该硬件表中表项索引号等于该报文复制序号的表项,表项索引号是硬件表项在硬件表中的序号;并判断该表项是否满足报文头部的匹配特征,如果满足,则将用于统计匹配表项的计数器的值加1,并将该表项写入用于缓存匹配表项的缓存表中,如果不满足,则不做处理;最后,无论该表项是否匹配,微码程序都将复制报文丢弃。
[0060]在本发明的具体实施例中,复制后的每份报文携带一个复制序号回到微码模块,相应的微码程序都会执行一次;该微码程序每执行一次,都会读取并判断该硬件表的一个不同表项,表项索引号分别等于报文的复制序号O?N-1。这样,该微码程序执行N次后,便等价于实现了对该硬件表的遍历查找。其中,由于微码程序的长度可能受到硬件资源的限制,在一个微码程序中顺序读取所有硬件表项一般无法实现,所以本发明实施例采用多次执行同一微码程序,每次执行只读取一条表项的方式。当网络处理器遍历完硬件表之后,CPU等待一定时间会直接读取上述计数器的数值,并根据计数器的数值读取缓存表中的匹配表项,即可获取批量的匹配表项(例如计数器的值是M,CPU根据计数器的数值M,读取缓存表的前M项,即为所有的匹配表项),其中,CPU的等待时长应根据硬件表的表容量和网络处理器的处理速度来确定,也可以通过实验的方法来确定。
[0061]在本发明具体的实施例中,微码程序读到一条匹配表项后,并没有立即上报给CPU,而是通过计数器计数并存入缓存表的方式集中上报,这样做可以减少CPU处理流程,方便CPU获取批量的匹配表项。计数器的初始值为0,可以由CPU进行清零操作。匹配表项存入缓存表的索引,由计数器的当前计数值确定。一般地,硬件计数器加I并返回计数值是一个不可分割的原子操作,可以避免微码程序多次执行时对匹配计数器密集操作导致混乱的问题。另外,CPU报文离开微码模块又回到微码模块,这一环路的配置可以在网络处理器初始化时进行配置。
[0062]在本发明具体的实施例中,微码模块对报文的处理十分高效,因此整个过程的处理时间远远小于CPU直接遍历大容量硬件表的响应时间。其中CPU读缓存表的时间只与匹配表项的实际数目成正比。在多数情况下,匹配表项的实际数目都比硬件表表项总数要小得多,因此本发明实施例的方法的响应时间比CPU直接遍历硬件表的响应时间要小得多。
[0063]如图2所示,在本发明的上述实施例中,步骤12的具体步骤为:
[0064]步骤21,检测CPU报文的类型信息;
[0065]步骤22,根据类型信息,配置复制寄存器。
[0066]如图3所示,在本发明的上述实施例中,步骤14的具体步骤流程为:
[0067]步骤31,根据复制后的CPU报文的复制序号,获取硬件表项索引号等于该复制序号的硬件表项;
[0068]步骤32,判断CPU报文的匹配信息与获取的硬件表项的信息是否匹配。
[0069]在本发明具体的实施例中,复制后的每份报文携带一个复制序号回到微码模块,相应的微码程序都会执行一次;该微码程序每执行一次,都会读取并判断硬件表的一个不同表项,表项索引号分别等于报文的复制序号。以下是一个具体的实施:
[0070]在一个EPON中,一个OLT包括主控卡,上联卡和线卡。考虑一块网络处理器实现的线卡,如图4所示,线卡转发并学习上下行报文的MAC地址。当前MAC地址信息记录在一张硬件表sys_mac_table中,表大小为N,即最多保存N个MAC地址。如图5所示,sys_mac_table的表项内容包括有效标志位valid,MAC地址mac_addr,端口值portld,vlan值vlanld,与静态/动态标志位static_flag。CPU可以要求获取sys_mac_table中符合某种特征的MAC地址,比如获取某端口、某vlan或者某端口 +某vlan上的所有MAC地址。
[0071 ] 为了实施上述实施例的技术方案,线卡初始化时在网络处理器芯片中配置一条报文从微码模块离开,再回到微码模块的环路队列,如图4所示。并在网络处理器芯片中定义用于计数匹配表项的硬件计数器mac_cache_counter,和用于缓存匹配表项的硬件表mac_cache_table.缓存表mac_cache_table的表项格式与MAC地址表sys_mac_table的表项格式一样,如图5所示。微码模块中存储多个微码程序,包括但不仅限于微码程序ecm_process和mac_iter_process.其中,微码程序ecm_process用来处理CPU发来的CPU报文,微码程序mac_iter_pr0cess用来处理经上述环回队列回到微码模块的报文。微码模块可以根据报文来源选择对应的微码程序进行处理。
[0072]考虑线卡CPU获取线卡某端口 portl上所有MAC地址的情形。如图4所示,线卡CPU向网络处理器芯片发送获取MAC地址的CPU报文。如图6所示,CPU报文头部的格式定义为TYPE和VALUE两个部分。如图7所示,获取MAC地址的CPU报文,其TYPE部分取值定义为 MAC_GET_PKT,VALUE 部分取值定义为{port_match = LportId = portl, vlan_match=0,vlanld = 0}。
[0073]如图4所示,获取MAC地址的CPU报文首先进入网络处理器芯片的微码模块进行处理,相应的微码程序是ecm_process。ecm_process首先判断报文类型为MAC_GET_PKT,然后跳转到相应的子流程seq_get_mac_addr。子流程seq_get_mac_addr配置报文的复制寄存器,使复制份数等于N,并配置报文的目的队列为上述环回队列,使报文离开微码模块后能再次回到微码模块。
[0074]如图4所示,该CPU报文的复制寄存器值即复制份数大于1,因此在逻辑多播模块中被复制成N份,并且复制后的每份报文都携带一个复制序号,依次取值O?N-1。复制序号保存在特定寄存器中。这些复制报文通过环回队列回到微码模块进行处理,相应的微码程序是 mac_iter_process0
[0075]如图8所示,微码程序mac_iter_process首先读特定寄存器获取报文的复制序号k,然后读取MAC地址表sys_mac_table中索引等于k的表项K。如果表项K无效,贝Ij配置丢弃该报文,程序结束。如果表项K有效,由于报文头部port_mtach = 1,portld需要匹配,因此判断表项K的portld是否与报文头部的portId( = portl)相等。如果两者的portld不等,则配置丢弃该报文,程序结束。如果两者的portld相等,由于报文头部vlan_mtach=0,vlanld不需要匹配,因此进入后续流程将计数器mac_cache_counter加I并返回计数值C,并将表项K写入缓存表mac_cache_table中索引等于C_1的表项,最后配置丢弃该报文,程序结束。
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1