Migrate S6b to use new epdg_dia_rc record

Change-Id: I11674ef7b9fb541d7e48a74fa986ee0798042de9
This commit is contained in:
Pau Espin 2024-03-06 18:54:08 +01:00
parent d1b03fdde4
commit ae6e7d4521
4 changed files with 27 additions and 22 deletions

View File

@ -147,13 +147,13 @@ server_assignment_request(IMSI, Type, APN) ->
gen_server:call(?SERVER,
{sar, {IMSI, Type, APN}}).
tx_aa_answer(Pid, ResultCode) ->
tx_aa_answer(Pid, DiaRC) ->
% handle_request(AAR) was spawned into its own process, and it's blocked waiting for AAA:
Pid ! {aaa, ResultCode}.
Pid ! {aaa, DiaRC}.
tx_st_answer(Pid, ResultCode) ->
tx_st_answer(Pid, DiaRC) ->
% handle_request(STR) was spawned into its own process, and it's blocked waiting for STA:
Pid ! {sta, ResultCode}.
Pid ! {sta, DiaRC}.
result_code_success(2001) -> ok;
result_code_success(2002) -> ok;

View File

@ -6,6 +6,8 @@
-include_lib("diameter/include/diameter.hrl").
-include_lib("diameter_3gpp_ts29_273_s6b.hrl").
-include("conv.hrl").
%% diameter callbacks
-export([peer_up/3, peer_down/3, pick_peer/4, prepare_request/3, prepare_retransmit/3,
handle_answer/4, handle_error/4, handle_request/3]).
@ -67,15 +69,15 @@ handle_request(#diameter_packet{msg = Req, errors = []}, _SvcName, {_, Caps}) wh
ok = aaa_ue_fsm:ev_rx_s6b_aar(PidRes, {Apn, AgentInfoOpt}),
lager:debug("Waiting for S6b AAA~n", []),
receive
{aaa, ResultCode} -> lager:debug("Rx AAA with ResultCode=~p~n", [ResultCode])
{aaa, DiaRC} -> lager:debug("Rx AAA with DiaRC=~p~n", [DiaRC])
end;
undefined -> lager:error("Error looking up FSM for IMSI~n", [Imsi]),
ResultCode = ?'RULE-FAILURE-CODE_CM_AUTHORIZATION_REJECTED'
DiaRC = #epdg_dia_rc{result_code = ?'RULE-FAILURE-CODE_CM_AUTHORIZATION_REJECTED'}
end,
Resp = #'AAA'{'Session-Id'= SessionId,
'Auth-Application-Id' = AuthAppId,
'Auth-Request-Type' = AuthReqType,
'Result-Code' = ResultCode,
'Result-Code' = DiaRC#epdg_dia_rc.result_code,
'Origin-Host' = OH,
'Origin-Realm' = OR},
lager:info("S6b Tx to ~p: ~p~n", [Caps, Resp]),
@ -97,10 +99,12 @@ handle_request(#diameter_packet{msg = Req, errors = []}, _SvcName, {_, Caps}) wh
ok ->
lager:debug("Waiting for S6b STA~n", []),
receive
{sta, ResultCode} -> lager:debug("Rx STA with ResultCode=~p~n", [ResultCode])
{sta, DiaRC} ->
ResultCode = DiaRC#epdg_dia_rc.result_code,
lager:debug("Rx STA with ResultCode=~p~n", [ResultCode])
end;
{ok, DiaRC} when is_integer(DiaRC) ->
ResultCode = DiaRC;
{ok, DiaRC} ->
ResultCode = DiaRC#epdg_dia_rc.result_code;
{error, Err} when is_integer(Err) ->
ResultCode = Err;
{error, _} ->
@ -119,4 +123,4 @@ handle_request(#diameter_packet{msg = Req, errors = []}, _SvcName, {_, Caps}) wh
handle_request(Packet, _SvcName, Peer) ->
lager:error("S6b Rx unexpected msg from ~p: ~p~n", [Peer, Packet]),
erlang:error({unexpected, ?MODULE, ?LINE}).
erlang:error({unexpected, ?MODULE, ?LINE}).

View File

@ -232,12 +232,13 @@ state_authenticated({call, {Pid, _Tag} = From}, rx_s6b_str, Data) ->
lager:info("ue_fsm state_authenticated event=rx_s6b_str, ~p~n", [Data]),
case {Data#ue_fsm_data.pgw_sess_active, Data#ue_fsm_data.epdg_sess_active} of
{false, _} -> %% The S6b session is not active...
DiaRC = 5002, %% UNKNOWN_SESSION_ID
DiaRC = #epdg_dia_rc{result_code = 5002}, %% UNKNOWN_SESSION_ID
{keep_state, Data, [{reply,From,{error, DiaRC}}]};
{true, true} -> %% The other session is still active, no need to send SAR Type=USER_DEREGISTRATION
lager:info("ue_fsm state_authenticated event=rx_s6b_str: ePDG session still active, skip updating the HSS~n", []),
Data1 = Data#ue_fsm_data{pgw_sess_active = false},
{keep_state, Data1, [{reply,From,{ok, 2001}}]};
DiaRC = #epdg_dia_rc{result_code = 2001}, %% SUCCESS
{keep_state, Data1, [{reply,From,{ok, DiaRC}}]};
{true, false} -> %% All sessions will now be gone, trigger SAR Type=USER_DEREGISTRATION
case aaa_diameter_swx:server_assignment_request(Data#ue_fsm_data.imsi,
?'DIAMETER_CX_SERVER-ASSIGNMENT-TYPE_USER_DEREGISTRATION',
@ -245,7 +246,7 @@ state_authenticated({call, {Pid, _Tag} = From}, rx_s6b_str, Data) ->
ok -> Data1 = Data#ue_fsm_data{s6b_resp_pid = Pid},
{next_state, state_authenticated_wait_swx_saa, Data1, [{reply,From,ok}]};
{error, _Err} ->
DiaRC = 5002, %% UNKNOWN_SESSION_ID
DiaRC = #epdg_dia_rc{result_code = 5002}, %% UNKNOWN_SESSION_ID
{keep_state, Data, [{reply,From,{error, DiaRC}}]}
end
end;
@ -263,23 +264,23 @@ state_authenticated_wait_swx_saa(enter, _OldState, Data) ->
state_authenticated_wait_swx_saa({call, From}, {rx_swx_saa, Result}, Data) ->
case Result of
{error, SAType, DiaRC} -> ResultCode = DiaRC#epdg_dia_rc.result_code;
{ok, SAType, _ResInfo} -> ResultCode = 2001
{error, SAType, DiaRC} -> DiaRC;
{ok, SAType, _ResInfo} -> DiaRC = #epdg_dia_rc{result_code = 2001}
end,
lager:info("ue_fsm state_authenticated_wait_swx_saa event=rx_swx_saa SAType=~p ResulCode=~p, ~p~n", [SAType, ResultCode, Data]),
lager:info("ue_fsm state_authenticated_wait_swx_saa event=rx_swx_saa SAType=~p ResulCode=~p, ~p~n", [SAType, DiaRC, Data]),
case SAType of
?'DIAMETER_CX_SERVER-ASSIGNMENT-TYPE_PGW_UPDATE' ->
aaa_diameter_s6b:tx_aa_answer(Data#ue_fsm_data.s6b_resp_pid, ResultCode),
aaa_diameter_s6b:tx_aa_answer(Data#ue_fsm_data.s6b_resp_pid, DiaRC),
Data1 = Data#ue_fsm_data{pgw_sess_active = true, s6b_resp_pid = undefined},
{next_state, state_authenticated, Data1, [{reply,From,ok}]};
?'DIAMETER_CX_SERVER-ASSIGNMENT-TYPE_USER_DEREGISTRATION' ->
case Data#ue_fsm_data.s6b_resp_pid of
undefined -> %% SWm initiated
aaa_diameter_swm:session_termination_answer(Data#ue_fsm_data.imsi, ResultCode),
aaa_diameter_swm:session_termination_answer(Data#ue_fsm_data.imsi, DiaRC),
Data1 = Data#ue_fsm_data{epdg_sess_active = false},
{next_state, state_new, Data1, [{reply,From,ok}]};
_ -> %% S6b initiated
aaa_diameter_s6b:tx_st_answer(Data#ue_fsm_data.s6b_resp_pid, ResultCode),
aaa_diameter_s6b:tx_st_answer(Data#ue_fsm_data.s6b_resp_pid, DiaRC),
Data1 = Data#ue_fsm_data{pgw_sess_active = false, s6b_resp_pid = undefined},
{next_state, state_new, Data1, [{reply,From,ok}]}
end

View File

@ -402,11 +402,11 @@ state_wait_swm_session_termination_answer(enter, _OldState, Data) ->
{keep_state, Data}
end;
state_wait_swm_session_termination_answer({call, From}, {received_swm_sta, DiaResultCode}, Data) ->
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]),
case Data#ue_fsm_data.tear_down_gsup_needed of
true ->
case {DiaResultCode, Data#ue_fsm_data.tear_down_gsup_cause} of
case {DiaRC#epdg_dia_rc.result_code, Data#ue_fsm_data.tear_down_gsup_cause} of
{2001, 0} -> gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, ok);
{2001, _} -> gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, {error, Data#ue_fsm_data.tear_down_gsup_cause});
_ -> gsup_server:purge_ms_response(Data#ue_fsm_data.imsi, {error, ?GSUP_CAUSE_NET_FAIL})