pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/36231?usp=email )
Change subject: aaa_diameter_swm: Look up aaa_ue_fsm process each time it needs to be accessed ......................................................................
aaa_diameter_swm: Look up aaa_ue_fsm process each time it needs to be accessed
Similar to what was already done in 745d542b9202d3c5ef69d44d8c1c140490012822 fpr epdg_ue_fsm.
Change-Id: Ic019d41716284639f6256f7ba24533bf806333b1 --- M src/aaa_diameter_swm.erl M src/aaa_ue_fsm.erl 2 files changed, 37 insertions(+), 51 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg refs/changes/31/36231/1
diff --git a/src/aaa_diameter_swm.erl b/src/aaa_diameter_swm.erl index 5050ffb..2e39048 100644 --- a/src/aaa_diameter_swm.erl +++ b/src/aaa_diameter_swm.erl @@ -7,15 +7,9 @@ -include_lib("diameter_3gpp_ts29_273.hrl").
-record(swm_state, { - table_id, % ets table id, - ues = sets:new() + table_id % ets table id }).
--record(swm_session, { - imsi :: string(), - pid :: pid() - }). - -export([start_link/0]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2]). -export([code_change/3, terminate/2]). @@ -56,16 +50,18 @@ session_termination_request(Imsi) -> gen_server:cast(?SERVER, {str, Imsi}).
-handle_cast({epdg_auth_req, Imsi, PdpTypeNr, Apn, EAP}, State0) -> - {Sess, State1} = find_or_new_swm_session(Imsi, State0), - aaa_ue_fsm:ev_swm_auth_req(Sess#swm_session.pid, {PdpTypeNr, Apn, EAP}), - {noreply, State1}; +handle_cast({epdg_auth_req, Imsi, PdpTypeNr, Apn, EAP}, State) -> + case aaa_ue_fsm:get_pid_by_imsi(Imsi) of + undefined -> {ok, Pid} = aaa_ue_fsm:start(Imsi); + Pid -> Pid + end, + aaa_ue_fsm:ev_swm_auth_req(Pid, {PdpTypeNr, Apn, EAP}), + {noreply, State};
handle_cast({epdg_auth_compl_req, Imsi, Apn}, State) -> - Sess = find_swm_session_by_imsi(Imsi, State), - case Sess of - #swm_session{imsi = Imsi} -> - aaa_ue_fsm:ev_swm_auth_compl(Sess#swm_session.pid, Apn); + case aaa_ue_fsm:get_pid_by_imsi(Imsi) of + Pid when is_pid(Pid) -> + aaa_ue_fsm:ev_swm_auth_compl(Pid, Apn); undefined -> RC_USER_UNKNOWN=5030, epdg_diameter_swm:auth_compl_response(Imsi, {error, RC_USER_UNKNOWN}) @@ -73,10 +69,9 @@ {noreply, State};
handle_cast({str, Imsi}, State) -> - Sess = find_swm_session_by_imsi(Imsi, State), - case Sess of - #swm_session{} -> - case aaa_ue_fsm:ev_rx_swm_str(Sess#swm_session.pid) of + case aaa_ue_fsm:get_pid_by_imsi(Imsi) of + Pid when is_pid(Pid) -> + case aaa_ue_fsm:ev_rx_swm_str(Pid) of ok -> ok; % Answering delayed due to SAR+SAA towards HSS. {ok, DiaRC} when is_integer(DiaRC) -> ok = epdg_diameter_swm:session_termination_answer(Imsi, DiaRC); @@ -126,32 +121,3 @@ %% ------------------------------------------------------------------ %% Internal Function Definitions %% ------------------------------------------------------------------ - -new_swm_session(Imsi, State) -> - {ok, Pid} = aaa_ue_fsm:start_link(Imsi), - UE = #swm_session{imsi = Imsi, pid = Pid}, - NewSt = State#swm_state{ues = sets:add_element(UE, State#swm_state.ues)}, - {UE, NewSt}. - -% returns swm_session if found, undefined if not -find_swm_session_by_imsi(Imsi, State) -> - {Imsi, Res} = sets:fold( - fun(UEsIt = #swm_session{imsi = LookupImsi}, {LookupImsi, _AccIn}) -> {LookupImsi, UEsIt}; - (_, AccIn) -> AccIn - end, - {Imsi, undefined}, - State#swm_state.ues), - Res. - -find_or_new_swm_session(Imsi, State) -> - UE = find_swm_session_by_imsi(Imsi, State), - case UE of - #swm_session{imsi = Imsi} -> - {UE, State}; - undefined -> - new_swm_session(Imsi, State) - end. - -delete_swm_session(Imsi, State) -> - SetRemoved = sets:del_element(Imsi, State#swm_state.ues), - State#swm_state{ues = SetRemoved}. \ No newline at end of file diff --git a/src/aaa_ue_fsm.erl b/src/aaa_ue_fsm.erl index 5a6e847..52057ba 100644 --- a/src/aaa_ue_fsm.erl +++ b/src/aaa_ue_fsm.erl @@ -39,7 +39,7 @@ -include_lib("diameter_3gpp_ts29_273_s6b.hrl"). -include("conv.hrl").
--export([start_link/1]). +-export([start/1, stop/1]). -export([init/1,callback_mode/0,terminate/3]). -export([get_server_name_by_imsi/1, get_pid_by_imsi/1]). -export([ev_swm_auth_req/2, ev_swm_auth_compl/2, ev_rx_swm_str/1, ev_rx_swx_maa/2, ev_rx_swx_saa/2, @@ -62,10 +62,18 @@ ServerName = get_server_name_by_imsi(Imsi), whereis(ServerName).
-start_link(Imsi) -> +start(Imsi) -> ServerName = get_server_name_by_imsi(Imsi), lager:info("ue_fsm start_link(~p)~n", [ServerName]), - gen_statem:start_link({local, ServerName}, ?MODULE, Imsi, [{debug, [trace]}]). + gen_statem:start({local, ServerName}, ?MODULE, Imsi, [{debug, [trace]}]). + +stop(SrvRef) -> + try + gen_statem:stop(SrvRef) + catch + exit:Err -> + {error, Err} + end.
ev_swm_auth_req(Pid, {PdpTypeNr, Apn, EAP}) -> lager:info("ue_fsm ev_swm_auth_req~n", []),