fixeria has submitted this change. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38767?usp=email )
Change subject: s1ap_proxy: properly handle E-RAB RELEASE IND ......................................................................
s1ap_proxy: properly handle E-RAB RELEASE IND
Use the right release kind in the case of E-RAB RELEASE IND, so that the E-RAB FSM can be terminated immediately.
Change-Id: Id1b77ef59818d6416326477a25e9866ab636b3ad --- M src/s1ap_proxy.erl M test/s1ap_proxy_test.erl 2 files changed, 9 insertions(+), 8 deletions(-)
Approvals: laforge: Looks good to me, but someone else must approve Jenkins Builder: Verified pespin: Looks good to me, approved
diff --git a/src/s1ap_proxy.erl b/src/s1ap_proxy.erl index 5f7775e..ec729d0 100644 --- a/src/s1ap_proxy.erl +++ b/src/s1ap_proxy.erl @@ -70,7 +70,8 @@
-record(proxy_state, {erabs :: dict:dict(), mme_ue_id :: undefined | mme_ue_id(), - enb_ue_id :: undefined | enb_ue_id() + enb_ue_id :: undefined | enb_ue_id(), + rel_kind :: undefined | cmd | ind }).
-type proxy_state() :: #proxy_state{}. @@ -274,7 +275,8 @@ ?LOG_DEBUG("Processing E-RAB RELEASE COMMAND"), s1gw_metrics:ctr_inc(?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_RELEASE_CMD), case handle_ies(C0#'E-RABReleaseCommand'.protocolIEs, - ?'id-E-RABToBeReleasedList', S0) of + ?'id-E-RABToBeReleasedList', + S0#proxy_state{rel_kind = cmd}) of {{ok, IEs}, S1} -> C1 = C0#'E-RABReleaseCommand'{protocolIEs = IEs}, PDU = {Outcome, Msg#'InitiatingMessage'{value = C1}}, @@ -310,7 +312,8 @@ ?LOG_DEBUG("Processing E-RAB RELEASE INDICATION"), s1gw_metrics:ctr_inc(?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_RELEASE_IND), case handle_ies(C0#'E-RABReleaseIndication'.protocolIEs, - ?'id-E-RABReleasedList', S0) of + ?'id-E-RABReleasedList', + S0#proxy_state{rel_kind = ind}) of {{ok, IEs}, S1} -> C1 = C0#'E-RABReleaseIndication'{protocolIEs = IEs}, PDU = {Outcome, Msg#'InitiatingMessage'{value = C1}}, @@ -451,7 +454,7 @@ #'E-RABItem'{'e-RAB-ID' = ERABId} = C, case erab_fsm_find(ERABId, S) of {ok, Pid} -> - ok = erab_fsm:erab_release_cmd(Pid), + ok = erab_fsm:erab_release(Pid, S#proxy_state.rel_kind), {{ok, C}, S}; error -> ?LOG_ERROR("E-RAB ~p is not registered", [erab_uid(ERABId, S)]), diff --git a/test/s1ap_proxy_test.erl b/test/s1ap_proxy_test.erl index 9e94716..917b63e 100644 --- a/test/s1ap_proxy_test.erl +++ b/test/s1ap_proxy_test.erl @@ -111,12 +111,10 @@ %% [eNB -> MME] E-RAB RELEASE INDICATION ReleaseInd = e_rab_release_ind_pdu(),
- %% TODO: make sure that the E-RAB FSM has been terminated - %% FIXME: erab_fsm does not tear down immediately, but after a timeout - [?_assertMatch({forward, _}, s1ap_proxy:process_pdu(Pid, SetupReq)), ?_assertMatch({forward, _}, s1ap_proxy:process_pdu(Pid, SetupRsp)), - ?_assertEqual({forward, ReleaseInd}, s1ap_proxy:process_pdu(Pid, ReleaseInd))]. + ?_assertEqual({forward, ReleaseInd}, s1ap_proxy:process_pdu(Pid, ReleaseInd)), + ?_assertEqual([], s1ap_proxy:fetch_erab_list(Pid))].
test_e_rab_modify_ind(#{handler := Pid}) ->