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),

--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39524?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: erlang/osmo-s1gw
Gerrit-Branch: master
Gerrit-Change-Id: I91a010f304456c1593ef257051a912f0fe8ae2a1
Gerrit-Change-Number: 39524
Gerrit-PatchSet: 2
Gerrit-Owner: fixeria <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>

Reply via email to