Add support of Message Class IE

This IE was introduced together with inter-MSC handover implementation.
Message Class IE is mandatory for Inter-MSC GSUP messages and optional for Subscriber Management, SS and SMS messages.
This commit is contained in:
Andrey Velikiy 2019-06-19 14:16:52 +03:00 committed by kluchnikov
parent b39df23758
commit c66c8d0729
2 changed files with 15 additions and 2 deletions

View File

@ -83,7 +83,8 @@
sm_rp_mms => integer(),
sm_alert_reason => integer(),
imei => binary(),
imei_check_result => integer()
imei_check_result => integer(),
message_class => integer()
}.
-define(SESSION_STATE_BEGIN, 1).
@ -99,6 +100,7 @@
-define(FREEZE_P_TMSI, 16#07).
-define(MSISDN, 16#08).
-define(HLR_NUMBER, 16#09).
-define(MESSAGE_CLASS, 16#0a).
-define(PDP_CONTEXT_ID, 16#10).
-define(PDP_TYPE, 16#11).
-define(ACCESS_POINT_NAME, 16#12).
@ -128,6 +130,8 @@
-define(MANDATORY_DEFAULT, [imsi, message_type]).
-define(OPTIONAL_DEFAULT, [message_class]).
-define (GSUP_MESSAGES(), #{
16#04 => #{message_type => location_upd_req, mandatory => [], optional => [cn_domain]},
16#05 => #{message_type => location_upd_err, mandatory => [cause]},

View File

@ -82,6 +82,10 @@ decode_ie(<<?HLR_NUMBER, Len, HLRNumber:Len/binary, Tail/binary>>, Map) ->
?CHECK_LEN(hlr_number, Len, 0, 8),
decode_ie(Tail, Map#{hlr_number => HLRNumber});
decode_ie(<<?MESSAGE_CLASS, Len, MessageClass:Len/unit:8, Tail/binary>>, Map) ->
?CHECK_LEN(message_class, Len, 1, 1),
decode_ie(Tail, Map#{message_class => MessageClass});
decode_ie(<<?PDP_CONTEXT_ID, Len, PDPContextId:Len/unit:8, Tail/binary>>, Map) ->
?CHECK_LEN(pdp_context_id, Len, 1, 1),
List = maps:get(pdp_context_id, Map, []),
@ -248,7 +252,7 @@ encode(MsgType, GSUPMessage) when is_integer(MsgType), is_map(GSUPMessage), MsgT
case ?GSUP_MESSAGES() of
#{MsgType := #{message_type := MsgTypeAtom, mandatory := Mandatory0} = Map} ->
Mandatory = Mandatory0 ++ ?MANDATORY_DEFAULT,
Possible = Mandatory ++ maps:get(optional, Map, []),
Possible = Mandatory ++ maps:get(optional, Map, []) ++ ?OPTIONAL_DEFAULT,
case {maps:size(maps:with(Mandatory, GSUPMessage)) == length(Mandatory),
maps:size(maps:without(Possible, GSUPMessage)) == 0} of
{true, true} ->
@ -321,6 +325,11 @@ encode_ie(#{hlr_number := Value} = GSUPMessage, Head) ->
?CHECK_LEN(hlr_number, Len, 0, 8),
encode_ie(maps:without([hlr_number], GSUPMessage), <<Head/binary, ?HLR_NUMBER, Len, Value/binary>>);
encode_ie(#{message_class := Value} = GSUPMessage, Head) ->
Len = 1,
?CHECK_SIZE(message_class, Len, Value),
encode_ie(maps:without([message_class], GSUPMessage), <<Head/binary, ?MESSAGE_CLASS, Len, Value:Len/unit:8>>);
encode_ie(#{pdp_context_id := PDPCIdList0} = GSUPMessage, Head) ->
Len = 1,
PDPCIdList = <<