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>(a)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 <callumfarrbennett(a)yahoo.com>