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", []),
--
To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/36231?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: Ic019d41716284639f6256f7ba24533bf806333b1
Gerrit-Change-Number: 36231
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: newchange