diff --git a/include/gsup_protocol.hrl b/include/gsup_protocol.hrl index 3c867d6..a1e6cf9 100644 --- a/include/gsup_protocol.hrl +++ b/include/gsup_protocol.hrl @@ -107,6 +107,7 @@ sm_alert_reason => integer(), imei => binary(), imei_check_result => integer(), + num_vectors_req => integer(), message_class => integer(), source_name => binary(), destination_name => binary(), @@ -158,6 +159,7 @@ -define(SM_ALERT_REASON, 16#46). -define(IMEI, 16#50). -define(IMEI_CHECK_RESULT, 16#51). +-define(NUM_VECTORS_REQ, 16#52). -define(SOURCE_NAME, 16#60). -define(DESTINATION_NAME, 16#61). -define(AN_APDU, 16#62). @@ -173,7 +175,7 @@ 16#04 => #{message_type => location_upd_req, mandatory => [], optional => [cn_domain]}, 16#05 => #{message_type => location_upd_err, mandatory => [cause]}, 16#06 => #{message_type => location_upd_res, mandatory => [], optional => [msisdn, hlr_number, pdp_info_complete, pdp_info_list, pdp_charging]}, - 16#08 => #{message_type => send_auth_info_req, mandatory => [], optional => [cn_domain, auts, rand, supported_rat_types, current_rat_type]}, + 16#08 => #{message_type => send_auth_info_req, mandatory => [], optional => [cn_domain, auts, rand, supported_rat_types, current_rat_type, num_vectors_req]}, 16#09 => #{message_type => send_auth_info_err, mandatory => [cause]}, 16#0a => #{message_type => send_auth_info_res, mandatory => [], optional => [auth_tuples, auts, rand]}, 16#0b => #{message_type => auth_failure_report, mandatory => [], optional => [cn_domain]}, diff --git a/src/gsup_protocol.erl b/src/gsup_protocol.erl index 30d5574..5dd4bda 100644 --- a/src/gsup_protocol.erl +++ b/src/gsup_protocol.erl @@ -159,6 +159,10 @@ decode_ie(<>, Map) ?CHECK_LEN(imei_check_result, Len, 1, 1), decode_ie(Tail, Map#{imei_check_result => IMEIResult}); +decode_ie(<>, Map) -> + ?CHECK_LEN(num_vectors_req, Len, 1, 1), + decode_ie(Tail, Map#{num_vectors_req => NumVectorsRequest}); + decode_ie(<>, Map) -> decode_ie(Tail, Map#{source_name => SourceName}); @@ -467,6 +471,11 @@ encode_ie(#{imei_check_result := Value} = GSUPMessage, Head) -> ?CHECK_SIZE(imei_check_result, Len, Value), encode_ie(maps:without([imei_check_result], GSUPMessage), <>); +encode_ie(#{num_vectors_req := Value} = GSUPMessage, Head) -> + Len = 1, + ?CHECK_SIZE(num_vectors_req, Len, Value), + encode_ie(maps:without([num_vectors_req], GSUPMessage), <>); + encode_ie(#{source_name := Value} = GSUPMessage, Head) -> Len = size(Value), encode_ie(maps:without([source_name], GSUPMessage), <>); diff --git a/test/gsup_encode_decode_test.erl b/test/gsup_encode_decode_test.erl index 65863c7..85b40b2 100644 --- a/test/gsup_encode_decode_test.erl +++ b/test/gsup_encode_decode_test.erl @@ -44,6 +44,15 @@ sai_req_test() -> ?assertEqual(Map, gsup_protocol:decode(Bin)), ?assertEqual(Bin, gsup_protocol:encode(Map)). +sai_req_num_test() -> + Bin = <<16#08, ?TEST_IMSI_IE, ?TEST_CLASS_SUBSCR_IE, 16#52, 16#01, 16#02>>, + Map = #{imsi => <<"123456789012345">>, + message_class => 1, + message_type => send_auth_info_req, + num_vectors_req => 2}, + ?assertEqual(Map, gsup_protocol:decode(Bin)), + ?assertEqual(Bin, gsup_protocol:encode(Map)). + sai_req_eps_test() -> Bin = <<16#08, ?TEST_IMSI_IE, ?TEST_CLASS_SUBSCR_IE, ?TEST_SUPP_RAT_TYPES_IE, ?TEST_CURR_RAT_TYPE_LTE_IE>>, Map = #{imsi => <<"123456789012345">>, message_class => 1, message_type => send_auth_info_req,