查看源代码 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}} 消息中(请参见下文)。Typeconnectaccept,具体取决于该进程是为连接传输还是监听传输而启动的。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_tcpdiameter_sctp

摘要

回调

启动传输进程。由 diameter 调用,作为调用 diameter:add_transport/2 的结果,以便分别建立或接受传输连接。传输进程维护与单个远程对等方的连接。

回调

链接到此回调

start/3

查看源代码 (自 OTP R14B03 起)
-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/2diameter:add_transport/2 的能力,传递给后者覆盖传递给前者的值。

Config 与传递给 diameter:add_transport/2diameter:transport_opt() 列表中的 transport_config 元组中的值相同。

start 函数应使用 Svc 和/或 Config 中的 Host-IP-Address 列表来选择并返回适当的本地 IP 地址列表。在连接的情况下,可以在建立连接后的 connected 消息中传递本地地址列表(请参见下面的 消息)。在任一情况下,如果未指定 Host-IP-Address,则本地地址列表将用于在传出的能力交换消息中填充 Host-IP-Address AVP。

传输进程必须实现下面记录的消息接口。它应保留其父进程的 pid,监视父进程,并在父进程死亡时终止。它不应链接到父进程。如果与对等方的传输连接丢失,则应退出。