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.os.Parcelable;
     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.UnknownHostException;
     26 import java.util.ArrayList;
     27 import java.util.Collection;
     28 import java.util.Iterator;
     29 
     30 /**
     31  * A simple object for retrieving the results of a DHCP request.
     32  * Optimized (attempted) for that jni interface
     33  * TODO - remove when DhcpInfo is deprecated.  Move the remaining api to LinkProperties.
     34  * @hide
     35  */
     36 public class DhcpResults implements Parcelable {
     37     private static final String TAG = "DhcpResults";
     38 
     39     public final LinkProperties linkProperties;
     40 
     41     public InetAddress serverAddress;
     42 
     43     /**
     44      * Vendor specific information (from RFC 2132).
     45      */
     46     public String vendorInfo;
     47 
     48     public int leaseDuration;
     49 
     50     public DhcpResults() {
     51         linkProperties = new LinkProperties();
     52     }
     53 
     54     /** copy constructor */
     55     public DhcpResults(DhcpResults source) {
     56         if (source != null) {
     57             linkProperties = new LinkProperties(source.linkProperties);
     58             serverAddress = source.serverAddress;
     59             leaseDuration = source.leaseDuration;
     60             vendorInfo = source.vendorInfo;
     61         } else {
     62             linkProperties = new LinkProperties();
     63         }
     64     }
     65 
     66     public DhcpResults(LinkProperties lp) {
     67         linkProperties = new LinkProperties(lp);
     68     }
     69 
     70     /**
     71      * Updates the DHCP fields that need to be retained from
     72      * original DHCP request if the current renewal shows them
     73      * being empty.
     74      */
     75     public void updateFromDhcpRequest(DhcpResults orig) {
     76         if (orig == null || orig.linkProperties == null) return;
     77         if (linkProperties.getRoutes().size() == 0) {
     78             for (RouteInfo r : orig.linkProperties.getRoutes()) linkProperties.addRoute(r);
     79         }
     80         if (linkProperties.getDnses().size() == 0) {
     81             for (InetAddress d : orig.linkProperties.getDnses()) linkProperties.addDns(d);
     82         }
     83     }
     84 
     85     /**
     86      * Test if this DHCP lease includes vendor hint that network link is
     87      * metered, and sensitive to heavy data transfers.
     88      */
     89     public boolean hasMeteredHint() {
     90         if (vendorInfo != null) {
     91             return vendorInfo.contains("ANDROID_METERED");
     92         } else {
     93             return false;
     94         }
     95     }
     96 
     97     public void clear() {
     98         linkProperties.clear();
     99         serverAddress = null;
    100         vendorInfo = null;
    101         leaseDuration = 0;
    102     }
    103 
    104     @Override
    105     public String toString() {
    106         StringBuffer str = new StringBuffer(linkProperties.toString());
    107 
    108         str.append(" DHCP server ").append(serverAddress);
    109         str.append(" Vendor info ").append(vendorInfo);
    110         str.append(" lease ").append(leaseDuration).append(" seconds");
    111 
    112         return str.toString();
    113     }
    114 
    115     @Override
    116     public boolean equals(Object obj) {
    117         if (this == obj) return true;
    118 
    119         if (!(obj instanceof DhcpResults)) return false;
    120 
    121         DhcpResults target = (DhcpResults)obj;
    122 
    123         if (linkProperties == null) {
    124             if (target.linkProperties != null) return false;
    125         } else if (!linkProperties.equals(target.linkProperties)) return false;
    126         if (serverAddress == null) {
    127             if (target.serverAddress != null) return false;
    128         } else if (!serverAddress.equals(target.serverAddress)) return false;
    129         if (vendorInfo == null) {
    130             if (target.vendorInfo != null) return false;
    131         } else if (!vendorInfo.equals(target.vendorInfo)) return false;
    132         if (leaseDuration != target.leaseDuration) return false;
    133 
    134         return true;
    135     }
    136 
    137     /** Implement the Parcelable interface */
    138     public int describeContents() {
    139         return 0;
    140     }
    141 
    142     /** Implement the Parcelable interface */
    143     public void writeToParcel(Parcel dest, int flags) {
    144         linkProperties.writeToParcel(dest, flags);
    145 
    146         dest.writeInt(leaseDuration);
    147 
    148         if (serverAddress != null) {
    149             dest.writeByte((byte)1);
    150             dest.writeByteArray(serverAddress.getAddress());
    151         } else {
    152             dest.writeByte((byte)0);
    153         }
    154 
    155         dest.writeString(vendorInfo);
    156     }
    157 
    158     /** Implement the Parcelable interface */
    159     public static final Creator<DhcpResults> CREATOR =
    160         new Creator<DhcpResults>() {
    161             public DhcpResults createFromParcel(Parcel in) {
    162                 DhcpResults prop = new DhcpResults((LinkProperties)in.readParcelable(null));
    163 
    164                 prop.leaseDuration = in.readInt();
    165 
    166                 if (in.readByte() == 1) {
    167                     try {
    168                         prop.serverAddress = InetAddress.getByAddress(in.createByteArray());
    169                     } catch (UnknownHostException e) {}
    170                 }
    171 
    172                 prop.vendorInfo = in.readString();
    173 
    174                 return prop;
    175             }
    176 
    177             public DhcpResults[] newArray(int size) {
    178                 return new DhcpResults[size];
    179             }
    180         };
    181 
    182     // Utils for jni population - false on success
    183     public void setInterfaceName(String interfaceName) {
    184         linkProperties.setInterfaceName(interfaceName);
    185     }
    186 
    187     public boolean addLinkAddress(String addrString, int prefixLength) {
    188         InetAddress addr;
    189         try {
    190             addr = NetworkUtils.numericToInetAddress(addrString);
    191         } catch (IllegalArgumentException e) {
    192             Log.e(TAG, "addLinkAddress failed with addrString " + addrString);
    193             return true;
    194         }
    195 
    196         LinkAddress linkAddress = new LinkAddress(addr, prefixLength);
    197         linkProperties.addLinkAddress(linkAddress);
    198 
    199         RouteInfo routeInfo = new RouteInfo(linkAddress);
    200         linkProperties.addRoute(routeInfo);
    201         return false;
    202     }
    203 
    204     public boolean addGateway(String addrString) {
    205         try {
    206             linkProperties.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(addrString)));
    207         } catch (IllegalArgumentException e) {
    208             Log.e(TAG, "addGateway failed with addrString " + addrString);
    209             return true;
    210         }
    211         return false;
    212     }
    213 
    214     public boolean addDns(String addrString) {
    215         if (TextUtils.isEmpty(addrString) == false) {
    216             try {
    217                 linkProperties.addDns(NetworkUtils.numericToInetAddress(addrString));
    218             } catch (IllegalArgumentException e) {
    219                 Log.e(TAG, "addDns failed with addrString " + addrString);
    220                 return true;
    221             }
    222         }
    223         return false;
    224     }
    225 
    226     public boolean setServerAddress(String addrString) {
    227         try {
    228             serverAddress = NetworkUtils.numericToInetAddress(addrString);
    229         } catch (IllegalArgumentException e) {
    230             Log.e(TAG, "setServerAddress failed with addrString " + addrString);
    231             return true;
    232         }
    233         return false;
    234     }
    235 
    236     public void setLeaseDuration(int duration) {
    237         leaseDuration = duration;
    238     }
    239 
    240     public void setVendorInfo(String info) {
    241         vendorInfo = info;
    242     }
    243 
    244     public void setDomains(String domains) {
    245         linkProperties.setDomains(domains);
    246     }
    247 }
    248