Decode/Encode Apn as string

Change-Id: I1206e31272f03853aa8447fb263fff7757282b83
This commit is contained in:
Pau Espin 2024-01-22 17:41:30 +01:00
parent 058a99393e
commit 1a064fa6ae
4 changed files with 58 additions and 7 deletions

View File

@ -81,7 +81,7 @@
-type 'GSUPPdpInfo'() :: #{
pdp_context_id => integer(),
pdp_address => 'GSUPPdpAddress'(),
access_point_name => binary(),
access_point_name => string(),
quality_of_service => binary(),
pdp_charging => integer()
}.

51
src/apn_encdec.erl Normal file
View File

@ -0,0 +1,51 @@
-module(apn_encdec).
% decode APN Name Encoded Format
% TS 23.003 APN
-export([decode_apn/1, encode_apn/1]).
decode_apn(ApnEnc) ->
decode_apn("", ApnEnc, 0).
decode_apn(Result, [], 0) ->
Result;
decode_apn(Result, << >>, 0) ->
Result;
decode_apn("", ApnEnc, 0) ->
<< NewElemLen:8, RemainEnc/bytes >> = ApnEnc,
case NewElemLen of
0 -> "";
_ -> decode_apn("", RemainEnc, NewElemLen)
end;
decode_apn(Result, ApnEnc, 0) ->
<< NewElemLen:8, RemainEnc/bytes >> = ApnEnc,
case NewElemLen of
0 -> Result;
_ -> decode_apn(Result ++ ".", RemainEnc, NewElemLen)
end;
decode_apn(Result, ApnEnc, RemainLen) when RemainLen > 0 ->
<< Char:8, RemainEnc/bytes >> = ApnEnc,
decode_apn(Result ++ [Char], RemainEnc, RemainLen - 1).
encode_apn(ApnStr) ->
encode_apn(<<>>, ApnStr, "", 0).
encode_apn(ApnEnc, "", "", 0) ->
ApnEnc;
encode_apn(ApnEnc, "", CurStr, Len) ->
CurBin = binary:list_to_bin(CurStr),
Result = << ApnEnc/binary, Len, CurBin/binary >>,
Result;
encode_apn(ApnEnc, [ Char | RemainStr ], CurStr, Len) ->
case Char of
46 -> CurBin = binary:list_to_bin(CurStr),
encode_apn(<<ApnEnc/binary, Len, CurBin/binary >>, RemainStr, "", 0);
_ -> encode_apn(ApnEnc, RemainStr, CurStr ++ [Char], Len + 1)
end.

View File

@ -267,7 +267,7 @@ decode_pdp_info(<<?PDP_ADDRESS, Len, PDPAddress:Len/binary, Tail/binary>>, Map)
decode_pdp_info(<<?ACCESS_POINT_NAME, Len, APN:Len/binary, Tail/binary>>, Map) ->
?CHECK_LEN(access_point_name, Len, 1, 100),
decode_pdp_info(Tail, Map#{access_point_name => APN});
decode_pdp_info(Tail, Map#{access_point_name => apn_encdec:decode_apn(APN)});
decode_pdp_info(<<?QUALITY_OF_SERVICE, Len, QOS:Len/binary, Tail/binary>>, Map) ->
?CHECK_LEN(quality_of_service, Len, 1, 20),
@ -620,9 +620,10 @@ encode_pdp_info(#{pdp_address := Value} = Map, Head) ->
encode_pdp_info(maps:without([pdp_address], Map), <<Head/binary, ?PDP_ADDRESS, Len, PDPTypeOrg, PDPTypeNr, Addr/binary>>);
encode_pdp_info(#{access_point_name := Value} = Map, Head) ->
Len = size(Value),
ApnBin = apn_encdec:encode_apn(Value),
Len = size(ApnBin),
?CHECK_LEN(access_point_name, Len, 1, 100),
encode_pdp_info(maps:without([access_point_name], Map), <<Head/binary, ?ACCESS_POINT_NAME, Len, Value/binary>>);
encode_pdp_info(maps:without([access_point_name], Map), <<Head/binary, ?ACCESS_POINT_NAME, Len, ApnBin/binary>>);
encode_pdp_info(#{quality_of_service := Value} = Map, Head) ->
Len = size(Value),

View File

@ -217,14 +217,13 @@ lu_res_test() ->
msisdn => <<145,148,97,70,50,36,67>>,
pdp_charging => 44799,pdp_info_complete => true,
pdp_info_list =>
[#{access_point_name =>
<<4,116,101,115,116,3,97,112,110>>,
[#{access_point_name => "test.apn",
pdp_charging => 65315,pdp_context_id => 1,
pdp_address => #{address => #{},
pdp_type_org => 241,
pdp_type_nr => 33},
quality_of_service => <<2>>},
#{access_point_name => <<3,102,111,111,3,97,112,110>>,
#{access_point_name => "foo.apn",
pdp_context_id => 2,
pdp_address => #{address => #{},
pdp_type_org => 241,