aboutsummaryrefslogtreecommitdiffstats
path: root/lib/diameter
diff options
context:
space:
mode:
authorAnders Svensson <[email protected]>2017-06-12 15:35:22 +0200
committerAnders Svensson <[email protected]>2017-06-12 16:13:03 +0200
commit84bfb4980a5d6dd806cff07c8dc1c9f2ef85fc20 (patch)
tree4db82dc888b97c95a13052f0d86f80addd506944 /lib/diameter
parent9296f611de2055c65bdae9425ce80e63fba6610f (diff)
downloadotp-84bfb4980a5d6dd806cff07c8dc1c9f2ef85fc20.tar.gz
otp-84bfb4980a5d6dd806cff07c8dc1c9f2ef85fc20.tar.bz2
otp-84bfb4980a5d6dd806cff07c8dc1c9f2ef85fc20.zip
Let diameter_tcp send/recv callbacks deal in diameter_packet
To let a recv callback for an incoming request set transport_data and have it returned in a send callback.
Diffstat (limited to 'lib/diameter')
-rw-r--r--lib/diameter/src/transport/diameter_tcp.erl73
1 files changed, 40 insertions, 33 deletions
diff --git a/lib/diameter/src/transport/diameter_tcp.erl b/lib/diameter/src/transport/diameter_tcp.erl
index 5819d52bdc..a2f393d5d4 100644
--- a/lib/diameter/src/transport/diameter_tcp.erl
+++ b/lib/diameter/src/transport/diameter_tcp.erl
@@ -523,9 +523,10 @@ getr(Key) ->
%% Transition monitor state.
%% Outgoing message.
-m(Bin, S)
- when is_binary(Bin) ->
- send(Bin, S),
+m(Msg, S)
+ when is_record(Msg, diameter_packet);
+ is_binary(Msg) ->
+ send(Msg, S),
S;
%% Transport has established a connection. Stop monitoring on the
@@ -632,9 +633,10 @@ transition({diameter, {send, Msg}}, #transport{} = S) ->
message(send, Msg, S);
%% Monitor has sent an outgoing message.
-transition(Bin, S)
- when is_binary(Bin) ->
- message(ack, Bin, S);
+transition(Msg, S)
+ when is_record(Msg, diameter_packet);
+ is_binary(Msg) ->
+ message(ack, Msg, S);
%% Deferred actions from a message_cb.
transition({actions, Dir, Acts}, S) ->
@@ -856,22 +858,25 @@ connect(Mod, Host, Port, Opts) ->
%% send/2
-send(Bin, #monitor{socket = Sock, module = M, transport = TPid, ack = B}) ->
- send1(M, Sock, Bin),
- B andalso (TPid ! Bin);
+send(Msg, #monitor{socket = Sock, module = M, transport = TPid, ack = B}) ->
+ send1(M, Sock, Msg),
+ B andalso (TPid ! Msg);
-send(Bin, #transport{socket = Sock, module = M, send = false} = S) ->
- send1(M, Sock, Bin),
- message(ack, Bin, S);
+send(Msg, #transport{socket = Sock, module = M, send = false} = S) ->
+ send1(M, Sock, Msg),
+ message(ack, Msg, S);
%% Send from the monitor process to avoid deadlock if both the
%% receiver and the peer were to block in send.
-send(Bin, #transport{send = Pid} = S) ->
- Pid ! Bin,
+send(Msg, #transport{send = Pid} = S) ->
+ Pid ! Msg,
S.
%% send1/3
+send1(Mod, Sock, #diameter_packet{bin = Bin}) ->
+ send1(Mod, Sock, Bin);
+
send1(Mod, Sock, Bin) ->
case send(Mod, Sock, Bin) of
ok ->
@@ -953,17 +958,20 @@ getstat(M, Sock) ->
%% request. Ignoring possible extra arguments, calls are of the
%% following form.
%%
-%% cb(recv, Bin) Pass a received message into diameter?
-%% cb(send, Bin) Send a message?
-%% cb(ack, Bin) Acknowledgement of a completed send.
+%% cb(recv, Msg) Receive a message into diameter?
+%% cb(send, Msg) Send a message on the socket?
+%% cb(ack, Msg) Acknowledgement of a completed send.
%% cb(ack, false) Acknowledgement of a discarded request.
%%
-%% Callbacks return a list of the following form.
+%% Msg will be binary() in a recv callback, but can be a
+%% diameter_packet record in a send/ack callback if a recv/send
+%% callback returns a record. Callbacks return a list of the following
+%% form.
%%
-%% [boolean() | send | recv | binary()]
+%% [boolean() | send | recv | binary() | #diameter_packet{}]
%%
%% The atoms are meaningless by themselves, but say whether subsequent
-%% binaries are to be sent or received. A boolean says whether or not
+%% messages are to be sent or received. A boolean says whether or not
%% to continue reading on the socket. Messages can be received even
%% after false is returned if these arrived in the same packet. A
%% leading recv or send is implicit on the corresponding callbacks. A
@@ -979,11 +987,8 @@ message(send, false = M, S) ->
message(ack, _, #transport{message_cb = false} = S) ->
S;
-message(Dir, #diameter_packet{bin = Bin}, S) ->
- message(Dir, Bin, S);
-
-message(Dir, Bin, #transport{message_cb = CB} = S) ->
- recv(<<>>, actions(cb(CB, Dir, Bin), Dir, S)).
+message(Dir, Msg, #transport{message_cb = CB} = S) ->
+ recv(<<>>, actions(cb(CB, Dir, Msg), Dir, S)).
%% actions/3
@@ -999,13 +1004,15 @@ actions([Dir | As], _, S)
Dir == recv ->
actions(As, Dir, S);
-actions([Bin | As], send = Dir, #transport{} = S)
- when is_binary(Bin) ->
- actions(As, Dir, send(Bin, S));
+actions([Msg | As], send = Dir, S)
+ when is_binary(Msg);
+ is_record(Msg, diameter_packet) ->
+ actions(As, Dir, send(Msg, S));
-actions([Bin | As], recv = Dir, #transport{parent = Pid} = S)
- when is_binary(Bin) ->
- diameter_peer:recv(Pid, Bin),
+actions([Msg | As], recv = Dir, #transport{parent = Pid} = S)
+ when is_binary(Msg);
+ is_record(Msg, diameter_packet) ->
+ diameter_peer:recv(Pid, Msg),
actions(As, Dir, S);
actions([{defer, Tmo, Acts} | As], Dir, S) ->
@@ -1017,8 +1024,8 @@ actions(CB, _, S) ->
%% cb/3
-cb(false, _, Bin) ->
- [Bin];
+cb(false, _, Msg) ->
+ [Msg];
cb(CB, Dir, Msg) ->
diameter_lib:eval([CB, Dir, Msg]).