From 380ce8ad2ff25e9f9339b2c7ee9832d85ae6c880 Mon Sep 17 00:00:00 2001 From: Andreas Schultz Date: Thu, 8 Jul 2021 16:30:19 +0200 Subject: [PATCH] use structured location types everywhere --- apps/ergw/test/smc_ggsn_test_lib.erl | 42 +++----------- apps/ergw/test/smc_test_lib.erl | 63 +++++++++++++++++++++ apps/ergw_core/src/ergw_gsn_lib.erl | 8 ++- apps/ergw_core/src/ergw_proxy_lib.erl | 2 +- apps/ergw_core/src/ggsn_gn.erl | 36 +++++------- apps/ergw_core/src/gtp_context.erl | 14 ++++- apps/ergw_core/src/itu_e212.erl | 4 ++ apps/ergw_core/src/pgw_s5s8.erl | 54 +++++------------- apps/ergw_core/src/saegw_s11.erl | 54 +++++------------- apps/ergw_core/test/ergw_ggsn_test_lib.erl | 41 +++----------- apps/ergw_core/test/ergw_pgw_test_lib.erl | 45 +++++++-------- apps/ergw_core/test/ergw_saegw_test_lib.erl | 18 +++--- apps/ergw_core/test/ergw_test_lib.erl | 63 +++++++++++++++++++++ apps/ergw_core/test/ggsn_SUITE.erl | 7 +-- apps/ergw_core/test/pgw_SUITE.erl | 7 +-- apps/ergw_core/test/saegw_s11_SUITE.erl | 7 +-- rebar.config | 4 +- rebar.lock | 8 +-- 18 files changed, 247 insertions(+), 230 deletions(-) diff --git a/apps/ergw/test/smc_ggsn_test_lib.erl b/apps/ergw/test/smc_ggsn_test_lib.erl index 5cc01ee7..67c48f83 100644 --- a/apps/ergw/test/smc_ggsn_test_lib.erl +++ b/apps/ergw/test/smc_ggsn_test_lib.erl @@ -259,13 +259,8 @@ make_request(create_pdp_context_request, SubType, #selection_mode{mode = 0}, #tunnel_endpoint_identifier_control_plane{tei = LocalCntlTEI}, #tunnel_endpoint_identifier_data_i{tei = LocalDataTEI}, - #user_location_information{type = 1, - mcc = <<"001">>, - mnc = <<"001">>, - lac = 11, - ci = 0, - sac = 20263, - rac = 0}], + #user_location_information{location = smc_test_lib:sai(1, 1, 11, 20263)} + ], IEs = make_pdp_type(SubType, IEs0), Req = #gtp{version = v1, type = create_pdp_context_request, tei = 0, @@ -282,13 +277,10 @@ make_request(update_pdp_context_request, SubType, ULI = case SubType of ra_update -> - #user_location_information - {type = 1, mcc = <<"001">>, mnc = <<"001">>, - lac = 11, ci = 0, sac = SeqNo band 16#ffff, rac = 0}; + #user_location_information{location = + smc_test_lib:sai(1, 1, 11, SeqNo band 16#ffff)}; _ -> - #user_location_information - {type = 1, mcc = <<"001">>, mnc = <<"001">>, - lac = 11, ci = 0, sac = 20263, rac = 0} + #user_location_information{location = smc_test_lib:sai(1, 1, 11, 20263)} end, IEs = [#recovery{restart_counter = RCnt}, @@ -314,13 +306,7 @@ make_request(ms_info_change_notification_request, without_tei, #rat_type{rat_type = RAT}, #imei{imei = <<"1234567890123456">>}, #international_mobile_subscriber_identity{imsi = ?IMSI}, - #user_location_information{type = 1, - mcc = <<"001">>, - mnc = <<"001">>, - lac = 11, - ci = 0, - sac = 20263, - rac = 0} + #user_location_information{location = smc_test_lib:sai(1, 1, 11, 20263)} ], #gtp{version = v1, type = ms_info_change_notification_request, tei = 0, @@ -333,13 +319,7 @@ make_request(ms_info_change_notification_request, invalid_imsi, #rat_type{rat_type = RAT}, #international_mobile_subscriber_identity{ imsi = <<"991111111111111">>}, - #user_location_information{type = 1, - mcc = <<"001">>, - mnc = <<"001">>, - lac = 11, - ci = 0, - sac = 20263, - rac = 0} + #user_location_information{location = smc_test_lib:sai(1, 1, 11, 20263)} ], #gtp{version = v1, type = ms_info_change_notification_request, tei = 0, @@ -351,13 +331,7 @@ make_request(ms_info_change_notification_request, _SubType, rat_type = RAT}) -> IEs = [#recovery{restart_counter = RCnt}, #rat_type{rat_type = RAT}, - #user_location_information{type = 1, - mcc = <<"001">>, - mnc = <<"001">>, - lac = 11, - ci = 0, - sac = 20263, - rac = 0} + #user_location_information{location = smc_test_lib:sai(1, 1, 11, 20263)} ], #gtp{version = v1, type = ms_info_change_notification_request, diff --git a/apps/ergw/test/smc_test_lib.erl b/apps/ergw/test/smc_test_lib.erl index e5a5b81a..6d5874db 100644 --- a/apps/ergw/test/smc_test_lib.erl +++ b/apps/ergw/test/smc_test_lib.erl @@ -45,6 +45,9 @@ -export([match_map/4, maps_key_length/2]). -export([init_ets/1]). -export([set_online_charging/1, set_apn_key/2, load_aaa_answer_config/1, set_path_timers/1]). +-export([plmn/2, cgi/2, cgi/4, sai/2, sai/4, rai/3, rai/4, + tai/2, tai/3, ecgi/2, ecgi/3, lai/2, lai/3, + macro_enb/2, macro_enb/3, ext_macro_enb/2, ext_macro_enb/3]). -include("smc_test_lib.hrl"). -include_lib("stdlib/include/ms_transform.hrl"). @@ -765,3 +768,63 @@ set_path_timers(SetTimers) -> {ok, Timers} = ergw_core_config:get([path_management], undefined), NewTimers = maps_recusive_merge(Timers, SetTimers), ok = ergw_core_config:put(path_management, NewTimers). + +%%%=================================================================== +%%% common helpers for location data types +%%%=================================================================== + +plmn(CC, NC) -> + MCC = iolist_to_binary(io_lib:format("~3..0b", [CC])), + S = itu_e212:mcn_size(MCC), + MNC = iolist_to_binary(io_lib:format("~*..0b", [S, NC])), + {MCC, MNC}. + +cgi(CC, NC, LAC, CI) -> + #cgi{plmn_id = plmn(CC, NC), lac = LAC, ci = CI}. + +cgi(CC, NC) -> + cgi(CC, NC, rand:uniform(16#ffff), rand:uniform(16#ffff)). + +sai(CC, NC, LAC, SAC) -> + #sai{plmn_id = plmn(CC, NC), lac = LAC, sac = SAC}. + +sai(CC, NC) -> + sai(CC, NC, rand:uniform(16#ffff), rand:uniform(16#ffff)). + +rai(CC, NC, LAC, RAC) -> + #rai{plmn_id = plmn(CC, NC), lac = LAC, rac = RAC}. + +rai(v1, CC, NC) -> + rai(CC, NC, rand:uniform(16#ffff), (rand:uniform(16#ff) bsl 8) bor 16#ff); +rai(v2, CC, NC) -> + rai(CC, NC, rand:uniform(16#ffff), rand:uniform(16#ffff)). + +tai(CC, NC, TAC) -> + #tai{plmn_id = plmn(CC, NC), tac = TAC}. + +tai(CC, NC) -> + tai(CC, NC, rand:uniform(16#ffff)). + +ecgi(CC, NC, ECI) -> + #ecgi{plmn_id = plmn(CC, NC), eci = ECI}. + +ecgi(CC, NC) -> + ecgi(CC, NC, rand:uniform(16#fffffff)). + +lai(CC, NC, LAC) -> + #lai{plmn_id = plmn(CC, NC), lac = LAC}. + +lai(CC, NC) -> + lai(CC, NC, rand:uniform(16#ffff)). + +macro_enb(CC, NC, MeNB) -> + #macro_enb{plmn_id = plmn(CC, NC), id = MeNB}. + +macro_enb(CC, NC) -> + macro_enb(CC, NC, rand:uniform(16#fffff)). + +ext_macro_enb(CC, NC, EMeNB) -> + #ext_macro_enb{plmn_id = plmn(CC, NC), id = EMeNB}. + +ext_macro_enb(CC, NC) -> + ext_macro_enb(CC, NC, rand:uniform(16#1fffff)). diff --git a/apps/ergw_core/src/ergw_gsn_lib.erl b/apps/ergw_core/src/ergw_gsn_lib.erl index 953a2163..850f9db6 100644 --- a/apps/ergw_core/src/ergw_gsn_lib.erl +++ b/apps/ergw_core/src/ergw_gsn_lib.erl @@ -286,19 +286,21 @@ optional_if_unset(K, V, M) -> init_cev_from_session(Now, SessionOpts) -> Keys = ['Charging-Rule-Base-Name', 'QoS-Information', - '3GPP-User-Location-Info', '3GPP-RAT-Type', + 'User-Location-Info', '3GPP-RAT-Type', '3GPP-Charging-Id', '3GPP-SGSN-Address', '3GPP-SGSN-IPv6-Address'], Init = #{'Change-Time' => [calendar:system_time_to_universal_time(Now + erlang:time_offset(), native)]}, Container = - maps:fold(fun(K, V, M) when K == '3GPP-User-Location-Info'; - K == '3GPP-RAT-Type'; + maps:fold(fun(K, V, M) when K == '3GPP-RAT-Type'; K == '3GPP-Charging-Id' -> M#{K => [ergw_aaa_diameter:'3gpp_from_session'(K, V)]}; (K, V, M) when K == '3GPP-SGSN-Address'; K == '3GPP-SGSN-IPv6-Address' -> M#{'SGSN-Address' => [V]}; + ('User-Location-Info' = K, V, M) -> + M#{'3GPP-User-Location-Info' => + [ergw_aaa_diameter:'3gpp_from_session'(K, V)]}; (K, V, M) -> M#{K => [V]} end, Init, maps:with(Keys, SessionOpts)), diff --git a/apps/ergw_core/src/ergw_proxy_lib.erl b/apps/ergw_core/src/ergw_proxy_lib.erl index d29fff6d..d2b3433c 100644 --- a/apps/ergw_core/src/ergw_proxy_lib.erl +++ b/apps/ergw_core/src/ergw_proxy_lib.erl @@ -206,7 +206,7 @@ proxy_info(Session, #bearer{remote = #fq_teid{ip = GsnU}}, #context{apn = APN, imsi = IMSI, imei = IMEI, msisdn = MSISDN}) -> Keys = [{'3GPP-RAT-Type', 'ratType'}, - {'3GPP-User-Location-Info', 'userLocationInfo'}, + {'User-Location-Info', 'userLocationInfo'}, {'RAI', rai}], PI = lists:foldl( fun({Key, MapTo}, P) when is_map_key(Key, Session) -> diff --git a/apps/ergw_core/src/ggsn_gn.erl b/apps/ergw_core/src/ggsn_gn.erl index 42abe0d5..078e570b 100644 --- a/apps/ergw_core/src/ggsn_gn.erl +++ b/apps/ergw_core/src/ggsn_gn.erl @@ -385,11 +385,6 @@ map_username(IEs, [H | Rest], Acc) -> Part = map_attr(H, IEs), map_username(IEs, Rest, [Part | Acc]). -hexstr(Value, _Width) when is_binary(Value) -> - erlang:iolist_to_binary([io_lib:format("~2.16.0B", [X]) || <> <= Value]); -hexstr(Value, Width) when is_integer(Value) -> - erlang:iolist_to_binary(io_lib:format("~*.16.0B", [Width, Value])). - %% init_session/4 init_session(IEs, #tunnel{local = #fq_teid{ip = LocalIP}}, #context{charging_identifier = ChargingId}, @@ -508,28 +503,23 @@ copy_to_session(_, #selection_mode{mode = Mode}, _AAAopts, Session) -> Session#{'3GPP-Selection-Mode' => Mode}; copy_to_session(_, #charging_characteristics{value = Value}, _AAAopts, Session) -> Session#{'3GPP-Charging-Characteristics' => Value}; -copy_to_session(_, #routeing_area_identity{mcc = MCC, mnc = MNC, - lac = LAC, rac = RAC}, _AAAopts, Session) -> - RAI = <>, - Session#{'RAI' => RAI, - '3GPP-SGSN-MCC-MNC' => <>}; +copy_to_session(_, #routeing_area_identity{identity = #rai{plmn_id = PLMN} = RAI}, + _AAAopts, Session) -> + maps:update_with('User-Location-Info', _#{'RAI' => RAI}, #{'RAI' => RAI}, + Session#{'3GPP-SGSN-MCC-MNC' => PLMN}); copy_to_session(_, #imei{imei = IMEI}, _AAAopts, Session) -> Session#{'3GPP-IMEISV' => IMEI}; copy_to_session(_, #rat_type{rat_type = Type}, _AAAopts, Session) -> Session#{'3GPP-RAT-Type' => Type}; -copy_to_session(_, #user_location_information{type = Type, mcc = MCC, mnc = MNC, lac = LAC, - ci = CI, sac = SAC} = IE, _AAAopts, Session0) -> - Session = if Type == 0 -> - CGI = <>, - maps:without(['SAI'], Session0#{'CGI' => CGI}); - Type == 1 -> - SAI = <>, - maps:without(['CGI'], Session0#{'SAI' => SAI}); - true -> - Session0 - end, - Value = gtp_packet:encode_v1_uli(IE), - Session#{'3GPP-User-Location-Info' => Value}; +copy_to_session(_, #user_location_information{location = Location}, _AAAopts, Session) -> + ULI0 = maps:with(['RAI'], maps:get('User-Location-Info', Session, #{})), + ULI = case Location of + #cgi{} -> ULI0#{'CGI' => Location}; + #sai{} -> ULI0#{'SAI' => Location}; + #rai{} -> ULI0#{'RAI' => Location}; + _ -> ULI0 + end, + Session#{'User-Location-Info' => ULI}; copy_to_session(_, #ms_time_zone{timezone = TZ, dst = DST}, _AAAopts, Session) -> Session#{'3GPP-MS-TimeZone' => {TZ, DST}}; copy_to_session(_, _, _AAAopts, Session) -> diff --git a/apps/ergw_core/src/gtp_context.erl b/apps/ergw_core/src/gtp_context.erl index 2cf30161..3e5a4dd6 100644 --- a/apps/ergw_core/src/gtp_context.erl +++ b/apps/ergw_core/src/gtp_context.erl @@ -125,7 +125,17 @@ trigger_delete_context(Context) -> gen_statem:cast(Context, {delete_context, administrative}). %% TODO: add online charing events -collect_charging_events(OldS, NewS) -> +collect_charging_events(OldS0, NewS0) -> + Fields = ['3GPP-MS-TimeZone', + 'QoS-Information', + '3GPP-RAT-Type', + '3GPP-SGSN-Address', + '3GPP-SGSN-IPv6-Address', + '3GPP-SGSN-MCC-MNC', + 'User-Location-Info'], + OldS = maps:merge(maps:with(Fields, OldS0), maps:get('User-Location-Info', OldS0)), + NewS = maps:merge(maps:with(Fields, NewS0), maps:get('User-Location-Info', NewS0)), + EvChecks = [ {'CGI', 'cgi-sai-change'}, @@ -141,7 +151,7 @@ collect_charging_events(OldS, NewS) -> {'3GPP-SGSN-MCC-MNC', 'sgsn-sgw-plmn-id-change'}, {'TAI', 'tai-change'}, %%{ qos, 'tariff-switch-change'}, - {'3GPP-User-Location-Info', 'user-location-info-change'} + {'User-Location-Info', 'user-location-info-change'} ], Events = diff --git a/apps/ergw_core/src/itu_e212.erl b/apps/ergw_core/src/itu_e212.erl index f7880f18..c73821ec 100644 --- a/apps/ergw_core/src/itu_e212.erl +++ b/apps/ergw_core/src/itu_e212.erl @@ -9,6 +9,10 @@ -export([split_imsi/1]). +-ifdef(TEST). +-export([mcn_size/1]). +-endif. + %%==================================================================== %% API %%==================================================================== diff --git a/apps/ergw_core/src/pgw_s5s8.erl b/apps/ergw_core/src/pgw_s5s8.erl index de06e64e..f48e384e 100644 --- a/apps/ergw_core/src/pgw_s5s8.erl +++ b/apps/ergw_core/src/pgw_s5s8.erl @@ -674,49 +674,25 @@ copy_to_session(_, #v2_selection_mode{mode = Mode}, _AAAopts, Session) -> copy_to_session(_, #v2_charging_characteristics{value = Value}, _AAAopts, Session) -> Session#{'3GPP-Charging-Characteristics' => Value}; -copy_to_session(_, #v2_serving_network{mcc = MCC, mnc = MNC}, _AAAopts, Session) -> - Session#{'3GPP-SGSN-MCC-MNC' => <>}; +copy_to_session(_, #v2_serving_network{plmn_id = PLMN}, _AAAopts, Session) -> + Session#{'3GPP-SGSN-MCC-MNC' => PLMN}; copy_to_session(_, #v2_mobile_equipment_identity{mei = IMEI}, _AAAopts, Session) -> Session#{'3GPP-IMEISV' => IMEI}; copy_to_session(_, #v2_rat_type{rat_type = Type}, _AAAopts, Session) -> Session#{'3GPP-RAT-Type' => Type}; - -%% 0 CGI -%% 1 SAI -%% 2 RAI -%% 3-127 Spare for future use -%% 128 TAI -%% 129 ECGI -%% 130 TAI and ECGI -%% 131-255 Spare for future use - -copy_to_session(_, #v2_user_location_information{tai = TAI, ecgi = ECGI}, _AAAopts, Session) - when is_binary(TAI), is_binary(ECGI) -> - Value = <<130, TAI/binary, ECGI/binary>>, - Session#{'TAI' => TAI, 'ECGI' => ECGI, '3GPP-User-Location-Info' => Value}; -copy_to_session(_, #v2_user_location_information{ecgi = ECGI}, _AAAopts, Session) - when is_binary(ECGI) -> - Value = <<129, ECGI/binary>>, - Session#{'ECGI' => ECGI, '3GPP-User-Location-Info' => Value}; -copy_to_session(_, #v2_user_location_information{tai = TAI}, _AAAopts, Session) - when is_binary(TAI) -> - Value = <<128, TAI/binary>>, - Session#{'TAI' => TAI, '3GPP-User-Location-Info' => Value}; -copy_to_session(_, #v2_user_location_information{rai = RAI}, _AAAopts, Session) - when is_binary(RAI) -> - Value = <<2, RAI/binary>>, - Session#{'RAI' => RAI, '3GPP-User-Location-Info' => Value}; -copy_to_session(_, #v2_user_location_information{sai = SAI}, _AAAopts, Session0) - when is_binary(SAI) -> - Session = maps:without(['CGI'], Session0#{'SAI' => SAI}), - Value = <<1, SAI/binary>>, - Session#{'3GPP-User-Location-Info' => Value}; -copy_to_session(_, #v2_user_location_information{cgi = CGI}, _AAAopts, Session0) - when is_binary(CGI) -> - Session = maps:without(['SAI'], Session0#{'CGI' => CGI}), - Value = <<0, CGI/binary>>, - Session#{'3GPP-User-Location-Info' => Value}; - +copy_to_session(_, #v2_user_location_information{} = Info, _AAAopts, Session) -> + ULI = lists:foldl( + fun(X, S) when is_record(X, cgi) -> S#{'CGI' => X}; + (X, S) when is_record(X, sai) -> S#{'SAI' => X}; + (X, S) when is_record(X, rai) -> S#{'RAI' => X}; + (X, S) when is_record(X, tai) -> S#{'TAI' => X}; + (X, S) when is_record(X, ecgi) -> S#{'ECGI' => X}; + (X, S) when is_record(X, lai) -> S#{'LAI' => X}; + (X, S) when is_record(X, macro_enb) -> S#{'macro-eNB' => X}; + (X, S) when is_record(X, ext_macro_enb) -> S#{'ext-macro-eNB' => X}; + (_, S) -> S + end, #{}, tl(tuple_to_list(Info))), + Session#{'User-Location-Info' => ULI}; copy_to_session(_, #v2_ue_time_zone{timezone = TZ, dst = DST}, _AAAopts, Session) -> Session#{'3GPP-MS-TimeZone' => {TZ, DST}}; copy_to_session(_, _, _AAAopts, Session) -> diff --git a/apps/ergw_core/src/saegw_s11.erl b/apps/ergw_core/src/saegw_s11.erl index 5d65c4c8..e04775c4 100644 --- a/apps/ergw_core/src/saegw_s11.erl +++ b/apps/ergw_core/src/saegw_s11.erl @@ -544,49 +544,25 @@ copy_to_session(_, #v2_selection_mode{mode = Mode}, _AAAopts, Session) -> copy_to_session(_, #v2_charging_characteristics{value = Value}, _AAAopts, Session) -> Session#{'3GPP-Charging-Characteristics' => Value}; -copy_to_session(_, #v2_serving_network{mcc = MCC, mnc = MNC}, _AAAopts, Session) -> - Session#{'3GPP-SGSN-MCC-MNC' => <>}; +copy_to_session(_, #v2_serving_network{plmn_id = PLMN}, _AAAopts, Session) -> + Session#{'3GPP-SGSN-MCC-MNC' => PLMN}; copy_to_session(_, #v2_mobile_equipment_identity{mei = IMEI}, _AAAopts, Session) -> Session#{'3GPP-IMEISV' => IMEI}; copy_to_session(_, #v2_rat_type{rat_type = Type}, _AAAopts, Session) -> Session#{'3GPP-RAT-Type' => Type}; - -%% 0 CGI -%% 1 SAI -%% 2 RAI -%% 3-127 Spare for future use -%% 128 TAI -%% 129 ECGI -%% 130 TAI and ECGI -%% 131-255 Spare for future use - -copy_to_session(_, #v2_user_location_information{tai = TAI, ecgi = ECGI}, _AAAopts, Session) - when is_binary(TAI), is_binary(ECGI) -> - Value = <<130, TAI/binary, ECGI/binary>>, - Session#{'TAI' => TAI, 'ECGI' => ECGI, '3GPP-User-Location-Info' => Value}; -copy_to_session(_, #v2_user_location_information{ecgi = ECGI}, _AAAopts, Session) - when is_binary(ECGI) -> - Value = <<129, ECGI/binary>>, - Session#{'ECGI' => ECGI, '3GPP-User-Location-Info' => Value}; -copy_to_session(_, #v2_user_location_information{tai = TAI}, _AAAopts, Session) - when is_binary(TAI) -> - Value = <<128, TAI/binary>>, - Session#{'TAI' => TAI, '3GPP-User-Location-Info' => Value}; -copy_to_session(_, #v2_user_location_information{rai = RAI}, _AAAopts, Session) - when is_binary(RAI) -> - Value = <<2, RAI/binary>>, - Session#{'RAI' => RAI, '3GPP-User-Location-Info' => Value}; -copy_to_session(_, #v2_user_location_information{sai = SAI}, _AAAopts, Session0) - when is_binary(SAI) -> - Session = maps:without(['CGI'], Session0#{'SAI' => SAI}), - Value = <<1, SAI/binary>>, - Session#{'3GPP-User-Location-Info' => Value}; -copy_to_session(_, #v2_user_location_information{cgi = CGI}, _AAAopts, Session0) - when is_binary(CGI) -> - Session = maps:without(['SAI'], Session0#{'CGI' => CGI}), - Value = <<0, CGI/binary>>, - Session#{'3GPP-User-Location-Info' => Value}; - +copy_to_session(_, #v2_user_location_information{} = Info, _AAAopts, Session) -> + ULI = lists:foldl( + fun(X, S) when is_record(X, cgi) -> S#{'CGI' => X}; + (X, S) when is_record(X, sai) -> S#{'SAI' => X}; + (X, S) when is_record(X, rai) -> S#{'RAI' => X}; + (X, S) when is_record(X, tai) -> S#{'TAI' => X}; + (X, S) when is_record(X, ecgi) -> S#{'ECGI' => X}; + (X, S) when is_record(X, lai) -> S#{'LAI' => X}; + (X, S) when is_record(X, macro_enb) -> S#{'macro-eNB' => X}; + (X, S) when is_record(X, ext_macro_enb) -> S#{'ext-macro-eNB' => X}; + (_, S) -> S + end, #{}, tl(tuple_to_list(Info))), + Session#{'User-Location-Info' => ULI}; copy_to_session(_, #v2_ue_time_zone{timezone = TZ, dst = DST}, _AAAopts, Session) -> Session#{'3GPP-MS-TimeZone' => {TZ, DST}}; copy_to_session(_, _, _AAAopts, Session) -> diff --git a/apps/ergw_core/test/ergw_ggsn_test_lib.erl b/apps/ergw_core/test/ergw_ggsn_test_lib.erl index c7ba41f1..a595eca0 100644 --- a/apps/ergw_core/test/ergw_ggsn_test_lib.erl +++ b/apps/ergw_core/test/ergw_ggsn_test_lib.erl @@ -259,13 +259,7 @@ make_request(create_pdp_context_request, SubType, #selection_mode{mode = 0}, #tunnel_endpoint_identifier_control_plane{tei = LocalCntlTEI}, #tunnel_endpoint_identifier_data_i{tei = LocalDataTEI}, - #user_location_information{type = 1, - mcc = <<"001">>, - mnc = <<"001">>, - lac = 11, - ci = 0, - sac = 20263, - rac = 0}], + #user_location_information{location = ergw_test_lib:sai(1, 1, 11, 20263)}], IEs = make_pdp_type(SubType, IEs0), Req = #gtp{version = v1, type = create_pdp_context_request, tei = 0, @@ -282,13 +276,10 @@ make_request(update_pdp_context_request, SubType, ULI = case SubType of ra_update -> - #user_location_information - {type = 1, mcc = <<"001">>, mnc = <<"001">>, - lac = 11, ci = 0, sac = SeqNo band 16#ffff, rac = 0}; + #user_location_information{ + location = ergw_test_lib:sai(1, 1, 11, SeqNo band 16#ffff)}; _ -> - #user_location_information - {type = 1, mcc = <<"001">>, mnc = <<"001">>, - lac = 11, ci = 0, sac = 20263, rac = 0} + #user_location_information{location = ergw_test_lib:sai(1, 1, 11, 20263)} end, IEs = [#recovery{restart_counter = RCnt}, @@ -314,13 +305,7 @@ make_request(ms_info_change_notification_request, without_tei, #rat_type{rat_type = RAT}, #imei{imei = <<"1234567890123456">>}, #international_mobile_subscriber_identity{imsi = ?IMSI}, - #user_location_information{type = 1, - mcc = <<"001">>, - mnc = <<"001">>, - lac = 11, - ci = 0, - sac = 20263, - rac = 0} + #user_location_information{location = ergw_test_lib:sai(1, 1, 11, 20263)} ], #gtp{version = v1, type = ms_info_change_notification_request, tei = 0, @@ -333,13 +318,7 @@ make_request(ms_info_change_notification_request, invalid_imsi, #rat_type{rat_type = RAT}, #international_mobile_subscriber_identity{ imsi = <<"991111111111111">>}, - #user_location_information{type = 1, - mcc = <<"001">>, - mnc = <<"001">>, - lac = 11, - ci = 0, - sac = 20263, - rac = 0} + #user_location_information{location = ergw_test_lib:sai(1, 1, 11, 20263)} ], #gtp{version = v1, type = ms_info_change_notification_request, tei = 0, @@ -351,13 +330,7 @@ make_request(ms_info_change_notification_request, _SubType, rat_type = RAT}) -> IEs = [#recovery{restart_counter = RCnt}, #rat_type{rat_type = RAT}, - #user_location_information{type = 1, - mcc = <<"001">>, - mnc = <<"001">>, - lac = 11, - ci = 0, - sac = 20263, - rac = 0} + #user_location_information{location = ergw_test_lib:sai(1, 1, 11, 20263)} ], #gtp{version = v1, type = ms_info_change_notification_request, diff --git a/apps/ergw_core/test/ergw_pgw_test_lib.erl b/apps/ergw_core/test/ergw_pgw_test_lib.erl index ebbf790f..066f83c7 100644 --- a/apps/ergw_core/test/ergw_pgw_test_lib.erl +++ b/apps/ergw_core/test/ergw_pgw_test_lib.erl @@ -364,10 +364,10 @@ create_session_request(Base, N, #v2_msisdn{msisdn = MSISDN}, #v2_rat_type{rat_type = RAT}, #v2_selection_mode{mode = 0}, - #v2_serving_network{mcc = <<"001">>, mnc = <<"001">>}, + #v2_serving_network{plmn_id = ergw_test_lib:plmn(1,1)}, #v2_ue_time_zone{timezone = 10, dst = 0}, - #v2_user_location_information{tai = <<3,2,22,214,217>>, - ecgi = <<3,2,22,8,71,9,92>>}], + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)}], IEs = make_pdn_type(simple, IEs0), #gtp{version = v2, type = create_session_request, tei = 0, seq_no = SeqNo, ie = IEs}. @@ -426,10 +426,10 @@ make_request(create_session_request, SubType, #v2_msisdn{msisdn = ?'MSISDN'}, #v2_rat_type{rat_type = RAT}, #v2_selection_mode{mode = 0}, - #v2_serving_network{mcc = <<"001">>, mnc = <<"001">>}, + #v2_serving_network{plmn_id = ergw_test_lib:plmn(1,1)}, #v2_ue_time_zone{timezone = 10, dst = 0}, - #v2_user_location_information{tai = <<3,2,22,214,217>>, - ecgi = <<3,2,22,8,71,9,92>>}], + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)}], IEs1 = make_pdn_type(SubType, IEs0), IEs = make_indication(SubType, IEs1), #gtp{version = v2, type = create_session_request, tei = 0, @@ -459,10 +459,8 @@ make_request(modify_bearer_request, secondary_rat_usage_data_report, local_control_tei = LocalCntlTEI, remote_control_tei = RemoteCntlTEI, rat_type = RAT}) -> - MCCMNC = <<16#00, 16#11, 16#00>>, %% MCC => 001, MNC => 001 - ULI = #v2_user_location_information{ - tai = <>, - ecgi = <>}, + ULI = #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 20263), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)}, IEs = [#v2_recovery{restart_counter = RCnt}, #v2_ue_time_zone{timezone = 10, dst = 0}, ULI, @@ -494,17 +492,14 @@ make_request(modify_bearer_request, SubType, remote_control_tei = RemoteCntlTEI, rat_type = RAT}) when SubType == simple; SubType == ra_update -> - MCCMNC = <<16#00, 16#11, 16#00>>, %% MCC => 001, MNC => 001 ULI = case SubType of ra_update -> - #v2_user_location_information{ - tai = <>, - ecgi = <>}; + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, SeqNo band 16#ffff), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)}; _ -> - #v2_user_location_information{ - tai = <>, - ecgi = <>} + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)} end, IEs = [#v2_recovery{restart_counter = RCnt}, #v2_ue_time_zone{timezone = 10, dst = 0}, @@ -540,8 +535,8 @@ make_request(change_notification_request, simple, IEs = [#v2_recovery{restart_counter = RCnt}, #v2_rat_type{rat_type = RAT}, #v2_ue_time_zone{timezone = 10, dst = 0}, - #v2_user_location_information{tai = <<3,2,22,214,217>>, - ecgi = <<3,2,22,8,71,9,92>>} + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)} ], #gtp{version = v2, type = change_notification_request, tei = RemoteCntlTEI, @@ -574,8 +569,8 @@ make_request(change_notification_request, without_tei, imsi = ?'IMSI'}, #v2_mobile_equipment_identity{mei = ?IMEISV}, #v2_ue_time_zone{timezone = 10, dst = 0}, - #v2_user_location_information{tai = <<3,2,22,214,217>>, - ecgi = <<3,2,22,8,71,9,92>>} + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)} ], #gtp{version = v2, type = change_notification_request, tei = 0, @@ -597,8 +592,8 @@ make_request(delete_session_request, fq_teid, IEs = [#v2_recovery{restart_counter = RCnt}, #v2_eps_bearer_id{eps_bearer_id = 5}, fq_teid(0, ?'S5/S8-C SGW', LocalCntlTEI, LocalIP), - #v2_user_location_information{tai = <<3,2,22,214,217>>, - ecgi = <<3,2,22,8,71,9,92>>}], + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)}], #gtp{version = v2, type = delete_session_request, tei = RemoteCntlTEI, seq_no = SeqNo, ie = IEs}; @@ -621,8 +616,8 @@ make_request(delete_session_request, SubType, IEs = [#v2_recovery{restart_counter = RCnt}, #v2_eps_bearer_id{eps_bearer_id = 5}, FqTEID, - #v2_user_location_information{tai = <<3,2,22,214,217>>, - ecgi = <<3,2,22,8,71,9,92>>}], + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)}], #gtp{version = v2, type = delete_session_request, tei = RemoteCntlTEI, seq_no = SeqNo, ie = IEs}; diff --git a/apps/ergw_core/test/ergw_saegw_test_lib.erl b/apps/ergw_core/test/ergw_saegw_test_lib.erl index e3aa15a7..9cb355bc 100644 --- a/apps/ergw_core/test/ergw_saegw_test_lib.erl +++ b/apps/ergw_core/test/ergw_saegw_test_lib.erl @@ -199,10 +199,10 @@ make_request(create_session_request, SubType, #v2_msisdn{msisdn = ?'MSISDN'}, #v2_rat_type{rat_type = 6}, #v2_selection_mode{mode = 0}, - #v2_serving_network{mcc = <<"001">>, mnc = <<"001">>}, + #v2_serving_network{plmn_id = ergw_test_lib:plmn(1,1)}, #v2_ue_time_zone{timezone = 10, dst = 0}, - #v2_user_location_information{tai = <<3,2,22,214,217>>, - ecgi = <<3,2,22,8,71,9,92>>}], + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)}], IEs1 = make_pdn_type(SubType, IEs0), IEs = make_indication(SubType, IEs1), #gtp{version = v2, type = create_session_request, tei = 0, @@ -250,8 +250,8 @@ make_request(modify_bearer_request, SubType, when SubType == simple; SubType == ra_update -> IEs = [#v2_recovery{restart_counter = RCnt}, #v2_ue_time_zone{timezone = 10, dst = 0}, - #v2_user_location_information{tai = <<3,2,22,214,217>>, - ecgi = <<3,2,22,8,71,9,92>>}, + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)}, fq_teid(0, ?'S11-C MME', LocalCntlTEI, LocalIP) ], @@ -290,8 +290,8 @@ make_request(delete_session_request, fq_teid, IEs = [#v2_recovery{restart_counter = RCnt}, #v2_eps_bearer_id{eps_bearer_id = 5}, fq_teid(0, ?'S11-C MME', LocalCntlTEI, LocalIP), - #v2_user_location_information{tai = <<3,2,22,214,217>>, - ecgi = <<3,2,22,8,71,9,92>>}], + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)}], #gtp{version = v2, type = delete_session_request, tei = RemoteCntlTEI, seq_no = SeqNo, ie = IEs}; @@ -313,8 +313,8 @@ make_request(delete_session_request, SubType, IEs = [#v2_recovery{restart_counter = RCnt}, #v2_eps_bearer_id{eps_bearer_id = 5}, FqTEID, - #v2_user_location_information{tai = <<3,2,22,214,217>>, - ecgi = <<3,2,22,8,71,9,92>>}], + #v2_user_location_information{tai = ergw_test_lib:tai(1, 1, 55001), + ecgi = ergw_test_lib:ecgi(1, 1, 138873180)}], #gtp{version = v2, type = delete_session_request, tei = RemoteCntlTEI, seq_no = SeqNo, ie = IEs}; diff --git a/apps/ergw_core/test/ergw_test_lib.erl b/apps/ergw_core/test/ergw_test_lib.erl index d749bad9..2bbf387d 100644 --- a/apps/ergw_core/test/ergw_test_lib.erl +++ b/apps/ergw_core/test/ergw_test_lib.erl @@ -45,6 +45,9 @@ -export([match_map/4, maps_key_length/2]). -export([init_ets/1]). -export([set_online_charging/1, set_apn_key/2, load_aaa_answer_config/1, set_path_timers/1]). +-export([plmn/2, cgi/2, cgi/4, sai/2, sai/4, rai/3, rai/4, + tai/2, tai/3, ecgi/2, ecgi/3, lai/2, lai/3, + macro_enb/2, macro_enb/3, ext_macro_enb/2, ext_macro_enb/3]). -include("ergw_test_lib.hrl"). -include_lib("stdlib/include/ms_transform.hrl"). @@ -969,3 +972,63 @@ set_path_timers(SetTimers) -> {ok, Timers} = ergw_core_config:get([path_management], undefined), NewTimers = maps_recusive_merge(Timers, SetTimers), ok = ergw_core_config:put(path_management, NewTimers). + +%%%=================================================================== +%%% common helpers for location data types +%%%=================================================================== + +plmn(CC, NC) -> + MCC = iolist_to_binary(io_lib:format("~3..0b", [CC])), + S = itu_e212:mcn_size(MCC), + MNC = iolist_to_binary(io_lib:format("~*..0b", [S, NC])), + {MCC, MNC}. + +cgi(CC, NC, LAC, CI) -> + #cgi{plmn_id = plmn(CC, NC), lac = LAC, ci = CI}. + +cgi(CC, NC) -> + cgi(CC, NC, rand:uniform(16#ffff), rand:uniform(16#ffff)). + +sai(CC, NC, LAC, SAC) -> + #sai{plmn_id = plmn(CC, NC), lac = LAC, sac = SAC}. + +sai(CC, NC) -> + sai(CC, NC, rand:uniform(16#ffff), rand:uniform(16#ffff)). + +rai(CC, NC, LAC, RAC) -> + #rai{plmn_id = plmn(CC, NC), lac = LAC, rac = RAC}. + +rai(v1, CC, NC) -> + rai(CC, NC, rand:uniform(16#ffff), (rand:uniform(16#ff) bsl 8) bor 16#ff); +rai(v2, CC, NC) -> + rai(CC, NC, rand:uniform(16#ffff), rand:uniform(16#ffff)). + +tai(CC, NC, TAC) -> + #tai{plmn_id = plmn(CC, NC), tac = TAC}. + +tai(CC, NC) -> + tai(CC, NC, rand:uniform(16#ffff)). + +ecgi(CC, NC, ECI) -> + #ecgi{plmn_id = plmn(CC, NC), eci = ECI}. + +ecgi(CC, NC) -> + ecgi(CC, NC, rand:uniform(16#fffffff)). + +lai(CC, NC, LAC) -> + #lai{plmn_id = plmn(CC, NC), lac = LAC}. + +lai(CC, NC) -> + lai(CC, NC, rand:uniform(16#ffff)). + +macro_enb(CC, NC, MeNB) -> + #macro_enb{plmn_id = plmn(CC, NC), id = MeNB}. + +macro_enb(CC, NC) -> + macro_enb(CC, NC, rand:uniform(16#fffff)). + +ext_macro_enb(CC, NC, EMeNB) -> + #ext_macro_enb{plmn_id = plmn(CC, NC), id = EMeNB}. + +ext_macro_enb(CC, NC) -> + ext_macro_enb(CC, NC, rand:uniform(16#1fffff)). diff --git a/apps/ergw_core/test/ggsn_SUITE.erl b/apps/ergw_core/test/ggsn_SUITE.erl index 015ad379..090f4263 100644 --- a/apps/ergw_core/test/ggsn_SUITE.erl +++ b/apps/ergw_core/test/ggsn_SUITE.erl @@ -1641,7 +1641,7 @@ session_options(Config) -> '3GPP-MSISDN' => ?MSISDN, '3GPP-RAT-Type' => 1, '3GPP-IMSI' => ?IMSI, - '3GPP-User-Location-Info' => '_', + 'User-Location-Info' => '_', 'QoS-Information' => #{ @@ -2146,14 +2146,13 @@ simple_ocs(Config) -> '3GPP-RAT-Type' => 1, '3GPP-Selection-Mode' => 0, %% '3GPP-SGSN-MCC-MNC' => '?????', - '3GPP-User-Location-Info' => '_', + 'User-Location-Info' => '_', 'Acct-Interim-Interval' => 600, 'Bearer-Operation' => '_', 'Called-Station-Id' => unicode:characters_to_binary(lists:join($., ?'APN-EXAMPLE')), 'Calling-Station-Id' => ?MSISDN, 'Charging-Rule-Base-Name' => <<"m2m0001">>, 'Diameter-Session-Id' => '_', - %% 'ECGI' => '?????', %% 'Event-Trigger' => '?????', 'Framed-IP-Address' => {10, '_', '_', '_'}, 'Framed-IPv6-Prefix' => {{16#8001, 0, '_', '_', '_', '_', '_', '_'},64}, @@ -2177,11 +2176,9 @@ simple_ocs(Config) -> 'APN-Aggregate-Max-Bitrate-DL' => '_' }, %% 'Requested-IP-Address' => '?????', - 'SAI' => '_', 'Service-Type' => 'Framed-User', 'Session-Id' => '_', 'Session-Start' => '_', - %% 'TAI' => '?????', 'Username' => '_' }, ?match_map(Expected, Session), diff --git a/apps/ergw_core/test/pgw_SUITE.erl b/apps/ergw_core/test/pgw_SUITE.erl index f43d9792..2607c2cf 100644 --- a/apps/ergw_core/test/pgw_SUITE.erl +++ b/apps/ergw_core/test/pgw_SUITE.erl @@ -2599,7 +2599,7 @@ session_options(Config) -> '3GPP-MSISDN' => ?MSISDN, '3GPP-RAT-Type' => 1, '3GPP-IMSI' => ?IMSI, - '3GPP-User-Location-Info' => '_', + 'User-Location-Info' => '_', 'QoS-Information' => #{ @@ -3636,7 +3636,7 @@ simple_ocs(Config) -> %% '3GPP-PDP-Type' => 'IPv4v6', '3GPP-RAT-Type' => 1, '3GPP-SGSN-MCC-MNC' => '_', - '3GPP-User-Location-Info' => '_', + 'User-Location-Info' => '_', %% 'Acct-Interim-Interval' => '?????', %% 'Bearer-Operation' => '?????', 'Called-Station-Id' => @@ -3644,7 +3644,6 @@ simple_ocs(Config) -> 'Calling-Station-Id' => ?MSISDN, 'Charging-Rule-Base-Name' => <<"m2m0001">>, 'Diameter-Session-Id' => '_', - 'ECGI' => '_', 'Event-Trigger' => '_', 'Framed-IP-Address' => {10, '_', '_', '_'}, %% 'Framed-IPv6-Prefix' => {{16#8001, 0, '_', '_', '_', '_', '_', '_'},64}, @@ -3668,11 +3667,9 @@ simple_ocs(Config) -> }, %% 'Requested-IP-Address' => '_', - %% 'SAI' => '?????', 'Service-Type' => 'Framed-User', 'Session-Id' => '_', 'Session-Start' => '_', - 'TAI' => '_', 'Username' => '_' }, ?match_map(Expected, Session), diff --git a/apps/ergw_core/test/saegw_s11_SUITE.erl b/apps/ergw_core/test/saegw_s11_SUITE.erl index 9048e55c..050ef107 100644 --- a/apps/ergw_core/test/saegw_s11_SUITE.erl +++ b/apps/ergw_core/test/saegw_s11_SUITE.erl @@ -1175,7 +1175,7 @@ session_options(Config) -> '3GPP-MSISDN' => ?MSISDN, '3GPP-RAT-Type' => 6, '3GPP-IMSI' => ?IMSI, - '3GPP-User-Location-Info' => '_', + 'User-Location-Info' => '_', 'QoS-Information' => #{ @@ -1652,7 +1652,7 @@ simple_ocs(Config) -> %% '3GPP-PDP-Type' => 'IPv4v6', '3GPP-RAT-Type' => 6, '3GPP-SGSN-MCC-MNC' => '_', - '3GPP-User-Location-Info' => '_', + 'User-Location-Info' => '_', %% 'Acct-Interim-Interval' => '?????', %% 'Bearer-Operation' => '?????', 'Called-Station-Id' => @@ -1660,7 +1660,6 @@ simple_ocs(Config) -> 'Calling-Station-Id' => ?MSISDN, 'Charging-Rule-Base-Name' => <<"m2m0001">>, 'Diameter-Session-Id' => '_', - 'ECGI' => '_', 'Event-Trigger' => '_', 'Framed-IP-Address' => {10, '_', '_', '_'}, %% 'Framed-IPv6-Prefix' => {{16#8001, 0, '_', '_', '_', '_', '_', '_'},64}, @@ -1684,11 +1683,9 @@ simple_ocs(Config) -> }, %% 'Requested-IP-Address' => '_', - %% 'SAI' => '?????', 'Service-Type' => 'Framed-User', 'Session-Id' => '_', 'Session-Start' => '_', - 'TAI' => '_', 'Username' => '_' }, ?match_map(Expected, Session), diff --git a/rebar.config b/rebar.config index 88e76e36..73e7c244 100644 --- a/rebar.config +++ b/rebar.config @@ -19,9 +19,9 @@ {xxhash, {git, "https://github.com/pierreis/erlang-xxhash.git", {branch, "master"}}}, {erlando, {git, "https://github.com/travelping/erlando.git", {tag, "1.0.3"}}}, {netdata, {git, "https://github.com/RoadRunnr/erl_netdata.git", {ref, "cbd6eaf"}}}, - {gtplib, "2.1.0"}, + {gtplib, "3.0.0"}, {pfcplib, "2.1.1"}, - {ergw_aaa, {git, "https://github.com/travelping/ergw_aaa.git", {tag, "4.0.0"}}} + {ergw_aaa, {git, "https://github.com/travelping/ergw_aaa.git", {tag, "4.1.0"}}} ]}. {minimum_otp_vsn, "23.0"}. diff --git a/rebar.lock b/rebar.lock index 163a4f4d..f4bdbc58 100644 --- a/rebar.lock +++ b/rebar.lock @@ -7,7 +7,7 @@ {<<"eradius">>,{pkg,<<"eradius">>,<<"2.2.2">>},1}, {<<"ergw_aaa">>, {git,"https://github.com/travelping/ergw_aaa.git", - {ref,"120869e44fe5c0769cb80792413d8163d0b2c4aa"}}, + {ref,"a44b39e2a45ca7432cbe984065bbd1f0eca05741"}}, 0}, {<<"erlando">>, {git,"https://github.com/travelping/erlando.git", @@ -15,7 +15,7 @@ 0}, {<<"fast_yaml">>,{pkg,<<"fast_yaml">>,<<"1.0.31">>},0}, {<<"gen_batch_server">>,{pkg,<<"gen_batch_server">>,<<"0.8.4">>},1}, - {<<"gtplib">>,{pkg,<<"gtplib">>,<<"2.1.0">>},0}, + {<<"gtplib">>,{pkg,<<"gtplib">>,<<"3.0.0">>},0}, {<<"gun">>, {git,"https://github.com/ninenines/gun.git", {ref,"3a3e56fb66edaaa1a7093744a0fd8303b993b3c8"}}, @@ -71,7 +71,7 @@ {<<"eradius">>, <<"B02C9EBFE9E9741947BC284FB94716B24EA0C82EFC7223945439822E88E83E24">>}, {<<"fast_yaml">>, <<"A66D0E678341DC20680AECE8E6FD566205A229981B5B3CFA698C66323B728DA2">>}, {<<"gen_batch_server">>, <<"20535E9DBD4DC234E63B3DF79BA65D8A770396B2CAD6B4068A1E37E3AE010900">>}, - {<<"gtplib">>, <<"FEC92685B40D337A21D6DB152B38E5F443862283D4A431EEE2F81EAE19AAF708">>}, + {<<"gtplib">>, <<"47700022BBD2D9221EA3EA9F61FDE1785A2AEC2686C7BD491993424B43147F69">>}, {<<"jesse">>, <<"593B8CAD26AF3CC0E44C727BD8CBDE56E2B0DE4C8D2738B1C258B6936A40A6A3">>}, {<<"jobs">>, <<"B2F0071531C4A48575A096FEC428DCDD4555C64E5086FE521FCEAF581B1F51DC">>}, {<<"jsx">>, <<"20A170ABD4335FC6DB24D5FAD1E5D677C55DADF83D1B20A8A33B5FE159892A39">>}, @@ -100,7 +100,7 @@ {<<"eradius">>, <<"EFB25BFFB6A5E024BFE476C6FFC2026C34AEB7B64E0532EE3DC3AB2C0F1F2C31">>}, {<<"fast_yaml">>, <<"8AA129E3384C5AA9F5F1597A1E3321A63A44860F3951F23EEED950BF0EE59643">>}, {<<"gen_batch_server">>, <<"FF6B0ED0F7BE945F38B94DDD4784D128F35FF029C34DAD6CA0C6CB17AB7BC9C4">>}, - {<<"gtplib">>, <<"CB5A1FF50F8EDBF8D43A06D9F204889C324A4E688F11EEE04FBE4D822F017D60">>}, + {<<"gtplib">>, <<"F55C692050A0CF748BA5E084FAAAE587FCBAE0A6A771A2EFD63555C5F90F7CE6">>}, {<<"jesse">>, <<"3F9475B0C5B242E09592604AABB03328501D7E3D8A528173B5A75396EEDB0060">>}, {<<"jobs">>, <<"4E50CC8EDD7B5A0AE6F4C17B25514470A772626A5F6C24E9BC06A62AEF618237">>}, {<<"jsx">>, <<"37BECA0435F5CA8A2F45F76A46211E76418FBEF80C36F0361C249FC75059DC6D">>},