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