NetworkUtils.java revision f5bbb5720454742e0e2f6ae489fa164845261cbf
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 41585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt /** 42585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * Add a route to the routing table. 43585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * 44585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @param interfaceName the interface to route through. 45585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @param dst the network or host to route to. May be IPv4 or IPv6, e.g. 46585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * "0.0.0.0" or "2001:4860::". 47585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @param prefixLength the prefix length of the route. 48585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @param gw the gateway to use, e.g., "192.168.251.1". If null, 49585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * indicates a directly-connected route. 50585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt */ 51585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt public native static int addRoute(String interfaceName, String dst, 52585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt int prefixLength, String gw); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Return the gateway address for the default route for the named interface. */ 5547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt public static InetAddress getDefaultRoute(String interfaceName) { 5647f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt int addr = getDefaultRouteNative(interfaceName); 57585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt return intToInetAddress(addr); 5847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt } 5947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt private native static int getDefaultRouteNative(String interfaceName); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Remove host routes that uses the named interface. */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static int removeHostRoutes(String interfaceName); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Remove the default route for the named interface. */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static int removeDefaultRoute(String interfaceName); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Reset any sockets that are connected via the named interface. */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static int resetConnections(String interfaceName); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Start the DHCP client daemon, in order to have it request addresses 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for the named interface, and then configure the interface with those 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * addresses. This call blocks until it obtains a result (either success 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or failure) from the daemon. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interfaceName the name of the interface to configure 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ipInfo if the request succeeds, this object is filled in with 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the IP address information. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} for success, {@code false} for failure 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 800216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt public native static boolean runDhcp(String interfaceName, DhcpInfoInternal ipInfo); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shut down the DHCP client daemon. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interfaceName the name of the interface for which the daemon 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be stopped 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} for success, {@code false} for failure 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean stopDhcp(String interfaceName); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Release the current DHCP lease. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interfaceName the name of the interface for which the lease should 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be released 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} for success, {@code false} for failure 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean releaseDhcpLease(String interfaceName); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the last DHCP-related error message that was recorded. 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/>NOTE: This string is not localized, but currently it is only 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used in logging. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the most recent error message, if any 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String getDhcpError(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 107585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * Convert a IPv4 address from an integer to an InetAddress. 10807481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson * @param hostAddress an int corresponding to the IPv4 address in network byte order 109585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt */ 110585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt public static InetAddress intToInetAddress(int hostAddress) { 111585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt byte[] addressBytes = { (byte)(0xff & hostAddress), 112585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (byte)(0xff & (hostAddress >> 8)), 113585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (byte)(0xff & (hostAddress >> 16)), 114585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (byte)(0xff & (hostAddress >> 24)) }; 11547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11707481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson return InetAddress.getByAddress(addressBytes); 11807481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson } catch (UnknownHostException e) { 11907481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson throw new AssertionError(); 120585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 121585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 122585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 12396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /** 12496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * Convert a IPv4 address from an InetAddress to an integer 12596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @param inetAddr is an InetAddress corresponding to the IPv4 address 12696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @return the IP address as an integer in network byte order 12796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff */ 12896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff public static int inetAddressToInt(InetAddress inetAddr) 12996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throws IllegalArgumentException { 13096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff byte [] addr = inetAddr.getAddress(); 13196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (addr.length != 4) { 13296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throw new IllegalArgumentException("Not an IPv4 address"); 13396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 13496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) | 13596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff ((addr[1] & 0xff) << 8) | (addr[0] & 0xff); 13696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 13796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 13896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /** 13996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * Convert a network prefix length to an IPv4 netmask integer 14096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @param prefixLength 14196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * @return the IPv4 netmask as an integer in network byte order 14296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff */ 14396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff public static int prefixLengthToNetmaskInt(int prefixLength) 14496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throws IllegalArgumentException { 14596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (prefixLength < 0 || prefixLength > 32) { 14696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff throw new IllegalArgumentException("Invalid prefix length (0 <= prefix <= 32)"); 14796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 14896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff int value = 0xffffffff << (32 - prefixLength); 14996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff return Integer.reverseBytes(value); 15096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 15196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 1520216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt /** 1530216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * Create an InetAddress from a string where the string must be a standard 1540216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * representation of a V4 or V6 address. Avoids doing a DNS lookup on failure 1550216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * but it will throw an IllegalArgumentException in that case. 1560216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * @param addrString 1570216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * @return the InetAddress 1580216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * @hide 1590216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt */ 1600216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt public static InetAddress numericToInetAddress(String addrString) 1610216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt throws IllegalArgumentException { 162f5bbb5720454742e0e2f6ae489fa164845261cbfElliott Hughes return InetAddress.parseNumericAddress(addrString); 1630216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt } 1640216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 165585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt /** 166585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * Add a default route through the specified gateway. 167585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @param interfaceName interface on which the route should be added 168585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @param gw the IP address of the gateway to which the route is desired, 169585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @return {@code true} on success, {@code false} on failure 170585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt */ 171585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt public static boolean addDefaultRoute(String interfaceName, InetAddress gw) { 172585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt String dstStr; 173585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt String gwStr = gw.getHostAddress(); 174585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 175585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt if (gw instanceof Inet4Address) { 176585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt dstStr = "0.0.0.0"; 177585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } else if (gw instanceof Inet6Address) { 178585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt dstStr = "::"; 179585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } else { 180585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt Log.w(TAG, "addDefaultRoute failure: address is neither IPv4 nor IPv6" + 181585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt "(" + gwStr + ")"); 182585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt return false; 183585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 184585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt return addRoute(interfaceName, dstStr, 0, gwStr) == 0; 185585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 186585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 187585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt /** 188585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * Add a host route. 189585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @param interfaceName interface on which the route should be added 190585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @param dst the IP address of the host to which the route is desired, 191585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * this should not be null. 192585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @param gw the IP address of the gateway to which the route is desired, 193585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * if null, indicates a directly-connected route. 194585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt * @return {@code true} on success, {@code false} on failure 195585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt */ 196585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt public static boolean addHostRoute(String interfaceName, InetAddress dst, 197585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt InetAddress gw) { 198585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt if (dst == null) { 199585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt Log.w(TAG, "addHostRoute: dst should not be null"); 200585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt return false; 201585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 202585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 203585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt int prefixLength; 204585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt String dstStr = dst.getHostAddress(); 205585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt String gwStr = (gw != null) ? gw.getHostAddress() : null; 206585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt 207585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt if (dst instanceof Inet4Address) { 208585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt prefixLength = 32; 209585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } else if (dst instanceof Inet6Address) { 210585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt prefixLength = 128; 211585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } else { 212585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt Log.w(TAG, "addHostRoute failure: address is neither IPv4 nor IPv6" + 213585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt "(" + dst + ")"); 214585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt return false; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 216585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt return addRoute(interfaceName, dstStr, prefixLength, gwStr) == 0; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 219