aboutsummaryrefslogtreecommitdiffstats
path: root/lib/diameter/src/base/diameter_peer_fsm.erl
diff options
context:
space:
mode:
authorAnders Svensson <[email protected]>2012-08-22 19:56:02 +0200
committerAnders Svensson <[email protected]>2012-08-24 00:29:58 +0200
commit1c3884894917a7e84d95f7c82c61c6205d802717 (patch)
tree31c88ec8d9bd908adfef5f825e2817a679561efd /lib/diameter/src/base/diameter_peer_fsm.erl
parentcfea5eea406ba3af96588ff458e55de9a149d9c5 (diff)
downloadotp-1c3884894917a7e84d95f7c82c61c6205d802717.tar.gz
otp-1c3884894917a7e84d95f7c82c61c6205d802717.tar.bz2
otp-1c3884894917a7e84d95f7c82c61c6205d802717.zip
Deal with the fact that capabilities config may be incomplete
A transport can be configured before its service so handle insufficient configuration instead of crashing at CER/CEA encode.
Diffstat (limited to 'lib/diameter/src/base/diameter_peer_fsm.erl')
-rw-r--r--lib/diameter/src/base/diameter_peer_fsm.erl15
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/diameter/src/base/diameter_peer_fsm.erl b/lib/diameter/src/base/diameter_peer_fsm.erl
index 99644814d2..588ebfb4e8 100644
--- a/lib/diameter/src/base/diameter_peer_fsm.erl
+++ b/lib/diameter/src/base/diameter_peer_fsm.erl
@@ -202,14 +202,27 @@ handle_info(T, #state{} = State) ->
?LOG(stop, T),
x(T, State)
catch
+ exit: {diameter_codec, encode, _} = Reason ->
+ close_wd(Reason, State#state.parent),
+ ?LOG(stop, Reason),
+ %% diameter_codec:encode/2 emits an error report. Only
+ %% indicate the probable reason here.
+ diameter_lib:info_report(probable_configuration_error,
+ insufficient_capabilities),
+ {stop, {shutdown, Reason}, State};
{?MODULE, Tag, Reason} ->
?LOG(Tag, {Reason, T}),
{stop, {shutdown, Reason}, State}
end.
-%% The form of the exception caught here is historical. It's
+%% The form of the throw caught here is historical. It's
%% significant that it's not a 2-tuple, as in ?FAILURE(Reason),
%% since these are caught elsewhere.
+%% Note that there's no guarantee that the service and transport
+%% capabilities are good enough to build a CER/CEA that can be
+%% succesfully encoded. It's not checked at diameter:add_transport/2
+%% since this can be called before creating the service.
+
x(Reason, #state{} = S) ->
close_wd(Reason, S),
{stop, {shutdown, Reason}, S}.