OAM协议栈编码方法及系统转让专利

申请号 : CN201410427666.5

文献号 : CN104158903A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 黄志成

申请人 : 上海斐讯数据通信技术有限公司

摘要 :

本发明提供一种OAM协议栈编码方法。所述OAM协议栈编码方法包括:设置对象定义模块;根据所述对象定义模板对OAM对象进行定义OAM对象相关属性值;根据定义的所述OAM对象相关属性值生成OAM协议栈相关的代码。所述OAM协议栈相关的代码包括:协议栈公用函数源码、协议栈对象的设置函数代码、以及协议栈对象的取值函数代码。本发明的技术方案能够自动实现部分OAM协议栈相关代码的自动生成,不仅大大提供了代码的书写效率,缩短了项目开发周期,而且自动生成的代码的准确性、清晰性也得到了增强,为后期的二次开发及维护提供了极大的便利。

权利要求 :

1.一种OAM协议栈编码方法,其特征在于,所述OAM协议栈编码方法包括:

设置对象定义模块;

根据所述对象定义模板对OAM对象进行定义OAM对象相关属性值;

根据定义的所述OAM对象相关属性值生成OAM协议栈相关的代码。

2.根据权利要求1所述的OAM协议栈编码方法,其特征在于:所述对象定义模板包括:

对对象的全局属性以及对象的参数的定义;所述对象的全局属性包括:对象的名称、对象Branch值、以及对象Leaf值;所述对象的参数属性包括:参数的名称、参数的数据类型、以及参数在内存中占用的长度。

3.根据权利要求2所述的OAM协议栈编码方法,其特征在于:所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体;所述结构体代码的生成是根据每一个所述OAM对象定义生成一个结构体实例。

4.根据权利要求2所述的OAM协议栈编码方法,其特征在于:所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体数组声明、以及取对象数函数;所述结构体数组声明代码的生成是根据每一个所述OAM对象定义生成一个结构体实例,所有的所述结构体实例组成结构体数组声明;所述取对象数函数返回所述结构体数组中的对象数目。

5.根据权利要求3或4所述的OAM协议栈编码方法,其特征在于:所述根据每一个所述OAM对象定义生成一个结构体的具体实现包括:根据所述对象的名称、所述对象Branch值、对象Leaf值生成一个结构体实例;所述结构体实例包括相应对象的Branch、Leaf、设置函数、以及取值函数。

6.根据权利要求5所述的OAM协议栈编码方法,其特征在于:所述OAM协议栈相关的代码包括:协议栈对象的设置函数代码;所述设置函数输入的参数包括回复报文内存指针、设置报文有效数据字段指针、以及对象实例号;所述对象实例号用于确定所述OAM对象;所述OAM对象的全局属性还包括:设置消息ID、设置消息结构体、手动设置标记以及目的进程ID;当所述OAM对象的手动设置标识不为预设的手动设置标识时,生成的所述设置函数代码包括:根据所述设置报文有效数据字段指针获取所述OAM对象的相应属性值,并将所述OAM对象的相应属性值填写到所述OAM对象的设置消息结构体中;根据所述OAM对象的设置消息ID、设置消息结构体以及目的进程ID生成设置消息发送给目标进程;根据所述目标进程的设置回复消息确定设置回复码;将所述OAM对象的Branch值、Leaf值以及所述设置回复码填写到所述回复报文内存指针确定的相应位置;当所述OAM对象的对象手动设置标识为预设的手动设置标识时,则生成的所述设置函数为空函数,此时所述设置函数需人工处理。

7.根据权利要求5所述的OAM协议栈编码方法,其特征在于:所述OAM协议栈相关的代码包括:协议栈对象的取值函数代码;所述取值函数输入的参数包括回复报文内存指针、取值报文有效数据字段指针、以及对象实例号;所述对象实例号用于确定所述OAM对象;所述OAM对象的全局属性还包括:取值消息ID、取值消息结构体、手动取值标记以及目的进程ID;当所述OAM对象的手动取值标识为预设的手动取值标识时,生成的所述取值函数代码包括:根据所述OAM对象的取值消息ID、取值消息结构体以及目的进程ID生成取值消息发送给目标进程;根据所述目标进程的取值回复消息获取所述OAM对象的相应属性值,并将所述OAM对象Branch值、Leaf值以及所获取的所述OAM对象的相应属性值填充到所述回复报文内存指针确定的相应位置;所当所述OAM对象的对象手动取值标识为预设的手动取值标识时,则生成的所述取值函数为空函数,此时所述设置函数需人工处理。

