summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/net/DhcpResults.java144
-rw-r--r--core/java/android/net/EthernetManager.java9
-rw-r--r--core/java/android/net/IpConfiguration.java99
-rw-r--r--core/java/android/net/NetworkUtils.java27
-rw-r--r--core/java/android/net/StaticIpConfiguration.java194
-rw-r--r--core/jni/android_net_NetUtils.cpp24
-rw-r--r--core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/AccessPointParserHelper.java20
-rw-r--r--services/core/java/com/android/server/net/IpConfigStore.java90
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java22
9 files changed, 434 insertions, 195 deletions
diff --git a/core/java/android/net/DhcpResults.java b/core/java/android/net/DhcpResults.java
index 49a307e..71df60a 100644
--- a/core/java/android/net/DhcpResults.java
+++ b/core/java/android/net/DhcpResults.java
@@ -16,13 +16,15 @@
package android.net;
+import android.net.NetworkUtils;
import android.os.Parcelable;
import android.os.Parcel;
import android.text.TextUtils;
import android.util.Log;
import java.net.InetAddress;
-import java.net.UnknownHostException;
+import java.net.Inet4Address;
+import java.util.Objects;
/**
* A simple object for retrieving the results of a DHCP request.
@@ -30,54 +32,46 @@ import java.net.UnknownHostException;
* TODO - remove when DhcpInfo is deprecated. Move the remaining api to LinkProperties.
* @hide
*/
-public class DhcpResults implements Parcelable {
+public class DhcpResults extends StaticIpConfiguration {
private static final String TAG = "DhcpResults";
- public final LinkProperties linkProperties;
-
public InetAddress serverAddress;
- /**
- * Vendor specific information (from RFC 2132).
- */
+ /** Vendor specific information (from RFC 2132). */
public String vendorInfo;
public int leaseDuration;
public DhcpResults() {
- linkProperties = new LinkProperties();
+ super();
+ }
+
+ public DhcpResults(StaticIpConfiguration source) {
+ super(source);
}
/** copy constructor */
public DhcpResults(DhcpResults source) {
+ super(source);
+
if (source != null) {
- linkProperties = new LinkProperties(source.linkProperties);
+ // All these are immutable, so no need to make copies.
serverAddress = source.serverAddress;
- leaseDuration = source.leaseDuration;
vendorInfo = source.vendorInfo;
- } else {
- linkProperties = new LinkProperties();
+ leaseDuration = source.leaseDuration;
}
}
- public DhcpResults(LinkProperties lp) {
- linkProperties = new LinkProperties(lp);
- }
-
/**
* Updates the DHCP fields that need to be retained from
* original DHCP request if the current renewal shows them
* being empty.
*/
public void updateFromDhcpRequest(DhcpResults orig) {
- if (orig == null || orig.linkProperties == null) return;
- if (linkProperties.getRoutes().size() == 0) {
- for (RouteInfo r : orig.linkProperties.getRoutes()) linkProperties.addRoute(r);
- }
- if (linkProperties.getDnsServers().size() == 0) {
- for (InetAddress d : orig.linkProperties.getDnsServers()) {
- linkProperties.addDnsServer(d);
- }
+ if (orig == null) return;
+ if (gateway == null) gateway = orig.gateway;
+ if (dnsServers.size() == 0) {
+ dnsServers.addAll(orig.dnsServers);
}
}
@@ -94,15 +88,14 @@ public class DhcpResults implements Parcelable {
}
public void clear() {
- linkProperties.clear();
- serverAddress = null;
+ super.clear();
vendorInfo = null;
leaseDuration = 0;
}
@Override
public String toString() {
- StringBuffer str = new StringBuffer(linkProperties.toString());
+ StringBuffer str = new StringBuffer(super.toString());
str.append(" DHCP server ").append(serverAddress);
str.append(" Vendor info ").append(vendorInfo);
@@ -119,58 +112,19 @@ public class DhcpResults implements Parcelable {
DhcpResults target = (DhcpResults)obj;
- if (linkProperties == null) {
- if (target.linkProperties != null) return false;
- } else if (!linkProperties.equals(target.linkProperties)) return false;
- if (serverAddress == null) {
- if (target.serverAddress != null) return false;
- } else if (!serverAddress.equals(target.serverAddress)) return false;
- if (vendorInfo == null) {
- if (target.vendorInfo != null) return false;
- } else if (!vendorInfo.equals(target.vendorInfo)) return false;
- if (leaseDuration != target.leaseDuration) return false;
-
- return true;
- }
-
- /** Implement the Parcelable interface */
- public int describeContents() {
- return 0;
- }
-
- /** Implement the Parcelable interface */
- public void writeToParcel(Parcel dest, int flags) {
- linkProperties.writeToParcel(dest, flags);
-
- dest.writeInt(leaseDuration);
-
- if (serverAddress != null) {
- dest.writeByte((byte)1);
- dest.writeByteArray(serverAddress.getAddress());
- } else {
- dest.writeByte((byte)0);
- }
-
- dest.writeString(vendorInfo);
+ return super.equals((StaticIpConfiguration) obj) &&
+ Objects.equals(serverAddress, target.serverAddress) &&
+ Objects.equals(vendorInfo, target.vendorInfo) &&
+ leaseDuration == target.leaseDuration;
}
/** Implement the Parcelable interface */
public static final Creator<DhcpResults> CREATOR =
new Creator<DhcpResults>() {
public DhcpResults createFromParcel(Parcel in) {
- DhcpResults prop = new DhcpResults((LinkProperties)in.readParcelable(null));
-
- prop.leaseDuration = in.readInt();
-
- if (in.readByte() == 1) {
- try {
- prop.serverAddress = InetAddress.getByAddress(in.createByteArray());
- } catch (UnknownHostException e) {}
- }
-
- prop.vendorInfo = in.readString();
-
- return prop;
+ DhcpResults dhcpResults = new DhcpResults();
+ readFromParcel(dhcpResults, in);
+ return dhcpResults;
}
public DhcpResults[] newArray(int size) {
@@ -178,33 +132,39 @@ public class DhcpResults implements Parcelable {
}
};
- // Utils for jni population - false on success
- public void setInterfaceName(String interfaceName) {
- linkProperties.setInterfaceName(interfaceName);
+ /** Implement the Parcelable interface */
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeInt(leaseDuration);
+ NetworkUtils.parcelInetAddress(dest, serverAddress, flags);
+ dest.writeString(vendorInfo);
+ }
+
+ private static void readFromParcel(DhcpResults dhcpResults, Parcel in) {
+ StaticIpConfiguration.readFromParcel(dhcpResults, in);
+ dhcpResults.leaseDuration = in.readInt();
+ dhcpResults.serverAddress = NetworkUtils.unparcelInetAddress(in);
+ dhcpResults.vendorInfo = in.readString();
}
- public boolean addLinkAddress(String addrString, int prefixLength) {
- InetAddress addr;
+ // Utils for jni population - false on success
+ // Not part of the superclass because they're only used by the JNI iterface to the DHCP daemon.
+ public boolean setIpAddress(String addrString, int prefixLength) {
try {
- addr = NetworkUtils.numericToInetAddress(addrString);
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "addLinkAddress failed with addrString " + addrString);
+ Inet4Address addr = (Inet4Address) NetworkUtils.numericToInetAddress(addrString);
+ ipAddress = new LinkAddress(addr, prefixLength);
+ } catch (IllegalArgumentException|ClassCastException e) {
+ Log.e(TAG, "setIpAddress failed with addrString " + addrString + "/" + prefixLength);
return true;
}
-
- LinkAddress linkAddress = new LinkAddress(addr, prefixLength);
- linkProperties.addLinkAddress(linkAddress);
-
- RouteInfo routeInfo = new RouteInfo(linkAddress);
- linkProperties.addRoute(routeInfo);
return false;
}
- public boolean addGateway(String addrString) {
+ public boolean setGateway(String addrString) {
try {
- linkProperties.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(addrString)));
+ gateway = NetworkUtils.numericToInetAddress(addrString);
} catch (IllegalArgumentException e) {
- Log.e(TAG, "addGateway failed with addrString " + addrString);
+ Log.e(TAG, "setGateway failed with addrString " + addrString);
return true;
}
return false;
@@ -213,7 +173,7 @@ public class DhcpResults implements Parcelable {
public boolean addDns(String addrString) {
if (TextUtils.isEmpty(addrString) == false) {
try {
- linkProperties.addDnsServer(NetworkUtils.numericToInetAddress(addrString));
+ dnsServers.add(NetworkUtils.numericToInetAddress(addrString));
} catch (IllegalArgumentException e) {
Log.e(TAG, "addDns failed with addrString " + addrString);
return true;
@@ -241,6 +201,6 @@ public class DhcpResults implements Parcelable {
}
public void setDomains(String domains) {
- linkProperties.setDomains(domains);
+ domains = domains;
}
}
diff --git a/core/java/android/net/EthernetManager.java b/core/java/android/net/EthernetManager.java
index 608ca28..d965f27 100644
--- a/core/java/android/net/EthernetManager.java
+++ b/core/java/android/net/EthernetManager.java
@@ -21,7 +21,6 @@ import android.net.IEthernetManager;
import android.net.IpConfiguration;
import android.net.IpConfiguration.IpAssignment;
import android.net.IpConfiguration.ProxySettings;
-import android.net.LinkProperties;
import android.os.RemoteException;
/**
@@ -52,16 +51,12 @@ public class EthernetManager {
*/
public IpConfiguration getConfiguration() {
if (mService == null) {
- return new IpConfiguration(IpAssignment.UNASSIGNED,
- ProxySettings.UNASSIGNED,
- new LinkProperties());
+ return new IpConfiguration();
}
try {
return mService.getConfiguration();
} catch (RemoteException e) {
- return new IpConfiguration(IpAssignment.UNASSIGNED,
- ProxySettings.UNASSIGNED,
- new LinkProperties());
+ return new IpConfiguration();
}
}
diff --git a/core/java/android/net/IpConfiguration.java b/core/java/android/net/IpConfiguration.java
index 4730bab..fe69f29 100644
--- a/core/java/android/net/IpConfiguration.java
+++ b/core/java/android/net/IpConfiguration.java
@@ -16,7 +16,7 @@
package android.net;
-import android.net.LinkProperties;
+import android.net.StaticIpConfiguration;
import android.os.Parcel;
import android.os.Parcelable;
@@ -31,7 +31,7 @@ public class IpConfiguration implements Parcelable {
public enum IpAssignment {
/* Use statically configured IP settings. Configuration can be accessed
- * with linkProperties */
+ * with staticIpConfiguration */
STATIC,
/* Use dynamically configured IP settigns */
DHCP,
@@ -42,12 +42,14 @@ public class IpConfiguration implements Parcelable {
public IpAssignment ipAssignment;
+ public StaticIpConfiguration staticIpConfiguration;
+
public enum ProxySettings {
/* No proxy is to be used. Any existing proxy settings
* should be cleared. */
NONE,
/* Use statically configured proxy. Configuration can be accessed
- * with linkProperties */
+ * with httpProxy. */
STATIC,
/* no proxy details are assigned, this is used to indicate
* that any existing proxy settings should be retained */
@@ -59,30 +61,69 @@ public class IpConfiguration implements Parcelable {
public ProxySettings proxySettings;
- public LinkProperties linkProperties;
+ public ProxyInfo httpProxy;
- public IpConfiguration(IpConfiguration source) {
- if (source != null) {
- ipAssignment = source.ipAssignment;
- proxySettings = source.proxySettings;
- linkProperties = new LinkProperties(source.linkProperties);
- } else {
- ipAssignment = IpAssignment.UNASSIGNED;
- proxySettings = ProxySettings.UNASSIGNED;
- linkProperties = new LinkProperties();
- }
+ private void init(IpAssignment ipAssignment,
+ ProxySettings proxySettings,
+ StaticIpConfiguration staticIpConfiguration,
+ ProxyInfo httpProxy) {
+ this.ipAssignment = ipAssignment;
+ this.proxySettings = proxySettings;
+ this.staticIpConfiguration = (staticIpConfiguration == null) ?
+ null : new StaticIpConfiguration(staticIpConfiguration);
+ this.httpProxy = (httpProxy == null) ?
+ null : new ProxyInfo(httpProxy);
}
public IpConfiguration() {
- this(null);
+ init(IpAssignment.UNASSIGNED, ProxySettings.UNASSIGNED, null, null);
}
public IpConfiguration(IpAssignment ipAssignment,
ProxySettings proxySettings,
- LinkProperties linkProperties) {
+ StaticIpConfiguration staticIpConfiguration,
+ ProxyInfo httpProxy) {
+ init(ipAssignment, proxySettings, staticIpConfiguration, httpProxy);
+ }
+
+ public IpConfiguration(IpConfiguration source) {
+ this();
+ if (source != null) {
+ init(source.ipAssignment, source.proxySettings,
+ source.staticIpConfiguration, source.httpProxy);
+ }
+ }
+
+ public IpAssignment getIpAssignment() {
+ return ipAssignment;
+ }
+
+ public void setIpAssignment(IpAssignment ipAssignment) {
this.ipAssignment = ipAssignment;
+ }
+
+ public StaticIpConfiguration getStaticIpConfiguration() {
+ return staticIpConfiguration;
+ }
+
+ public void setStaticIpConfiguration(StaticIpConfiguration staticIpConfiguration) {
+ this.staticIpConfiguration = staticIpConfiguration;
+ }
+
+ public ProxySettings getProxySettings() {
+ return proxySettings;
+ }
+
+ public void setProxySettings(ProxySettings proxySettings) {
this.proxySettings = proxySettings;
- this.linkProperties = new LinkProperties(linkProperties);
+ }
+
+ public ProxyInfo getHttpProxy() {
+ return httpProxy;
+ }
+
+ public void setHttpProxy(ProxyInfo httpProxy) {
+ this.httpProxy = httpProxy;
}
@Override
@@ -90,10 +131,16 @@ public class IpConfiguration implements Parcelable {
StringBuilder sbuf = new StringBuilder();
sbuf.append("IP assignment: " + ipAssignment.toString());
sbuf.append("\n");
+ if (staticIpConfiguration != null) {
+ sbuf.append("Static configuration: " + staticIpConfiguration.toString());
+ sbuf.append("\n");
+ }
sbuf.append("Proxy settings: " + proxySettings.toString());
sbuf.append("\n");
- sbuf.append(linkProperties.toString());
- sbuf.append("\n");
+ if (httpProxy != null) {
+ sbuf.append("HTTP proxy: " + httpProxy.toString());
+ sbuf.append("\n");
+ }
return sbuf.toString();
}
@@ -111,14 +158,16 @@ public class IpConfiguration implements Parcelable {
IpConfiguration other = (IpConfiguration) o;
return this.ipAssignment == other.ipAssignment &&
this.proxySettings == other.proxySettings &&
- Objects.equals(this.linkProperties, other.linkProperties);
+ Objects.equals(this.staticIpConfiguration, other.staticIpConfiguration) &&
+ Objects.equals(this.httpProxy, other.httpProxy);
}
@Override
public int hashCode() {
- return 13 + (linkProperties != null ? linkProperties.hashCode() : 0) +
+ return 13 + (staticIpConfiguration != null ? staticIpConfiguration.hashCode() : 0) +
17 * ipAssignment.ordinal() +
- 47 * proxySettings.ordinal();
+ 47 * proxySettings.ordinal() +
+ 83 * httpProxy.hashCode();
}
/** Implement the Parcelable interface */
@@ -130,7 +179,8 @@ public class IpConfiguration implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(ipAssignment.name());
dest.writeString(proxySettings.name());
- dest.writeParcelable(linkProperties, flags);
+ dest.writeParcelable(staticIpConfiguration, flags);
+ dest.writeParcelable(httpProxy, flags);
}
/** Implement the Parcelable interface */
@@ -140,7 +190,8 @@ public class IpConfiguration implements Parcelable {
IpConfiguration config = new IpConfiguration();
config.ipAssignment = IpAssignment.valueOf(in.readString());
config.proxySettings = ProxySettings.valueOf(in.readString());
- config.linkProperties = in.readParcelable(null);
+ config.staticIpConfiguration = in.readParcelable(null);
+ config.httpProxy = in.readParcelable(null);
return config;
}
diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java
index 663aa15..54d8676 100644
--- a/core/java/android/net/NetworkUtils.java
+++ b/core/java/android/net/NetworkUtils.java
@@ -23,6 +23,7 @@ import java.net.UnknownHostException;
import java.util.Collection;
import java.util.Locale;
+import android.os.Parcel;
import android.util.Log;
import android.util.Pair;
@@ -203,6 +204,32 @@ public class NetworkUtils {
}
/**
+ * Writes an InetAddress to a parcel. The address may be null. This is likely faster than
+ * calling writeSerializable.
+ */
+ protected static void parcelInetAddress(Parcel parcel, InetAddress address, int flags) {
+ byte[] addressArray = (address != null) ? address.getAddress() : null;
+ parcel.writeByteArray(addressArray);
+ }
+
+ /**
+ * Reads an InetAddress from a parcel. Returns null if the address that was written was null
+ * or if the data is invalid.
+ */
+ protected static InetAddress unparcelInetAddress(Parcel in) {
+ byte[] addressArray = in.createByteArray();
+ if (addressArray == null) {
+ return null;
+ }
+ try {
+ return InetAddress.getByAddress(addressArray);
+ } catch (UnknownHostException e) {
+ return null;
+ }
+ }
+
+
+ /**
* Masks a raw IP address byte array with the specified prefix length.
*/
public static void maskRawAddress(byte[] array, int prefixLength) {
diff --git a/core/java/android/net/StaticIpConfiguration.java b/core/java/android/net/StaticIpConfiguration.java
new file mode 100644
index 0000000..5a273cf
--- /dev/null
+++ b/core/java/android/net/StaticIpConfiguration.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import android.net.LinkAddress;
+import android.os.Parcelable;
+import android.os.Parcel;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Class that describes static IP configuration.
+ *
+ * This class is different from LinkProperties because it represents
+ * configuration intent. The general contract is that if we can represent
+ * a configuration here, then we should be able to configure it on a network.
+ * The intent is that it closely match the UI we have for configuring networks.
+ *
+ * In contrast, LinkProperties represents current state. It is much more
+ * expressive. For example, it supports multiple IP addresses, multiple routes,
+ * stacked interfaces, and so on. Because LinkProperties is so expressive,
+ * using it to represent configuration intent as well as current state causes
+ * problems. For example, we could unknowingly save a configuration that we are
+ * not in fact capable of applying, or we could save a configuration that the
+ * UI cannot display, which has the potential for malicious code to hide
+ * hostile or unexpected configuration from the user: see, for example,
+ * http://b/12663469 and http://b/16893413 .
+ *
+ * @hide
+ */
+public class StaticIpConfiguration implements Parcelable {
+ public LinkAddress ipAddress;
+ public InetAddress gateway;
+ public final ArrayList<InetAddress> dnsServers;
+ public String domains;
+
+ public StaticIpConfiguration() {
+ dnsServers = new ArrayList<InetAddress>();
+ }
+
+ public StaticIpConfiguration(StaticIpConfiguration source) {
+ this();
+ if (source != null) {
+ // All of these except dnsServers are immutable, so no need to make copies.
+ ipAddress = source.ipAddress;
+ gateway = source.gateway;
+ dnsServers.addAll(source.dnsServers);
+ domains = source.domains;
+ }
+ }
+
+ public void clear() {
+ ipAddress = null;
+ gateway = null;
+ dnsServers.clear();
+ domains = null;
+ }
+
+ /**
+ * Returns the network routes specified by this object. Will typically include a
+ * directly-connected route for the IP address's local subnet and a default route.
+ */
+ public List<RouteInfo> getRoutes(String iface) {
+ List<RouteInfo> routes = new ArrayList<RouteInfo>(2);
+ if (ipAddress != null) {
+ routes.add(new RouteInfo(ipAddress, null, iface));
+ }
+ if (gateway != null) {
+ routes.add(new RouteInfo((LinkAddress) null, gateway, iface));
+ }
+ return routes;
+ }
+
+ /**
+ * Returns a LinkProperties object expressing the data in this object. Note that the information
+ * contained in the LinkProperties will not be a complete picture of the link's configuration,
+ * because any configuration information that is obtained dynamically by the network (e.g.,
+ * IPv6 configuration) will not be included.
+ */
+ public LinkProperties toLinkProperties(String iface) {
+ LinkProperties lp = new LinkProperties();
+ lp.setInterfaceName(iface);
+ if (ipAddress != null) {
+ lp.addLinkAddress(ipAddress);
+ }
+ for (RouteInfo route : getRoutes(iface)) {
+ lp.addRoute(route);
+ }
+ for (InetAddress dns : dnsServers) {
+ lp.addDnsServer(dns);
+ }
+ return lp;
+ }
+
+ public String toString() {
+ StringBuffer str = new StringBuffer();
+
+ str.append("IP address ");
+ if (ipAddress != null ) str.append(ipAddress).append(" ");
+
+ str.append("Gateway ");
+ if (gateway != null) str.append(gateway.getHostAddress()).append(" ");
+
+ str.append(" DNS servers: [");
+ for (InetAddress dnsServer : dnsServers) {
+ str.append(" ").append(dnsServer.getHostAddress());
+ }
+
+ str.append(" ] Domains");
+ if (domains != null) str.append(domains);
+ return str.toString();
+ }
+
+ public int hashCode() {
+ int result = 13;
+ result = 47 * result + (ipAddress == null ? 0 : ipAddress.hashCode());
+ result = 47 * result + (gateway == null ? 0 : gateway.hashCode());
+ result = 47 * result + (domains == null ? 0 : domains.hashCode());
+ result = 47 * result + dnsServers.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+
+ if (!(obj instanceof StaticIpConfiguration)) return false;
+
+ StaticIpConfiguration other = (StaticIpConfiguration) obj;
+
+ return other != null &&
+ Objects.equals(ipAddress, other.ipAddress) &&
+ Objects.equals(gateway, other.gateway) &&
+ dnsServers.equals(other.dnsServers) &&
+ Objects.equals(domains, other.domains);
+ }
+
+ /** Implement the Parcelable interface */
+ public static Creator<StaticIpConfiguration> CREATOR =
+ new Creator<StaticIpConfiguration>() {
+ public StaticIpConfiguration createFromParcel(Parcel in) {
+ StaticIpConfiguration s = new StaticIpConfiguration();
+ readFromParcel(s, in);
+ return s;
+ }
+
+ public StaticIpConfiguration[] newArray(int size) {
+ return new StaticIpConfiguration[size];
+ }
+ };
+
+ /** Implement the Parcelable interface */
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface */
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(ipAddress, flags);
+ NetworkUtils.parcelInetAddress(dest, gateway, flags);
+ dest.writeInt(dnsServers.size());
+ for (InetAddress dnsServer : dnsServers) {
+ NetworkUtils.parcelInetAddress(dest, dnsServer, flags);
+ }
+ }
+
+ protected static void readFromParcel(StaticIpConfiguration s, Parcel in) {
+ s.ipAddress = in.readParcelable(null);
+ s.gateway = NetworkUtils.unparcelInetAddress(in);
+ s.dnsServers.clear();
+ int size = in.readInt();
+ for (int i = 0; i < size; i++) {
+ s.dnsServers.add(NetworkUtils.unparcelInetAddress(in));
+ }
+ }
+}
diff --git a/core/jni/android_net_NetUtils.cpp b/core/jni/android_net_NetUtils.cpp
index 32cf286..5bd38f3 100644
--- a/core/jni/android_net_NetUtils.cpp
+++ b/core/jni/android_net_NetUtils.cpp
@@ -69,9 +69,8 @@ namespace android {
*/
static struct fieldIds {
jmethodID clear;
- jmethodID setInterfaceName;
- jmethodID addLinkAddress;
- jmethodID addGateway;
+ jmethodID setIpAddress;
+ jmethodID setGateway;
jmethodID addDns;
jmethodID setDomains;
jmethodID setServerAddress;
@@ -130,21 +129,16 @@ static jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstr
if (result == 0) {
env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear);
- // set mIfaceName
- // dhcpResults->setInterfaceName(ifname)
- env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setInterfaceName, ifname);
-
// set the linkAddress
// dhcpResults->addLinkAddress(inetAddress, prefixLength)
- result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.addLinkAddress,
+ result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setIpAddress,
env->NewStringUTF(ipaddr), prefixLength);
}
if (result == 0) {
// set the gateway
- // dhcpResults->addGateway(gateway)
result = env->CallBooleanMethod(dhcpResults,
- dhcpResultsFieldIds.addGateway, env->NewStringUTF(gateway));
+ dhcpResultsFieldIds.setGateway, env->NewStringUTF(gateway));
}
if (result == 0) {
@@ -279,12 +273,10 @@ int register_android_net_NetworkUtils(JNIEnv* env)
LOG_FATAL_IF(dhcpResultsClass == NULL, "Unable to find class android/net/DhcpResults");
dhcpResultsFieldIds.clear =
env->GetMethodID(dhcpResultsClass, "clear", "()V");
- dhcpResultsFieldIds.setInterfaceName =
- env->GetMethodID(dhcpResultsClass, "setInterfaceName", "(Ljava/lang/String;)V");
- dhcpResultsFieldIds.addLinkAddress =
- env->GetMethodID(dhcpResultsClass, "addLinkAddress", "(Ljava/lang/String;I)Z");
- dhcpResultsFieldIds.addGateway =
- env->GetMethodID(dhcpResultsClass, "addGateway", "(Ljava/lang/String;)Z");
+ dhcpResultsFieldIds.setIpAddress =
+ env->GetMethodID(dhcpResultsClass, "setIpAddress", "(Ljava/lang/String;I)Z");
+ dhcpResultsFieldIds.setGateway =
+ env->GetMethodID(dhcpResultsClass, "setGateway", "(Ljava/lang/String;)Z");
dhcpResultsFieldIds.addDns =
env->GetMethodID(dhcpResultsClass, "addDns", "(Ljava/lang/String;)Z");
dhcpResultsFieldIds.setDomains =
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/AccessPointParserHelper.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/AccessPointParserHelper.java
index 116a31e..93b16e7 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/AccessPointParserHelper.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/AccessPointParserHelper.java
@@ -26,8 +26,8 @@ import org.xml.sax.helpers.DefaultHandler;
import android.net.IpConfiguration.IpAssignment;
import android.net.IpConfiguration.ProxySettings;
import android.net.LinkAddress;
-import android.net.LinkProperties;
import android.net.RouteInfo;
+import android.net.StaticIpConfiguration;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.AuthAlgorithm;
import android.net.wifi.WifiConfiguration.KeyMgmt;
@@ -116,7 +116,7 @@ public class AccessPointParserHelper {
boolean usercert = false;
WifiConfiguration config = null;
int securityType = NONE;
- LinkProperties mLinkProperties = null;
+ StaticIpConfiguration mStaticIpConfiguration = null;
InetAddress mInetAddr = null;
@Override
@@ -153,7 +153,7 @@ public class AccessPointParserHelper {
usercert = true;
}
if (tagName.equalsIgnoreCase("ip")) {
- mLinkProperties = new LinkProperties();
+ mStaticIpConfiguration = new StaticIpConfiguration();
ip = true;
}
if (tagName.equalsIgnoreCase("gateway")) {
@@ -173,15 +173,15 @@ public class AccessPointParserHelper {
@Override
public void endElement(String uri, String localName, String tagName) throws SAXException {
if (tagName.equalsIgnoreCase("accesspoint")) {
- if (mLinkProperties != null) {
+ if (mStaticIpConfiguration != null) {
config.setIpAssignment(IpAssignment.STATIC);
- config.setLinkProperties(mLinkProperties);
+ config.setStaticIpConfiguration(mStaticIpConfiguration);
} else {
config.setIpAssignment(IpAssignment.DHCP);
}
config.setProxySettings(ProxySettings.NONE);
networks.add(config);
- mLinkProperties = null;
+ mStaticIpConfiguration = null;
}
}
@@ -312,7 +312,7 @@ public class AccessPointParserHelper {
if (!InetAddress.isNumeric(gwAddr)) {
throw new SAXException();
}
- mLinkProperties.addRoute(new RouteInfo(InetAddress.getByName(gwAddr)));
+ mStaticIpConfiguration.gateway = InetAddress.getByName(gwAddr);
} catch (UnknownHostException e) {
throw new SAXException();
}
@@ -324,7 +324,7 @@ public class AccessPointParserHelper {
if ((nwPrefixLength < 0) || (nwPrefixLength > 32)) {
throw new SAXException();
}
- mLinkProperties.addLinkAddress(new LinkAddress(mInetAddr, nwPrefixLength));
+ mStaticIpConfiguration.ipAddress = new LinkAddress(mInetAddr, nwPrefixLength);
} catch (NumberFormatException e) {
throw new SAXException();
}
@@ -336,7 +336,7 @@ public class AccessPointParserHelper {
if (!InetAddress.isNumeric(dnsAddr)) {
throw new SAXException();
}
- mLinkProperties.addDnsServer(InetAddress.getByName(dnsAddr));
+ mStaticIpConfiguration.dnsServers.add(InetAddress.getByName(dnsAddr));
} catch (UnknownHostException e) {
throw new SAXException();
}
@@ -348,7 +348,7 @@ public class AccessPointParserHelper {
if (!InetAddress.isNumeric(dnsAddr)) {
throw new SAXException();
}
- mLinkProperties.addDnsServer(InetAddress.getByName(dnsAddr));
+ mStaticIpConfiguration.dnsServers.add(InetAddress.getByName(dnsAddr));
} catch (UnknownHostException e) {
throw new SAXException();
}
diff --git a/services/core/java/com/android/server/net/IpConfigStore.java b/services/core/java/com/android/server/net/IpConfigStore.java
index 907eeb2..857b9e9 100644
--- a/services/core/java/com/android/server/net/IpConfigStore.java
+++ b/services/core/java/com/android/server/net/IpConfigStore.java
@@ -20,10 +20,10 @@ import android.net.IpConfiguration;
import android.net.IpConfiguration.IpAssignment;
import android.net.IpConfiguration.ProxySettings;
import android.net.LinkAddress;
-import android.net.LinkProperties;
import android.net.NetworkUtils;
import android.net.ProxyInfo;
import android.net.RouteInfo;
+import android.net.StaticIpConfiguration;
import android.os.Handler;
import android.os.HandlerThread;
import android.text.TextUtils;
@@ -41,6 +41,7 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
+import java.net.Inet4Address;
import java.util.Map;
public class IpConfigStore {
@@ -69,40 +70,32 @@ public class IpConfigStore {
}
private boolean writeConfig(DataOutputStream out, int configKey,
- IpConfiguration config) throws IOException {
+ IpConfiguration config) throws IOException {
boolean written = false;
try {
- LinkProperties linkProperties = config.linkProperties;
switch (config.ipAssignment) {
case STATIC:
out.writeUTF(IP_ASSIGNMENT_KEY);
out.writeUTF(config.ipAssignment.toString());
- for (LinkAddress linkAddr : linkProperties.getLinkAddresses()) {
- out.writeUTF(LINK_ADDRESS_KEY);
- out.writeUTF(linkAddr.getAddress().getHostAddress());
- out.writeInt(linkAddr.getPrefixLength());
- }
- for (RouteInfo route : linkProperties.getRoutes()) {
- out.writeUTF(GATEWAY_KEY);
- LinkAddress dest = route.getDestinationLinkAddress();
- if (dest != null) {
- out.writeInt(1);
- out.writeUTF(dest.getAddress().getHostAddress());
- out.writeInt(dest.getPrefixLength());
- } else {
- out.writeInt(0);
+ StaticIpConfiguration staticIpConfiguration = config.staticIpConfiguration;
+ if (staticIpConfiguration != null) {
+ if (staticIpConfiguration.ipAddress != null) {
+ LinkAddress ipAddress = staticIpConfiguration.ipAddress;
+ out.writeUTF(LINK_ADDRESS_KEY);
+ out.writeUTF(ipAddress.getAddress().getHostAddress());
+ out.writeInt(ipAddress.getPrefixLength());
}
- if (route.getGateway() != null) {
- out.writeInt(1);
- out.writeUTF(route.getGateway().getHostAddress());
- } else {
- out.writeInt(0);
+ if (staticIpConfiguration.gateway != null) {
+ out.writeUTF(GATEWAY_KEY);
+ out.writeInt(0); // Default route.
+ out.writeInt(1); // Have a gateway.
+ out.writeUTF(staticIpConfiguration.gateway.getHostAddress());
+ }
+ for (InetAddress inetAddr : staticIpConfiguration.dnsServers) {
+ out.writeUTF(DNS_KEY);
+ out.writeUTF(inetAddr.getHostAddress());
}
- }
- for (InetAddress inetAddr : linkProperties.getDnsServers()) {
- out.writeUTF(DNS_KEY);
- out.writeUTF(inetAddr.getHostAddress());
}
written = true;
break;
@@ -121,7 +114,7 @@ public class IpConfigStore {
switch (config.proxySettings) {
case STATIC:
- ProxyInfo proxyProperties = linkProperties.getHttpProxy();
+ ProxyInfo proxyProperties = config.httpProxy;
String exclusionList = proxyProperties.getExclusionListAsString();
out.writeUTF(PROXY_SETTINGS_KEY);
out.writeUTF(config.proxySettings.toString());
@@ -134,7 +127,7 @@ public class IpConfigStore {
written = true;
break;
case PAC:
- ProxyInfo proxyPacProperties = linkProperties.getHttpProxy();
+ ProxyInfo proxyPacProperties = config.httpProxy;
out.writeUTF(PROXY_SETTINGS_KEY);
out.writeUTF(config.proxySettings.toString());
out.writeUTF(PROXY_PAC_FILE);
@@ -159,7 +152,7 @@ public class IpConfigStore {
out.writeInt(configKey);
}
} catch (NullPointerException e) {
- loge("Failure in writing " + config.linkProperties + e);
+ loge("Failure in writing " + config + e);
}
out.writeUTF(EOS);
@@ -196,7 +189,7 @@ public class IpConfigStore {
// Default is DHCP with no proxy
IpAssignment ipAssignment = IpAssignment.DHCP;
ProxySettings proxySettings = ProxySettings.NONE;
- LinkProperties linkProperties = new LinkProperties();
+ StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration();
String proxyHost = null;
String pacFileUrl = null;
int proxyPort = -1;
@@ -213,13 +206,23 @@ public class IpConfigStore {
} else if (key.equals(LINK_ADDRESS_KEY)) {
LinkAddress linkAddr = new LinkAddress(
NetworkUtils.numericToInetAddress(in.readUTF()), in.readInt());
- linkProperties.addLinkAddress(linkAddr);
+ if (linkAddr.getAddress() instanceof Inet4Address &&
+ staticIpConfiguration.ipAddress == null) {
+ staticIpConfiguration.ipAddress = linkAddr;
+ } else {
+ loge("Non-IPv4 or duplicate address: " + linkAddr);
+ }
} else if (key.equals(GATEWAY_KEY)) {
LinkAddress dest = null;
InetAddress gateway = null;
if (version == 1) {
// only supported default gateways - leave the dest/prefix empty
gateway = NetworkUtils.numericToInetAddress(in.readUTF());
+ if (staticIpConfiguration.gateway == null) {
+ staticIpConfiguration.gateway = gateway;
+ } else {
+ loge("Duplicate gateway: " + gateway.getHostAddress());
+ }
} else {
if (in.readInt() == 1) {
dest = new LinkAddress(
@@ -229,10 +232,16 @@ public class IpConfigStore {
if (in.readInt() == 1) {
gateway = NetworkUtils.numericToInetAddress(in.readUTF());
}
+ RouteInfo route = new RouteInfo(dest, gateway);
+ if (route.isIPv4Default() &&
+ staticIpConfiguration.gateway == null) {
+ staticIpConfiguration.gateway = gateway;
+ } else {
+ loge("Non-IPv4 default or duplicate route: " + route);
+ }
}
- linkProperties.addRoute(new RouteInfo(dest, gateway));
} else if (key.equals(DNS_KEY)) {
- linkProperties.addDnsServer(
+ staticIpConfiguration.dnsServers.add(
NetworkUtils.numericToInetAddress(in.readUTF()));
} else if (key.equals(PROXY_SETTINGS_KEY)) {
proxySettings = ProxySettings.valueOf(in.readUTF());
@@ -258,9 +267,11 @@ public class IpConfigStore {
IpConfiguration config = new IpConfiguration();
networks.put(id, config);
- config.linkProperties = linkProperties;
switch (ipAssignment) {
case STATIC:
+ config.staticIpConfiguration = staticIpConfiguration;
+ config.ipAssignment = ipAssignment;
+ break;
case DHCP:
config.ipAssignment = ipAssignment;
break;
@@ -276,16 +287,15 @@ public class IpConfigStore {
switch (proxySettings) {
case STATIC:
- config.proxySettings = proxySettings;
- ProxyInfo ProxyInfo =
+ ProxyInfo proxyInfo =
new ProxyInfo(proxyHost, proxyPort, exclusionList);
- linkProperties.setHttpProxy(ProxyInfo);
+ config.proxySettings = proxySettings;
+ config.httpProxy = proxyInfo;
break;
case PAC:
+ ProxyInfo proxyPacProperties = new ProxyInfo(pacFileUrl);
config.proxySettings = proxySettings;
- ProxyInfo proxyPacProperties =
- new ProxyInfo(pacFileUrl);
- linkProperties.setHttpProxy(proxyPacProperties);
+ config.httpProxy = proxyPacProperties;
break;
case NONE:
config.proxySettings = proxySettings;
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 3c37b94..ac2a176 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -21,7 +21,7 @@ import android.net.IpConfiguration;
import android.net.IpConfiguration.ProxySettings;
import android.net.IpConfiguration.IpAssignment;
import android.net.ProxyInfo;
-import android.net.LinkProperties;
+import android.net.StaticIpConfiguration;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -1096,13 +1096,13 @@ public class WifiConfiguration implements Parcelable {
}
/** @hide */
- public LinkProperties getLinkProperties() {
- return mIpConfiguration.linkProperties;
+ public StaticIpConfiguration getStaticIpConfiguration() {
+ return mIpConfiguration.getStaticIpConfiguration();
}
/** @hide */
- public void setLinkProperties(LinkProperties linkProperties) {
- mIpConfiguration.linkProperties = linkProperties;
+ public void setStaticIpConfiguration(StaticIpConfiguration staticIpConfiguration) {
+ mIpConfiguration.setStaticIpConfiguration(staticIpConfiguration);
}
/** @hide */
@@ -1126,9 +1126,19 @@ public class WifiConfiguration implements Parcelable {
}
/** @hide */
+ public ProxyInfo getHttpProxy() {
+ return mIpConfiguration.httpProxy;
+ }
+
+ /** @hide */
+ public void setHttpProxy(ProxyInfo httpProxy) {
+ mIpConfiguration.httpProxy = httpProxy;
+ }
+
+ /** @hide */
public void setProxy(ProxySettings settings, ProxyInfo proxy) {
mIpConfiguration.proxySettings = settings;
- mIpConfiguration.linkProperties.setHttpProxy(proxy);
+ mIpConfiguration.httpProxy = proxy;
}
/** Implement the Parcelable interface {@hide} */