用freeDiameter封装Diameter消息

来源:互联网 发布:linux route 修改 编辑:程序博客网 时间:2024/05/16 14:52

一、Diameter消息头的构建
1、在库中查找所要构建消息的消息头样例对象
函数1int fd_dict_search(struct dictionary*dict,enum dict_object_type type,int criteria,const void*what,struct dict_object**result,int retval);
参数1,是一个指向存储样例对象库的指针;
参数2,是所要查找样例对象的类型,对于msg消息头填选DICT_COMMAND,对于avp填选DICT_AVP,(如下为enum dict_object_type定义);
/* Types of object in the dictionary. */
enum dict_object_type {
DICT_VENDOR = 1,
DICT_APPLICATION,
DICT_TYPE,
DICT_ENUMVAL,
DICT_AVP,
DICT_COMMAND,
DICT_RULE };
参数3,是查找样例对象所用的方式,不同的参数2对应不同的方式;
参数4,是根据参数3,查找所用的具体数据;
参数5,传出参数,指向查找得到的样例对象地址的指针;
参数6,查找样例对象失败所定义的返回值。
 2、根据查找得到的样例对象构建消息实例
函数2fd_msg_new(struct dict_object*model,int flags,struct msg**msg);
参数1,指向样例对象的指针;
参数2,标志位,一般为0
参数3,指向构建完成的空消息实例地址的指针。

 二、不同类型avp的构建
不同类型的avp构建,具体构建流程大致相同,可归纳为:
查找avp样例对象—构建avp实例—根据avp类型填充数据—把avp添加到msg
不同类型avp的构建,除了数据填充有所差异,其他三个流程所用函数相同。
函数1int fd_dict_search(struct dictionary*dict,enum dict_object_type type,int criteria,const void*what,struct dict_object**result,int retval);
函数1的介绍见上.
函数3int fd_msg_avp_new(struct dict_object*model,int flags,struct avp**avp);
函数3的介绍类函数2.
函数4int fd_msg_avp_add(msg_or_avp*reference,enum msg_brw_dir dir,struct avp*avp);
函数4的作用是把构建好的avp实例添加到创建好的msg消息实例中,参数1是构建好的msg消息实例,参数2是把avp添加进msg中的方式,参数3是构建好的avp实例。
1、存储的数据类型是ipavp数据填充
2、类型为octetstringavp数据填充
3、类型是时间的avp数据填充
函数5fd_msg_avp_value_encode(void*data,struct avp*avp);
该函数的作用是,利用事先定义好的回调函数,用格式化的数据初始化avp实例。参数1是指向数据的指针,参数2是指向需要填充数据的avp的指针。对于以上3中类型的avp都可以使用该函数填充数据(octetstring的回调函数请自行实现)。
4、类型为enumvalavp数据填充
函数6int fd_dict_getval(struct dict_object* object,void* val);
该函数的作用是,把object中的数据存储在val中。参数1,是指向vap实例的指针;参数2,是指向存储数据的指针。
函数7int fd_msg_avp_setvalue(struct avp*avp,union avp_value*value);
该函数的做用是把value的数据填充进avp中去。参数1,是指向待填充数据的avp的指针;参数2,是指向未被填充数据的指针。


 5、类型是整形的avp数据填充
整形数据类型,包括unsigned32unsigned64integer32integer64都可以使用这样的方式填充avp



(对于avp类型为grouped本文未列出)
0 0
原创粉丝点击