Home | History | Annotate | Download | only in net
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.net;
     18 
     19 import android.net.NetworkUtils;
     20 import android.os.Parcel;
     21 import android.text.TextUtils;
     22 import android.util.Log;
     23 
     24 import java.net.InetAddress;
     25 import java.net.Inet4Address;
     26 import java.util.Objects;
     27 
     28 /**
     29  * A simple object for retrieving the results of a DHCP request.
     30  * Optimized (attempted) for that jni interface
     31  * TODO - remove when DhcpInfo is deprecated.  Move the remaining api to LinkProperties.
     32  * @hide
     33  */
     34 public class DhcpResults extends StaticIpConfiguration {
     35     private static final String TAG = "DhcpResults";
     36 
     37     public InetAddress serverAddress;
     38 
     39     /** Vendor specific information (from RFC 2132). */
     40     public String vendorInfo;
     41 
     42     public int leaseDuration;
     43 
     44     public DhcpResults() {
     45         super();
     46     }
     47 
     48     public DhcpResults(StaticIpConfiguration source) {
     49         super(source);
     50     }
     51 
     52     /** copy constructor */
     53     public DhcpResults(DhcpResults source) {
     54         super(source);
     55 
     56         if (source != null) {
     57             // All these are immutable, so no need to make copies.
     58             serverAddress = source.serverAddress;
     59             vendorInfo = source.vendorInfo;
     60             leaseDuration = source.leaseDuration;
     61         }
     62     }
     63 
     64     /**
     65      * Updates the DHCP fields that need to be retained from
     66      * original DHCP request if the current renewal shows them
     67      * being empty.
     68      */
     69     public void updateFromDhcpRequest(DhcpResults orig) {
     70         if (orig == null) return;
     71         if (gateway == null) gateway = orig.gateway;
     72         if (dnsServers.size() == 0) {
     73             dnsServers.addAll(orig.dnsServers);
     74         }
     75     }
     76 
     77     /**
     78      * Test if this DHCP lease includes vendor hint that network link is
     79      * metered, and sensitive to heavy data transfers.
     80      */
     81     public boolean hasMeteredHint() {
     82         if (vendorInfo != null) {
     83             return vendorInfo.contains("ANDROID_METERED");
     84         } else {
     85             return false;
     86         }
     87     }
     88 
     89     public void clear() {
     90         super.clear();
     91         vendorInfo = null;
     92         leaseDuration = 0;
     93     }
     94 
     95     @Override
     96     public String toString() {
     97         StringBuffer str = new StringBuffer(super.toString());
     98 
     99         str.append(" DHCP server ").append(serverAddress);
    100         str.append(" Vendor info ").append(vendorInfo);
    101         str.append(" lease ").append(leaseDuration).append(" seconds");
    102 
    103         return str.toString();
    104     }
    105 
    106     @Override
    107     public boolean equals(Object obj) {
    108         if (this == obj) return true;
    109 
    110         if (!(obj instanceof DhcpResults)) return false;
    111 
    112         DhcpResults target = (DhcpResults)obj;
    113 
    114         return super.equals((StaticIpConfiguration) obj) &&
    115                 Objects.equals(serverAddress, target.serverAddress) &&
    116                 Objects.equals(vendorInfo, target.vendorInfo) &&
    117                 leaseDuration == target.leaseDuration;
    118     }
    119 
    120     /** Implement the Parcelable interface */
    121     public static final Creator<DhcpResults> CREATOR =
    122         new Creator<DhcpResults>() {
    123             public DhcpResults createFromParcel(Parcel in) {
    124                 DhcpResults dhcpResults = new DhcpResults();
    125                 readFromParcel(dhcpResults, in);
    126                 return dhcpResults;
    127             }
    128 
    129             public DhcpResults[] newArray(int size) {
    130                 return new DhcpResults[size];
    131             }
    132         };
    133 
    134     /** Implement the Parcelable interface */
    135     public void writeToParcel(Parcel dest, int flags) {
    136         super.writeToParcel(dest, flags);
    137         dest.writeInt(leaseDuration);
    138         NetworkUtils.parcelInetAddress(dest, serverAddress, flags);
    139         dest.writeString(vendorInfo);
    140     }
    141 
    142     private static void readFromParcel(DhcpResults dhcpResults, Parcel in) {
    143         StaticIpConfiguration.readFromParcel(dhcpResults, in);
    144         dhcpResults.leaseDuration = in.readInt();
    145         dhcpResults.serverAddress = NetworkUtils.unparcelInetAddress(in);
    146         dhcpResults.vendorInfo = in.readString();
    147     }
    148 
    149     // Utils for jni population - false on success
    150     // Not part of the superclass because they're only used by the JNI iterface to the DHCP daemon.
    151     public boolean setIpAddress(String addrString, int prefixLength) {
    152         try {
    153             Inet4Address addr = (Inet4Address) NetworkUtils.numericToInetAddress(addrString);
    154             ipAddress = new LinkAddress(addr, prefixLength);
    155         } catch (IllegalArgumentException|ClassCastException e) {
    156             Log.e(TAG, "setIpAddress failed with addrString " + addrString + "/" + prefixLength);
    157             return true;
    158         }
    159         return false;
    160     }
    161 
    162     public boolean setGateway(String addrString) {
    163         try {
    164             gateway = NetworkUtils.numericToInetAddress(addrString);
    165         } catch (IllegalArgumentException e) {
    166             Log.e(TAG, "setGateway failed with addrString " + addrString);
    167             return true;
    168         }
    169         return false;
    170     }
    171 
    172     public boolean addDns(String addrString) {
    173         if (TextUtils.isEmpty(addrString) == false) {
    174             try {
    175                 dnsServers.add(NetworkUtils.numericToInetAddress(addrString));
    176             } catch (IllegalArgumentException e) {
    177                 Log.e(TAG, "addDns failed with addrString " + addrString);
    178                 return true;
    179             }
    180         }
    181         return false;
    182     }
    183 
    184     public boolean setServerAddress(String addrString) {
    185         try {
    186             serverAddress = NetworkUtils.numericToInetAddress(addrString);
    187         } catch (IllegalArgumentException e) {
    188             Log.e(TAG, "setServerAddress failed with addrString " + addrString);
    189             return true;
    190         }
    191         return false;
    192     }
    193 
    194     public void setLeaseDuration(int duration) {
    195         leaseDuration = duration;
    196     }
    197 
    198     public void setVendorInfo(String info) {
    199         vendorInfo = info;
    200     }
    201 
    202     public void setDomains(String newDomains) {
    203         domains = newDomains;
    204     }
    205 }
    206