NetworkUtils.java revision 3876495129cce3ed8ac6f247189b075dc9baec8f
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;
24fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkeyimport java.util.Locale;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwaltimport android.util.Log;
27585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Native methods for managing network interfaces.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class NetworkUtils {
34585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt
35585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt    private static final String TAG = "NetworkUtils";
36585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt
370900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    /** Bring the named network interface up. */
380900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    public native static int enableInterface(String interfaceName);
390900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Bring the named network interface down. */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static int disableInterface(String interfaceName);
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
438171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    /** Setting bit 0 indicates reseting of IPv4 addresses required */
448171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    public static final int RESET_IPV4_ADDRESSES = 0x01;
458171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
468171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    /** Setting bit 1 indicates reseting of IPv4 addresses required */
478171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    public static final int RESET_IPV6_ADDRESSES = 0x02;
488171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
498171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    /** Reset all addresses */
508171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    public static final int RESET_ALL_ADDRESSES = RESET_IPV4_ADDRESSES | RESET_IPV6_ADDRESSES;
518171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
528171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    /**
538171e6f690cca1bad354e7e352823d79d420daf3Wink Saville     * Reset IPv6 or IPv4 sockets that are connected via the named interface.
548171e6f690cca1bad354e7e352823d79d420daf3Wink Saville     *
558171e6f690cca1bad354e7e352823d79d420daf3Wink Saville     * @param interfaceName is the interface to reset
568171e6f690cca1bad354e7e352823d79d420daf3Wink Saville     * @param mask {@see #RESET_IPV4_ADDRESSES} and {@see #RESET_IPV6_ADDRESSES}
578171e6f690cca1bad354e7e352823d79d420daf3Wink Saville     */
588171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    public native static int resetConnections(String interfaceName, int mask);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start the DHCP client daemon, in order to have it request addresses
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for the named interface, and then configure the interface with those
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * addresses. This call blocks until it obtains a result (either success
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or failure) from the daemon.
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param interfaceName the name of the interface to configure
664717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt     * @param dhcpResults if the request succeeds, this object is filled in with
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the IP address information.
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} for success, {@code false} for failure
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
704717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    public native static boolean runDhcp(String interfaceName, DhcpResults dhcpResults);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
73914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff     * Initiate renewal on the Dhcp client daemon. This call blocks until it obtains
74914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff     * a result (either success or failure) from the daemon.
75914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff     * @param interfaceName the name of the interface to configure
764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt     * @param dhcpResults if the request succeeds, this object is filled in with
77914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff     * the IP address information.
78914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff     * @return {@code true} for success, {@code false} for failure
79914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff     */
804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    public native static boolean runDhcpRenew(String interfaceName, DhcpResults dhcpResults);
81914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff
82914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff    /**
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    /**
10712324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker     * Set the SO_MARK of {@code socketfd} to {@code mark}
10812324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker     */
10912324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker    public native static void markSocket(int socketfd, int mark);
11012324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker
11112324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker    /**
1123876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * Binds the current process to the network designated by {@code netId}.  All sockets created
1133876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * in the future (and not explicitly bound via a bound {@link SocketFactory} (see
1143876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * {@link Network#socketFactory}) will be bound to this network.  Note that if this
1153876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * {@code Network} ever disconnects all sockets created in this way will cease to work.  This
1163876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * is by design so an application doesn't accidentally use sockets it thinks are still bound to
1173876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * a particular {@code Network}.
1183876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     */
1193876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    public native static void bindProcessToNetwork(int netId);
1203876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
1213876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    /**
1223876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * Clear any process specific {@code Network} binding.  This reverts a call to
1233876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * {@link #bindProcessToNetwork}.
1243876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     */
1253876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    public native static void unbindProcessToNetwork();
1263876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
1273876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    /**
1283876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * Return the netId last passed to {@link #bindProcessToNetwork}, or NETID_UNSET if
1293876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * {@link #unbindProcessToNetwork} has been called since {@link #bindProcessToNetwork}.
1303876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     */
1313876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    public native static int getNetworkBoundToProcess();
1323876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
1333876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    /**
1343876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * Binds host resolutions performed by this process to the network designated by {@code netId}.
1353876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * {@link #bindProcessToNetwork} takes precedence over this setting.
1363876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     *
1373876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * @deprecated This is strictly for legacy usage to support startUsingNetworkFeature().
1383876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     */
1393876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    public native static void bindProcessToNetworkForHostResolution(int netId);
1403876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
1413876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    /**
1423876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * Clears any process specific {@link Network} binding for host resolution.  This does
1433876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * not clear bindings enacted via {@link #bindProcessToNetwork}.
1443876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     *
1453876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * @deprecated This is strictly for legacy usage to support startUsingNetworkFeature().
1463876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     */
1473876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    public native static void unbindProcessToNetworkForHostResolution();
1483876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
1493876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    /**
1503876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * Explicitly binds {@code socketfd} to the network designated by {@code netId}.  This
1513876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     * overrides any binding via {@link #bindProcessToNetwork}.
1523876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen     */
1533876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    public native static void bindSocketToNetwork(int socketfd, int netId);
1543876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
1553876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    /**
156585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt     * Convert a IPv4 address from an integer to an InetAddress.
15707481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson     * @param hostAddress an int corresponding to the IPv4 address in network byte order
158585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt     */
159585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt    public static InetAddress intToInetAddress(int hostAddress) {
160585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt        byte[] addressBytes = { (byte)(0xff & hostAddress),
161585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt                                (byte)(0xff & (hostAddress >> 8)),
162585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt                                (byte)(0xff & (hostAddress >> 16)),
163585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt                                (byte)(0xff & (hostAddress >> 24)) };
16447f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
16607481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson           return InetAddress.getByAddress(addressBytes);
16707481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson        } catch (UnknownHostException e) {
16807481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson           throw new AssertionError();
169585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt        }
170585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt    }
171585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt
17296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    /**
17396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * Convert a IPv4 address from an InetAddress to an integer
17496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * @param inetAddr is an InetAddress corresponding to the IPv4 address
17596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * @return the IP address as an integer in network byte order
17696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     */
1774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    public static int inetAddressToInt(Inet4Address inetAddr)
17896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            throws IllegalArgumentException {
17996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        byte [] addr = inetAddr.getAddress();
18096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) |
18196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff                ((addr[1] & 0xff) << 8) | (addr[0] & 0xff);
18296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    }
18396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff
18496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    /**
18596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * Convert a network prefix length to an IPv4 netmask integer
18696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * @param prefixLength
18796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * @return the IPv4 netmask as an integer in network byte order
18896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     */
18996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    public static int prefixLengthToNetmaskInt(int prefixLength)
19096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            throws IllegalArgumentException {
19196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        if (prefixLength < 0 || prefixLength > 32) {
19296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            throw new IllegalArgumentException("Invalid prefix length (0 <= prefix <= 32)");
19396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        }
19496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        int value = 0xffffffff << (32 - prefixLength);
19596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        return Integer.reverseBytes(value);
19696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    }
19796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff
1980216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    /**
19959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * Convert a IPv4 netmask integer to a prefix length
20059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * @param netmask as an integer in network byte order
20159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * @return the network prefix length
20259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     */
20359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    public static int netmaskIntToPrefixLength(int netmask) {
20459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt        return Integer.bitCount(netmask);
20559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    }
20659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt
20759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    /**
2080216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * Create an InetAddress from a string where the string must be a standard
2090216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * representation of a V4 or V6 address.  Avoids doing a DNS lookup on failure
2100216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * but it will throw an IllegalArgumentException in that case.
2110216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * @param addrString
2120216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * @return the InetAddress
2130216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * @hide
2140216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     */
2150216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public static InetAddress numericToInetAddress(String addrString)
2160216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt            throws IllegalArgumentException {
217f5bbb5720454742e0e2f6ae489fa164845261cbfElliott Hughes        return InetAddress.parseNumericAddress(addrString);
2180216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    }
2190216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
220585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt    /**
221f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     * Get InetAddress masked with prefixLength.  Will never return null.
222f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     * @param IP address which will be masked with specified prefixLength
223f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     * @param prefixLength the prefixLength used to mask the IP
224f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     */
225f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt    public static InetAddress getNetworkPart(InetAddress address, int prefixLength) {
226f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        if (address == null) {
227f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt            throw new RuntimeException("getNetworkPart doesn't accept null address");
228f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        }
229f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
230f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        byte[] array = address.getAddress();
231f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
232f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        if (prefixLength < 0 || prefixLength > array.length * 8) {
233f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt            throw new RuntimeException("getNetworkPart - bad prefixLength");
234f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        }
235f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
236f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        int offset = prefixLength / 8;
237f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        int reminder = prefixLength % 8;
238f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        byte mask = (byte)(0xFF << (8 - reminder));
239f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
240f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        if (offset < array.length) array[offset] = (byte)(array[offset] & mask);
241f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
242f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        offset++;
243f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
244f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        for (; offset < array.length; offset++) {
245f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt            array[offset] = 0;
246f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        }
247f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
248f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        InetAddress netPart = null;
249f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        try {
250f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt            netPart = InetAddress.getByAddress(array);
251f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        } catch (UnknownHostException e) {
252f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt            throw new RuntimeException("getNetworkPart error - " + e.toString());
253f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        }
254f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        return netPart;
255f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt    }
256f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
257f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt    /**
258f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     * Check if IP address type is consistent between two InetAddress.
259f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     * @return true if both are the same type.  False otherwise.
260f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     */
261f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt    public static boolean addressTypeMatches(InetAddress left, InetAddress right) {
262f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        return (((left instanceof Inet4Address) && (right instanceof Inet4Address)) ||
263f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt                ((left instanceof Inet6Address) && (right instanceof Inet6Address)));
264f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt    }
26559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt
26659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    /**
26759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * Convert a 32 char hex string into a Inet6Address.
26859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * throws a runtime exception if the string isn't 32 chars, isn't hex or can't be
26959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * made into an Inet6Address
27059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * @param addrHexString a 32 character hex string representing an IPv6 addr
27159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * @return addr an InetAddress representation for the string
27259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     */
27359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    public static InetAddress hexToInet6Address(String addrHexString)
27459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt            throws IllegalArgumentException {
27559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt        try {
276fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkey            return numericToInetAddress(String.format(Locale.US, "%s:%s:%s:%s:%s:%s:%s:%s",
27759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt                    addrHexString.substring(0,4),   addrHexString.substring(4,8),
27859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt                    addrHexString.substring(8,12),  addrHexString.substring(12,16),
27959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt                    addrHexString.substring(16,20), addrHexString.substring(20,24),
28059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt                    addrHexString.substring(24,28), addrHexString.substring(28,32)));
28159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt        } catch (Exception e) {
28259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt            Log.e("NetworkUtils", "error in hexToInet6Address(" + addrHexString + "): " + e);
28359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt            throw new IllegalArgumentException(e);
28459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt        }
28559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    }
286a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt
287a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt    /**
288a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt     * Create a string array of host addresses from a collection of InetAddresses
289a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt     * @param addrs a Collection of InetAddresses
290a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt     * @return an array of Strings containing their host addresses
291a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt     */
292a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt    public static String[] makeStrings(Collection<InetAddress> addrs) {
293a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt        String[] result = new String[addrs.size()];
294a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt        int i = 0;
295a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt        for (InetAddress addr : addrs) {
296a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt            result[i++] = addr.getHostAddress();
297a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt        }
298a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt        return result;
299a10b7fd2239668a87be690a57ef7b3bc39b6bfd3Robert Greenwalt    }
300d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt
301d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt    /**
302d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt     * Trim leading zeros from IPv4 address strings
303d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt     * Our base libraries will interpret that as octel..
304d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt     * Must leave non v4 addresses and host names alone.
305d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt     * For example, 192.168.000.010 -> 192.168.0.10
306d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt     * TODO - fix base libraries and remove this function
307d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt     * @param addr a string representing an ip addr
308d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt     * @return a string propertly trimmed
309d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt     */
310d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt    public static String trimV4AddrZeros(String addr) {
3110faacf0658af00929481fa158f0c88289ba5145fRobert Greenwalt        if (addr == null) return null;
312d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt        String[] octets = addr.split("\\.");
313d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt        if (octets.length != 4) return addr;
314d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt        StringBuilder builder = new StringBuilder(16);
315d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt        String result = null;
316d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt        for (int i = 0; i < 4; i++) {
317d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt            try {
3183957b5fc49335f13b15080b8e7146580026c0479Robert Greenwalt                if (octets[i].length() > 3) return addr;
319d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt                builder.append(Integer.parseInt(octets[i]));
320d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt            } catch (NumberFormatException e) {
321d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt                return addr;
322d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt            }
323d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt            if (i < 3) builder.append('.');
324d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt        }
325d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt        result = builder.toString();
326d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt        return result;
327d4420ab2fbb85280d2f507072fe0bd820ac26a3fRobert Greenwalt    }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
329