pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/36232?usp=email )
Change subject: AAA: Swx: Answer RTR with RTA
......................................................................
AAA: Swx: Answer RTR with RTA
Related: OS#6042
Change-Id: Iba49fe8565d2303f975003ed2a79de25a4b23832
---
M include/conv.hrl
M src/aaa_diameter_swx_cb.erl
2 files changed, 52 insertions(+), 5 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg refs/changes/32/36232/1
diff --git a/include/conv.hrl b/include/conv.hrl
index 786bdff..dda21f4 100644
--- a/include/conv.hrl
+++ b/include/conv.hrl
@@ -31,6 +31,8 @@
%
-hrl_name('conv.hrl').
+-define(VENDOR_ID_3GPP, 10415).
+
%% Can Hold information about Result-Code or Experimental-Result:
-record(epdg_dia_rc, {
vendor_id :: non_neg_integer(), %% or undefined if Result-Code
diff --git a/src/aaa_diameter_swx_cb.erl b/src/aaa_diameter_swx_cb.erl
index 8a6dd08..4936c24 100644
--- a/src/aaa_diameter_swx_cb.erl
+++ b/src/aaa_diameter_swx_cb.erl
@@ -10,7 +10,8 @@
%% diameter callbacks
-export([peer_up/3, peer_down/3, pick_peer/4, pick_peer/5, prepare_request/3,
prepare_request/4,
prepare_retransmit/3, prepare_retransmit/4,
- handle_answer/4, handle_answer/5, handle_error/4, handle_error/5,
handle_request/3]).
+ handle_request/3,
+ handle_answer/4, handle_answer/5, handle_error/4, handle_error/5]).
%% peer_up/3
peer_up(_SvcName, Peer, State) ->
@@ -67,6 +68,41 @@
prepare_retransmit(Packet, SvcName, Peer, ExtraPars) ->
prepare_request(Packet, SvcName, Peer, ExtraPars).
+%% handle_request/3
+
+%% 3GPP TS 29.273 8.2.2.4 Network Initiated De-Registration by HSS Procedure
+handle_request(#diameter_packet{msg = Req, errors = []}, _SvcName, {_, Caps}) when
is_record(Req, 'RTR') ->
+ lager:info("SWx Rx RTR from ~p: ~p~n", [Caps, Req]),
+ #diameter_caps{origin_host = {OH,_}, origin_realm = {OR,_}} = Caps,
+ #'RTR'{'Session-Id' = SessionId,
+ 'Vendor-Specific-Application-Id' = VendorAppId,
+ 'Auth-Session-State' = AuthSessState,
+ 'User-Name' = Imsi,
+ 'Deregistration-Reason' = _DeregReason} = Req,
+ case aaa_ue_fsm:get_pid_by_imsi(Imsi) of
+ Pid when is_pid(Pid) ->
+ aaa_ue_fsm:stop(Pid),
+ Res = 2001, %% Success
+ ERes = [];
+ undefined ->
+ Res = [],
+ %% TS 29.229 6.2.2.1 DIAMETER_ERROR_USER_UNKNOWN
+ ERes = #'Experimental-Result'{'Vendor-Id' = ?VENDOR_ID_3GPP,
'Experimental-Result-Code' = 5001}
+ end,
+ Resp = #'RTA'{'Session-Id' = SessionId,
+ 'Vendor-Specific-Application-Id' = VendorAppId,
+ 'Result-Code' = Res,
+ 'Experimental-Result' = ERes,
+ 'Auth-Session-State' = AuthSessState,
+ 'Origin-Host' = OH,
+ 'Origin-Realm' = OR},
+ lager:info("SWx Tx to ~p: ~p~n", [Caps, Resp]),
+ {reply, Resp};
+
+handle_request(Msg, _SvcName, Peer) ->
+ lager:error("SWx Rx unexpected msg from ~p: ~p~n", [Peer, Msg]),
+ erlang:error({unexpected, ?MODULE, ?LINE}).
+
%% handle_answer/4
handle_answer(#diameter_packet{msg = Msg, errors = Errors}, _Request, _SvcName, Peer,
ReqPid) when is_record(Msg, 'MAA') ->
lager:info("SWx Rx MAA ~p: ~p/ Errors ~p ~n", [Peer, Msg, Errors]),
@@ -82,6 +118,7 @@
aaa_ue_fsm:ev_rx_swx_maa(ReqPid, {error, DiaRC})
end,
{ok, Msg};
+
handle_answer(#diameter_packet{msg = Msg, errors = Errors}, Request, _SvcName, Peer,
ReqPid) when is_record(Msg, 'SAA') ->
lager:info("SWx Rx SAA ~p: ~p/ Errors ~p ~n", [Peer, Msg, Errors]),
% Recover fields from originating request:
@@ -103,9 +140,11 @@
aaa_ue_fsm:ev_rx_swx_saa(ReqPid, {error, SAType, DiaRC})
end,
{ok, Msg}.
+
handle_answer(#diameter_packet{msg = Msg, errors = []}, _Request, _SvcName, Peer) ->
lager:info("SWx Rx ~p: ~p~n", [Peer, Msg]),
{ok, Msg};
+
handle_answer(#diameter_packet{msg = Msg, errors = Errors}, _Request, _SvcName, Peer)
->
lager:info("SWx Rx ~p: ~p / Errors ~p ~n", [Peer, Msg, Errors]),
{error, Errors}.
@@ -122,10 +161,6 @@
lager:error("SWx error: ~p, ExtraPars: ~p~n", [Reason, ExtraPars]),
{error, Reason}.
-%% handle_request/3
-handle_request(_Packet, _SvcName, _Peer) ->
- erlang:error({unexpected, ?MODULE, ?LINE}).
-
%% ------------------------------------------------------------------
%% Internal Function Definitions
%% ------------------------------------------------------------------
--
To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/36232?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: Iba49fe8565d2303f975003ed2a79de25a4b23832
Gerrit-Change-Number: 36232
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: newchange