pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/36171?usp=email )
Change subject: Forward PGW Address PGW->AAA->HSS ......................................................................
Forward PGW Address PGW->AAA->HSS
We were missing passing the actual IP address of the PDN-GW when transmitting SAR to the HSS (precisely with the aim of updating that information).
Change-Id: Ia99442487fef56c16c4be2fb7f36221d016e55e0 --- M src/aaa_diameter_s6b_cb.erl M src/aaa_diameter_swx.erl M src/aaa_ue_fsm.erl 3 files changed, 32 insertions(+), 17 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg refs/changes/71/36171/1
diff --git a/src/aaa_diameter_s6b_cb.erl b/src/aaa_diameter_s6b_cb.erl index ab15bd6..b3fe209 100644 --- a/src/aaa_diameter_s6b_cb.erl +++ b/src/aaa_diameter_s6b_cb.erl @@ -58,12 +58,13 @@ 'Auth-Application-Id' = AuthAppId, 'Auth-Request-Type' = AuthReqType, 'User-Name' = [UserName], - 'Service-Selection' = [Apn]} = Req, + 'Service-Selection' = [Apn], + 'MIP6-Agent-Info' = AgentInfoOpt } = Req, Imsi = conv:nai_to_imsi(UserName), PidRes = aaa_ue_fsm:get_pid_by_imsi(Imsi), case PidRes of PidRes when is_pid(PidRes) -> - ok = aaa_ue_fsm:ev_rx_s6b_aar(PidRes, Apn), + 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]) diff --git a/src/aaa_diameter_swx.erl b/src/aaa_diameter_swx.erl index be301f2..72a360e 100644 --- a/src/aaa_diameter_swx.erl +++ b/src/aaa_diameter_swx.erl @@ -51,7 +51,7 @@ -export([init/1, handle_call/3, handle_cast/2, handle_info/2]). -export([code_change/3]). -export([multimedia_auth_request/7]). --export([server_assignment_request/3]). +-export([server_assignment_request/4]). -export([test/0, test/1]).
%% Diameter Application Definitions @@ -146,9 +146,9 @@ gen_server:call(?SERVER, {mar, {IMSI, NumAuthItems, AuthScheme, RAT, CKey, IntegrityKey, PdpTypeNr}}). % APN is optional and should be [] -server_assignment_request(IMSI, Type, APN) -> +server_assignment_request(IMSI, Type, APN, AgentInfoOpt) -> gen_server:call(?SERVER, - {sar, {IMSI, Type, APN}}). + {sar, {IMSI, Type, APN, AgentInfoOpt}}).
result_code_success(2001) -> ok; result_code_success(2002) -> ok; @@ -235,8 +235,8 @@ {reply, {error, Err}, State} end;
-handle_call({sar, {IMSI, Type, APN}}, {Pid, _Tag} = _From, State) -> - lager:debug("SWx Tx SAR Imsi=~p Type=~p APN=~p~n", [IMSI, Type, APN]), +handle_call({sar, {IMSI, Type, APN, AgentInfoOpt}}, {Pid, _Tag} = _From, State) -> + lager:debug("SWx Tx SAR Imsi=~p Type=~p APN=~p AgentInfoOpt=~p ~n", [IMSI, Type, APN, AgentInfoOpt]), SessionId = diameter:session_id(application:get_env(?ENV_APP_NAME, origin_host, ?ENV_DEFAULT_ORIG_HOST)), SAR = #'SAR'{'Vendor-Specific-Application-Id' = #'Vendor-Specific-Application-Id'{ 'Vendor-Id' = ?VENDOR_ID_3GPP, @@ -245,7 +245,8 @@ 'User-Name' = IMSI, 'Auth-Session-State' = 1, 'Server-Assignment-Type' = Type, - 'Service-Selection' = [APN] + 'Service-Selection' = [APN], + 'MIP6-Agent-Info' = AgentInfoOpt }, Ret = diameter_call(SAR, Pid, State), case Ret of diff --git a/src/aaa_ue_fsm.erl b/src/aaa_ue_fsm.erl index fd39061..9fa868e 100644 --- a/src/aaa_ue_fsm.erl +++ b/src/aaa_ue_fsm.erl @@ -111,10 +111,10 @@ {error, Err} end.
-ev_rx_s6b_aar(Pid, Apn) -> - lager:info("ue_fsm ev_rx_s6b_aar: ~p~n", [Apn]), +ev_rx_s6b_aar(Pid, {Apn, AgentInfoOpt}) -> + lager:info("ue_fsm ev_rx_s6b_aar: ~p ~p~n", [Apn, AgentInfoOpt]), try - gen_statem:call(Pid, {rx_s6b_aar, Apn}) + gen_statem:call(Pid, {rx_s6b_aar, Apn, AgentInfoOpt}) catch exit:Err -> {error, Err} @@ -164,7 +164,7 @@
state_new({call, From}, {swm_auth_compl, Apn}, Data) -> lager:info("ue_fsm state_new event=swm_auth_compl, ~p~n", [Data]), - case aaa_diameter_swx:server_assignment_request(Data#ue_fsm_data.imsi, 1, Apn) of + case aaa_diameter_swx:server_assignment_request(Data#ue_fsm_data.imsi, 1, Apn, []) of ok -> {next_state, state_wait_swx_saa, Data, [{reply,From,ok}]}; {error, Err} -> {keep_state, Data, [{reply,From,{error, Err}}]} end. @@ -197,11 +197,11 @@ Data1 = Data#ue_fsm_data{epdg_sess_active = true}, {keep_state, Data1};
-state_authenticated({call, {Pid, _Tag} = From}, {rx_s6b_aar, Apn}, Data) -> - lager:info("ue_fsm state_authenticated event=rx_s6b_aar Apn=~p, ~p~n", [Apn, Data]), +state_authenticated({call, {Pid, _Tag} = From}, {rx_s6b_aar, Apn, AgentInfoOpt}, Data) -> + lager:info("ue_fsm state_authenticated event=rx_s6b_aar Apn=~p AgentInfo=~p, ~p~n", [Apn, AgentInfoOpt, Data]), case aaa_diameter_swx:server_assignment_request(Data#ue_fsm_data.imsi, ?'DIAMETER_CX_SERVER-ASSIGNMENT-TYPE_PGW_UPDATE', - Apn) of + Apn, AgentInfoOpt) of ok -> Data1 = Data#ue_fsm_data{s6b_resp_pid = Pid, apn = Apn}, {next_state, state_authenticated_wait_swx_saa, Data1, [{reply,From,ok}]}; {error, Err} -> {keep_state, Data, [{reply,From,{error, Err}}]} @@ -220,7 +220,7 @@ {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', - Data#ue_fsm_data.apn) of + Data#ue_fsm_data.apn, []) of ok -> {next_state, state_authenticated_wait_swx_saa, Data, [{reply,From,ok}]}; {error, _Err} -> DiaRC = 5002, %% UNKNOWN_SESSION_ID @@ -241,7 +241,7 @@ {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', - Data#ue_fsm_data.apn) of + Data#ue_fsm_data.apn, []) of ok -> Data1 = Data#ue_fsm_data{s6b_resp_pid = Pid}, {next_state, state_authenticated_wait_swx_saa, Data1, [{reply,From,ok}]}; {error, _Err} ->