pespin has uploaded this change for review.
epdg: Do SWm STR+STA upon rx of Delete Bearer Req
Change-Id: I795d973dc472f55d18048025ef4ffe1552dfdf26
---
M src/epdg_gtpc_s2b.erl
M src/epdg_ue_fsm.erl
2 files changed, 43 insertions(+), 9 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg refs/changes/64/35864/1
diff --git a/src/epdg_gtpc_s2b.erl b/src/epdg_gtpc_s2b.erl
index ca05d9b..349aac6 100644
--- a/src/epdg_gtpc_s2b.erl
+++ b/src/epdg_gtpc_s2b.erl
@@ -312,6 +312,7 @@
Sess ->
Resp = gen_delete_bearer_response(Req, Sess, request_accepted, State),
tx_gtp(Resp, State),
+ epdg_ue_fsm:received_gtpc_delete_bearer_request(Sess#gtp_session.pid),
State1 = delete_gtp_session(Sess, State),
{noreply, State1}
end;
diff --git a/src/epdg_ue_fsm.erl b/src/epdg_ue_fsm.erl
index 3e9d1be..350a991 100644
--- a/src/epdg_ue_fsm.erl
+++ b/src/epdg_ue_fsm.erl
@@ -41,13 +41,14 @@
-export([init/1,callback_mode/0,terminate/3]).
-export([auth_request/1, lu_request/1, tunnel_request/1, purge_ms_request/1]).
-export([received_swm_auth_response/2, received_swm_auth_compl_response/2, received_swm_session_termination_answer/2]).
--export([received_gtpc_create_session_response/2, received_gtpc_delete_session_response/2]).
+-export([received_gtpc_create_session_response/2, received_gtpc_delete_session_response/2, received_gtpc_delete_bearer_request/1]).
-export([state_new/3, state_wait_auth_resp/3, state_authenticating/3, state_authenticated/3,
state_wait_delete_session_resp/3, state_wait_swm_session_termination_answer/3]).
-record(ue_fsm_data, {
imsi,
apn = "internet" :: string(),
+ tear_down_gsup_needed = false :: boolean(), %% need to send GSUP PurgeMSResp after STR+STA?
tear_down_gsup_cause = 0 :: integer()
}).
@@ -137,6 +138,16 @@
{error, Err}
end.
+received_gtpc_delete_bearer_request(Pid) ->
+ lager:info("ue_fsm received_gtpc_delete_bearer_request~n", []),
+ try
+ gen_statem:call(Pid, received_gtpc_delete_bearer_request)
+ catch
+ exit:Err ->
+ {error, Err}
+ end.
+
+
%% ------------------------------------------------------------------
%% Internal helpers
%% ------------------------------------------------------------------
@@ -231,6 +242,11 @@
{error, Err} -> {keep_state, Data, [{reply,From,{error, Err}}]}
end;
+state_authenticated({call, From}, received_gtpc_delete_bearer_request, Data) ->
+ lager:info("ue_fsm state_authenticated event=received_gtpc_delete_bearer_request, ~p~n", [Data]),
+ Data1 = Data#ue_fsm_data{tear_down_gsup_needed = false},
+ {next_state, state_wait_swm_session_termination_answer, Data1, [{reply,From,ok}]};
+
state_authenticated({call, From}, _Whatever, Data) ->
lager:error("ue_fsm state_authenticated: Unexpected call event, ~p~n", [Data]),
{keep_state, Data, [{reply,From,ok}]};
@@ -248,11 +264,12 @@
GtpCause = gtp_utils:enum_v2_cause(CauseIE#v2_cause.v2_cause),
GsupCause = conv:cause_gtp2gsup(GtpCause),
lager:debug("Cause: GTP_atom=~p -> GTP_int=~p -> GSUP_int=~p~n", [CauseIE#v2_cause.v2_cause, GtpCause, GsupCause]),
+ Data1 = Data#ue_fsm_data{tear_down_gsup_needed = true},
case GsupCause of
- 0 -> Data1 = Data;
- _ -> Data1 = Data#ue_fsm_data{tear_down_gsup_cause = GsupCause}
+ 0 -> Data2 = Data1;
+ _ -> Data2 = Data1#ue_fsm_data{tear_down_gsup_cause = GsupCause}
end,
- {next_state, state_wait_swm_session_termination_answer, Data1, [{reply,From,ok}]};
+ {next_state, state_wait_swm_session_termination_answer, Data2, [{reply,From,ok}]};
state_wait_delete_session_resp({call, From}, Event, Data) ->
lager:error("ue_fsm state_wait_delete_session_resp: Unexpected call event ~p, ~p~n", [Event, Data]),
@@ -265,16 +282,23 @@
case epdg_diameter_swm:session_termination_request(Data#ue_fsm_data.imsi) of
ok -> {keep_state, Data};
{error, _Err} ->
- gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, {error, ?GSUP_CAUSE_NET_FAIL}),
+ case Data#ue_fsm_data.tear_down_gsup_needed of
+ true -> gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, {error, ?GSUP_CAUSE_NET_FAIL});
+ false -> ok
+ end,
{keep_state, Data}
end;
state_wait_swm_session_termination_answer({call, From}, {received_swm_sta, DiaResultCode}, Data) ->
lager:info("ue_fsm state_wait_swm_session_termination_answer event=received_swm_sta, ~p~n", [Data]),
- case {DiaResultCode, Data#ue_fsm_data.tear_down_gsup_cause} of
- {2001, 0} -> gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, ok);
- {2001, _} -> gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, {error, Data#ue_fsm_data.tear_down_gsup_cause});
- _ -> gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, {error, ?GSUP_CAUSE_NET_FAIL})
+ case Data#ue_fsm_data.tear_down_gsup_needed of
+ true ->
+ case {DiaResultCode, Data#ue_fsm_data.tear_down_gsup_cause} of
+ {2001, 0} -> gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, ok);
+ {2001, _} -> gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, {error, Data#ue_fsm_data.tear_down_gsup_cause});
+ _ -> gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, {error, ?GSUP_CAUSE_NET_FAIL})
+ end;
+ false -> ok
end,
{keep_state, Data, [{reply,From,ok}]};
To view, visit change 35864. To unsubscribe, or for help writing mail filters, visit settings.