pespin has uploaded this change for review. ( 
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(-)



  git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg 
refs/changes/37/36337/1

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 <pes...@sysmocom.de>
Gerrit-MessageType: newchange

Reply via email to