fixeria has submitted this change. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39525?usp=email )
(
1 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: erab_fsm: handle RELEASE.ind in state erab_wait_release_rsp ......................................................................
erab_fsm: handle RELEASE.ind in state erab_wait_release_rsp
This can happen if both MME and eNB initiate the E-RAB RELEASE procedures simultaneously. Ignore subsequent release requests.
Change-Id: I68efecf56866e04c71571165f61648d9c37fc173 Related: SYS#7318, SYS#7310 --- M src/erab_fsm.erl M test/erab_fsm_test.erl 2 files changed, 22 insertions(+), 0 deletions(-)
Approvals: pespin: Looks good to me, approved Jenkins Builder: Verified
diff --git a/src/erab_fsm.erl b/src/erab_fsm.erl index c4dbbd6..dbd7ec1 100644 --- a/src/erab_fsm.erl +++ b/src/erab_fsm.erl @@ -385,6 +385,16 @@ ?LOG_DEBUG("Rx E-RAB RELEASE Rsp, we're done"), {stop, normal}; %% we're done!
+erab_wait_release_rsp(cast, erab_release_cmd, + #erab_state{}) -> + ?LOG_INFO("Rx E-RAB RELEASE Cmd while releasing (ignored)"), + keep_state_and_data; + +erab_wait_release_rsp(cast, erab_release_ind, + #erab_state{}) -> + ?LOG_INFO("Rx E-RAB RELEASE Ind while releasing (ignored)"), + keep_state_and_data; + erab_wait_release_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 232446e..ea508dd 100644 --- a/test/erab_fsm_test.erl +++ b/test/erab_fsm_test.erl @@ -57,6 +57,8 @@ ?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 IND (in state erab_wait_release_rsp) :: success", + ?TC(fun test_erab_wait_release_rsp_release_ind_success/1)}, {"E-RAB release :: PFCP session deletion error", ?TC(fun test_erab_release_pfcp_delete_error/1)}].
@@ -141,6 +143,16 @@ ?_assertNot(erlang:is_process_alive(Pid))].
+%% test E-RAB RELEASE.ind received in state erab_wait_release_rsp +test_erab_wait_release_rsp_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_cmd(Pid)), + ?_assertEqual(ok, erab_fsm:erab_release_ind(Pid)), %% ignored + ?_assertEqual(ok, erab_fsm:erab_release_rsp(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),