背景技术
由于数据通信技术的发展,数据交换芯片所承载的业务也越来越多,在较大的数据吞吐量、多级调度等技术指标要求下,简单的片内数据交换已经满足不了目前的需求。在这种条件下,通常的设计思路是将数据包存储在片外存储器中,并在片内以队列的形式管理数据包,因此数据包的入队和出队管理方法就显得至关重要。
数据包存储在片外存储器中,通过片内的缓存地址来管理数据包,但包描述符,即表示包的其他信息的数据,则存储在片内并以队列的形式进行管理,数据包和包描述符的出队与入队,缓存地址的分配与回收,入队次数的更新等,均属于数据包入队和出队管理的范畴。
在数据交换业务中,数据包经过交换域,在进行处理的过程中,或丢弃,或入队,这种情况下,可以根据片内或片外维护的多播权重(入队次数)的更新来判断数据包的缓存地址是否回收。但还有一种TC(Transparent Clock,透传时钟)、OC(Ordinary Clock,普通时钟)/BC(Boundary Clock,边界时钟)模式的1588数据包,在进行处理的时候可能多种情况:1)数据包只经过交换域;2)数据包只上报CPU;3)数据包既经过交换域,又上报CPU。三种情况的处理方法和缓存地址的回收机制也不尽相同。
专利号为CN200510087200.6的中国专利提出了一种多播调度中缓存权重(即数据包的入队次数)的处理方法,该方法中的缓存权重最大值与输出端口数相同,端口的权重为1,在接入侧累加被丢弃报文的端口权重,当权重与该端口的最大权重相等时,回收相应缓存地址。该专利有两个局限,一是缓存权重最大值受限于端口数,二是缓存权重的更新受限于所要丢弃的报文,这两点不利于该技术的重用。
专利号为CN200810055936.9的中国专利提出了一种缓存管理方法,该方法是利用数据包老化的原理,在某个缓存地址被申请后将其标记为申请状态,计时到最大申请时间后回收该缓存地址。该方法受限于老化的时间,有些数据包由于优先级较低,很长时间后才被调度出去,但不允许老化,因此这种方法对于优先级较低的数据包不通用。
专利号为CN02108977.9的中国专利提出了一种以太网交换芯片传输数据过程中缓存的管理和分配方法,该方法利用转发和释放帧控制块时缓存权重的更新后是否为0来判断缓存是否回收。通常这种情况只适合经过交换域的数据包,而不适用于既经过交换域又上报CPU和只上报CPU的数据包缓存地址的管理。
专利号为CN200710177721.X的中国专利提供了一种缓存地址释放方法,该方法包括:逻辑模块中有报文上送CPU时,CPU先向逻辑模块查询包信息,根据查询到的包信息从逻辑模块中读取报文,并在该报文读取完毕后,从逻辑模块中读出该报文对应的包信息;逻辑模块在所述包信息被读出时,释放该包信息中包含的缓存地址。该方法中的缓存释放需要利用CPU查询包信息,对于不上报CPU的包有一定的局限性。
具体实施方式
为了使本发明所要解决的技术问题、技术方案及有益效果更加清楚、明白,以下结合附图和实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
如图1所示,是本发明数据包入队和出队管理方法优选实施例的流程图,本实施例具体包括以下步骤:
步骤S001:根据数据包处理装置支持的数据包最大多播复制份数,为数据包处理装置处理的数据包设置初始入队次数;
入队次数是指数据包复制后能进入队列的个数,由于有些复制后的数据包被直接丢弃,不需要入队,故数据包入队次数并不等于数据包的多播复制的次数。
本实施例中,初始入队次数大于数据包处理装置支持的数据包最大多播复制份数。
步骤S002:将上述初始入队次数初始化到外接存储器中;
本步骤在数据包处理装置初始化时完成,具体为,在外接存储器中的用于存储数据包的入队次数的存储区域中的每个入队次数占用的存储空间中均写入初始入队次数;本发明中,多个数据包的入队次数维护在同一个外接存储区域中,节省了存储资源,降低了成本。
本发明中,外接存储器中包括但不限于使用QDR2SRAM(Quad Data Rate StaticRandom Access Memory,四倍数据速率静态随机存取存储器)。以QDR2SRAM为例:
QDR2SRAM设置有两个存储区域,一个用于缓存数据包链表,一个用于缓存数据包的入队次数,现有技术中,数据包的初始入队次数为空或者为0,容易造成PMAU在数据包操作过程中的误回收的问题,本发明在初始化时,即将用于缓存数据包的入队次数的存储空间全部初始化为预设的初始入队次数,解决了PMAU在数据包操作过程中的被误回收的问题。
当一个数据包占用的存储空间为1个时,称为短包,当一个数据包占用的存储空间不止1个时,称为长包。无论是短包还是长包,均存储在外接存储器中,数据包在存储到外接存储器中时,其PMAU及链表就相应的生成或建立,短包由于只占一个存储空间,故短包只有一个PMAU,而长包一般是分片后再行存储,每一个分片数据占一个存储空间,故长包有多个PMAU,并被依次存入链表中进行管理,数据包的链表中除了保存数据包的PMAU外,还保存了数据包的节点标识等;本发明不涉及具体的数据包操作,只涉及数据包的PMAU和入队次数的处理。
步骤S003:令数据包的PMAU或数据包链首PMAU维护上述数据包的入队次数;
本发明中,由于数据包的PMAU或者链首PMAU维护数据包的入队次数,故根据数据包的PMAU或者链首PMAU,读写数据包的入队次数。
步骤S004:检测到数据包入队或者出队时,更新上述数据包的入队次数;
本步骤具体包括以下步骤:
步骤S41:根据上述数据包的PMAU或链表的链首PMAU,从上述外接存储器中读取上述数据包的入队次数;
若为第一次读取数据包的入队次数,则读出的入队次数为上述数据包的初始入队次数;
步骤S42:将上述链首PMAU作为写地址;
步骤S43:判断数据包处理装置的多级移位寄存器中是否有与上述写地址相同的地址,若是,则执行步骤S44;否则,执行步骤S45;
步骤S44:读取上述多级移位寄存器中上述地址的数据,作为上述数据包的历史入队次数,若上述多级移位寄存器中有两个以上的地址与上述写地址相同,则读取其中优先级高的地址中的数据,作为上述数据包的历史入队次数;转入步骤S46;
步骤S45:将从外接存储器中读取的入队次数作为上述数据包的历史入队次数;
步骤S46:根据上述历史入队次数,计算上述数据包预更新的入队次数;
当上述数据包为入队时,本步骤具体为:用上述历史入队次数,加上统计得到的入队次数,得到上述数据包预更新的入队次数;
当上述数据包为出队时,本步骤具体为:用上述历史入队次数减1,得到上述数据包预更新的入队次数。
步骤S47:用计算得到的入队次数更新上述外接存储器中上述数据包的入队次数;
步骤S48:将更新后的入队次数及其缓存地址写入数据包处理装置的多级移位寄存器的第一级移位寄存器中;
步骤S49:对上述多级移位寄存器进行移位操作。
步骤S005:判断上述数据包的PMAU是否需要回收,若是,则执行步骤S006;否则,返回步骤S004;
本步骤通过以下步骤判断数据包的PMAU是否需要回收:
判断数据包的类型标识及入队次数,若上述数据包的类型标识为只经过交换域且入队次数为1,则需要回收上述数据包的PMAU;若上述数据包的类型标识为既经过交换域又上报CPU且入队次数为0,则需要回收上述数据包的PMAU;若上述数据包的类型标识为只上报CPU,则需要回收上述数据包的PMAU。因此,本发明对于TC、OC/BC模式的1588数据包同样适用。
步骤S006:回收上述数据包的PMAU。
当需要回收PMAU的数据包为短包时,本步骤具体为:
将数据包的PMAU写入待回收短包PMAU FIFO;当轮询到待回收短包PMAU FIFO时,回收当前PMAU。
当需要回收PMAU的数据包为长包时,本步骤具体为:
步骤S61:将数据包链表的链首PMAU作为下一个PMAU的读地址,写入到链首PMAU读地址FIFO;
步骤S62:轮询到上述链首PMAU读地址FIFO时,取出其中的PMAU,将取出的PMAU写入预设有计数器的待回收长包非链尾PMAU FIFO,同时将上述取出的PMAU作为读地址,读取数据包链表中的下一个PMAU;
上述待回收长包非链尾PMAU FIFO的计数器的初始值为0,最大值为待回收长包非链尾PMAU FIFO的深度;
步骤S63:判断读取到的PMAU是否是数据包链表的最后一个PMAU,若是,则将上述PMAU写入待回收长包链尾PMAU FIFO,并令上述待回收长包非链尾PMAU FIFO的计数器加1;否则,将上述PMAU作为数据包链表的下一个PMAU的读地址,写入非链首PMAU读地址FIFO,并令上述待回收长包非链尾PMAU FIFO的计数器加1;
步骤S64:轮询到上述非链首PMAU读地址FIFO时,取出其中的PMAU,将取出的PMAU写入上述待回收长包非链尾PMAU FIFO,同时将上述取出的PMAU作为读地址,读取数据包链表中的下一个PMAU,执行步骤S63;
步骤S65:轮询到待回收长包非链尾PMAU FIFO时,判断上述待回收长包非链尾PMAU FIFO的计数器的值是否大于0;若是,则回收当前PMAU,并令待回收长包非链尾PMAUFIFO的计数器减1;当轮询到待回收长包链尾PMAU FIFO时,则直接回收当前PMAU。
本发明中,PMAU读地址FIFO与待回收PMAU FIFO的轮询过程是在两个进程中执行的,这两个进程有可能同时执行,本实施例将其写在两个步骤中,仅仅是为了描述方便,并不代表PMAU读地址FIFO与待回收PMAU FIFO的轮询过程一定是异步执行。
由于数据包在入队时,其入队次数是所有复制后的数据包均入队或丢弃后一次性统计获得,故存在这样的问题:数据包的入队次数还没统计完成或者统计完成但还未缓存时(按照现有技术,此时数据包的入队次数为0),先入队的数据包已出队,此时需要对该数据包的入队次数进行更新,更新后数据包的入队次数变为负数(此时的入队次数为历史入队次数减1),为了避免出现负数而导致该数据包的PMAU被错误回收,本发明为数据包设置一个初始入队次数,这样,不管是数据包在入队时更新入队次数,还是数据包出队时更新入队次数,都可避免处理负数,从而使得数据包的PMAU能够准确回收。
本发明适用于多链表、数据包端口交织等场景,对于长包来说,由于数据包的数据分片存储在不同的地址中,故数据包的PMAU不能同时回收,只能逐个回收。为了避免下一PMAU未读出时即回收当前PMAU,且该PMAU被快速再次分配而引起的链表被覆盖的问题,本发明为待回收长包非链尾PMAU FIFO设置了计数器,读取到下一PMAU后才可以回收当前PMAU,保证了链表的稳定性,避免了缓存泄漏。
如图2所示,是本发明数据包处理装置优选实施例的原理框图,本实施例包括初始化模块01、入队次数更新模块02、PMAU回收模块03以及多级移位寄存器04,
初始化模块01,用于将预设的数据包初始入队次数初始化到外接存储器中;具体为:将初始入队次数写入外接存储器中用于存储数据包入队次数的存储区域中的每个入队次数存储空间中;
入队次数更新模块02,用于在数据包为短包时,令数据包的PMAU维护其入队次数,或者在数据包为长包时,令数据包链表的链首PMAU维护其入队次数;在数据包入队或者出队时,更新上述数据包的入队次数,具体为:计算数据包预更新的入队次数;并用计算得到的入队次数更新外接存储器中上述数据包的入队次数,以及将更新后的入队次数及其缓存地址写入多级移位寄存器04的第一级移位寄存器中,并对多级移位寄存器04进行移位操作;
PMAU回收模块03,用于判断数据包的PMAU是否需要回收,并在需要回收时,回收上述数据包的PMAU;具体为:在需要回收PMAU的数据包为短包时,将数据包的PMAU写入待回收短包PMAUFIFO,在轮询到待回收短包PMAU FIFO时,直接回收当前PMAU;在需要回收PMAU的数据包为长包时,将数据包链表的非链尾PMAU写入预设有计数器的待回收长包非链尾PMAUFIFO,将链尾PMAU写入待回收长包链尾PMAU FIFO,在读取到长包的数据包链表的下一个PMAU后,令上述待回收长包非链尾PMAU FIFO的计数器加1;以及在轮询到待回收长包非链尾PMAU FIFO时,判断上述待回收长包非链尾PMAU FIFO的计数器的值是否大于0,在上述待回收长包非链尾PMAU FIFO的计数器的值大于0时,回收当前PMAU,并令上述待回收长包非链尾PMAU FIFO的计数器减1;在轮询到待回收长包链尾PMAU FIFO时,直接回收当前PMAU。
上述说明示出并描述了本发明的优选实施例,但如前所述,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述发明构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。