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