NetworkUtils.java revision 59b1a4ede7032c1b4d897e13dd4ede09b5e14743
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
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Reset any sockets that are connected via the named interface. */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static int resetConnections(String interfaceName);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start the DHCP client daemon, in order to have it request addresses
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for the named interface, and then configure the interface with those
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * addresses. This call blocks until it obtains a result (either success
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or failure) from the daemon.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param interfaceName the name of the interface to configure
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ipInfo if the request succeeds, this object is filled in with
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the IP address information.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} for success, {@code false} for failure
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
540216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public native static boolean runDhcp(String interfaceName, DhcpInfoInternal ipInfo);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff     * Initiate renewal on the Dhcp client daemon. This call blocks until it obtains
5831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff     * a result (either success or failure) from the daemon.
5931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff     * @param interfaceName the name of the interface to configure
6031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff     * @param ipInfo if the request succeeds, this object is filled in with
6131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff     * the IP address information.
6231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff     * @return {@code true} for success, {@code false} for failure
6331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff     */
6431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    public native static boolean runDhcpRenew(String interfaceName, DhcpInfoInternal ipInfo);
6531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
6631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    /**
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Shut down the DHCP client daemon.
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param interfaceName the name of the interface for which the daemon
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should be stopped
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} for success, {@code false} for failure
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean stopDhcp(String interfaceName);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Release the current DHCP lease.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param interfaceName the name of the interface for which the lease should
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be released
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} for success, {@code false} for failure
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean releaseDhcpLease(String interfaceName);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the last DHCP-related error message that was recorded.
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>NOTE: This string is not localized, but currently it is only
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * used in logging.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the most recent error message, if any
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static String getDhcpError();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
91585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt     * Convert a IPv4 address from an integer to an InetAddress.
9207481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson     * @param hostAddress an int corresponding to the IPv4 address in network byte order
93585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt     */
94585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt    public static InetAddress intToInetAddress(int hostAddress) {
95585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt        byte[] addressBytes = { (byte)(0xff & hostAddress),
96585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt                                (byte)(0xff & (hostAddress >> 8)),
97585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt                                (byte)(0xff & (hostAddress >> 16)),
98585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt                                (byte)(0xff & (hostAddress >> 24)) };
9947f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10107481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson           return InetAddress.getByAddress(addressBytes);
10207481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson        } catch (UnknownHostException e) {
10307481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson           throw new AssertionError();
104585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt        }
105585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt    }
106585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt
10796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    /**
10896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * Convert a IPv4 address from an InetAddress to an integer
10996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * @param inetAddr is an InetAddress corresponding to the IPv4 address
11096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * @return the IP address as an integer in network byte order
11196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     */
11296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    public static int inetAddressToInt(InetAddress inetAddr)
11396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            throws IllegalArgumentException {
11496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        byte [] addr = inetAddr.getAddress();
11596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        if (addr.length != 4) {
11696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            throw new IllegalArgumentException("Not an IPv4 address");
11796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        }
11896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) |
11996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff                ((addr[1] & 0xff) << 8) | (addr[0] & 0xff);
12096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    }
12196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff
12296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    /**
12396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * Convert a network prefix length to an IPv4 netmask integer
12496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * @param prefixLength
12596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * @return the IPv4 netmask as an integer in network byte order
12696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     */
12796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    public static int prefixLengthToNetmaskInt(int prefixLength)
12896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            throws IllegalArgumentException {
12996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        if (prefixLength < 0 || prefixLength > 32) {
13096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            throw new IllegalArgumentException("Invalid prefix length (0 <= prefix <= 32)");
13196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        }
13296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        int value = 0xffffffff << (32 - prefixLength);
13396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        return Integer.reverseBytes(value);
13496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    }
13596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff
1360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    /**
13759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * Convert a IPv4 netmask integer to a prefix length
13859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * @param netmask as an integer in network byte order
13959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * @return the network prefix length
14059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     */
14159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    public static int netmaskIntToPrefixLength(int netmask) {
14259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt        return Integer.bitCount(netmask);
14359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    }
14459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt
14559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    /**
1460216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * Create an InetAddress from a string where the string must be a standard
1470216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * representation of a V4 or V6 address.  Avoids doing a DNS lookup on failure
1480216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * but it will throw an IllegalArgumentException in that case.
1490216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * @param addrString
1500216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * @return the InetAddress
1510216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     * @hide
1520216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt     */
1530216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public static InetAddress numericToInetAddress(String addrString)
1540216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt            throws IllegalArgumentException {
155f5bbb5720454742e0e2f6ae489fa164845261cbfElliott Hughes        return InetAddress.parseNumericAddress(addrString);
1560216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    }
1570216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
158585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt    /**
159f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     * Get InetAddress masked with prefixLength.  Will never return null.
160f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     * @param IP address which will be masked with specified prefixLength
161f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     * @param prefixLength the prefixLength used to mask the IP
162f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     */
163f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt    public static InetAddress getNetworkPart(InetAddress address, int prefixLength) {
164f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        if (address == null) {
165f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt            throw new RuntimeException("getNetworkPart doesn't accept null address");
166f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        }
167f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
168f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        byte[] array = address.getAddress();
169f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
170f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        if (prefixLength < 0 || prefixLength > array.length * 8) {
171f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt            throw new RuntimeException("getNetworkPart - bad prefixLength");
172f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        }
173f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
174f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        int offset = prefixLength / 8;
175f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        int reminder = prefixLength % 8;
176f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        byte mask = (byte)(0xFF << (8 - reminder));
177f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
178f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        if (offset < array.length) array[offset] = (byte)(array[offset] & mask);
179f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
180f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        offset++;
181f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
182f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        for (; offset < array.length; offset++) {
183f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt            array[offset] = 0;
184f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        }
185f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
186f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        InetAddress netPart = null;
187f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        try {
188f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt            netPart = InetAddress.getByAddress(array);
189f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        } catch (UnknownHostException e) {
190f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt            throw new RuntimeException("getNetworkPart error - " + e.toString());
191f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        }
192f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        return netPart;
193f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt    }
194f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt
195f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt    /**
196f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     * Check if IP address type is consistent between two InetAddress.
197f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     * @return true if both are the same type.  False otherwise.
198f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt     */
199f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt    public static boolean addressTypeMatches(InetAddress left, InetAddress right) {
200f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt        return (((left instanceof Inet4Address) && (right instanceof Inet4Address)) ||
201f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt                ((left instanceof Inet6Address) && (right instanceof Inet6Address)));
202f43396caaaae8f336bcf6fe9128a89dc7a7b0a5cRobert Greenwalt    }
20359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt
20459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    /**
20559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * Convert a 32 char hex string into a Inet6Address.
20659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * throws a runtime exception if the string isn't 32 chars, isn't hex or can't be
20759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * made into an Inet6Address
20859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * @param addrHexString a 32 character hex string representing an IPv6 addr
20959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     * @return addr an InetAddress representation for the string
21059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt     */
21159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    public static InetAddress hexToInet6Address(String addrHexString)
21259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt            throws IllegalArgumentException {
21359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt        try {
21459b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt            return numericToInetAddress(String.format("%s:%s:%s:%s:%s:%s:%s:%s",
21559b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt                    addrHexString.substring(0,4),   addrHexString.substring(4,8),
21659b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt                    addrHexString.substring(8,12),  addrHexString.substring(12,16),
21759b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt                    addrHexString.substring(16,20), addrHexString.substring(20,24),
21859b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt                    addrHexString.substring(24,28), addrHexString.substring(28,32)));
21959b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt        } catch (Exception e) {
22059b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt            Log.e("NetworkUtils", "error in hexToInet6Address(" + addrHexString + "): " + e);
22159b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt            throw new IllegalArgumentException(e);
22259b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt        }
22359b1a4ede7032c1b4d897e13dd4ede09b5e14743Robert Greenwalt    }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
225