本发明提供一种基于Marvell交换芯片在CPU端构建上层通信协议过程中,对同时处理需要获取源端口信息的协议报文和不需要源端口信息的数据报文时,CPU高效率的处理方法。
背景技术:
在数据通信设备中,一些特殊的数据报文和协议报文都需要通过交换芯片上到CPU进行相应的处理。对于以EAPS环网检测协议为代表的一类协议报文上送CPU前需要加入报文进入交换芯片的入端口ID信息,EAPS协议在处理时报文的端口信息将作为判断是否环路的重要标志信息。而以带内网管报文为代表的数据文需要保持报文不作任何修改的给到网管模块进行处理。
因受Marvell交换芯片功能限制,不支持直接针对EAPS协议报文做入端口信息标记功能,而是提供了一种基于端口的DSA tag功能(如图3所示)。如图1所示,在和CPU相连的端口6上使能DSA tag功能之后,从6端口发出到CPU的所有报文都会被打上4个字节的DSA tag(如图2所示),其中有报文源端口信息,以满足需要获取报文源端口的协议处理流程需求。
由于带有DSA tag的报文在Linux内核的协议栈中不能被识别和处理,所以需要在Linux内核收包流程中,在送到协议栈之前对DSA tag做出处理。
目前常用的处理流程需要包含Linux内核的协议栈前处理和应用层收包处理两个部分:
常规Linux内核的协议栈前处理包含以下步骤(如图4所示):
1、CPU收到交换芯片上送的报文后,首先需解析报文,通过关键字判断是协议报文还是数据报文;
2、对于普通的数据报文(例如网管报文),由于不需要获取报文源端口信息,可以直接去掉4个字节的DSA tag,再通过Linux内核协议栈上送到网管模块处理;
3、对于EAPS等协议报文首先需要解析到DSA tag中的报文源端口信息;
4、将源端口信息附加到协议报文Payload的特定字段中;
5、去掉DSA tag,再通过Linux内核协议栈上送到应用协议(EAPS)处理(如图6所示);
常规应用层收包处理包含以下步骤(如图5):
1、应用层需二次解析报文,通过关键字判断是网管数据报文还是协议报文,分别送到协议处理模块和网管模块;
2、网管模块收到网管数据报文后,按网管流程进行解析处理;
3、应用协议收到协议报文后,解析协议报文Payload,到特定的字段中获取报文源端口信息。
4、继续协议处理流程。
技术实现要素:
本发明的上述技术问题主要是通过下述技术方案得以解决的:
一种基于Marvell交换芯片在获取报文源端口时CPU高效处理方法,其特征在于:上送协议栈处理时,将带有DSA tag后缀的协议报文,替换为VLAN tag后缀,再将源端口信息写入到VLAN id中,最后上送协议栈走协议处理流程。
在上述的一种基于Marvell交换芯片在获取报文源端口时CPU高效处理方法,对于带有DSA tag的协议报文,需要从DSA tag中获取到报文的源端口信息后,再进行字段替换。
在上述的一种基于Marvell交换芯片在获取报文源端口时CPU高效处理方法,上送协议栈处理前,对需要上送CPU的报文添加带有源端口信息的DSA tag。
在上述的一种基于Marvell交换芯片在获取报文源端口时CPU高效处理方法,上送协议栈处理时,对于带有DSA tag字段的数据报文,去掉4字节DSA tag字段,最后上送协议栈走数据处理流程。
在上述的一种基于Marvell交换芯片在获取报文源端口时CPU高效处理方法,应用层协议收包时,设置只接收带有VLAN tag的报文,即协议报文,报文中的VLAN id即为报文源端口。
与现有技术相比,本发明的有益效果是:1.在Linux内核收包处理中,对于协议报文,不需要删除4个字节的DSA tag字段,不修改报文的大小,避免了对Linux内核报文结构的sk_buff的修改,提高了报文处理效率。2.在应用层收包处理中,由于在Linux内核中已将协议报文修改为带有VLAN tag的报文,所以在收包时,对于协议模块可以只接收带有VLAN tag的报文即为协议报文,不需要再判断是否为数据报文然后做丢弃处理;而对于网管模块只接收不带VLAN Tag的数据报文,简化了应用层报文处理流程,提高了应用层报文处理效率。
附图说明
图1是通信设备的环形组网示意图。
图2是带DSA tag的报文结构示意图。
图3是DSA tag结构及字段值示意图。
图4是内核收包处理流程示意图。
图5是应用层协议收包处理流程示意图。
图6是上送协议栈的协议报文结构示意图。
图7是VLAN tag字段及值示意图。
图8是Linux内核收包处理流程示意图。
图9是相应的应用层协议的处理流程示意图。
具体实施方式
下面通过实施例,并结合附图,对本发明的技术方案作进一步具体的说明。
实施例:
首先介绍下改进Linux内核的协议栈前处理,具体包含以下步骤:
(1)CPU收到交换芯片上送的报文后,首先需解析报文,通过关键字判断是协议报文还是数据报文;
(2)对于普通的数据报文(例如网管报文),由于不需要获取报文源端口信息,可以直接去掉4个字节的DSA tag字段,再通过Linux内核协议栈上送到网管模块处理;
(3)对于EAPS等协议报文将4个字节的DSA tag转换为4个字节的VLAN tag(如图7所示),将源端口信息写到VLAN id中;
(4)直接通过Linux内核协议栈上送到应用协议(EAPS)处理;
改进应用层收包处理包含以下步骤:
(5)网管模块只需要处理不带VLAN Tag的网管数据报文,带VLAN Tag的协议报文直接丢弃,直接按网管流程进行解析处理;
(6)协议模块只处理带VLAN Tag的协议报文,不带VLAN Tag的报文直接丢弃,从VLAN Tag中获取VLAN id,即为报文源端口信息。
(7)继续协议处理流程。
本发明基于改进Linux内核的协议栈前处理,对报文进行处理的具体实现方法包括:
步骤S1.配置交换芯片使其自动为需要上送CPU的报文添加带有源端口信息的DSA tag;
步骤S2.Linux内核收包时,在上送协议栈处理之前,对于带有DSA tag的协议报文,在从DSA tag中获取到报文的源端口信息后,将DSA tag修改为VLAN tag(如图7所示),再将源端口信息写入到VLAN id中,上送协议栈走协议处理流程;
步骤S3.Linux内核收包时(如图8所示),在上送协议栈处理之前,对于带有DSA tag的数据报文,去掉4字节DSA tag,上送协议栈走数据处理流程;
步骤S4.应用层协议收包时,设置只接收带有VLAN tag的报文,即协议报文,报文中的VLAN id即为报文源端口(如图9所示)。
以上所述,仅是本发明的较佳实施例,并非对本发明作任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单增删裁剪、等同变化与修饰,均仍属本发明技术方案的保护范围。