8.一种OAM协议栈编码系统,其特征在于:所述OAM协议栈编码系统包括:

模板定义模块,用于设置对象定义模块;

对象定义模块,与所述模板定义模块相连,用于根据所述对象定义模板对OAM对象进行定义OAM对象相关属性值;

代码生成模块,与所述对象定义模块相连,用于根据定义的所述OAM对象相关属性值生成OAM协议栈相关的代码。

9.根据权利要求8所述的OAM协议栈编码系统,其特征在于:所述模板定义模块中的所述对象定义模板包括:对对象的全局属性以及对象的参数的定义;所述对象的全局属性包括:对象的名称、对象Branch值、以及对象Leaf值;所述对象的参数属性包括:参数的名称、参数的数据类型、以及参数在内存中占用的长度。

10.根据权利要求9所述的OAM协议栈编码系统,其特征在于:所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体;所述结构体代码的生成是根据每一个所述OAM对象定义生成一个结构体实例。

11.根据权利要求9所述的OAM协议栈编码系统,其特征在于:所述代码生成模块中的所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体数组声明、以及取对象函数;所述结构体数组声明代码的生成是根据每一个所述OAM对象定义生成一个结构体实例,所有的所述结构体实例组成结构体数组声明;所述取对象函数返回所述结构体数组中的对象数目。

12.根据权利要求10或11所述的OAM协议栈编码系统,其特征在于:所述结构体实例包括相应对象的Branch、Leaf、设置函数、以及取值函数;所述代码生成模块中的所述OAM协议栈相关的代码包括:协议栈对象的设置函数代码;所述设置函数输入的参数包括回复报文内存指针、设置报文有效数据字段指针、以及对象实例号;所述对象实例号用于确定所述OAM对象;所述OAM对象的全局属性还包括:设置消息ID、设置消息结构体、手动设置标记以及目的进程ID;当所述OAM对象的手动设置标识不为预设的手动设置标识时,生成的所述设置函数代码包括:根据所述设置报文有效数据字段指针获取所述OAM对象的相应属性值,并将所述OAM对象的相应属性值填写到所述OAM对象的设置消息结构体中;根据所述OAM对象的设置消息ID、设置消息结构体以及目的进程ID生成设置消息发送给目标进程;

根据所述目标进程的设置回复消息确定设置回复码;将所述OAM对象的Branch值、Leaf值以及所述设置回复码填写到所述回复报文内存指针确定的相应位置;所述代码生成模块中的所述OAM协议栈相关的代码还包括:协议栈对象的取值函数代码;所述取值函数输入的参数包括回复报文内存指针、取值报文有效数据字段指针、以及对象实例号;所述对象实例号用于确定所述OAM对象;所述OAM对象的全局属性还包括:取值消息ID、取值消息结构体、手动取值标记以及目的进程ID;当所述OAM对象的手动取值标识为预设的手动取值标识时,生成的所述取值函数代码包括:根据所述OAM对象的取值消息ID、取值消息结构体以及目的进程ID生成取值消息发送给目标进程;根据所述目标进程的取值回复消息获取所述OAM对象的相应属性值,并将所述OAM对象Branch值、Leaf值以及所获取的所述OAM对象的相应属性值填充到所述回复报文内存指针确定的相应位置。

说明书 :

OAM协议栈编码方法及系统

技术领域

[0001] 本发明涉及一种协议编码,特别是涉及一种OAM协议编码方法及系统。

背景技术

