pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/34730?usp=email )
Change subject: epdg_diameter_swx: parse the result code of the MAA ......................................................................
epdg_diameter_swx: parse the result code of the MAA
Parse error cases on both the Result-Code and the Experimental-Result-Code of an Media Authentication Answer.
Change-Id: I8d2c99f12df3de1df5529d03ffccab07b14337df --- M src/epdg_diameter_swx.erl 1 file changed, 44 insertions(+), 2 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg refs/changes/30/34730/1
diff --git a/src/epdg_diameter_swx.erl b/src/epdg_diameter_swx.erl index 6ae0c1f..9909446 100644 --- a/src/epdg_diameter_swx.erl +++ b/src/epdg_diameter_swx.erl @@ -104,6 +104,7 @@ gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
peer_down(API, SvcName, {PeerRef, _} = Peer) -> + % fixme: why do we still have ets here? (catch ets:delete(?MODULE, {API, PeerRef})), gen_server:cast(?SERVER, {peer_down, SvcName, Peer}), ok. @@ -131,7 +132,32 @@ gen_server:call(?SERVER, {sar, {IMSI, Type, APN}}).
+result_code_success(2001) -> ok; +result_code_success(2002) -> ok; +result_code_success(_) -> invalid_result_code. + % TODO Sync failure + +-define (MAA_Errors(), #{ + invalid_result_code => #{error => "Unknown result code"}, + invalid_exp_result => #{error => "Unknown experimental result code"}, + unknown_user => #{error => "User is not known by HSS"} +}). + +-spec parse_mar(#'MAA'{}) -> map(). +parse_mar(#'MAA'{'Result-Code' = [ResultCode]} = Maa) -> + Success = result_code_success(ResultCode), + {Success, ResultCode}; + +parse_mar(#'MAA'{'Experimental-Result' = [#{'Vendor-Code' := ?VENDOR_ID_3GPP, 'ExpResultCode' := 5001}]} = Maa) -> + {unknown_user, 5001}; +parse_mar(#'MAA'{'Experimental-Result' = [#{'Vendor-Code' := ?VENDOR_ID_3GPP, 'ExpResultCode' := ResultCode}]} = Maa) -> + {invalid_exp_result, ResultCode}; +parse_mar(Maa) -> + {unknown_err, []}. + +% parse_mar(#'MAA'{'Experimental-Result-Code' = [ResultCode] = MAA) -> + handle_call({mar, {IMSI, NumAuthItems, AuthScheme, RAT, CKey, IntegrityKey}}, _From, State) -> SessionId = diameter:session_id(application:get_env(?SERVER, origin_host, "aaa.example.org")), MAR = #'MAR'{'Vendor-Specific-Application-Id' = #'Vendor-Specific-Application-Id'{ @@ -168,8 +194,12 @@ }, Ret = diameter:call(?SVC_NAME, ?APP_ALIAS, SAR, []), case Ret of - {ok, SAA} -> - {reply, {ok, SAA}, State}; + {ok, Maa} -> + SuccessCode = parse_mar(Maa), + case SuccessCode of + {ok, _} -> {reply, {ok, Maa}, State}; + {Err, Info} -> {reply, {error, {Err, Info, Maa}}, State} + end; {error, Err} -> lager:error("Error: ~w~n", [Err]), {reply, {error, Err}, State}