diameter_codec
diameter_codec
模块
diameter_codec
模块摘要
直径信息的解码和编码。
描述
传入的Diameter消息在传递给diameter_app(3)
回调之前从二进制()中解码。同样,传出的Diameter消息在被传递到适当的diameter_transport(3)
模块进行传输之前被编码为二进制()。这里记录的功能实现了默认的编码/解码。
警告
直径用户不需要在这里明确地调用函数,当使用时发送和接收消息diameter:call/4
并且记录回调接口diameter_app(3)
:直径本身提供编码/解码作为配置传递diameter:start_service/2
的结果,并且结果可能不同于记录的函数返回的结果这里取决于配置。
下面的header()
和packet()
记录在diameter.hrl中定义,它可以包含如下。
-include_lib("diameter/include/diameter.hrl").
在字典文件编译产生的hrl文件中定义了特定于应用程序的记录。
数据类型
uint8() = 0..255uint24() = 0..16777215uint32() = 0..4294967295
8位,24位和32位整数出现在Diameter和AVP头文件中。
avp() = #diameter_avp{}
AVP的应用中立表示。主要用于需要处理任意直径应用的继电器应用。实现特定Diameter应用程序(为其配置字典)的服务可以操纵类型的值message()
。
字段有以下类型。
code = uint32()is_mandatory = boolean()need_encryption = boolean()vendor_id = uint32() | undefined
AVP头中的值分别对应于AVP代码,M标志,P标志和Vendor-ID。供应商ID不是undefined
暗示了一组V标志。
data = iolist()
AVP的数据字节。
name = atom()
正在讨论的字典文件中定义的AVP的名称,或者undefined
所讨论的字典文件未知AVP的名称。
value = term()
AVP的解码值。将undefined
在解码如果数据字节不能被解码,该AVP是未知的,或者如果decode format
是none
。解码值的类型如文件所示diameter_dict(4)
。
type = atom()
问题词典文件(或其继承的文件)中指定的AVP类型。可能的类型undefined
和直径类型:OctetString
,Integer32
,Integer64
,Unsigned32
,Unsigned64
,Float32
,Float64
,Grouped
,Enumerated
,Address
,Time
,UTF8String
,DiameterIdentity
,DiameterURI
,IPFilterRule
和QoSFilterRule
。
dictionary() = module()
生成的字典模块的名称。diameterc(1)
或diameter_make:codec/2
字典模块提供的接口是一个可能发生变化的实现细节。
header() = #diameter_header{}
Diameter标题的记录表示。packet()
返回的值decode/2
是从传入消息中提取的。在一个设定的值packet()
传递到encode/2
被保留在已编码的二进制()中,用外length
,cmd_code
和application_id
,所有这一切都是由所确定的dictionary()
问题。
注
由于直径本身将设置适当的值,因此不必在传出消息中明确设置标题字段。设置不合适的值对于测试目的可能很有用。
字段有以下类型。
version = uint8()length = uint24()cmd_code = uint24()application_id = uint32()hop_by_hop_id = uint32()end_to_end_id = uint32()
直径标头的版本、消息长度、命令代码、应用程序ID、逐跳标识符和端到端标识符字段的值.
is_request = boolean()is_proxiable = boolean()is_error = boolean()is_retransmitted = boolean()
对应于Diameter报头的R(equest),P(roxiable),E(rror)和T(潜在重传消息)标志的值。
message() = record() | maybe_improper_list()
传递给回调diameter:call/4
或从handle_request/3
回调返回的Diameter消息的表示形式。记录表示如下所述diameter_dict(4)
:字典文件中定义的消息被编码为记录,每个分量AVP有一个字段。同样,消息也可以编码为一个列表,其头部是原子值消息名称(如相关字典文件中指定的),其尾部是AVP名称/值对列表或具有AVP键值的映射名。解码格式取决于diameter:service_opt()
decode_format
。在编码时接受任何格式。
另一个列表值表示形式允许将消息指定为头部为a header()
且尾部为avp()
列表的列表。当按照handle_request/3
回调的返回值指示中继请求时,直接使用此表示。它与其他两个不同之处在于它绕过了对与其相关字典中的定义不一致的消息的检查:消息完全按照指定发送。
packet() = #diameter_packet{}
传入和传出Diameter消息的容器。字段具有以下类型。
header =
header()
| undefined
消息的Diameter标头。undefined
对于非中继应用中的外发消息可以是(通常应该是),在这种情况下直径提供了适当的值。
avps = [
avp()
] | undefined
消息的AVP。如果该msg
字段的值设置为非undefined
。
msg =
message()
| undefined
传入/传出消息。对于传入的消息,decode format
如果消息可以在非中继应用程序中解码,则对应于所配置的术语,undefined
否则。对于传出消息,设置[header()
|
avp()]
列表等同于将字段header
和avps
字段设置为相应的值。
警告
该msg
字段中的值并不
意味着没有解码错误。该errors
领域也应该被检查。
bin = binary()
编码前的传入消息或编码后的传出消息。
errors = [5000..5999 | {5000..5999, avp()}]
解码传入消息时检测到的错误,由相应的5xxx系列结果代码(永久故障)标识。对于传入的请求,这些应该被用来形成handle_request/3
回调中记录的适当答案diameter_app(3)
。对于传入的答案,diameter:application_opt()
answer_errors
确定行为。
transport_data = term()
一个任意的意义,仅限于有关的运输过程,如文件所述diameter_transport(3)
。
出口
decode(Mod, Bin) -> Pkt
类型
解码Diameter消息。
encode(Mod, Msg) -> Pkt
类型
编码Diameter消息。
另见
diameterc(1)
,diameter_app(3)
,diameter_dict(4)
,diameter_make(3)