NetworkUtils.java revision 3957b5fc49335f13b15080b8e7146580026c0479
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; 23a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwaltimport java.util.Collection; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwaltimport android.util.Log; 26585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Native methods for managing network interfaces. 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class NetworkUtils { 33585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 34585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt private static final String TAG = "NetworkUtils"; 35585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 360900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood /** Bring the named network interface up. */ 370900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood public native static int enableInterface(String interfaceName); 380900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Bring the named network interface down. */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static int disableInterface(String interfaceName); 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 428171e6f690cca1bad354e7e352823d79d420daf3Wink Saville /** Setting bit 0 indicates reseting of IPv4 addresses required */ 438171e6f690cca1bad354e7e352823d79d420daf3Wink Saville public static final int RESET_IPV4_ADDRESSES = 0x01; 448171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 458171e6f690cca1bad354e7e352823d79d420daf3Wink Saville /** Setting bit 1 indicates reseting of IPv4 addresses required */ 468171e6f690cca1bad354e7e352823d79d420daf3Wink Saville public static final int RESET_IPV6_ADDRESSES = 0x02; 478171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 488171e6f690cca1bad354e7e352823d79d420daf3Wink Saville /** Reset all addresses */ 498171e6f690cca1bad354e7e352823d79d420daf3Wink Saville public static final int RESET_ALL_ADDRESSES = RESET_IPV4_ADDRESSES | RESET_IPV6_ADDRESSES; 508171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 518171e6f690cca1bad354e7e352823d79d420daf3Wink Saville /** 528171e6f690cca1bad354e7e352823d79d420daf3Wink Saville * Reset IPv6 or IPv4 sockets that are connected via the named interface. 538171e6f690cca1bad354e7e352823d79d420daf3Wink Saville * 548171e6f690cca1bad354e7e352823d79d420daf3Wink Saville * @param interfaceName is the interface to reset 558171e6f690cca1bad354e7e352823d79d420daf3Wink Saville * @param mask {@see #RESET_IPV4_ADDRESSES} and {@see #RESET_IPV6_ADDRESSES} 568171e6f690cca1bad354e7e352823d79d420daf3Wink Saville */ 578171e6f690cca1bad354e7e352823d79d420daf3Wink Saville public native static int resetConnections(String interfaceName, int mask); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Start the DHCP client daemon, in order to have it request addresses 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for the named interface, and then configure the interface with those 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * addresses. This call blocks until it obtains a result (either success 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or failure) from the daemon. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interfaceName the name of the interface to configure 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ipInfo if the request succeeds, this object is filled in with 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the IP address information. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} for success, {@code false} for failure 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 690216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt public native static boolean runDhcp(String interfaceName, DhcpInfoInternal ipInfo); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 72914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff * Initiate renewal on the Dhcp client daemon. This call blocks until it obtains 73914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff * a result (either success or failure) from the daemon. 74914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff * @param interfaceName the name of the interface to configure 75914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff * @param ipInfo if the request succeeds, this object is filled in with 76914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff * the IP address information. 77914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff * @return {@code true} for success, {@code false} for failure 78914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff */ 79914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff public native static boolean runDhcpRenew(String interfaceName, DhcpInfoInternal ipInfo); 80914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff 81914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shut down the DHCP client daemon. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interfaceName the name of the interface for which the daemon 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be stopped 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} for success, {@code false} for failure 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean stopDhcp(String interfaceName); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Release the current DHCP lease. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interfaceName the name of the interface for which the lease should 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be released 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} for success, {@code false} for failure 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean releaseDhcpLease(String interfaceName); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the last DHCP-related error message that was recorded. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/>NOTE: This string is not localized, but currently it is only 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used in logging. 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the most recent error message, if any 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String getDhcpError(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 106585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * Convert a IPv4 address from an integer to an InetAddress. 10707481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson * @param hostAddress an int corresponding to the IPv4 address in network byte order 108585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt */ 109585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt public static InetAddress intToInetAddress(int hostAddress) { 110585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt byte[] addressBytes = { (byte)(0xff & hostAddress), 111585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (byte)(0xff & (hostAddress >> 8)), 112585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (byte)(0xff & (hostAddress >> 16)), 113585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (byte)(0xff & (hostAddress >> 24)) }; 11447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11607481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson return InetAddress.getByAddress(addressBytes); 11707481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson } catch (UnknownHostException e) { 11807481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson throw new AssertionError(); 119585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 120585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 121585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 12296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /** 12396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * Convert a IPv4 address from an InetAddress to an integer 12496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @param inetAddr is an InetAddress corresponding to the IPv4 address 12596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @return the IP address as an integer in network byte order 12696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff */ 12796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff public static int inetAddressToInt(InetAddress inetAddr) 12896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throws IllegalArgumentException { 12996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff byte [] addr = inetAddr.getAddress(); 13096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (addr.length != 4) { 13196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throw new IllegalArgumentException("Not an IPv4 address"); 13296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 13396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) | 13496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff ((addr[1] & 0xff) << 8) | (addr[0] & 0xff); 13596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 13696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 13796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /** 13896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * Convert a network prefix length to an IPv4 netmask integer 13996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @param prefixLength 14096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @return the IPv4 netmask as an integer in network byte order 14196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff */ 14296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff public static int prefixLengthToNetmaskInt(int prefixLength) 14396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throws IllegalArgumentException { 14496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (prefixLength < 0 || prefixLength > 32) { 14596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throw new IllegalArgumentException("Invalid prefix length (0 <= prefix <= 32)"); 14696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 14796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff int value = 0xffffffff << (32 - prefixLength); 14896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff return Integer.reverseBytes(value); 14996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 15096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 1510216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt /** 15259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * Convert a IPv4 netmask integer to a prefix length 15359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * @param netmask as an integer in network byte order 15459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * @return the network prefix length 15559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt */ 15659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt public static int netmaskIntToPrefixLength(int netmask) { 15759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt return Integer.bitCount(netmask); 15859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 15959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 16059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt /** 1610216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * Create an InetAddress from a string where the string must be a standard 1620216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * representation of a V4 or V6 address. Avoids doing a DNS lookup on failure 1630216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * but it will throw an IllegalArgumentException in that case. 1640216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * @param addrString 1650216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * @return the InetAddress 1660216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * @hide 1670216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt */ 1680216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt public static InetAddress numericToInetAddress(String addrString) 1690216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt throws IllegalArgumentException { 170f5bbb5720454742e0e2f6ae489fa164845261cbfElliott Hughes return InetAddress.parseNumericAddress(addrString); 1710216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt } 1720216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 173585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt /** 174f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt * Get InetAddress masked with prefixLength. Will never return null. 175f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt * @param IP address which will be masked with specified prefixLength 176f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt * @param prefixLength the prefixLength used to mask the IP 177f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt */ 178f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt public static InetAddress getNetworkPart(InetAddress address, int prefixLength) { 179f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt if (address == null) { 180f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt throw new RuntimeException("getNetworkPart doesn't accept null address"); 181f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 182f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 183f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt byte[] array = address.getAddress(); 184f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 185f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt if (prefixLength < 0 || prefixLength > array.length * 8) { 186f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt throw new RuntimeException("getNetworkPart - bad prefixLength"); 187f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 188f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 189f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt int offset = prefixLength / 8; 190f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt int reminder = prefixLength % 8; 191f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt byte mask = (byte)(0xFF << (8 - reminder)); 192f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 193f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt if (offset < array.length) array[offset] = (byte)(array[offset] & mask); 194f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 195f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt offset++; 196f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 197f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt for (; offset < array.length; offset++) { 198f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt array[offset] = 0; 199f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 200f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 201f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt InetAddress netPart = null; 202f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt try { 203f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt netPart = InetAddress.getByAddress(array); 204f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } catch (UnknownHostException e) { 205f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt throw new RuntimeException("getNetworkPart error - " + e.toString()); 206f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 207f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt return netPart; 208f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 209f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt 210f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt /** 211f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt * Check if IP address type is consistent between two InetAddress. 212f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt * @return true if both are the same type. False otherwise. 213f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt */ 214f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt public static boolean addressTypeMatches(InetAddress left, InetAddress right) { 215f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt return (((left instanceof Inet4Address) && (right instanceof Inet4Address)) || 216f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt ((left instanceof Inet6Address) && (right instanceof Inet6Address))); 217f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt } 21859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt 21959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt /** 22059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * Convert a 32 char hex string into a Inet6Address. 22159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * throws a runtime exception if the string isn't 32 chars, isn't hex or can't be 22259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * made into an Inet6Address 22359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * @param addrHexString a 32 character hex string representing an IPv6 addr 22459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt * @return addr an InetAddress representation for the string 22559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt */ 22659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt public static InetAddress hexToInet6Address(String addrHexString) 22759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt throws IllegalArgumentException { 22859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt try { 22959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt return numericToInetAddress(String.format("%s:%s:%s:%s:%s:%s:%s:%s", 23059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt addrHexString.substring(0,4), addrHexString.substring(4,8), 23159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt addrHexString.substring(8,12), addrHexString.substring(12,16), 23259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt addrHexString.substring(16,20), addrHexString.substring(20,24), 23359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt addrHexString.substring(24,28), addrHexString.substring(28,32))); 23459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } catch (Exception e) { 23559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt Log.e("NetworkUtils", "error in hexToInet6Address(" + addrHexString + "): " + e); 23659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt throw new IllegalArgumentException(e); 23759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 23859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt } 239a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt 240a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt /** 241a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt * Create a string array of host addresses from a collection of InetAddresses 242a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt * @param addrs a Collection of InetAddresses 243a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt * @return an array of Strings containing their host addresses 244a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt */ 245a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt public static String[] makeStrings(Collection<InetAddress> addrs) { 246a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt String[] result = new String[addrs.size()]; 247a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt int i = 0; 248a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt for (InetAddress addr : addrs) { 249a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt result[i++] = addr.getHostAddress(); 250a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt } 251a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt return result; 252a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt } 253d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt 254d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt /** 255d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt * Trim leading zeros from IPv4 address strings 256d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt * Our base libraries will interpret that as octel.. 257d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt * Must leave non v4 addresses and host names alone. 258d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt * For example, 192.168.000.010 -> 192.168.0.10 259d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt * TODO - fix base libraries and remove this function 260d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt * @param addr a string representing an ip addr 261d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt * @return a string propertly trimmed 262d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt */ 263d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt public static String trimV4AddrZeros(String addr) { 264d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt String[] octets = addr.split("\\."); 265d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt if (octets.length != 4) return addr; 266d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt StringBuilder builder = new StringBuilder(16); 267d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt String result = null; 268d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt for (int i = 0; i < 4; i++) { 269d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt try { 2703957b5fc49335f13b15080b8e7146580026c0479Robert Greenwalt if (octets[i].length() > 3) return addr; 271d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt builder.append(Integer.parseInt(octets[i])); 272d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt } catch (NumberFormatException e) { 273d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt return addr; 274d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt } 275d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt if (i < 3) builder.append('.'); 276d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt } 277d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt result = builder.toString(); 278d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt return result; 279d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 281