M3UA: Properly select SCTP stream ID based on message class
diff --git a/src/m3ua_core.erl b/src/m3ua_core.erl
index 4005696..dfa2677 100644
--- a/src/m3ua_core.erl
+++ b/src/m3ua_core.erl
@@ -39,8 +39,8 @@
role, % asp | sgp
asp_state, % down, inactive, active
t_ack,
- user_pid,
- user_ref,
+ user_fun,
+ user_args,
sctp_remote_ip,
sctp_remote_port,
sctp_local_port,
@@ -75,8 +75,8 @@
end,
{ok, SctpSock} = gen_sctp:open(OpenOpts),
LoopDat = #m3ua_state{role = asp, sctp_sock = SctpSock,
- user_pid = proplists:get_value(user_pid, InitOpts),
- user_ref = proplists:get_value(user_ref, InitOpts),
+ user_fun = proplists:get_value(user_fun, InitOpts),
+ user_args = proplists:get_value(user_args, InitOpts),
sctp_remote_ip = proplists:get_value(sctp_remote_ip, InitOpts),
sctp_remote_port = proplists:get_value(sctp_remote_port, InitOpts),
sctp_local_port = LocalPort},
@@ -91,20 +91,28 @@
{ok, StateName, StateData}.
% Helper function to send data to the SCTP peer
-send_sctp_to_peer(LoopDat, PktData) when is_binary(PktData) ->
+send_sctp_to_peer(LoopDat, PktData, StreamId) when is_binary(PktData) ->
#m3ua_state{sctp_sock = Sock, sctp_assoc_id = Assoc} = LoopDat,
- SndRcvInfo = #sctp_sndrcvinfo{assoc_id = Assoc, ppid = 3, stream = 0},
- gen_sctp:send(Sock, SndRcvInfo, PktData);
+ SndRcvInfo = #sctp_sndrcvinfo{assoc_id = Assoc, ppid = 3, stream = StreamId},
+ gen_sctp:send(Sock, SndRcvInfo, PktData).
% same as above, but for un-encoded #m3ua_msg{}
send_sctp_to_peer(LoopDat, M3uaMsg) when is_record(M3uaMsg, m3ua_msg) ->
MsgBin = m3ua_codec:encode_m3ua_msg(M3uaMsg),
- send_sctp_to_peer(LoopDat, MsgBin).
+ StreamId = sctp_stream_for_m3ua(M3uaMsg),
+ send_sctp_to_peer(LoopDat, MsgBin, StreamId).
+
+% resolve the Stream ID depending on the m3ua_msg: 0 == management, 1 == trafic
+sctp_stream_for_m3ua(#m3ua_msg{msg_class = Class}) when
+ Class == ?M3UA_MSGC_TRANSFER ->
+ 1;
+sctp_stream_for_m3ua(#m3ua_msg{}) ->
+ 0.
send_prim_to_user(LoopDat, Prim) when is_record(LoopDat, m3ua_state), is_record(Prim, primitive) ->
- #m3ua_state{user_pid = Pid, user_ref = Ref} = LoopDat,
- Pid ! {m3ua, Ref, Prim}.
+ #m3ua_state{user_fun = Fun, user_args = Args} = LoopDat,
+ Fun(Prim, Args).
% helper to send one of the up/down/act/inact management messages + start timer
send_msg_start_tack(LoopDat, State, MsgClass, MsgType, Params) ->
@@ -263,7 +271,7 @@
msg_type = ?M3UA_MSGT_XFR_DATA, payload = Params}, LoopDat) ->
% Send primitive to the user
Mtp3 = proplists:get_value(?M3UA_IEI_PROTOCOL_DATA, Params),
- send_prim_to_user(LoopDat, osmo_util:make_prim('M','TRANSFER',indication,[Mtp3])),
+ send_prim_to_user(LoopDat, osmo_util:make_prim('MTP','TRANSFER',indication,[Mtp3])),
{next_state, asp_active, LoopDat};
asp_active(#m3ua_msg{msg_class = ?M3UA_MSGC_ASPTM,
msg_type = ?M3UA_MSGT_ASPTM_ASPIA_ACK}, LoopDat) ->