M2PA: implement RC 'fiso_msu_accepted' flag

This flag prevents the accepting of FISU or MSU inside RC, ensuring that
those events cannot enter LSC/IAC during times where they are invalid.
diff --git a/src/sctp_m2pa.erl b/src/sctp_m2pa.erl
index 3979ad4..fdadd36 100644
--- a/src/sctp_m2pa.erl
+++ b/src/sctp_m2pa.erl
@@ -33,7 +33,8 @@
 		last_bsn_received,
 		last_fsn_sent,
 		lsc_pid,
-		iac_pid
+		iac_pid,
+		msu_fisu_accepted
 	}).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -42,11 +43,12 @@
 
 init(_InitOpts) ->
 	% start MTP2 IAC FSM pointing LSC, AERM and TXC to us
-	{ok, Lsc} = gen_fsm:start_link(mtp2_lsc, [self(), self(), self(),self()], [{debug, [trace]}]),
+	{ok, Lsc} = gen_fsm:start_link(mtp2_lsc, [self(), self(), self(), self(),self()], [{debug, [trace]}]),
 	{ok, Iac} = gen_fsm:sync_send_event(Lsc, get_iac_pid),
 	gen_fsm:send_event(Lsc, power_on),
 	{ok, #m2pa_state{last_bsn_received=16#ffffff, last_fsn_sent=16#ffffff,
-			 lsc_pid=Lsc, iac_pid=Iac}}.
+			 lsc_pid=Lsc, iac_pid=Iac,
+		 	 msu_fisu_accepted = 0}}.
 
 terminate(Reason, _State, _LoopDat) ->
 	io:format("Terminating ~p (Reason ~p)~n", [?MODULE, Reason]),
@@ -61,6 +63,10 @@
 handle_info({lsc_txc, What}, State, LoopDat) when
 			What == start; What == retrieval_request_and_fsnc ->
 	{next_state, State, LoopDat};
+handle_info({lsc_rc, accept_msu_fisu}, State, LoopDat) ->
+	{next_state, State, LoopDat#m2pa_state{msu_fisu_accepted = 1}};
+handle_info({lsc_rc, reject_msu_fisu}, State, LoopDat) ->
+	{next_state, State, LoopDat#m2pa_state{msu_fisu_accepted = 0}};
 handle_info({Who, What}, established, LoopDat) when Who == iac_txc; Who == lsc_txc ->
 	Ls = iac_to_ls(What),
 	send_linkstate(Ls, LoopDat),
@@ -86,15 +92,21 @@
 		#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;
+			case LoopDat#m2pa_state.msu_fisu_accepted of
+				1 ->
+					LoopDat2 = LoopDat#m2pa_state{last_bsn_received = FsnRecv},
+					case Mtp3 of
+						undefined ->
+							ok;
+						_ ->
+							send_userdata_ack(LoopDat2)
+					end,
+					gen_fsm:send_event(LoopDat#m2pa_state.lsc_pid, fisu_msu_received),
+					Prim = osmo_util:make_prim('MTP','TRANSFER',indication, Mtp3),
+					{ok, Prim, LoopDat2};
 				_ ->
-					send_userdata_ack(LoopDat2)
-			end,
-			Prim = osmo_util:make_prim('MTP','TRANSFER',indication, Mtp3),
-			{ok, Prim, LoopDat2};
+					{ignore, LoopDat}
+			end;
 		#m2pa_msg{msg_type = ?M2PA_TYPE_LINK} ->
 			handle_linkstate(M2pa, LoopDat),
 			{ignore, LoopDat};
@@ -139,7 +151,12 @@
 	Linkstate = proplists:get_value(link_state, M2pa#m2pa_msg.parameters),
 	LsMtp2 = ls_to_iac(Linkstate),
 	if LsMtp2 == fisu ->
-		gen_fsm:send_event(LoopDat#m2pa_state.lsc_pid, fisu_msu_received);
+		case LoopDat#m2pa_state.msu_fisu_accepted of
+			1 ->
+				gen_fsm:send_event(LoopDat#m2pa_state.lsc_pid,
+						   fisu_msu_received);
+			0 -> ok
+		end;
 	   LsMtp2 == si_po ->
 		gen_fsm:send_event(LoopDat#m2pa_state.lsc_pid, LsMtp2);
 	   LsMtp2 == si_n; LsMtp2 == si_e; LsMtp2 == si_o; LsMtp2 == si_os ->