pespin has submitted this change. (
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/36337?usp=email )
Change subject: epdg_diameter_swm: Convert Tx calls to casts
......................................................................
epdg_diameter_swm: Convert Tx calls to casts
This allows calling Tx function from within Rx paths in epdg_ue_fsm.
Change-Id: Id42ba265ffde735c0a68a45555d11ef2dad56cfd
---
M src/epdg_diameter_swm.erl
M src/epdg_ue_fsm.erl
2 files changed, 63 insertions(+), 68 deletions(-)
Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, approved
diff --git a/src/epdg_diameter_swm.erl b/src/epdg_diameter_swm.erl
index 0badb28..bf7c0b1 100644
--- a/src/epdg_diameter_swm.erl
+++ b/src/epdg_diameter_swm.erl
@@ -43,53 +43,30 @@
% PdpTypeNr: SWm Diameter AVP "UE-Local-IP-Address"
% Apn: SWm Diameter AVP "Service-Selection"
% EAP: SWm Diameter AVP EAP-Payload
- Result = gen_server:call(?SERVER, {tx_dia, {der_auth_req, ImsiStr, PdpTypeNr, Apn,
EAP}}),
- case Result of
- {ok, _AuthTuples} ->
- epdg_ue_fsm:received_swm_dea_auth_response(self(), Result),
- ok;
- _ -> Result
- end.
+ ok = gen_server:cast(?SERVER, {tx_dia, {der_auth_req, ImsiStr, PdpTypeNr, Apn, EAP}}).
tx_reauth_answer(Imsi, DiaRC) ->
% In Diameter we use Imsi as strings, as done by diameter module.
ImsiStr = binary_to_list(Imsi),
- _Result = gen_server:call(?SERVER, {tx_dia, {raa, ImsiStr, DiaRC}}).
+ ok = gen_server:cast(?SERVER, {tx_dia, {raa, ImsiStr, DiaRC}}).
% Rx "GSUP CEAI LU Req" is our way of saying Rx "Swm Diameter-EAP REQ
(DER) with EAP AVP containing successuful auth":
tx_der_auth_compl_request(Imsi, Apn) ->
% In Diameter we use Imsi as strings, as done by diameter module.
ImsiStr = binary_to_list(Imsi),
- Result = gen_server:call(?SERVER, {tx_dia, {der_auth_compl_req, ImsiStr, Apn}}),
- case Result of
- {ok, _Mar} ->
- epdg_ue_fsm:received_swm_dea_auth_compl_response(self(), Result),
- ok;
- _ -> Result
- end.
+ ok = gen_server:cast(?SERVER, {tx_dia, {der_auth_compl_req, ImsiStr, Apn}}).
% 3GPP TS 29.273 7.1.2.3
tx_session_termination_request(Imsi) ->
% In Diameter we use Imsi as strings, as done by diameter module.
ImsiStr = binary_to_list(Imsi),
- Result = gen_server:call(?SERVER, {tx_dia, {str, ImsiStr}}),
- case Result of
- {ok, _Mar} ->
- epdg_ue_fsm:received_swm_session_terminate_answer(self(), Result),
- ok;
- _ -> Result
- end.
+ ok = gen_server:cast(?SERVER, {tx_dia, {str, ImsiStr}}).
% 3GPP TS 29.273 7.1.2.4
tx_abort_session_answer(Imsi) ->
% In Diameter we use Imsi as strings, as done by diameter module.
ImsiStr = binary_to_list(Imsi),
- Result = gen_server:call(?SERVER, {tx_dia, {asa, ImsiStr}}),
- case Result of
- {ok, _Mar} ->
- ok;
- _ -> Result
- end.
+ ok = gen_server:cast(?SERVER, {tx_dia, {asa, ImsiStr}}).
%% Emulation from the wire (DIAMETER SWm), called from internal AAA Server:
rx_reauth_request(Imsi) ->
@@ -112,31 +89,39 @@
rx_abort_session_request(Imsi) ->
ok = gen_server:cast(?SERVER, {rx_dia, {asr, Imsi}}).
-handle_call({tx_dia, {der_auth_req, Imsi, PdpTypeNr, Apn, EAP}}, _From, State) ->
- % we yet don't implement the Diameter SWm interface on the wire, we process the call
internally:
- ok = aaa_diameter_swm:rx_der_auth_request(Imsi, PdpTypeNr, Apn, EAP),
- {reply, ok, State};
-handle_call({tx_dia, {raa, Imsi, DiaRC}}, _From, State) ->
+%% ------------------------------------------------------------------
+%% Internal Function Definitions
+%% ------------------------------------------------------------------
+
+handle_call(Request, From, State) ->
+ error_logger:error_report(["unknown handle_call", {module, ?MODULE}, {request,
Request}, {from, From}, {state, State}]),
+ {reply, ok, State}.
+
+handle_cast({tx_dia, {der_auth_req, Imsi, PdpTypeNr, Apn, EAP}}, State) ->
+ % we yet don't implement the Diameter SWm interface on the wire, we process the call
internally:
+ aaa_diameter_swm:rx_der_auth_request(Imsi, PdpTypeNr, Apn, EAP),
+ {noreply, State};
+
+handle_cast({tx_dia, {raa, Imsi, DiaRC}}, State) ->
% we yet don't implement the Diameter SWm interface on the wire, we process the call
internally:
aaa_diameter_swm:rx_reauth_answer(Imsi, DiaRC#epdg_dia_rc.result_code),
- {reply, ok, State};
+ {noreply, State};
-handle_call({tx_dia, {der_auth_compl_req, Imsi, Apn}}, _From, State) ->
+handle_cast({tx_dia, {der_auth_compl_req, Imsi, Apn}}, State) ->
% we yet don't implement the Diameter SWm interface on the wire, we process the call
internally:
- Reply = aaa_diameter_swm:rx_der_auth_compl_request(Imsi, Apn),
- {reply, Reply, State};
+ aaa_diameter_swm:rx_der_auth_compl_request(Imsi, Apn),
+ {noreply, State};
-handle_call({tx_dia, {str, Imsi}}, _From, State) ->
+handle_cast({tx_dia, {str, Imsi}}, State) ->
% we yet don't implement the Diameter SWm interface on the wire, we process the call
internally:
- Reply = aaa_diameter_swm:rx_session_termination_request(Imsi),
- {reply, Reply, State};
+ aaa_diameter_swm:rx_session_termination_request(Imsi),
+ {noreply, State};
-handle_call({tx_dia, {asa, Imsi}}, _From, State) ->
+handle_cast({tx_dia, {asa, Imsi}}, State) ->
% we yet don't implement the Diameter SWm interface on the wire, we process the call
internally:
- Reply = aaa_diameter_swm:rx_abort_session_answer(Imsi),
- {reply, Reply, State}.
-
+ aaa_diameter_swm:rx_abort_session_answer(Imsi),
+ {noreply, State};
handle_cast({rx_dia, {dea_auth_resp, ImsiStr, Result}}, State) ->
Imsi = list_to_binary(ImsiStr),
@@ -213,7 +198,3 @@
terminate(Reason, _S) ->
lager:info("terminating ~p with reason ~p~n", [?MODULE, Reason]).
-
-%% ------------------------------------------------------------------
-%% Internal Function Definitions
-%% ------------------------------------------------------------------
diff --git a/src/epdg_ue_fsm.erl b/src/epdg_ue_fsm.erl
index 660323b..062083b 100644
--- a/src/epdg_ue_fsm.erl
+++ b/src/epdg_ue_fsm.erl
@@ -61,6 +61,7 @@
-define(TIMEOUT_VAL_WAIT_GTP_ANSWER, 10000).
-define(TIMEOUT_VAL_WAIT_GSUP_ANSWER, 10000).
+-define(TIMEOUT_VAL_WAIT_SWm_ANSWER, 10000).
-record(ue_fsm_data, {
imsi,
@@ -215,10 +216,8 @@
%% ------------------------------------------------------------------
ev_handle({call, From}, {auth_request, PdpTypeNr, Apn, EAP}, Data) ->
- case epdg_diameter_swm:tx_der_auth_request(Data#ue_fsm_data.imsi, PdpTypeNr, Apn,
EAP) of
- ok -> {next_state, state_wait_auth_resp, Data, [{reply,From,ok}]};
- {error, Err} -> {stop_and_reply, Err, [{reply,From,{error,Err}}], Data}
- end.
+ epdg_diameter_swm:tx_der_auth_request(Data#ue_fsm_data.imsi, PdpTypeNr, Apn,
EAP),
+ {next_state, state_wait_auth_resp, Data, [{reply,From,ok}]}.
%% ------------------------------------------------------------------
%% gen_statem Function Definitions
@@ -260,7 +259,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
state_wait_auth_resp(enter, _OldState, Data) ->
- {keep_state, Data};
+ {keep_state, Data,
{state_timeout,?TIMEOUT_VAL_WAIT_SWm_ANSWER,swm_der_timeout}};
state_wait_auth_resp({call, From}, {received_swm_dea_auth_response, Result}, Data) ->
lager:info("ue_fsm state_wait_auth_resp event=received_swm_dea_auth_response
Result=~p, ~p~n", [Result, Data]),
@@ -274,7 +273,13 @@
{next_state, state_new, Data, [{reply,From,ok}]};
_ ->
{next_state, state_new, Data, [{reply,From,{error,unknown}}]}
- end.
+ end;
+
+state_wait_auth_resp(state_timeout, swm_der_timeout, Data) ->
+ lager:error("ue_fsm state_wait_auth_resp: Timeout ~p, ~p~n",
[swm_der_timeout, Data]),
+ GsupCause = ?GSUP_CAUSE_NET_FAIL,
+ gsup_server:auth_response(Data#ue_fsm_data.imsi, {error, GsupCause}),
+ {next_state, state_new, Data}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% state_authenticating:
@@ -290,10 +295,8 @@
state_authenticating({call, From}, lu_request, Data) ->
lager:info("ue_fsm state_authenticating event=lu_request, ~p~n",
[Data]),
% Rx "GSUP CEAI LU Req" is our way of saying Rx "Swm Diameter-EAP
REQ (DER) with EAP AVP containing successuful auth":
- case epdg_diameter_swm:tx_der_auth_compl_request(Data#ue_fsm_data.imsi,
Data#ue_fsm_data.apn) of
- ok -> {keep_state, Data, [{reply,From,ok}]};
- {error, Err} -> {stop_and_reply, Err, [{reply,From,{error,Err}}], Data}
- end;
+ epdg_diameter_swm:tx_der_auth_compl_request(Data#ue_fsm_data.imsi,
Data#ue_fsm_data.apn),
+ {keep_state, Data, [{reply,From,ok}]};
% Rx Swm Diameter-EAP Answer (DEA) containing APN-Configuration, triggered by
% earlier Tx DER EAP AVP containing successuful auth", when we received GSUP LU
Req:
@@ -517,15 +520,8 @@
% Send STR towards AAA-Server
% % 3GPP TS 29.273 7.1.2.3
lager:info("ue_fsm state_wait_swm_session_termination_answer event=enter,
~p~n", [Data]),
- case epdg_diameter_swm:tx_session_termination_request(Data#ue_fsm_data.imsi) of
- ok -> {keep_state, Data};
- {error, _Err} ->
- 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;
+ epdg_diameter_swm:tx_session_termination_request(Data#ue_fsm_data.imsi),
+ {keep_state, Data,
{state_timeout,?TIMEOUT_VAL_WAIT_SWm_ANSWER,swm_str_timeout}};
state_wait_swm_session_termination_answer({call, From}, {received_swm_sta, DiaRC}, Data)
->
lager:info("ue_fsm state_wait_swm_session_termination_answer
event=received_swm_sta, ~p~n", [Data]),
@@ -542,7 +538,14 @@
state_wait_swm_session_termination_answer({call, From}, Event, Data) ->
lager:error("ue_fsm state_wait_swm_session_termination_answer: Unexpected
call event ~p, ~p~n", [Event, Data]),
- {keep_state, Data, [{reply,From,{error,unexpected_event}}]}.
+ {keep_state, Data, [{reply,From,{error,unexpected_event}}]};
+
+state_wait_swm_session_termination_answer(state_timeout, swm_str_timeout, Data) ->
+ 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,
+ {stop, normal}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% state_dereg_net_initiated_wait_cancel_location_res:
--
To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/36337?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: erlang/osmo-epdg
Gerrit-Branch: master
Gerrit-Change-Id: Id42ba265ffde735c0a68a45555d11ef2dad56cfd
Gerrit-Change-Number: 36337
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged