查看源代码 diameter_transport 行为 (diameter v2.4.1)
Diameter 传输接口。
指定为 transport_module
的模块,用于 diameter:add_transport/2
,必须实现此处记录的接口。该接口包含一个用于启动传输进程的函数,以及一个传输进程与其启动进程(即其父进程)通信的消息接口。
数据类型
message() = binary() |
diameter_codec:packet()
- 通过传输接口传递的 Diameter 消息。对于来自传输进程的入站消息,diameter_codec:packet() 的
bin
字段必须包含接收到的消息。对于入站请求,除非发送方提供其他值,否则在transport_data
字段中设置的任何值都将传递回相应的应答消息中的传输模块。对于到传输进程的出站消息,diameter_codec:packet() 的
transport_data
字段中的值不是undefined
,并且其bin
字段中包含要发送的 binary()。
消息
通过传输接口发送的所有消息的形式为 {diameter, term()}
。
传输进程可以从其父进程接收以下类型的消息。
{diameter, {send,
message()
| false}}
- 出站 Diameter 消息。只有在请求确认时才会收到原子false
:请参见下面的ack
消息。{diameter, {close, Pid}}
- 在收到对 DPR 的响应 DPA 后,请求终止传输进程。传输进程应退出。Pid
是父进程的 pid()。{diameter, {tls, Ref, Type, Bool}}
- 指示能力交换是否已选择使用 TLS 进行带内安全。Ref
是一个 reference(),必须包含在回复给传输父进程的{diameter, {tls, Ref}}
消息中(请参见下文)。Type
为connect
或accept
,具体取决于该进程是为连接传输还是监听传输而启动的。Bool
是一个 boolean(),指示是否应将传输连接升级到 TLS。如果请求 TLS (
Bool=true
),则连接进程应与对等方启动 TLS 握手,而接受进程应准备好接受握手。成功的握手之后,应向父进程发送{diameter, {tls, Ref}}
消息。握手失败应导致该进程退出。此消息仅发送给
Inband-Security-Id
配置表明支持 TLS 的传输进程。
传输进程应向其父进程发送以下类型的消息。
{diameter, {self(), connected}}
- 通知父进程,Type=accept
的传输进程已与对等方建立连接。如果传输进程的Type=connect
,则不发送。{diameter, {self(), connected, Remote}}
{diameter, {self(), connected, Remote, [LocalAddr]}}
- 通知父进程,Type=connect
的传输进程已与对等方建立连接。如果传输进程的Type=accept
,则不发送。Remote
是一个任意术语,唯一标识传输已连接到的远程端点。LocalAddr
列表的语义与从start/3
返回的列表相同。{diameter, ack}
- 请求对未应答的请求进行确认。传输进程应在将传入的 Diameter 消息传递到 diameter 之前发送一次此消息。因此,每个通过recv
消息(如下所示)传递到 diameter 的 Diameter 请求都将通过send
消息(如上所示)进行应答,可以是传输进程要发送的 message(),或者如果请求被丢弃或未应答,则为原子false
。这是为了允许传输进程跟踪尚未应答或丢弃的传入请求消息的数量,以便它可以调节传入流量的数量。当配置了
message_cb
时,diameter_tcp 和 diameter_sctp 都会请求确认,将发送/接收消息转换为可用于调节流量的回调。{diameter, {recv,
message()
}}
- 入站 Diameter 消息。{diameter, {tls, Ref}}
- 成功 TLS 握手的确认。Ref
是在{diameter, {tls, Ref, Type, Bool}}
消息中接收到的 reference(),响应于该消息发送回复。如果握手不成功,则传输必须退出。
另请参阅
摘要
回调
启动传输进程。由 diameter 调用,作为调用 diameter:add_transport/2
的结果,以便分别建立或接受传输连接。传输进程维护与单个远程对等方的连接。
回调
-callback start({Type, Ref}, Svc, Config) -> {ok, Pid} | {ok, Pid, LAddrs} | {error, Reason} when Type :: connect | accept, Ref :: diameter:transport_ref(), Svc :: #diameter_service{pid :: term(), capabilities :: term(), applications :: term()}, Config :: term(), Pid :: pid(), LAddrs :: [inet:ip_address()], Reason :: term().
启动传输进程。由 diameter 调用,作为调用 diameter:add_transport/2
的结果,以便分别建立或接受传输连接。传输进程维护与单个远程对等方的连接。
Type
指示所讨论的传输进程是为连接 (Type=connect
) 还是监听 (Type=accept
) 传输而启动的。在后一种情况下,会根据需要启动传输进程,以接受来自多个对等方的连接。
Ref 是从调用 diameter:add_transport/2
返回的值,该调用导致启动传输进程。
Svc
包含传递给 diameter:start_service/2
和 diameter:add_transport/2
的能力,传递给后者覆盖传递给前者的值。
Config
与传递给 diameter:add_transport/2
的 diameter:transport_opt() 列表中的 transport_config
元组中的值相同。
start 函数应使用 Svc
和/或 Config
中的 Host-IP-Address
列表来选择并返回适当的本地 IP 地址列表。在连接的情况下,可以在建立连接后的 connected
消息中传递本地地址列表(请参见下面的 消息)。在任一情况下,如果未指定 Host-IP-Address
,则本地地址列表将用于在传出的能力交换消息中填充 Host-IP-Address
AVP。
传输进程必须实现下面记录的消息接口。它应保留其父进程的 pid,监视父进程,并在父进程死亡时终止。它不应链接到父进程。如果与对等方的传输连接丢失,则应退出。