From 2e848e9290c2c912df46a7f9b4cd93ce002e9ba9 Mon Sep 17 00:00:00 2001 From: Anders Svensson Date: Sat, 6 Apr 2013 15:59:13 +0200 Subject: [PATCH] Add transport interface 'connected' message with local address list A transport module can return a local address list from its start/3 function in order to specify addresses to be used as Host-IP-Address during capabilities exchange. Now allow addresses to be communicated in a 'connected' message in the case of a connecting transport, so that diameter_tcp (in particular) can make local address configuration optional, communicating the gen_tcp default after connection establishment instead. --- lib/diameter/doc/src/diameter_transport.xml | 30 +++++++++++++-------- lib/diameter/src/base/diameter_peer.erl | 8 ++++-- lib/diameter/src/base/diameter_peer_fsm.erl | 13 +++++++-- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/lib/diameter/doc/src/diameter_transport.xml b/lib/diameter/doc/src/diameter_transport.xml index 55b531155fc2..8bccf6521e1f 100644 --- a/lib/diameter/doc/src/diameter_transport.xml +++ b/lib/diameter/doc/src/diameter_transport.xml @@ -1,6 +1,8 @@ message()'> + MESSAGES'> + start/3'> inet:ip_address()'> @@ -12,7 +14,7 @@
-20112012 +20112013 Ericsson AB. All Rights Reserved. @@ -125,7 +127,7 @@ Ref is the value that was returned from the call to &mod_add_transport; that has lead to starting of a transport process.

-Svc contains the capabilities passed to &mod_start_service; and +Svc contains capabilities passed to &mod_start_service; and &mod_add_transport;, values passed to the latter overriding those passed to the former.

@@ -134,13 +136,16 @@ passed to the former.

&mod_transport_opt; list passed to &mod_add_transport;.

-The start function should use the Host-IP-Address list and/or -Config to select an appropriate list of local IP addresses, -and should return this list if different from the -#diameter_service{} addresses. -The returned list is used to populate Host-IP-Address AVPs in -outgoing capabilities exchange messages, the -#diameter_service{} addresses being used otherwise.

+The start function should use the Host-IP-Address list in +Svc and/or Config to select an appropriate list of local +IP addresses, and should return this list if different from the +Svc addresses. +In the connecting case, the local address list can instead be +communicated in a connected message (see &MESSAGES; below) +following connection establishment. +In either case, the local address list is used to populate +Host-IP-Address AVPs in outgoing capabilities exchange +messages.

A transport process must implement the message interface documented below. @@ -230,13 +235,16 @@ Not sent if the transport process has Type=connect.

{diameter, {self(), connected, Remote}} +{diameter, {self(), connected, Remote, [LocalAddr]}}

Inform the parent that the transport process with Type=connect has established a connection with a peer. -Not sent if the transport process has Type=accept. +Not sent if the transport process has Type=acceptRemote is an arbitrary term that uniquely identifies the remote -endpoint to which the transport has connected.

+endpoint to which the transport has connected. +A LocalAddr list has the same semantics as one returned from +&start;.

{diameter, {recv, &message;}} diff --git a/lib/diameter/src/base/diameter_peer.erl b/lib/diameter/src/base/diameter_peer.erl index dfc76eb76e8e..0d2efd4d1fc1 100644 --- a/lib/diameter/src/base/diameter_peer.erl +++ b/lib/diameter/src/base/diameter_peer.erl @@ -24,7 +24,8 @@ %% Interface towards transport modules ... -export([recv/2, up/1, - up/2]). + up/2, + up/3]). %% ... and the stack. -export([start/1, @@ -180,7 +181,7 @@ start(Mod, Args) -> apply(Mod, start, Args). %%% --------------------------------------------------------------------------- -%%% # up/[12] +%%% # up/1-3 %%% --------------------------------------------------------------------------- up(Pid) -> %% accepting transport @@ -189,6 +190,9 @@ up(Pid) -> %% accepting transport up(Pid, Remote) -> %% connecting transport ifc_send(Pid, {self(), connected, Remote}). +up(Pid, Remote, LAddrs) -> %% connecting transport + ifc_send(Pid, {self(), connected, Remote, LAddrs}). + %%% --------------------------------------------------------------------------- %%% # recv/2 %%% --------------------------------------------------------------------------- diff --git a/lib/diameter/src/base/diameter_peer_fsm.erl b/lib/diameter/src/base/diameter_peer_fsm.erl index bee3e507fd3b..6be4259510a4 100644 --- a/lib/diameter/src/base/diameter_peer_fsm.erl +++ b/lib/diameter/src/base/diameter_peer_fsm.erl @@ -351,10 +351,17 @@ transition({diameter, {TPid, connected, Remote}}, mode = M} = S) -> {'Wait-Conn-Ack', _} = PS, %% assert - connect = M, %% + connect = M, %% keep_transport(TPid), send_CER(S#state{mode = {M, Remote}}); +transition({diameter, {TPid, connected, Remote, LAddrs}}, + #state{transport = TPid, + service = Svc} + = S) -> + transition({diameter, {TPid, connected, Remote}}, + S#state{service = readdr(Svc, LAddrs)}); + %% Connection from peer. transition({diameter, {TPid, connected}}, #state{transport = TPid, @@ -363,7 +370,7 @@ transition({diameter, {TPid, connected}}, parent = Pid} = S) -> {'Wait-Conn-Ack', Tmo} = PS, %% assert - accept = M, %% + accept = M, %% keep_transport(TPid), Pid ! {accepted, self()}, start_timer(Tmo, S#state{state = recv_CER}); @@ -376,6 +383,8 @@ transition({diameter, {_, connected}}, _) -> {stop, connection_timeout}; transition({diameter, {_, connected, _}}, _) -> {stop, connection_timeout}; +transition({diameter, {_, connected, _, _}}, _) -> + {stop, connection_timeout}; %% Connection has timed out: start an alternate. transition({connection_timeout = T, TPid},