实现多播转发的方法
技术领域
本发明属于计算机网络通信领域,具体涉及一种在Intel IXP2400网络处理器上实现多播转发的方法。
背景技术
参考图1,目前,在Intel IXP2400网络处理器报文处理流程如下:接收模块(RX)接收从外端口来的报文,然后送到处理模块(PM),处理模块处理完毕后送到二层封装模块(EM),封装完毕后送队列管理模块(QM),然后发送调度模块(TXS)调度包给发送模块(TX),最终发送模块把报文发送出去。队列管理模块和发送调度模块是基于包的管理和调度,每次处理只调度一个报文给发送模块(TX),发送模块按照信元方式把报文分片发送出去。
Buffer主要用来存放整个报文,参考图2、图3,每个buffer大小为2k字节,报文超过2k可使用多个buffer链来存放。META是buffer的描述单元,报文每个buffer中报文的大小,头部偏移等信息。一个META对应一个buffer。对于长报文,利用META的第一个长字把多个buffer链起来表示一个报文。
多播技术提供一种一个发送者向一组接收者传送数据的有效传输方式。多播在实际中有许多应用,如不同地域的指挥官可以利用多点多播系统参与计划编制会议,然后利用多播协议把计划传给下级指挥官;对地理上分布的逻辑数据库的数据修改以及视频点播、远程教学、网络电视等。多播传输中,数据被发送到接收者的多播地址,而不是每个接收者的单播地址,发送者只发送一个数据拷贝,源端到目标端路径上的中间节点复制该数据。
为实现多播通信,就必须建立支持多播的路由协议,目前常用的多播路由协议有距离向量多播路由协议DVMRP、协议无关密集模式多播协议和协议无关分散模式多播协议。
在Intel IXP2400网络处理器上实现多播转发时,需要把一份报文复制多份,目前,最简单的就是把整个报文体进行复制成多份报文,然后根据出接口信息分别封装不同报文头,发送出去。这种方法因为整个报文进行复制,效率低。
发明内容
本发明目的:提供一种在Intel IXP2400网络处理器上实现多播转发的方法。
本发明的技术内容:一种实现多播转发的方法,接收模块(RX)接收从外端口来的报文,然后送到处理模块(PM),处理模块处理完毕后送到封装模块(EM),封装完毕后送队列管理模块(QM),然后发送调度模块(TXS)调度包给发送模块(TX),最终发送模块把报文发送出去,其中,封装模块(EM)根据多播索引(MID)查找多播邻接封装表(DMAT),多播邻接封装表是一个链表,每一项保存一个出口报文封装格式信息,然后从多播队列出队一个多播报文头buffer,把报文头内容保存到该buffer中,构造多播报文头META,多播报文头META结构中增加一个多播标志位(M),同时修改原来META结构,增加一个多播发送次数域(tx_count),把META链到报文SOP META前,形成一个报文链表,然后把报文送到队列管理模块(QM)。
发送调度模块调度包给发送模块,发送模块(TX)得到一个报文,读取SOPMETA,同时把META中发送次数减1,如果发送次数不为0,则保存多播标志,否则不保存多播标志,然后把多播报文头拷贝到TBuf的prepend域,报文体拷贝到TBuf的后32字节处,然后发送出去,同时释放多播头buffer。
对报文头buffer,是可发送完立即释放,但对报文体,则检查发送次数,发送次数不为0,则不释放buffer,当减少到0时,释放buffer,且buffer足够多,可保证buffer堆积。
本发明的技术效果:因为多播报文只是报文头不一样,采用本发明方案,报文体不复制,只根据出接口不同,修改报文头,发送出去,在多播发送完毕后才释放整个报文缓冲区(buffer)。由于修改的只是报文头,故转发效率高。以下通过对比整个报文复制进行性能测试:
使用测试仪送POS 49字节报文到运行两种方案代码的设备中,检查出口性能,结果如下:
在整个报文都进行复制方案:在POS接口,49字节性能为1.2G BPS。
本发明方案:在POS接口,49字节性能为2.1G BPS。
故采用本发明方案性能提高很多。
附图说明
图1Intel IXP2400网络处理器报文处理流程的示意图;
图2Intel IXP2400网络处理器的buffer管理结构示意图;
图3Intel IXP2400网络处理器的META结构示意图;
图4增加多播后本发明的buffer管理结构示意图;
图5增加多播后本发明的META结构示意图;
图6本发明的封装处理流程图;
图7本发明的发送处理流程图;
图8本发明的报文的buffer回收处理流程图;
图9本发明的DMAT表的示意图。
具体实施方式
本发明提供了一种在Intel IXP2400网络处理器上实现多播转发的方法。假设:二层头部封装长度不大于32字节。二层头部在SNAP封装时最大二层头部长度为26字节。参考图4,构造一个多播头部buffer链,采用和原来设计链一致,但buffer大小为32字节。参考图5,META大小为了保持和原来设计一致,大小也采用8长字,其中,多播报文头META结构中增加一个多播标志位(M),同时修改原来META结构,增加一个多播发送次数域(tx_count),二层封装模块在多播时每次分配一个META,把二层头部写到对应的buffer中去,在第一个多播报文时写META发送次数域,把该报文送队列管理模块,在SOP或SOP_EOP mpkt多播时,读取第二个META信息,并减少发送次数(tx_count),把多播标志保存到发送上下文(TXC)。把多播二层头拷贝到一个TBuf Element prepend域,把其它报文内容拷贝到该TBuf Element后32字节处,发送该信元,报文的buffer回收。正常流程是发送完一个buffer(EOB)后立即释放该buffer。在多播时,对二层头buffer,是发送完立即释放,但对报文其它部分,则检查发送次数,发送次数不为0,则不释放buffer,当减少到0时,释放buffer。
在多buffer报文,SOP时判断是否要释放buffer时,为解决发送快的引擎把buffer已经释放,发送慢的引擎还在发送报文的问题,采用在多播队列中增加buffer个数。由于IXP1200buffer管理采用先进先出FIFO方式,在buffer足够多,可保证buffer堆积,即不会导致buffer环空。
参考图6、图7、图8,本发明的多播报文具体处理流程为:
(1)报文到达设备后,由接收模块(Rx)接收报文,把报文通过队列scratch环送到处理模块(PM)。
(2)处理模块(PM)检查报文头,发现为多播报文,使用报文目的IP和源IP查找多播表,得到多播索引(MID)。把报文通过scratch环送到报文封装模块(EM)
(3)封装模块(EM)根据多播索引(MID)查找多播邻接封装表(DMAT),参考图9,根据多播索引(根据ip查表得到),直接索引到多播邻接封装表头部,多播邻接封装表是一个链表,该表为一个二级表结构。一级表每个表项四个长字,第二级表每个表项为两个长字,第一级表根据多播索引直接索引到,以及表有一个next指针,指向下一个多播邻接封装。每一项保存一个出口报文封装格式信息,然后出队一个多播报文头buffer,把报文头内容保存到该buffer中,构造多播报文头META,把该META链到报文SOP META前,形成一个报文链表,然后把报文送到队列管理模块(QM),最后回到读下一个多播邻接封装表,进行多播下一个报文头的封装。直到整个多播发送完毕,再重新接收下一个多播报文。比如:多播要发送十次,根据多播索引查到第一级表,根据tx_count知道要发送十次,则先根据第一个多播邻接封装表,封装好报文,放到一个buffer中,把发送次数tx_count写到SOP META中。封装模块根据next_ptr读下一个多播邻接封装表,重复十次。
(4)队列管理和调度模块对报文进行管理和调度,送到发送模块。
(5)发送模块得到一个报文,读取META后,发现为多播报文,则读SOPMETA,同时把META中发送次数减1,如果发送次数不为0,则保存多播标志,否则不保存多播标志。然后把多播报文头拷贝到TBuf的prepend域,报文体拷贝到TBuf的后32字节处。然后发送出去。同时释放多播头buffer。在报文一个buffer发送完毕后,检查多播标志,多播则不进行报文buffer的释放,非多播则释放buffer。