NetworkUtils.java revision 59b1a4ede7032c1b4d897e13dd4ede09b5e14743
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.InetAddress; 20585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwaltimport java.net.Inet4Address; 21585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwaltimport java.net.Inet6Address; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.UnknownHostException; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwaltimport android.util.Log; 25585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Native methods for managing network interfaces. 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class NetworkUtils { 32585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 33585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt private static final String TAG = "NetworkUtils"; 34585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 350900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood /** Bring the named network interface up. */ 360900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood public native static int enableInterface(String interfaceName); 370900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Bring the named network interface down. */ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static int disableInterface(String interfaceName); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Reset any sockets that are connected via the named interface. */ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static int resetConnections(String interfaceName); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Start the DHCP client daemon, in order to have it request addresses 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for the named interface, and then configure the interface with those 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * addresses. This call blocks until it obtains a result (either success 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or failure) from the daemon. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interfaceName the name of the interface to configure 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ipInfo if the request succeeds, this object is filled in with 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the IP address information. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} for success, {@code false} for failure 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 540216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt public native static boolean runDhcp(String interfaceName, DhcpInfoInternal ipInfo); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff * Initiate renewal on the Dhcp client daemon. This call blocks until it obtains 5831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff * a result (either success or failure) from the daemon. 5931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff * @param interfaceName the name of the interface to configure 6031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff * @param ipInfo if the request succeeds, this object is filled in with 6131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff * the IP address information. 6231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff * @return {@code true} for success, {@code false} for failure 6331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff */ 6431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff public native static boolean runDhcpRenew(String interfaceName, DhcpInfoInternal ipInfo); 6531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 6631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff /** 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shut down the DHCP client daemon. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interfaceName the name of the interface for which the daemon 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be stopped 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} for success, {@code false} for failure 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean stopDhcp(String interfaceName); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Release the current DHCP lease. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interfaceName the name of the interface for which the lease should 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be released 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} for success, {@code false} for failure 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean releaseDhcpLease(String interfaceName); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the last DHCP-related error message that was recorded. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/>NOTE: This string is not localized, but currently it is only 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used in logging. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the most recent error message, if any 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String getDhcpError(); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 91585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * Convert a IPv4 address from an integer to an InetAddress. 9207481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson * @param hostAddress an int corresponding to the IPv4 address in network byte order 93585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt */ 94585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt public static InetAddress intToInetAddress(int hostAddress) { 95585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt byte[] addressBytes = { (byte)(0xff & hostAddress), 96585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (byte)(0xff & (hostAddress >> 8)), 97585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (byte)(0xff & (hostAddress >> 16)), 98585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (byte)(0xff & (hostAddress >> 24)) }; 9947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10107481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson return InetAddress.getByAddress(addressBytes); 10207481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson } catch (UnknownHostException e) { 10307481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson throw new AssertionError(); 104585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 105585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 106585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 10796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /** 10896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * Convert a IPv4 address from an InetAddress to an integer 10996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @param inetAddr is an InetAddress corresponding to the IPv4 address 11096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @return the IP address as an integer in network byte order 11196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff */ 11296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff public static int inetAddressToInt(InetAddress inetAddr) 11396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throws IllegalArgumentException { 11496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff byte [] addr = inetAddr.getAddress(); 11596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (addr.length != 4) { 11696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throw new IllegalArgumentException("Not an IPv4 address"); 11796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 11896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) | 11996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff ((addr[1] & 0xff) << 8) | (addr[0] & 0xff); 12096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 12196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 12296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /** 12396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * Convert a network prefix length to an IPv4 netmask integer 12496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @param prefixLength 12596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @return the IPv4 netmask as an integer in network byte order 12696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff */ 12796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff public static int prefixLengthToNetmaskInt(int prefixLength) 12896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throws IllegalArgumentException { 12996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (prefixLength < 0 || prefixLength > 32) { 13096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throw new IllegalArgumentException("Invalid prefix length (0 <= prefix <= 32)"); 13196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 13296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff int value = 0xffffffff << (32 - prefixLength); 13396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff return Integer.reverseBytes(value); 13496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 13596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 1360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt /** 13759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * Convert a IPv4 netmask integer to a prefix length 13859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * @param netmask as an integer in network byte order 13959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * @return the network prefix length 14059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt */ 14159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt public static int netmaskIntToPrefixLength(int netmask) { 14259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt return Integer.bitCount(netmask); 14359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 14459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 14559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt /** 1460216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * Create an InetAddress from a string where the string must be a standard 1470216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * representation of a V4 or V6 address. Avoids doing a DNS lookup on failure 1480216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * but it will throw an IllegalArgumentException in that case. 1490216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * @param addrString 1500216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * @return the InetAddress 1510216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * @hide 1520216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt */ 1530216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt public static InetAddress numericToInetAddress(String addrString) 1540216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt throws IllegalArgumentException { 155f5bbb5720454742e0e2f6ae489fa164845261cbfElliott Hughes return InetAddress.parseNumericAddress(addrString); 1560216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt } 1570216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 158585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt /** 159f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt * Get InetAddress masked with prefixLength. Will never return null. 160f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt * @param IP address which will be masked with specified prefixLength 161f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt * @param prefixLength the prefixLength used to mask the IP 162f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt */ 163f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt public static InetAddress getNetworkPart(InetAddress address, int prefixLength) { 164f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt if (address == null) { 165f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt throw new RuntimeException("getNetworkPart doesn't accept null address"); 166f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 167f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 168f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt byte[] array = address.getAddress(); 169f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 170f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt if (prefixLength < 0 || prefixLength > array.length * 8) { 171f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt throw new RuntimeException("getNetworkPart - bad prefixLength"); 172f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 173f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 174f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt int offset = prefixLength / 8; 175f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt int reminder = prefixLength % 8; 176f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt byte mask = (byte)(0xFF << (8 - reminder)); 177f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 178f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt if (offset < array.length) array[offset] = (byte)(array[offset] & mask); 179f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 180f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt offset++; 181f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 182f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt for (; offset < array.length; offset++) { 183f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt array[offset] = 0; 184f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 185f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 186f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt InetAddress netPart = null; 187f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt try { 188f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt netPart = InetAddress.getByAddress(array); 189f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } catch (UnknownHostException e) { 190f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt throw new RuntimeException("getNetworkPart error - " + e.toString()); 191f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 192f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt return netPart; 193f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 194f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 195f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt /** 196f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt * Check if IP address type is consistent between two InetAddress. 197f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt * @return true if both are the same type. False otherwise. 198f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt */ 199f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt public static boolean addressTypeMatches(InetAddress left, InetAddress right) { 200f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt return (((left instanceof Inet4Address) && (right instanceof Inet4Address)) || 201f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt ((left instanceof Inet6Address) && (right instanceof Inet6Address))); 202f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 20359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 20459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt /** 20559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * Convert a 32 char hex string into a Inet6Address. 20659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * throws a runtime exception if the string isn't 32 chars, isn't hex or can't be 20759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * made into an Inet6Address 20859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * @param addrHexString a 32 character hex string representing an IPv6 addr 20959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * @return addr an InetAddress representation for the string 21059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt */ 21159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt public static InetAddress hexToInet6Address(String addrHexString) 21259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt throws IllegalArgumentException { 21359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt try { 21459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt return numericToInetAddress(String.format("%s:%s:%s:%s:%s:%s:%s:%s", 21559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt addrHexString.substring(0,4), addrHexString.substring(4,8), 21659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt addrHexString.substring(8,12), addrHexString.substring(12,16), 21759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt addrHexString.substring(16,20), addrHexString.substring(20,24), 21859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt addrHexString.substring(24,28), addrHexString.substring(28,32))); 21959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } catch (Exception e) { 22059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt Log.e("NetworkUtils", "error in hexToInet6Address(" + addrHexString + "): " + e); 22159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt throw new IllegalArgumentException(e); 22259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 22359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 225