M2PA: implement proper acknowledgement of user data
diff --git a/src/sctp_m2pa.erl b/src/sctp_m2pa.erl
index fc0a063..3979ad4 100644
--- a/src/sctp_m2pa.erl
+++ b/src/sctp_m2pa.erl
@@ -77,7 +77,7 @@
{ok, Prim, LoopDat}.
-% sctp_core indicates that ew have received some data...
+% sctp_core indicates that we have received some data...
rx_sctp(#sctp_sndrcvinfo{ppid = ?M2PA_PPID}, Data, State, LoopDat) ->
{ok, M2pa} = m2pa_codec:parse_msg(Data),
FsnRecv = M2pa#m2pa_msg.fwd_seq_nr,
@@ -86,8 +86,15 @@
#m2pa_msg{msg_class = ?M2PA_CLASS_M2PA,
msg_type = ?M2PA_TYPE_USER} ->
Mtp3 = M2pa#m2pa_msg.mtp3,
+ LoopDat2 = LoopDat#m2pa_state{last_bsn_received = FsnRecv},
+ case Mtp3 of
+ undefined ->
+ ok;
+ _ ->
+ send_userdata_ack(LoopDat2)
+ end,
Prim = osmo_util:make_prim('MTP','TRANSFER',indication, Mtp3),
- {ok, Prim, LoopDat#m2pa_state{last_bsn_received = FsnRecv}};
+ {ok, Prim, LoopDat2};
#m2pa_msg{msg_type = ?M2PA_TYPE_LINK} ->
handle_linkstate(M2pa, LoopDat),
{ignore, LoopDat};
@@ -198,6 +205,14 @@
tx_sctp(Stream, M2paBin),
LoopDat.
+send_userdata_ack(LoopDat) ->
+ M2pa = #m2pa_msg{msg_class = ?M2PA_CLASS_M2PA,
+ msg_type = ?M2PA_TYPE_USER,
+ fwd_seq_nr = LoopDat#m2pa_state.last_fsn_sent,
+ back_seq_nr = LoopDat#m2pa_state.last_bsn_received},
+ M2paBin = m2pa_codec:encode_msg(M2pa),
+ tx_sctp(0, M2paBin).
+
tx_sctp(Stream, Payload) when is_integer(Stream), is_binary(Payload) ->
Param = {Stream, ?M2PA_PPID, Payload},
% sent to 'ourselves' (behaviour master module)