[0002] 在通信系统中,协议栈的开发一直是软件工程师的一个繁重的工作任务。由于协议栈的特殊性,不可避免的会有很多重复性的代码需要书写,这极大的增加了软件工程师的工作量,常常因此而拉长了项目的开发周期,增加项目的开发难度。
[0003] 在EPON(Ethernet Passive Optical Network,以太网无源光网络)系统中,ONU(Optical Network Unit,光网络单元)通过OAM(Operation Administation and Maintenance,操作、管理和维护)注册发现机制,注册到OLT(Optical Line Terminal,光线路终端),此时如果OLT认定ONU身份合法有效,则ONU上线。OLT可以管理上线的ONU,包括对ONU进行软件升级、动态带宽分配等操作,但其中最重要的是业务的下发和状态信息的监控读取等操作。通常业务的下发和状态信息的监控读取等操作需要都通过OAM对象的属性设置和取值操作来完成。由于EPON系统中需要大量使用OAM协议栈,从而使得在EPON系统中OAM协议栈编写的工作量巨大。
[0004] 鉴于此,如何在满足OAM协议栈功能实现的基础上,降低OAM协议栈的编码工作量,成为本领域技术人员亟待解决的问题。

发明内容

[0005] 鉴于以上所述现有技术的缺点,本发明的目的在于提供一种OAM协议栈编码方法及系统,用于解决现有技术中OAM协议栈开发的工作量巨大,代码书写效率低且开发的代码不便于后续维护的问题。
[0006] 为实现上述目的及其他相关目的,本发明提供一种OAM协议栈编码方法。所述OAM协议栈编码方法包括:设置对象定义模块;根据所述对象定义模板对OAM对象进行定义OAM对象相关属性值;根据定义的所述OAM对象相关属性值生成OAM协议栈相关的代码。
[0007] 可选地,所述对象定义模板包括:对对象的全局属性以及对象的参数的定义;所述对象的全局属性包括:对象的名称、对象Branch值、以及对象Leaf值;所述对象的参数属性包括:参数的名称、参数的数据类型、以及参数在内存中占用的长度。
[0008] 可选地,所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体;所述结构体代码的生成是根据每一个所述OAM对象定义生成一个结构体实例
[0009] 可选地,所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体数组声明、以及取对象数函数;所述结构体数组声明代码的生成是根据每一个所述OAM对象定义生成一个结构体实例,所有的所述结构体实例组成结构体数组声明;所述取对象数函数返回所述结构体数组中的对象数目。
[0010] 可选地,所述根据每一个所述OAM对象定义生成一个结构体的具体实现包括:根据所述对象的名称、所述对象Branch值、对象Leaf值生成一个结构体实例;所述结构体实例包括相应对象的Branch、Leaf、设置函数、以及取值函数。
[0011] 可选地,所述OAM协议栈相关的代码包括:协议栈对象的设置函数代码;所述设置函数输入的参数包括回复报文内存指针、设置报文有效数据字段指针、以及对象实例号;所述对象实例号用于确定所述OAM对象;所述OAM对象的全局属性还包括:设置消息ID、设置消息结构体、手动设置标记以及目的进程ID;当所述OAM对象的手动设置标识不为预设的手动设置标识时,生成的所述设置函数代码包括:根据所述设置报文有效数据字段指针获取所述OAM对象的相应属性值,并将所述OAM对象的相应属性值填写到所述OAM对象的设置消息结构体中;根据所述OAM对象的设置消息ID、设置消息结构体以及目的进程ID生成设置消息发送给目标进程;根据所述目标进程的设置回复消息确定设置回复码;将所述OAM对象的Branch值、Leaf值以及所述设置回复码填写到所述回复报文内存指针确定的相应位置。
[0012] 可选地,当所述OAM对象的对象手动设置标识为预设的手动设置标识时,则生成的所述设置函数为空函数,此时所述设置函数需人工处理。
[0013] 可选地,所述OAM协议栈相关的代码包括:协议栈对象的取值函数代码;所述取值函数输入的参数包括回复报文内存指针、取值报文有效数据字段指针、以及对象实例号;所述对象实例号用于确定所述OAM对象;所述OAM对象的全局属性还包括:取值消息ID、取值消息结构体、手动取值标记以及目的进程ID;当所述OAM对象的手动取值标识为预设的手动取值标识时,生成的所述取值函数代码包括:根据所述OAM对象的取值消息ID、取值消息结构体以及目的进程ID生成取值消息发送给目标进程;根据所述目标进程的取值回复消息获取所述OAM对象的相应属性值,并将所述OAM对象Branch值、Leaf值以及所获取的所述OAM对象的相应属性值填充到所述回复报文内存指针确定的相应位置。
[0014] 可选地,所当所述OAM对象的对象手动取值标识为预设的手动取值标识时,则生成的所述取值函数为空函数,此时所述设置函数需人工处理。
[0015] 本发明还提供一种OAM协议栈编码系统。所述OAM协议栈编码系统包括:模板定义模块,用于设置对象定义模块;对象定义模块,与所述模板定义模块相连,用于根据所述对象定义模板对OAM对象进行定义OAM对象相关属性值;代码生成模块,与所述对象定义模块相连,用于根据定义的所述OAM对象相关属性值生成OAM协议栈相关的代码。
[0016] 可选地,所述模板定义模块中的所述对象定义模板包括:对对象的全局属性以及对象的参数的定义;所述对象的全局属性包括:对象的名称、对象Branch值、以及对象Leaf值;所述对象的参数属性包括:参数的名称、参数的数据类型、以及参数在内存中占用的长度。
[0017] 可选地,所述代码生成模块中的所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体数组声明、以及取对象函数;所述结构体数组声明代码的生成是根据每一个所述OAM对象定义生成一个结构体实例,所有的所述结构体实例组成结构体数组声明;所述取对象函数返回所述结构体数组中的对象数目。
[0018] 可选地,所述代码生成模块中的所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体;所述结构体代码的生成是根据每一个所述OAM对象定义生成一个结构体实例。
[0019] 可选地,所述结构体实例包括相应对象的Branch、Leaf、设置函数、以及取值函数;所述代码生成模块中的所述OAM协议栈相关的代码包括:协议栈对象的设置函数代码;所述设置函数输入的参数包括回复报文内存指针、设置报文有效数据字段指针、以及对象实例号;所述对象实例号用于确定所述OAM对象;所述OAM对象的全局属性还包括:设置消息ID、设置消息结构体、手动设置标记以及目的进程ID;当所述OAM对象的手动设置标识不为预设的手动设置标识时,生成的所述设置函数代码包括:根据所述设置报文有效数据字段指针获取所述OAM对象的相应属性值,并将所述OAM对象的相应属性值填写到所述OAM对象的设置消息结构体中;根据所述OAM对象的设置消息ID、设置消息结构体以及目的进程ID生成设置消息发送给目标进程;根据所述目标进程的设置回复消息确定设置回复码;将所述OAM对象的Branch值、Leaf值以及所述设置回复码填写到所述回复报文内存指针确定的相应位置。
[0020] 可选地,所述结构体实例包括相应对象的Branch、Leaf、设置函数、以及取值函数;所述代码生成模块中的所述OAM协议栈相关的代码包括:协议栈对象的取值函数代码;所述取值函数输入的参数包括回复报文内存指针、取值报文有效数据字段指针、以及对象实例号;所述对象实例号用于确定所述OAM对象;所述OAM对象的全局属性还包括:取值消息ID、取值消息结构体、手动取值标记以及目的进程ID;当所述OAM对象的手动取值标识为预设的手动取值标识时,生成的所述取值函数代码包括:根据所述OAM对象的取值消息ID、取值消息结构体以及目的进程ID生成取值消息发送给目标进程;根据所述目标进程的取值回复消息获取所述OAM对象的相应属性值,并将所述OAM对象Branch值、Leaf值以及所获取的所述OAM对象的相应属性值填充到所述回复报文内存指针确定的相应位置。
[0021] 如上所述,本发明的一种OAM协议栈编码方法及系统,具有以下有益效果:能够自动实现部分OAM协议栈相关代码的自动生成,不仅大大提供了代码的书写效率,缩短了项目开发周期,而且自动生成的代码的准确性、清晰性也得到了增强,为后期的二次开发及维护提供了极大的便利。

