fixeria has submitted this change. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39524?usp=email )
Change subject: erab_fsm: handle RELEASE.{cmd,ind} in state erab_wait_setup_rsp ......................................................................
erab_fsm: handle RELEASE.{cmd,ind} in state erab_wait_setup_rsp
It can happen that either the eNB or the MME orders E-RAB release (directly or indirectly via UE CONTEXT RELEASE) *before* the E-RAB is fully setup (i.e. the erab_fsm state =/= erab_setup).
Change-Id: I91a010f304456c1593ef257051a912f0fe8ae2a1 Related: SYS#7318, SYS#7310 --- M src/erab_fsm.erl M test/erab_fsm_test.erl 2 files changed, 39 insertions(+), 6 deletions(-)
Approvals: Jenkins Builder: Verified fixeria: Looks good to me, approved osmith: Looks good to me, but someone else must approve pespin: Looks good to me, but someone else must approve
diff --git a/src/erab_fsm.erl b/src/erab_fsm.erl index bbb6dad..c4dbbd6 100644 --- a/src/erab_fsm.erl +++ b/src/erab_fsm.erl @@ -260,6 +260,18 @@ S#erab_state{from = From, u2a = U2A}};
+erab_wait_setup_rsp(cast, erab_release_cmd, + #erab_state{} = S) -> + ?LOG_DEBUG("Rx E-RAB RELEASE Cmd"), + {next_state, session_delete, + S#erab_state{rel_kind = cmd}}; + +erab_wait_setup_rsp(cast, erab_release_ind, + #erab_state{} = S) -> + ?LOG_DEBUG("Rx E-RAB RELEASE Ind"), + {next_state, session_delete, + S#erab_state{rel_kind = ind}}; + erab_wait_setup_rsp(Event, EventData, S) -> handle_event(?FUNCTION_NAME, Event, EventData, S).
diff --git a/test/erab_fsm_test.erl b/test/erab_fsm_test.erl index ec40e2e..232446e 100644 --- a/test/erab_fsm_test.erl +++ b/test/erab_fsm_test.erl @@ -49,10 +49,14 @@
erab_release_test_() -> - [{"E-RAB RELEASE CMD :: success", - ?TC(fun test_erab_release_cmd_success/1)}, - {"E-RAB RELEASE IND :: success", - ?TC(fun test_erab_release_ind_success/1)}, + [{"E-RAB RELEASE CMD (in state erab_setup) :: success", + ?TC(fun test_erab_setup_release_cmd_success/1)}, + {"E-RAB RELEASE CMD (in state erab_wait_setup_rsp) :: success", + ?TC(fun test_erab_wait_setup_rsp_release_cmd_success/1)}, + {"E-RAB RELEASE IND (in state erab_setup) :: success", + ?TC(fun test_erab_setup_release_ind_success/1)}, + {"E-RAB RELEASE IND (in state erab_wait_setup_rsp) :: success", + ?TC(fun test_erab_wait_setup_rsp_release_ind_success/1)}, {"E-RAB release :: PFCP session deletion error", ?TC(fun test_erab_release_pfcp_delete_error/1)}].
@@ -105,7 +109,8 @@ ?_assertNot(erlang:is_process_alive(Pid))].
-test_erab_release_cmd_success(Pid) -> +%% test E-RAB RELEASE.{cmd,rsp} received in state erab_setup +test_erab_setup_release_cmd_success(Pid) -> [?_assertEqual({ok, ?A2U}, erab_fsm:erab_setup_req(Pid, ?U2C)), ?_assertEqual({ok, ?C2U}, erab_fsm:erab_setup_rsp(Pid, ?U2A)), ?_assertEqual(ok, erab_fsm:erab_release_cmd(Pid)), @@ -113,13 +118,29 @@ ?_assertNot(erlang:is_process_alive(Pid))].
-test_erab_release_ind_success(Pid) -> +%% test E-RAB RELEASE.{cmd,rsp} received in state erab_wait_setup_rsp +test_erab_wait_setup_rsp_release_cmd_success(Pid) -> + [?_assertEqual({ok, ?A2U}, erab_fsm:erab_setup_req(Pid, ?U2C)), + ?_assertEqual(ok, erab_fsm:erab_release_cmd(Pid)), + ?_assertEqual(ok, erab_fsm:erab_release_rsp(Pid)), + ?_assertNot(erlang:is_process_alive(Pid))]. + + +%% test E-RAB RELEASE.ind received in state erab_setup +test_erab_setup_release_ind_success(Pid) -> [?_assertEqual({ok, ?A2U}, erab_fsm:erab_setup_req(Pid, ?U2C)), ?_assertEqual({ok, ?C2U}, erab_fsm:erab_setup_rsp(Pid, ?U2A)), ?_assertEqual(ok, erab_fsm:erab_release_ind(Pid)), ?_assertNot(erlang:is_process_alive(Pid))].
+%% test E-RAB RELEASE.ind received in state erab_wait_setup_rsp +test_erab_wait_setup_rsp_release_ind_success(Pid) -> + [?_assertEqual({ok, ?A2U}, erab_fsm:erab_setup_req(Pid, ?U2C)), + ?_assertEqual(ok, erab_fsm:erab_release_ind(Pid)), + ?_assertNot(erlang:is_process_alive(Pid))]. + + test_erab_release_pfcp_delete_error(Pid) -> %% pfcp_peer:session_delete_req/1 responds with a reject PDU = pfcp_mock:pdu_rsp_reject(session_deletion_response, ?SEID_Loc),