10216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt/*
20216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * Copyright (C) 2010 The Android Open Source Project
30216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt *
40216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License");
50216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * you may not use this file except in compliance with the License.
60216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * You may obtain a copy of the License at
70216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt *
80216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt *      http://www.apache.org/licenses/LICENSE-2.0
90216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt *
100216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * Unless required by applicable law or agreed to in writing, software
110216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS,
120216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * See the License for the specific language governing permissions and
140216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * limitations under the License.
150216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt */
160216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
170216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwaltpackage android.net;
180216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
1968e18d23298c62b61844eb296d247df55d45f463Robert Greenwaltimport android.text.TextUtils;
2068e18d23298c62b61844eb296d247df55d45f463Robert Greenwaltimport android.util.Log;
2168e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt
220216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwaltimport java.net.InetAddress;
230216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwaltimport java.net.Inet4Address;
240216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwaltimport java.net.UnknownHostException;
25aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwaltimport java.util.ArrayList;
26aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwaltimport java.util.Collection;
272c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriffimport java.util.Collections;
280216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
290216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt/**
300216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * A simple object for retrieving the results of a DHCP request.
310216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * Replaces (internally) the IPv4-only DhcpInfo class.
320216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt * @hide
330216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt */
340216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwaltpublic class DhcpInfoInternal {
3568e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt    private final static String TAG = "DhcpInfoInternal";
360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public String ipAddress;
370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public int prefixLength;
380216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
390216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public String dns1;
400216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public String dns2;
410216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
420216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public String serverAddress;
430216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public int leaseDuration;
440216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
452c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff    private Collection<RouteInfo> mRoutes;
46aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt
470216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public DhcpInfoInternal() {
482c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        mRoutes = new ArrayList<RouteInfo>();
49aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt    }
50aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt
51aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt    public void addRoute(RouteInfo routeInfo) {
522c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        mRoutes.add(routeInfo);
532c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff    }
542c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff
552c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff    public Collection<RouteInfo> getRoutes() {
562c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        return Collections.unmodifiableCollection(mRoutes);
570216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    }
580216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
590216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    private int convertToInt(String addr) {
60992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt        if (addr != null) {
61992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt            try {
62992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt                InetAddress inetAddress = NetworkUtils.numericToInetAddress(addr);
63992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt                if (inetAddress instanceof Inet4Address) {
64992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt                    return NetworkUtils.inetAddressToInt(inetAddress);
65992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt                }
66992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt            } catch (IllegalArgumentException e) {}
67992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt        }
680216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        return 0;
690216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    }
700216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
710216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public DhcpInfo makeDhcpInfo() {
720216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        DhcpInfo info = new DhcpInfo();
730216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        info.ipAddress = convertToInt(ipAddress);
742c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        for (RouteInfo route : mRoutes) {
75aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt            if (route.isDefaultRoute()) {
76aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt                info.gateway = convertToInt(route.getGateway().getHostAddress());
77aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt                break;
78aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt            }
79aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt        }
800216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        try {
810216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt            InetAddress inetAddress = NetworkUtils.numericToInetAddress(ipAddress);
820216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt            info.netmask = NetworkUtils.prefixLengthToNetmaskInt(prefixLength);
830216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        } catch (IllegalArgumentException e) {}
840216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        info.dns1 = convertToInt(dns1);
850216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        info.dns2 = convertToInt(dns2);
860216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        info.serverAddress = convertToInt(serverAddress);
870216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        info.leaseDuration = leaseDuration;
880216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        return info;
890216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    }
900216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
910216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public LinkAddress makeLinkAddress() {
9268e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt        if (TextUtils.isEmpty(ipAddress)) {
9368e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt            Log.e(TAG, "makeLinkAddress with empty ipAddress");
9468e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt            return null;
9568e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt        }
960216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        return new LinkAddress(NetworkUtils.numericToInetAddress(ipAddress), prefixLength);
970216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    }
980216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
990216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public LinkProperties makeLinkProperties() {
1000216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        LinkProperties p = new LinkProperties();
1010216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        p.addLinkAddress(makeLinkAddress());
1022c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        for (RouteInfo route : mRoutes) {
103aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt            p.addRoute(route);
10468e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt        }
1052c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        //if empty, connectivity configures default DNS
10668e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt        if (TextUtils.isEmpty(dns1) == false) {
10768e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt            p.addDns(NetworkUtils.numericToInetAddress(dns1));
10868e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt        } else {
1092c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff            Log.d(TAG, "makeLinkProperties with empty dns1!");
11068e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt        }
11168e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt        if (TextUtils.isEmpty(dns2) == false) {
11268e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt            p.addDns(NetworkUtils.numericToInetAddress(dns2));
11368e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt        } else {
114992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt            Log.d(TAG, "makeLinkProperties with empty dns2!");
11568e18d23298c62b61844eb296d247df55d45f463Robert Greenwalt        }
1160216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        return p;
1170216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    }
1180216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
1192c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff    /* Updates the DHCP fields that need to be retained from
1202c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff     * original DHCP request if the DHCP renewal shows them as
1212c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff     * being empty
1222c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff     */
1232c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff    public void updateFromDhcpRequest(DhcpInfoInternal orig) {
1242c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        if (orig == null) return;
1252c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff
1262c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        if (TextUtils.isEmpty(dns1)) {
1272c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff            dns1 = orig.dns1;
1282c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        }
1292c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff
1302c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        if (TextUtils.isEmpty(dns2)) {
1312c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff            dns2 = orig.dns2;
1322c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        }
1332c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff
1342c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        if (mRoutes.size() == 0) {
1352c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff            for (RouteInfo route : orig.getRoutes()) {
1362c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff                addRoute(route);
1372c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff            }
1382c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        }
1392c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff    }
1402c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff
1410216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    public String toString() {
142aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt        String routeString = "";
1432c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff        for (RouteInfo route : mRoutes) routeString += route.toString() + " | ";
1440216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt        return "addr: " + ipAddress + "/" + prefixLength +
1452c08ede34ceb0f847cc9f996db9832f5358f8726Irfan Sheriff                " mRoutes: " + routeString +
1460216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                " dns: " + dns1 + "," + dns2 +
1470216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                " dhcpServer: " + serverAddress +
1480216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                " leaseDuration: " + leaseDuration;
1490216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    }
1500216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt}
151