附图说明

[0022] 图1显示为本发明的一种OAM协议栈编码方法的一实施例的方法流程示意图。
[0023] 图2显示为本发明的一种OAM协议栈编码方法的一实施例的方法流程示意图。
[0024] 图3显示为本发明的一种OAM协议栈编码方法的一实施例的方法流程示意图。
[0025] 图4显示为本发明的一种OAM协议栈编码系统的一实施例的模块结构示意图。
[0026] 元件标号说明
[0027] 1 OAM协议栈编码系统
[0028] 11 模板定义模块
[0029] 12 对象定义模块
[0030] 13 代码生成模块
[0031] S1~S3 步骤

具体实施方式

[0032] 以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。
[0033] 需要说明的是,本实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
[0034] 为实现上述目的及其他相关目的,本发明提供一种OAM协议栈编码方法。如图1所示,在一个实施例中,所述OAM协议栈编码方法包括:
[0035] 步骤S1,设置对象定义模块。具体地,所述对象定义模板包括:对对象的全局属性以及对象的参数的定义;所述对象的全局属性包括:对象的名称(objectName)、对象Branch值(Branch)、以及对象Leaf值(Leaf);所述对象的参数属性包括:参数的名称(varlname)、参数的数据类型(dataType)、以及参数在内存中占用的长度(len)。在一个实施例中,所述对象的全局属性还包括:设置消息ID(setMsgId)、设置消息结构体(setStruct)、手动设置标记(setspechandler)、取值消息ID(getMsgId)、取值消息结构体(getStruct)、手动取值标记(getspechandler)以及目的进程ID(APPL_ID)。
[0036] 在一个实施例中,所述对象定义模板具体如下所示:
[0037]
[0038] 其中:
[0039]
[0040] 步骤S2,根据所述对象定义模板对OAM对象进行定义OAM对象相关属性值。具体地,根据IEEE802.3规范标准列出的OAM对象,遵照所述对象定义模板对所述OAM对象相关属性值进行定义。具体地,所述参数属性SET_OBJECT_VARIALBE对参数的定义取决于协议规范标准,可以包括1个参数或多个参数的情况。在特殊情况下,也可以为空,即没有参数的情况。在一个实施例中,如OAM协议操作对象aFECmode,它在规范标准中由Branch值和Leaf值唯一确定它的身份;而且有一个参数属性fecmode,数据类型是无符号整型。那么,遵照所述对象定义模板对所述OAM协议操作对象aFECmode对象相关属性的定义如下所示:
[0041]
[0042] 需要注意的是,如MSG_ID_EPON_PORT_SET_fecMode(设置消息ID)是根据OAM协议栈实际应用的系统确定的,并不属于协议规范标准的内容。当OAM对象属性在我们实际应用的系统中存在对应的设置消息ID时,即意味着存在系统操作接口,此时,我们需要使用该设置消息ID。反之,如果系统中不存在对应的设置消息ID,则我们仅需要保留模板中的“setMsgId”关键字即可。其他相关属性值的处理也类似,如果所述属性值在系统中有对应的相关值,则取其值;否则,保留模板中的关键字。在一个实施例中,所述参数属性可以为空,此时表示该OAM对象不存在参数变量。
[0043] 步骤S3,根据定义的所述OAM对象相关属性值生成OAM协议栈相关的代码。在一个实施例中,所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体;所述结构体代码的生成是根据每一个所述OAM对象定义生成一个结构体实例。在一个实施例中,所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体数组声明、以及取对象数函数;所述结构体数组声明代码的生成是根据每一个所述OAM对象定义生成一个结构体实例,所有的所述结构体实例组成结构体数组声明;所述取对象数函数返回所述结构体数组中的对象数目。在一个实施例中,实现该方法的代码生成脚本通过读取步骤2所定义的所述OAM对象相关属性值,并进行处理。对每一个所述OAM对象进行处理,所述处理包括:读取到“OBJECT_START”时,完成一些全局脚本变量的初始化。读取到“SET_OBJECT”时,将读取的其后面的相关全局变量属性值保留到相应的全局变量中。读取到“SET_OBJECT_VARIABLE”时,将读取的其后面的相关参数变量属性值保留到相应的全局变量中。读取到“OBJECT_END”时,说明一个完整的对象定义已经执行完毕,生成代码所需的全局变量赋值已经完成。通过这种方式或者类似的方式,同时可以将每一个所述OAM对象定义生成一个结构体实例。在一个实施例中,代码生成脚本根据所述OAM对象的对象名称、所述对象Branch值、对象Leaf值生成一个结构体实例;所述结构体实例包括相应对象的Branch、Leaf、设置函数、以及取值函数。每个定义的所述OAM对象相关属性值对应的生成了一个结构体实例,所有的这些结构体实例构成了结构体数据。所述取对象数函数返回所述结构体数组中的结构体对象数目,这可以简单的统计生成了结构体实例数目实现,也可以通过将所述结构体数组的长度除以单个结构体长度得到。在一个实施例中,所述代码生成脚本是通过TCL脚本实现的。
[0044] 在一个实施例中,所述OAM协议栈相关的代码还包括:协议栈对象的设置函数代码。具体地,设置函数代码的生成可以在读取到“OBJECT_END”时,生成代码所需的全局变量赋值已经完成时执行的。所述设置函数输入的参数包括回复报文内存指针、回复报文内存位移、设置报文有效数据字段指针、以及对象实例号;其中,所述对象实例号用于确定所述OAM对象。在一个实施例中,针对每一个OAM对象都生成一个设置函数代码,所有的设置函数代码生成后可以保存在对象私有设置函数接口源文件中。
[0045] 所述OAM对象的全局属性还包括:设置消息ID、设置消息结构体、手动设置标记以及目的进程ID。在生成协议栈对象的设置函数代码时,代码生成脚本首先判断所述OAM对象的手动设置标识是否为预设的手动设置标识(预设的手动设置标识可以默认为该属性关键字setspechandler)。如果所述OAM对象的手动设置标识为预设的手动设置标识,则说明该OAM对象的设置函数需要人工处理,此时,生成的所述OAM对象的设置函数为空函数。当所述OAM对象的手动设置标识不为预设的手动设置标识时,生成的所述设置函数代码包括:首先判断所述设置消息ID是否有效,如果有效,则根据所述设置报文有效数据字段指针获取所述OAM对象的相应属性值,并将所述OAM对象的相应属性值填写到所述OAM对象的设置消息结构体中。当所述属性值为多个时,将依次所述设置报文有效数据字段指针获取所述OAM对象的相应属性值(即根据对象属性顺序及属性对应的在报文中的长度循环解析所述设置报文的有效数据字段获取所述属性值),并将所述OAM对象的相应属性值填写到所述OAM对象的设置消息结构体中。根据所述OAM对象的设置消息ID、设置消息结构体以及目的进程ID生成设置消息发送给目标进程;根据所述目标进程的设置回复消息确定设置回复码;将所述OAM对象的Branch值、Leaf值以及所述设置回复码填写到所述回复报文内存指针确定的相应位置。如果所述设置消息ID无效,则不进行获取属性的操作,直接将所述OAM对象的Branch值、Leaf值以及无效返回码填写到所述回复报文内存指针确定的相应位置。所述设置函数还可以包括发送所述回复报文(通常为OAM报文)。当所述设置消息ID无效时,回复带无效返回码的OAM报文;当所述设置消息ID有效时,正确回复OAM报文。在一个实施例中,所述代码生成脚本是通过TCL脚本实现的。
[0046] 在一个实施例中,所述OAM协议栈相关的代码还包括:协议栈对象的取值函数代码。具体地,取值函数代码的生成可以在读取到“OBJECT_END”时,生成代码所需的全局变量赋值已经完成时执行的。所述取值函数输入的参数包括回复报文内存指针、回复报文内存位移、取值报文有效数据字段指针、以及对象实例号。其中,所述对象实例号用于确定所述OAM对象。在一个实施例中,针对每一个OAM对象都生成一个取值函数代码,所有的取值函数代码生成后可以保存在对象私有取值函数接口源文件中。
[0047] 所述OAM对象的全局属性还包括:取值消息ID、取值消息结构体、手动取值标记以及目的进程ID。在生成协议栈对象的取值函数代码时,代码生成脚本首先判断所述OAM对象的手动取值标识是否为预设的手动取值标识(预设的手动取值标识可以默认为该属性关键字getspechandler)。如果所述OAM对象的手动取值标识为预设的手动取值标识,则说明该OAM对象的取值函数需要人工处理,此时,生成的所述OAM对象的取值函数为空函数。当所述OAM对象的手动取值标识为预设的手动取值标识时,生成的所述取值函数代码包括:判断所述取值消息ID是否有效,如果有效,则根据所述OAM对象的取值消息ID、取值消息结构体以及目的进程ID生成取值消息发送给目标进程;根据所述目标进程的取值回复消息获取所述OAM对象的相应属性值,并将所述OAM对象Branch值、Leaf值以及所获取的所述OAM对象的相应属性值填充到所述回复报文内存指针确定的相应位置。如果所述取值消息ID无效,则不进行获取属性的操作,直接将所述OAM对象的Branch值、Leaf值以及无效返回码填写到所述回复报文内存指针确定的相应位置。所述取值函数还可以包括发送所述回复报文(通常为OAM报文)。当所述取值消息回复带无效返回码的OAM报文;当所述取值消息ID有效时,正确回复带参数内容的OAM报文。在一个实施例中,所述代码生成脚本是通过TCL脚本实现的。
[0048] 在一个实施例中,如图2所示,所述OAM协议栈编码方法包括生成设置函数代码。首先,在对象定义脚本中根据预设的对象定义模板定义协议中的OAM对象。然后,将对象定义脚本导入到功能实现脚本(即代码生成脚本)。在功能实现脚本中,首先根据所述OAM对象的手动设置标识判断是否需要手动处理,如果答案为YES,则需要手动处理设置函数代码。如果答案为No,此时,先通过设置消息ID判断设置消息是否有效(通过判断设置消息ID是否有效判断),如果答案为YES,则对设置消息报文进行解析,获取所述OAM对象的相应属性值,并填写到所述OAM对象的设置消息结构体中,根据所述OAM对象的设置消息ID、设置消息结构体以及目的进程ID生成设置消息发送给目标进程,根据所述目标进程的设置回复消息确定设置回复码。根据设置回复码填写正确的OAM报文并回复。如果答案为No,则回复无效OAM报文。
[0049] 在一个实施例中,如图3所示,所述OAM协议栈编码方法包括生成取值函数代码。首先,在对象定义脚本中根据预设的对象定义模板定义协议中的OAM对象。然后,将对象定义脚本导入到功能实现脚本(即代码生成脚本)。在功能实现脚本中,首先根据所述OAM对象的手动取值标识判断是否需要手动处理,如果答案为YES,则需要手动处理取值函数代码,即需要人工处理。如果答案为No,此时,先通过取值消息ID判断设置消息是否有效(通过判断取值消息ID是否有效来确定),如果答案为YES,则根据所述OAM对象的取值消息ID、取值消息结构体以及目的进程ID生成取值消息发送给目标进程。根据所述目标进程的取值回复消息获取所述OAM对象的相应属性值,并将所述OAM对象Branch值、Leaf值以及所获取的所述OAM对象的相应属性值填充到正确的OAM报文上,并回复所述正确的OAM报文。如果答案为No,则回复无效OAM报文。
[0050] 本发明还提供一种OAM协议栈编码系统。所述OAM协议栈编码系统能够应用如前所述的OAM协议栈编码方法。如图4所示,在一个实施例中,所述OAM协议栈编码系统1包括:模板定义模块11、对象定义模块12、以及代码生成模块13。其中:
[0051] 模板定义模块11,用于设置对象定义模块。所述模板定义模块中的所述对象定义模板包括:对对象的全局属性以及对象的参数的定义;所述对象的全局属性包括:对象的名称、对象Branch值、以及对象Leaf值;所述对象的参数属性包括:参数的名称、参数的数据类型、以及参数在内存中占用的长度。
[0052] 对象定义模块12,与所述模板定义模块11相连,用于根据所述对象定义模板对OAM对象进行定义OAM对象相关属性值。
[0053] 代码生成模块13,与所述对象定义模块12相连,用于根据定义的所述OAM对象相关属性值生成OAM协议栈相关的代码。在一个实施例中,所述代码生成模块13中的所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体;所述结构体代码的生成是根据每一个所述OAM对象定义生成一个结构体实例。在一个实施例中,所述结构体实例包括相应对象的Branch、Leaf、设置函数、以及取值函数。
[0054] 在一个实施例中,所述代码生成模块13中的所述OAM协议栈相关的代码包括:协议栈公用函数源码;所述协议栈公用函数源码包括协议栈对象的结构体数组声明、以及取对象函数;所述结构体数组声明代码的生成是根据每一个所述OAM对象定义生成一个结构体实例,所有的所述结构体实例组成结构体数组声明;所述取对象函数返回所述结构体数组中的对象数目。在一个实施例中,所述结构体实例包括相应对象的Branch、Leaf、设置函数、以及取值函数。
[0055] 在一个实施例中,所述代码生成模块13中的所述OAM协议栈相关的代码包括:协议栈对象的设置函数代码;所述设置函数输入的参数包括回复报文内存指针、设置报文有效数据字段指针、以及对象实例号;所述对象实例号用于确定所述OAM对象;所述OAM对象的全局属性还包括:设置消息ID、设置消息结构体、手动设置标记以及目的进程ID。当所述OAM对象的手动设置标识为预设的手动设置标识,则说明该OAM对象的设置函数需要人工处理,此时,生成的所述OAM对象的取值函数为空函数。当所述OAM对象的手动设置标识不为预设的手动设置标识时,生成的所述设置函数代码包括:判断所述设置消息ID是否有效,如果有效,则根据所述设置报文有效数据字段指针获取所述OAM对象的相应属性值,并将所述OAM对象的相应属性值填写到所述OAM对象的设置消息结构体中;根据所述OAM对象的设置消息ID、设置消息结构体以及目的进程ID生成设置消息发送给目标进程;根据所述目标进程的设置回复消息确定设置回复码;将所述OAM对象的Branch值、Leaf值以及所述设置回复码填写到所述回复报文内存指针确定的相应位置。所述设置函数还可以包括发送所述回复报文(通常为OAM报文)。当所述设置消息ID无效时,回复带无效返回码的OAM报文;当所述设置消息ID有效时,正确回复OAM报文。
[0056] 在一个实施例中,所述代码生成模块13中的所述OAM协议栈相关的代码包括:协议栈对象的取值函数代码;所述取值函数输入的参数包括回复报文内存指针、取值报文有效数据字段指针、以及对象实例号。所述对象实例号用于确定所述OAM对象;所述OAM对象的全局属性还包括:取值消息ID、取值消息结构体、手动取值标记以及目的进程ID。当所述OAM对象的手动取值标识为预设的手动取值标识,则说明该OAM对象的取值函数需要人工处理,此时,生成的所述OAM对象的取值函数为空函数。当所述OAM对象的手动取值标识不为预设的手动取值标识时,生成的所述取值函数代码包括:判断所述取值消息ID是否有效,如果有效,则根据所述OAM对象的取值消息ID、取值消息结构体以及目的进程ID生成取值消息发送给目标进程;根据所述目标进程的取值回复消息获取所述OAM对象的相应属性值,并将所述OAM对象Branch值、Leaf值以及所获取的所述OAM对象的相应属性值填充到所述回复报文内存指针确定的相应位置。所述取值函数还可以包括发送所述回复报文(通常为OAM报文)。当所述取值消息回复带无效返回码的OAM报文;当所述取值消息ID有效时,正确回复带参数内容的OAM报文。
[0057] 综上所述,本发明一种OAM协议栈编码方法及系统,具有以下有益效果:能够自动实现部分OAM协议栈相关代码的自动生成,不仅大大提供了代码的书写效率,缩短了项目开发周期,而且自动生成的代码的准确性、清晰性也得到了增强,为后期的二次开发及维护提供了极大的便利。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
[0058] 上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。