clufn has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/40255?usp=email )
Change subject: Add required conversions for IPv6 support ...................................................................... Add required conversions for IPv6 support Change-Id: I2426e0dcee3ca92075b845f6b21a175a3d047c08 --- M src/conv.erl 1 file changed, 45 insertions(+), 17 deletions(-) git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg refs/changes/55/40255/1 diff --git a/src/conv.erl b/src/conv.erl index d45c41d..0be6877 100644 --- a/src/conv.erl +++ b/src/conv.erl @@ -39,10 +39,14 @@ -include_lib("conv.hrl"). -export([ip_to_bin/1, bin_to_ip/1]). +-export([remove_prefix/1]). +-export([add_prefix/1]). +-export([get_6_from_bin/1]). -export([cause_gtp2gsup/1]). -export([dia_rc_success/1, dia_rc_to_gsup_cause/1]). -export([gtp2_paa_to_epdg_eua/1, epdg_eua_to_gsup_pdp_address/1]). -export([nai_to_imsi/1]). +-export([get_v4v6/2]). % ergw_aaa/src/ergw_aaa_3gpp_dict.erl % under GPLv2+ @@ -62,6 +66,23 @@ bin_to_ip({_, _, _, _, _, _, _, _} = IP) -> IP. +remove_prefix(<<A:8, Rest/binary>>) when is_binary(Rest) -> + Rest. + +add_prefix(<<A:8, B:8, C:8, D:8, E:8, F:8, G:8, H:8, I:8, J:8, K:8, L:8, M:8, N:8, O:8, P:8>>) -> + <<8, A:8, B:8, C:8, D:8, E:8, F:8, G:8, H:8, I:8, J:8, K:8, L:8, M:8, N:8, O:8, P:8>>. + +get_6_from_bin(<<A:8, B:8, C:8, D:8, E:8, F:8, G:8, H:8, I:8, J:8, K:8, L:8, M:8, N:8, O:8, P:8>>) -> + {A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P}. + +get_v4v6(<<A:8, B:8, C:8, D:8, E:8, F:8, G:8, H:8, I:8, J:8, K:8, L:8, M:8, N:8, O:8, P:8>> , <<Q:8, R:8, S:8, T:8>>) -> + <<8, A:8, B:8, C:8, D:8, E:8, F:8, G:8, H:8, I:8, J:8, K:8, L:8, M:8, N:8, O:8, P:8, Q:8, R:8, S:8, T:8>>. + +get_4_from_v4v6(<<A:136, Rest/binary>>) when is_binary(Rest) -> + Rest. +get_6_from_v4v6(<<A:8, B:8, C:8, D:8, E:8, F:8, G:8, H:8, I:8, J:8, K:8, L:8, M:8, N:8, O:8, P:8, Q:8, Rest/binary>>) -> + <<B:8, C:8, D:8, E:8, F:8, G:8, H:8, I:8, J:8, K:8, L:8, M:8, N:8, O:8, P:8, Q:8>>. + -spec cause_gtp2gsup(integer()) -> integer(). cause_gtp2gsup(?GTP2_CAUSE_REQUEST_ACCEPTED) -> 0; @@ -79,18 +100,18 @@ -define(DIA_VENDOR_3GPP, 10415). % transient (only in Experimental-Result-Code) --define(DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE, 4181). --define(DIAMETER_ERROR_CAMEL_SUBSCRIPTION_PRESENT, 4182). +-define(DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE, 4181). +-define(DIAMETER_ERROR_CAMEL_SUBSCRIPTION_PRESENT, 4182). % permanent (only in Experimental-Result-Code) --define(DIAMETER_ERROR_USER_UNKNOWN, 5001). --define(DIAMETER_AUTHORIZATION_REJECTED, 5003). --define(DIAMETER_ERROR_ROAMING_NOT_ALLOWED, 5004). --define(DIAMETER_MISSING_AVP, 5005). --define(DIAMETER_UNABLE_TO_COMPLY, 5012). --define(DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION, 5420). --define(DIAMETER_ERROR_RAT_NOT_ALLOWED, 5421). --define(DIAMETER_ERROR_EQUIPMENT_UNKNOWN, 5422). --define(DIAMETER_ERROR_UNKOWN_SERVING_NODE, 5423). +-define(DIAMETER_ERROR_USER_UNKNOWN, 5001). +-define(DIAMETER_AUTHORIZATION_REJECTED, 5003). +-define(DIAMETER_ERROR_ROAMING_NOT_ALLOWED, 5004). +-define(DIAMETER_MISSING_AVP, 5005). +-define(DIAMETER_UNABLE_TO_COMPLY, 5012). +-define(DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION, 5420). +-define(DIAMETER_ERROR_RAT_NOT_ALLOWED, 5421). +-define(DIAMETER_ERROR_EQUIPMENT_UNKNOWN, 5422). +-define(DIAMETER_ERROR_UNKOWN_SERVING_NODE, 5423). dia_rc_success(#epdg_dia_rc{result_code = 2001}) -> ok; dia_rc_success(#epdg_dia_rc{result_code = 2002}) -> ok; @@ -112,19 +133,26 @@ ipv4 = Addr}; gtp2_paa_to_epdg_eua(#v2_pdn_address_allocation{type = ipv6, address = Addr}) -> #epdg_eua{type_nr = ?GTP_PDP_ADDR_TYPE_NR_IPv6, - ipv6 = Addr}. -%TODO: IPv4v6 + ipv6 = remove_prefix(Addr)}; +gtp2_paa_to_epdg_eua(#v2_pdn_address_allocation{type = ipv4v6, address = Addr}) -> + #epdg_eua{type_nr = ?GTP_PDP_ADDR_TYPE_NR_IPv4v6, + ipv4 = get_4_from_v4v6(Addr), + ipv6 = get_6_from_v4v6(Addr)}. epdg_eua_to_gsup_pdp_address(#epdg_eua{type_nr = ?GTP_PDP_ADDR_TYPE_NR_IPv4, ipv4 = Addr}) -> #{pdp_type_org => 1, - pdp_type_nr => ?GTP_PDP_ADDR_TYPE_NR_IPv4, - address => #{ ipv4 => Addr}}; + pdp_type_nr => ?GTP_PDP_ADDR_TYPE_NR_IPv4, + address => #{ ipv4 => Addr}}; epdg_eua_to_gsup_pdp_address(#epdg_eua{type_nr = ?GTP_PDP_ADDR_TYPE_NR_IPv6, ipv6 = Addr}) -> #{pdp_type_org => 1, pdp_type_nr => ?GTP_PDP_ADDR_TYPE_NR_IPv6, - address => #{ ipv6 => Addr}}. -%TODO: IPv4v6 + address => #{ ipv6 => Addr}}; + +epdg_eua_to_gsup_pdp_address(#epdg_eua{type_nr = ?GTP_PDP_ADDR_TYPE_NR_IPv4v6, ipv4 = Addr4, ipv6 = Addr6}) -> +#{pdp_type_org => 1, + pdp_type_nr => ?GTP_PDP_ADDR_TYPE_NR_IPv4v6, + address => #{ ipv4 => Addr, ipv6 => Addr6}}. % 3GPP TS 23.003 clause 19 % Input: "<IMSI>@nai.epc.mnc<MNC>.mcc<MCC>.3gppnetwork.org" -- To view, visit https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/40255?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: erlang/osmo-epdg Gerrit-Branch: master Gerrit-Change-Id: I2426e0dcee3ca92075b845f6b21a175a3d047c08 Gerrit-Change-Number: 40255 Gerrit-PatchSet: 1 Gerrit-Owner: clufn <callumfarrbenn...@yahoo.com>