summaryrefslogtreecommitdiff
path: root/main/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java
diff options
context:
space:
mode:
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.java30
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);
+ }
+ }
}