From 2e848e9290c2c912df46a7f9b4cd93ce002e9ba9 Mon Sep 17 00:00:00 2001
From: Anders Svensson
Date: Sat, 6 Apr 2013 15:59:13 +0200
Subject: 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 55b531155f..8bccf6521e 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=accept.
Remote 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 dfc76eb76e..0d2efd4d1f 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 bee3e507fd..6be4259510 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},
--
cgit v1.2.3