NetworkUtils.java revision 07481ccd1dcc2912797ec64f0bfa5641b39adcea
1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.net; 18 19import java.net.InetAddress; 20import java.net.Inet4Address; 21import java.net.Inet6Address; 22import java.net.UnknownHostException; 23 24import android.util.Log; 25 26/** 27 * Native methods for managing network interfaces. 28 * 29 * {@hide} 30 */ 31public class NetworkUtils { 32 33 private static final String TAG = "NetworkUtils"; 34 35 /** Bring the named network interface up. */ 36 public native static int enableInterface(String interfaceName); 37 38 /** Bring the named network interface down. */ 39 public native static int disableInterface(String interfaceName); 40 41 /** 42 * Add a route to the routing table. 43 * 44 * @param interfaceName the interface to route through. 45 * @param dst the network or host to route to. May be IPv4 or IPv6, e.g. 46 * "0.0.0.0" or "2001:4860::". 47 * @param prefixLength the prefix length of the route. 48 * @param gw the gateway to use, e.g., "192.168.251.1". If null, 49 * indicates a directly-connected route. 50 */ 51 public native static int addRoute(String interfaceName, String dst, 52 int prefixLength, String gw); 53 54 /** Return the gateway address for the default route for the named interface. */ 55 public static InetAddress getDefaultRoute(String interfaceName) { 56 int addr = getDefaultRouteNative(interfaceName); 57 return intToInetAddress(addr); 58 } 59 private native static int getDefaultRouteNative(String interfaceName); 60 61 /** Remove host routes that uses the named interface. */ 62 public native static int removeHostRoutes(String interfaceName); 63 64 /** Remove the default route for the named interface. */ 65 public native static int removeDefaultRoute(String interfaceName); 66 67 /** Reset any sockets that are connected via the named interface. */ 68 public native static int resetConnections(String interfaceName); 69 70 /** 71 * Start the DHCP client daemon, in order to have it request addresses 72 * for the named interface, and then configure the interface with those 73 * addresses. This call blocks until it obtains a result (either success 74 * or failure) from the daemon. 75 * @param interfaceName the name of the interface to configure 76 * @param ipInfo if the request succeeds, this object is filled in with 77 * the IP address information. 78 * @return {@code true} for success, {@code false} for failure 79 */ 80 public native static boolean runDhcp(String interfaceName, DhcpInfo ipInfo); 81 82 /** 83 * Shut down the DHCP client daemon. 84 * @param interfaceName the name of the interface for which the daemon 85 * should be stopped 86 * @return {@code true} for success, {@code false} for failure 87 */ 88 public native static boolean stopDhcp(String interfaceName); 89 90 /** 91 * Release the current DHCP lease. 92 * @param interfaceName the name of the interface for which the lease should 93 * be released 94 * @return {@code true} for success, {@code false} for failure 95 */ 96 public native static boolean releaseDhcpLease(String interfaceName); 97 98 /** 99 * Return the last DHCP-related error message that was recorded. 100 * <p/>NOTE: This string is not localized, but currently it is only 101 * used in logging. 102 * @return the most recent error message, if any 103 */ 104 public native static String getDhcpError(); 105 106 /** 107 * When static IP configuration has been specified, configure the network 108 * interface according to the values supplied. 109 * @param interfaceName the name of the interface to configure 110 * @param ipInfo the IP address, default gateway, and DNS server addresses 111 * with which to configure the interface. 112 * @return {@code true} for success, {@code false} for failure 113 */ 114 public static boolean configureInterface(String interfaceName, DhcpInfo ipInfo) { 115 return configureNative(interfaceName, 116 ipInfo.ipAddress, 117 ipInfo.netmask, 118 ipInfo.gateway, 119 ipInfo.dns1, 120 ipInfo.dns2); 121 } 122 123 private native static boolean configureNative( 124 String interfaceName, int ipAddress, int netmask, int gateway, int dns1, int dns2); 125 126 /** 127 * Convert a IPv4 address from an integer to an InetAddress. 128 * @param hostAddress an int corresponding to the IPv4 address in network byte order 129 */ 130 public static InetAddress intToInetAddress(int hostAddress) { 131 byte[] addressBytes = { (byte)(0xff & hostAddress), 132 (byte)(0xff & (hostAddress >> 8)), 133 (byte)(0xff & (hostAddress >> 16)), 134 (byte)(0xff & (hostAddress >> 24)) }; 135 136 try { 137 return InetAddress.getByAddress(addressBytes); 138 } catch (UnknownHostException e) { 139 throw new AssertionError(); 140 } 141 } 142 143 /** 144 * Convert a IPv4 address from an InetAddress to an integer 145 * @param inetAddr is an InetAddress corresponding to the IPv4 address 146 * @return the IP address as an integer in network byte order 147 */ 148 public static int inetAddressToInt(InetAddress inetAddr) 149 throws IllegalArgumentException { 150 byte [] addr = inetAddr.getAddress(); 151 if (addr.length != 4) { 152 throw new IllegalArgumentException("Not an IPv4 address"); 153 } 154 return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) | 155 ((addr[1] & 0xff) << 8) | (addr[0] & 0xff); 156 } 157 158 /** 159 * Convert a network prefix length to an IPv4 netmask integer 160 * @param prefixLength 161 * @return the IPv4 netmask as an integer in network byte order 162 */ 163 public static int prefixLengthToNetmaskInt(int prefixLength) 164 throws IllegalArgumentException { 165 if (prefixLength < 0 || prefixLength > 32) { 166 throw new IllegalArgumentException("Invalid prefix length (0 <= prefix <= 32)"); 167 } 168 int value = 0xffffffff << (32 - prefixLength); 169 return Integer.reverseBytes(value); 170 } 171 172 /** 173 * Add a default route through the specified gateway. 174 * @param interfaceName interface on which the route should be added 175 * @param gw the IP address of the gateway to which the route is desired, 176 * @return {@code true} on success, {@code false} on failure 177 */ 178 public static boolean addDefaultRoute(String interfaceName, InetAddress gw) { 179 String dstStr; 180 String gwStr = gw.getHostAddress(); 181 182 if (gw instanceof Inet4Address) { 183 dstStr = "0.0.0.0"; 184 } else if (gw instanceof Inet6Address) { 185 dstStr = "::"; 186 } else { 187 Log.w(TAG, "addDefaultRoute failure: address is neither IPv4 nor IPv6" + 188 "(" + gwStr + ")"); 189 return false; 190 } 191 return addRoute(interfaceName, dstStr, 0, gwStr) == 0; 192 } 193 194 /** 195 * Add a host route. 196 * @param interfaceName interface on which the route should be added 197 * @param dst the IP address of the host to which the route is desired, 198 * this should not be null. 199 * @param gw the IP address of the gateway to which the route is desired, 200 * if null, indicates a directly-connected route. 201 * @return {@code true} on success, {@code false} on failure 202 */ 203 public static boolean addHostRoute(String interfaceName, InetAddress dst, 204 InetAddress gw) { 205 if (dst == null) { 206 Log.w(TAG, "addHostRoute: dst should not be null"); 207 return false; 208 } 209 210 int prefixLength; 211 String dstStr = dst.getHostAddress(); 212 String gwStr = (gw != null) ? gw.getHostAddress() : null; 213 214 if (dst instanceof Inet4Address) { 215 prefixLength = 32; 216 } else if (dst instanceof Inet6Address) { 217 prefixLength = 128; 218 } else { 219 Log.w(TAG, "addHostRoute failure: address is neither IPv4 nor IPv6" + 220 "(" + dst + ")"); 221 return false; 222 } 223 return addRoute(interfaceName, dstStr, prefixLength, gwStr) == 0; 224 } 225} 226