diff options
Diffstat (limited to 'main/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java')
-rw-r--r-- | main/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/main/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java b/main/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java index 5876ead5..9c8cf363 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java +++ b/main/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java @@ -5,11 +5,17 @@ package de.blinkt.openvpn.core; -import android.os.Build; +import android.net.IpPrefix; + import androidx.annotation.NonNull; +import java.lang.reflect.Array; import java.math.BigInteger; +import java.net.Inet4Address; import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; import java.util.Collection; import java.util.Locale; import java.util.PriorityQueue; @@ -203,6 +209,28 @@ public class NetworkSpace { return a && b; } + + public IpPrefix getPrefix() throws UnknownHostException { + if (isV4){ + /* add 0x01 00 00 00 00, so that all representations are 5 byte otherwise + /* numbers that are above 0x7fffffff get a leading 0x00 byte to not be negative + and small number 1-3 bytes*/ + byte[] ipBytes = netAddress.add(BigInteger.valueOf(0x0100000000L)).toByteArray(); + ipBytes = Arrays.copyOfRange(ipBytes, 1, 5); + + InetAddress inet4addr = Inet4Address.getByAddress(ipBytes); + return new IpPrefix(inet4addr, networkMask); + } + else + { + /* same dance for IPv6 */ + byte[] ipBytes = netAddress.add(BigInteger.ONE.shiftLeft(128)).toByteArray(); + ipBytes = Arrays.copyOfRange(ipBytes, 1, 17); + + InetAddress inet6addr = Inet6Address.getByAddress(ipBytes); + return new IpPrefix(inet6addr, networkMask); + } + } } |