aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Svensson <[email protected]>2017-08-29 22:26:51 +0200
committerAnders Svensson <[email protected]>2017-08-29 22:29:49 +0200
commita3749fd240260958053f90539b0f7e04e720d070 (patch)
treef9ec8c915f45db72a232d2fba46e32a3d03e2f1b
parent1fd9b919608b54e4d08340c45fe1cabb6975880c (diff)
downloadotp-a3749fd240260958053f90539b0f7e04e720d070.tar.gz
otp-a3749fd240260958053f90539b0f7e04e720d070.tar.bz2
otp-a3749fd240260958053f90539b0f7e04e720d070.zip
Send unordered on all outbound diameter_sctp streams
There's no reason for sending ordered since request handling is concurrent: different processes handling incoming requests can't know in which order they were received on the transport, and different processes sending requests can't know the order in which they're sent.
-rw-r--r--lib/diameter/src/transport/diameter_sctp.erl26
1 files changed, 11 insertions, 15 deletions
diff --git a/lib/diameter/src/transport/diameter_sctp.erl b/lib/diameter/src/transport/diameter_sctp.erl
index 86a98776c5..2af11729a9 100644
--- a/lib/diameter/src/transport/diameter_sctp.erl
+++ b/lib/diameter/src/transport/diameter_sctp.erl
@@ -102,10 +102,10 @@
streams :: {uint(), uint()} %% {InStream, OutStream} counts
| undefined,
os = 0 :: uint(), %% next output stream
+ rotate = 1 :: boolean() | 0 | 1, %% rotate os?
packet = true :: boolean() %% legacy transport_data?
| raw,
message_cb = false :: false | diameter:eval(),
- unordered = 1 :: boolean() | 0 | 1, %% send unordered?
send = false :: pid() | boolean()}). %% sending process
%% Monitor process state.
@@ -678,14 +678,14 @@ send(#diameter_packet{transport_data = {outstream, SId}}
= S) ->
send(SId rem OS, Msg, S);
-%% ... or not: rotate when sending ordered ...
-send(Msg, #transport{unordered = false,
+%% ... or not: rotate when sending on multiple streams ...
+send(Msg, #transport{rotate = true,
streams = {_, OS},
os = N}
= S) ->
send(N, Msg, S#transport{os = (N + 1) rem OS});
-%% ... or send only on the first stream, possibly unordered.
+%% ... or send on the only stream available.
send(Msg, S) ->
send(0, Msg, S).
@@ -777,24 +777,20 @@ recv({_, #sctp_pdapi_event{}}, _) ->
%% recv/1
%%
-%% Start sending unordered on a lone outbound stream after the second
-%% reception, so that an outgoing CER/CEA will arrive at the peer
-%% before another request.
+%% Start sending unordered after the second reception, so that an
+%% outgoing CER/CEA will arrive at the peer before another request.
-recv(#transport{unordered = B} = S)
+recv(#transport{rotate = B} = S)
when is_boolean(B) ->
S;
-recv(#transport{unordered = 0, streams = {_, 1}, socket = Sock} = S) ->
+recv(#transport{rotate = 0, streams = {_,N}, socket = Sock} = S) ->
ok = inet:setopts(Sock, [{sctp_default_send_param,
#sctp_sndrcvinfo{flags = [unordered]}}]),
- S#transport{unordered = true};
+ S#transport{rotate = 1 < N};
-recv(#transport{unordered = 0} = S) ->
- S#transport{unordered = false};
-
-recv(#transport{unordered = N} = S) ->
- S#transport{unordered = N-1}.
+recv(#transport{rotate = N} = S) ->
+ S#transport{rotate = N-1}.
%% publish/4