pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/36182?usp=email )
Change subject: Migrate S6b to use new epdg_dia_rc record ......................................................................
Migrate S6b to use new epdg_dia_rc record
Change-Id: I11674ef7b9fb541d7e48a74fa986ee0798042de9 --- M src/aaa_diameter_s6b.erl M src/aaa_diameter_s6b_cb.erl M src/aaa_ue_fsm.erl M src/epdg_ue_fsm.erl 4 files changed, 36 insertions(+), 22 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg refs/changes/82/36182/1
diff --git a/src/aaa_diameter_s6b.erl b/src/aaa_diameter_s6b.erl index 2792b6a..163ffbd 100644 --- a/src/aaa_diameter_s6b.erl +++ b/src/aaa_diameter_s6b.erl @@ -147,13 +147,13 @@ 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; diff --git a/src/aaa_diameter_s6b_cb.erl b/src/aaa_diameter_s6b_cb.erl index b3fe209..a56a7ca 100644 --- a/src/aaa_diameter_s6b_cb.erl +++ b/src/aaa_diameter_s6b_cb.erl @@ -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 @@ 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 @@ 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(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}). \ No newline at end of file diff --git a/src/aaa_ue_fsm.erl b/src/aaa_ue_fsm.erl index 4c33567..f06b326 100644 --- a/src/aaa_ue_fsm.erl +++ b/src/aaa_ue_fsm.erl @@ -232,12 +232,13 @@ 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 @@ 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({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 diff --git a/src/epdg_ue_fsm.erl b/src/epdg_ue_fsm.erl index 1414190..fd0d7f9 100644 --- a/src/epdg_ue_fsm.erl +++ b/src/epdg_ue_fsm.erl @@ -402,11 +402,11 @@ {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})