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