Loading packages/Connectivity/framework/src/android/net/IpPrefix.java +1 −1 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ public final class IpPrefix implements Parcelable { // first statement in constructor". We could factor out setting the member variables to an // init() method, but if we did, then we'd have to make the members non-final, or "error: // cannot assign a value to final variable address". So we just duplicate the code here. Pair<InetAddress, Integer> ipAndMask = NetworkUtils.parseIpAndMask(prefix); Pair<InetAddress, Integer> ipAndMask = NetworkUtils.legacyParseIpAndMask(prefix); this.address = ipAndMask.first.getAddress(); this.prefixLength = ipAndMask.second; checkAndMaskAddressAndPrefixLength(); Loading packages/Connectivity/framework/src/android/net/LinkAddress.java +1 −1 Original line number Diff line number Diff line Loading @@ -325,7 +325,7 @@ public class LinkAddress implements Parcelable { public LinkAddress(@NonNull String address, int flags, int scope) { // This may throw an IllegalArgumentException; catching it is the caller's responsibility. // TODO: consider rejecting mapped IPv4 addresses such as "::ffff:192.0.2.5/24". Pair<InetAddress, Integer> ipAndMask = NetworkUtils.parseIpAndMask(address); Pair<InetAddress, Integer> ipAndMask = NetworkUtils.legacyParseIpAndMask(address); init(ipAndMask.first, ipAndMask.second, flags, scope, LIFETIME_UNKNOWN, LIFETIME_UNKNOWN); } Loading packages/Connectivity/framework/src/android/net/NetworkUtils.java +45 −2 Original line number Diff line number Diff line Loading @@ -27,8 +27,10 @@ import com.android.net.module.util.Inet4AddressUtils; import java.io.FileDescriptor; import java.math.BigInteger; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Locale; import java.util.TreeSet; Loading Loading @@ -212,7 +214,7 @@ public class NetworkUtils { @Deprecated public static InetAddress numericToInetAddress(String addrString) throws IllegalArgumentException { return InetAddress.parseNumericAddress(addrString); return InetAddresses.parseNumericAddress(addrString); } /** Loading @@ -234,7 +236,7 @@ public class NetworkUtils { try { String[] pieces = ipAndMaskString.split("/", 2); prefixLength = Integer.parseInt(pieces[1]); address = InetAddress.parseNumericAddress(pieces[0]); address = InetAddresses.parseNumericAddress(pieces[0]); } catch (NullPointerException e) { // Null string. } catch (ArrayIndexOutOfBoundsException e) { // No prefix length. } catch (NumberFormatException e) { // Non-numeric prefix. Loading @@ -248,6 +250,47 @@ public class NetworkUtils { return new Pair<InetAddress, Integer>(address, prefixLength); } /** * Utility method to parse strings such as "192.0.2.5/24" or "2001:db8::cafe:d00d/64". * @hide * * @deprecated This method is used only for IpPrefix and LinkAddress. Since Android S, use * {@link #parseIpAndMask(String)}, if possible. */ @Deprecated public static Pair<InetAddress, Integer> legacyParseIpAndMask(String ipAndMaskString) { InetAddress address = null; int prefixLength = -1; try { String[] pieces = ipAndMaskString.split("/", 2); prefixLength = Integer.parseInt(pieces[1]); if (pieces[0] == null || pieces[0].isEmpty()) { final byte[] bytes = new byte[16]; bytes[15] = 1; return new Pair<InetAddress, Integer>(Inet6Address.getByAddress( "ip6-localhost"/* host */, bytes, 0 /* scope_id */), prefixLength); } if (pieces[0].startsWith("[") && pieces[0].endsWith("]") && pieces[0].indexOf(':') != -1) { pieces[0] = pieces[0].substring(1, pieces[0].length() - 1); } address = InetAddresses.parseNumericAddress(pieces[0]); } catch (NullPointerException e) { // Null string. } catch (ArrayIndexOutOfBoundsException e) { // No prefix length. } catch (NumberFormatException e) { // Non-numeric prefix. } catch (IllegalArgumentException e) { // Invalid IP address. } catch (UnknownHostException e) { // IP address length is illegal } if (address == null || prefixLength == -1) { throw new IllegalArgumentException("Invalid IP address and mask " + ipAndMaskString); } return new Pair<InetAddress, Integer>(address, prefixLength); } /** * Convert a 32 char hex string into a Inet6Address. * throws a runtime exception if the string isn't 32 chars, isn't hex or can't be Loading tests/net/common/java/android/net/IpPrefixTest.java +9 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,15 @@ public class IpPrefixTest { p = new IpPrefix("f00:::/32"); fail("Expected IllegalArgumentException: invalid IPv6 address"); } catch (IllegalArgumentException expected) { } p = new IpPrefix("/64"); assertEquals("::/64", p.toString()); p = new IpPrefix("/128"); assertEquals("::1/128", p.toString()); p = new IpPrefix("[2001:db8::123]/64"); assertEquals("2001:db8::/64", p.toString()); } @Test Loading tests/net/common/java/android/net/LinkAddressTest.java +15 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.InterfaceAddress; import java.net.NetworkInterface; Loading Loading @@ -117,6 +118,20 @@ public class LinkAddressTest { assertEquals(456, address.getScope()); assertTrue(address.isIpv4()); address = new LinkAddress("/64", 1 /* flags */, 2 /* scope */); assertEquals(Inet6Address.LOOPBACK, address.getAddress()); assertEquals(64, address.getPrefixLength()); assertEquals(1, address.getFlags()); assertEquals(2, address.getScope()); assertTrue(address.isIpv6()); address = new LinkAddress("[2001:db8::123]/64", 3 /* flags */, 4 /* scope */); assertEquals(InetAddresses.parseNumericAddress("2001:db8::123"), address.getAddress()); assertEquals(64, address.getPrefixLength()); assertEquals(3, address.getFlags()); assertEquals(4, address.getScope()); assertTrue(address.isIpv6()); // InterfaceAddress doesn't have a constructor. Fetch some from an interface. List<InterfaceAddress> addrs = NetworkInterface.getByName("lo").getInterfaceAddresses(); Loading Loading
packages/Connectivity/framework/src/android/net/IpPrefix.java +1 −1 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ public final class IpPrefix implements Parcelable { // first statement in constructor". We could factor out setting the member variables to an // init() method, but if we did, then we'd have to make the members non-final, or "error: // cannot assign a value to final variable address". So we just duplicate the code here. Pair<InetAddress, Integer> ipAndMask = NetworkUtils.parseIpAndMask(prefix); Pair<InetAddress, Integer> ipAndMask = NetworkUtils.legacyParseIpAndMask(prefix); this.address = ipAndMask.first.getAddress(); this.prefixLength = ipAndMask.second; checkAndMaskAddressAndPrefixLength(); Loading
packages/Connectivity/framework/src/android/net/LinkAddress.java +1 −1 Original line number Diff line number Diff line Loading @@ -325,7 +325,7 @@ public class LinkAddress implements Parcelable { public LinkAddress(@NonNull String address, int flags, int scope) { // This may throw an IllegalArgumentException; catching it is the caller's responsibility. // TODO: consider rejecting mapped IPv4 addresses such as "::ffff:192.0.2.5/24". Pair<InetAddress, Integer> ipAndMask = NetworkUtils.parseIpAndMask(address); Pair<InetAddress, Integer> ipAndMask = NetworkUtils.legacyParseIpAndMask(address); init(ipAndMask.first, ipAndMask.second, flags, scope, LIFETIME_UNKNOWN, LIFETIME_UNKNOWN); } Loading
packages/Connectivity/framework/src/android/net/NetworkUtils.java +45 −2 Original line number Diff line number Diff line Loading @@ -27,8 +27,10 @@ import com.android.net.module.util.Inet4AddressUtils; import java.io.FileDescriptor; import java.math.BigInteger; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Locale; import java.util.TreeSet; Loading Loading @@ -212,7 +214,7 @@ public class NetworkUtils { @Deprecated public static InetAddress numericToInetAddress(String addrString) throws IllegalArgumentException { return InetAddress.parseNumericAddress(addrString); return InetAddresses.parseNumericAddress(addrString); } /** Loading @@ -234,7 +236,7 @@ public class NetworkUtils { try { String[] pieces = ipAndMaskString.split("/", 2); prefixLength = Integer.parseInt(pieces[1]); address = InetAddress.parseNumericAddress(pieces[0]); address = InetAddresses.parseNumericAddress(pieces[0]); } catch (NullPointerException e) { // Null string. } catch (ArrayIndexOutOfBoundsException e) { // No prefix length. } catch (NumberFormatException e) { // Non-numeric prefix. Loading @@ -248,6 +250,47 @@ public class NetworkUtils { return new Pair<InetAddress, Integer>(address, prefixLength); } /** * Utility method to parse strings such as "192.0.2.5/24" or "2001:db8::cafe:d00d/64". * @hide * * @deprecated This method is used only for IpPrefix and LinkAddress. Since Android S, use * {@link #parseIpAndMask(String)}, if possible. */ @Deprecated public static Pair<InetAddress, Integer> legacyParseIpAndMask(String ipAndMaskString) { InetAddress address = null; int prefixLength = -1; try { String[] pieces = ipAndMaskString.split("/", 2); prefixLength = Integer.parseInt(pieces[1]); if (pieces[0] == null || pieces[0].isEmpty()) { final byte[] bytes = new byte[16]; bytes[15] = 1; return new Pair<InetAddress, Integer>(Inet6Address.getByAddress( "ip6-localhost"/* host */, bytes, 0 /* scope_id */), prefixLength); } if (pieces[0].startsWith("[") && pieces[0].endsWith("]") && pieces[0].indexOf(':') != -1) { pieces[0] = pieces[0].substring(1, pieces[0].length() - 1); } address = InetAddresses.parseNumericAddress(pieces[0]); } catch (NullPointerException e) { // Null string. } catch (ArrayIndexOutOfBoundsException e) { // No prefix length. } catch (NumberFormatException e) { // Non-numeric prefix. } catch (IllegalArgumentException e) { // Invalid IP address. } catch (UnknownHostException e) { // IP address length is illegal } if (address == null || prefixLength == -1) { throw new IllegalArgumentException("Invalid IP address and mask " + ipAndMaskString); } return new Pair<InetAddress, Integer>(address, prefixLength); } /** * Convert a 32 char hex string into a Inet6Address. * throws a runtime exception if the string isn't 32 chars, isn't hex or can't be Loading
tests/net/common/java/android/net/IpPrefixTest.java +9 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,15 @@ public class IpPrefixTest { p = new IpPrefix("f00:::/32"); fail("Expected IllegalArgumentException: invalid IPv6 address"); } catch (IllegalArgumentException expected) { } p = new IpPrefix("/64"); assertEquals("::/64", p.toString()); p = new IpPrefix("/128"); assertEquals("::1/128", p.toString()); p = new IpPrefix("[2001:db8::123]/64"); assertEquals("2001:db8::/64", p.toString()); } @Test Loading
tests/net/common/java/android/net/LinkAddressTest.java +15 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.InterfaceAddress; import java.net.NetworkInterface; Loading Loading @@ -117,6 +118,20 @@ public class LinkAddressTest { assertEquals(456, address.getScope()); assertTrue(address.isIpv4()); address = new LinkAddress("/64", 1 /* flags */, 2 /* scope */); assertEquals(Inet6Address.LOOPBACK, address.getAddress()); assertEquals(64, address.getPrefixLength()); assertEquals(1, address.getFlags()); assertEquals(2, address.getScope()); assertTrue(address.isIpv6()); address = new LinkAddress("[2001:db8::123]/64", 3 /* flags */, 4 /* scope */); assertEquals(InetAddresses.parseNumericAddress("2001:db8::123"), address.getAddress()); assertEquals(64, address.getPrefixLength()); assertEquals(3, address.getFlags()); assertEquals(4, address.getScope()); assertTrue(address.isIpv6()); // InterfaceAddress doesn't have a constructor. Fetch some from an interface. List<InterfaceAddress> addrs = NetworkInterface.getByName("lo").getInterfaceAddresses(); Loading