diff options
author | Irfan Sheriff <isheriff@google.com> | 2010-10-01 16:08:28 -0700 |
---|---|---|
committer | Irfan Sheriff <isheriff@google.com> | 2010-10-06 11:04:05 -0700 |
commit | ed5d7d17c9e9837ce7a6a10698cce9f6e4101acd (patch) | |
tree | f92135dd4aea005231596dc69a813a88eb1ebf63 | |
parent | 32e60fbea7888dcc4cb9612f27674888bb56f9c3 (diff) | |
download | frameworks_base-ed5d7d17c9e9837ce7a6a10698cce9f6e4101acd.zip frameworks_base-ed5d7d17c9e9837ce7a6a10698cce9f6e4101acd.tar.gz frameworks_base-ed5d7d17c9e9837ce7a6a10698cce9f6e4101acd.tar.bz2 |
Add LinkAddress
LinkAddress stores IP address + prefix for a network link
Change-Id: Id3e74e9d0a62121d097ebdc9be064eeea257ba1f
-rw-r--r-- | core/java/android/net/LinkAddress.aidl | 21 | ||||
-rw-r--r-- | core/java/android/net/LinkAddress.java | 149 | ||||
-rw-r--r-- | core/java/android/net/LinkProperties.java | 65 | ||||
-rw-r--r-- | services/java/com/android/server/TelephonyRegistry.java | 4 | ||||
-rw-r--r-- | telephony/java/com/android/internal/telephony/DataConnection.java | 34 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiStateMachine.java | 18 |
6 files changed, 231 insertions, 60 deletions
diff --git a/core/java/android/net/LinkAddress.aidl b/core/java/android/net/LinkAddress.aidl new file mode 100644 index 0000000..e7d8646 --- /dev/null +++ b/core/java/android/net/LinkAddress.aidl @@ -0,0 +1,21 @@ +/** + * + * Copyright (C) 2010 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; + +parcelable LinkAddress; + diff --git a/core/java/android/net/LinkAddress.java b/core/java/android/net/LinkAddress.java new file mode 100644 index 0000000..cb302da --- /dev/null +++ b/core/java/android/net/LinkAddress.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2010 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.os.Parcel; +import android.os.Parcelable; + +import java.net.InetAddress; +import java.net.InterfaceAddress; +import java.net.UnknownHostException; + +/** + * Identifies an address of a network link + * @hide + */ +public class LinkAddress implements Parcelable { + /** + * IPv4 or IPv6 address. + */ + private final InetAddress address; + + /** + * Network prefix + */ + private final int prefix; + + public LinkAddress(InetAddress address, InetAddress mask) { + this.address = address; + this.prefix = computeprefix(mask); + } + + public LinkAddress(InetAddress address, int prefix) { + this.address = address; + this.prefix = prefix; + } + + public LinkAddress(InterfaceAddress interfaceAddress) { + this.address = interfaceAddress.getAddress(); + this.prefix = interfaceAddress.getNetworkPrefixLength(); + } + + private static int computeprefix(InetAddress mask) { + int count = 0; + for (byte b : mask.getAddress()) { + for (int i = 0; i < 8; ++i) { + if ((b & (1 << i)) != 0) { + ++count; + } + } + } + return count; + } + + @Override + public String toString() { + return (address == null ? "" : (address.getHostAddress() + "/" + prefix)); + } + + /** + * Compares this {@code LinkAddress} instance against the specified address + * in {@code obj}. Two addresses are equal if their InetAddress and prefix + * are equal + * + * @param obj the object to be tested for equality. + * @return {@code true} if both objects are equal, {@code false} otherwise. + */ + @Override + public boolean equals(Object obj) { + if (!(obj instanceof LinkAddress)) { + return false; + } + LinkAddress linkAddress = (LinkAddress) obj; + return this.address.equals(linkAddress.address) && + this.prefix == linkAddress.prefix; + } + + /** + * Returns the InetAddress for this address. + */ + public InetAddress getAddress() { + return address; + } + + /** + * Get network prefix length + */ + public int getNetworkPrefix() { + return prefix; + } + + /** + * Implement the Parcelable interface + * @hide + */ + public int describeContents() { + return 0; + } + + /** + * Implement the Parcelable interface. + * @hide + */ + public void writeToParcel(Parcel dest, int flags) { + if (address != null) { + dest.writeByte((byte)1); + dest.writeByteArray(address.getAddress()); + dest.writeInt(prefix); + } else { + dest.writeByte((byte)0); + } + } + + /** + * Implement the Parcelable interface. + * @hide + */ + public static final Creator<LinkAddress> CREATOR = + new Creator<LinkAddress>() { + public LinkAddress createFromParcel(Parcel in) { + InetAddress address = null; + int prefix = 0; + if (in.readByte() == 1) { + try { + address = InetAddress.getByAddress(in.createByteArray()); + prefix = in.readInt(); + } catch (UnknownHostException e) { } + } + return new LinkAddress(address, prefix); + } + + public LinkAddress[] newArray(int size) { + return new LinkAddress[size]; + } + }; +} diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index f411eac..f1545ea 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -36,8 +36,8 @@ import java.util.Collections; */ public class LinkProperties implements Parcelable { - private NetworkInterface mIface; - private Collection<InetAddress> mAddresses; + String mIfaceName; + private Collection<LinkAddress> mLinkAddresses; private Collection<InetAddress> mDnses; private InetAddress mGateway; private ProxyProperties mHttpProxy; @@ -49,34 +49,42 @@ public class LinkProperties implements Parcelable { // copy constructor instead of clone public LinkProperties(LinkProperties source) { if (source != null) { - mIface = source.getInterface(); - mAddresses = source.getAddresses(); + mIfaceName = source.getInterfaceName(); + mLinkAddresses = source.getLinkAddresses(); mDnses = source.getDnses(); mGateway = source.getGateway(); mHttpProxy = new ProxyProperties(source.getHttpProxy()); } } - public void setInterface(NetworkInterface iface) { - mIface = iface; - } - public NetworkInterface getInterface() { - return mIface; + public void setInterfaceName(String iface) { + mIfaceName = iface; } + public String getInterfaceName() { - return (mIface == null ? null : mIface.getName()); + return mIfaceName; } - public void addAddress(InetAddress address) { - mAddresses.add(address); - } public Collection<InetAddress> getAddresses() { - return Collections.unmodifiableCollection(mAddresses); + Collection<InetAddress> addresses = new ArrayList<InetAddress>(); + for (LinkAddress linkAddress : mLinkAddresses) { + addresses.add(linkAddress.getAddress()); + } + return Collections.unmodifiableCollection(addresses); + } + + public void addLinkAddress(LinkAddress address) { + mLinkAddresses.add(address); + } + + public Collection<LinkAddress> getLinkAddresses() { + return Collections.unmodifiableCollection(mLinkAddresses); } public void addDns(InetAddress dns) { mDnses.add(dns); } + public Collection<InetAddress> getDnses() { return Collections.unmodifiableCollection(mDnses); } @@ -96,8 +104,8 @@ public class LinkProperties implements Parcelable { } public void clear() { - mIface = null; - mAddresses = new ArrayList<InetAddress>(); + mIfaceName = null; + mLinkAddresses = new ArrayList<LinkAddress>(); mDnses = new ArrayList<InetAddress>(); mGateway = null; mHttpProxy = null; @@ -113,11 +121,11 @@ public class LinkProperties implements Parcelable { @Override public String toString() { - String ifaceName = (mIface == null ? "" : "InterfaceName: " + mIface.getName() + " "); + String ifaceName = (mIfaceName == null ? "" : "InterfaceName: " + mIfaceName + " "); - String ip = "IpAddresses: ["; - for (InetAddress addr : mAddresses) ip += addr.getHostAddress() + ","; - ip += "] "; + String linkAddresses = "LinkAddresses: ["; + for (LinkAddress addr : mLinkAddresses) linkAddresses += addr.toString(); + linkAddresses += "] "; String dns = "DnsAddresses: ["; for (InetAddress addr : mDnses) dns += addr.getHostAddress() + ","; @@ -126,7 +134,7 @@ public class LinkProperties implements Parcelable { String proxy = (mHttpProxy == null ? "" : "HttpProxy: " + mHttpProxy.toString() + " "); String gateway = (mGateway == null ? "" : "Gateway: " + mGateway.getHostAddress() + " "); - return ifaceName + ip + gateway + dns + proxy; + return ifaceName + linkAddresses + gateway + dns + proxy; } /** @@ -135,12 +143,11 @@ public class LinkProperties implements Parcelable { */ public void writeToParcel(Parcel dest, int flags) { dest.writeString(getInterfaceName()); - dest.writeInt(mAddresses.size()); - //TODO: explore an easy alternative to preserve hostname - // without doing a lookup - for(InetAddress a : mAddresses) { - dest.writeByteArray(a.getAddress()); + dest.writeInt(mLinkAddresses.size()); + for(LinkAddress linkAddress : mLinkAddresses) { + dest.writeParcelable(linkAddress, flags); } + dest.writeInt(mDnses.size()); for(InetAddress d : mDnses) { dest.writeByteArray(d.getAddress()); @@ -170,16 +177,14 @@ public class LinkProperties implements Parcelable { String iface = in.readString(); if (iface != null) { try { - netProp.setInterface(NetworkInterface.getByName(iface)); + netProp.setInterfaceName(iface); } catch (Exception e) { return null; } } int addressCount = in.readInt(); for (int i=0; i<addressCount; i++) { - try { - netProp.addAddress(InetAddress.getByAddress(in.createByteArray())); - } catch (UnknownHostException e) { } + netProp.addLinkAddress((LinkAddress)in.readParcelable(null)); } addressCount = in.readInt(); for (int i=0; i<addressCount; i++) { diff --git a/services/java/com/android/server/TelephonyRegistry.java b/services/java/com/android/server/TelephonyRegistry.java index a33b7c2..2b4845b 100644 --- a/services/java/com/android/server/TelephonyRegistry.java +++ b/services/java/com/android/server/TelephonyRegistry.java @@ -584,9 +584,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } if (linkProperties != null) { intent.putExtra(Phone.DATA_LINK_PROPERTIES_KEY, linkProperties); - NetworkInterface iface = linkProperties.getInterface(); + String iface = linkProperties.getInterfaceName(); if (iface != null) { - intent.putExtra(Phone.DATA_IFACE_NAME_KEY, iface.getName()); + intent.putExtra(Phone.DATA_IFACE_NAME_KEY, iface); } } if (linkCapabilities != null) { diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java index 3030481..185d413 100644 --- a/telephony/java/com/android/internal/telephony/DataConnection.java +++ b/telephony/java/com/android/internal/telephony/DataConnection.java @@ -21,6 +21,7 @@ import com.android.internal.telephony.gsm.ApnSetting; import com.android.internal.util.HierarchicalState; import com.android.internal.util.HierarchicalStateMachine; +import android.net.LinkAddress; import android.net.LinkCapabilities; import android.net.LinkProperties; import android.os.AsyncResult; @@ -29,10 +30,10 @@ import android.os.SystemProperties; import android.util.EventLog; import java.net.InetAddress; +import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; -import java.util.HashMap; /** * {@hide} @@ -68,7 +69,7 @@ import java.util.HashMap; * EVENT_GET_LAST_FAIL_DONE, * EVENT_DEACTIVATE_DONE. * } - * ++ # mInactiveState + * ++ # mInactiveState * e(doNotifications) * x(clearNotifications) { * EVENT_RESET { notifiyDisconnectCompleted }. @@ -428,26 +429,25 @@ public abstract class DataConnection extends HierarchicalStateMachine { try { String prefix = "net." + interfaceName + "."; - linkProperties.setInterface(NetworkInterface.getByName(interfaceName)); + NetworkInterface networkInterface = NetworkInterface.getByName(interfaceName); + linkProperties.setInterfaceName(interfaceName); // TODO: Get gateway and dns via RIL interface not property? String gatewayAddress = SystemProperties.get(prefix + "gw"); linkProperties.setGateway(InetAddress.getByName(gatewayAddress)); - if (response.length > 2) { - String ipAddress = response[2]; - linkProperties.addAddress(InetAddress.getByName(ipAddress)); - - // TODO: Get gateway and dns via RIL interface not property? - String dnsServers[] = new String[2]; - dnsServers[0] = SystemProperties.get(prefix + "dns1"); - dnsServers[1] = SystemProperties.get(prefix + "dns2"); - if (isDnsOk(dnsServers)) { - linkProperties.addDns(InetAddress.getByName(dnsServers[0])); - linkProperties.addDns(InetAddress.getByName(dnsServers[1])); - } else { - result = SetupResult.ERR_BadDns; - } + for (InterfaceAddress addr : networkInterface.getInterfaceAddresses()) { + linkProperties.addLinkAddress(new LinkAddress(addr)); + } + // TODO: Get gateway and dns via RIL interface not property? + String dnsServers[] = new String[2]; + dnsServers[0] = SystemProperties.get(prefix + "dns1"); + dnsServers[1] = SystemProperties.get(prefix + "dns2"); + if (isDnsOk(dnsServers)) { + linkProperties.addDns(InetAddress.getByName(dnsServers[0])); + linkProperties.addDns(InetAddress.getByName(dnsServers[1])); + } else { + result = SetupResult.ERR_BadDns; } } catch (UnknownHostException e1) { log("onSetupCompleted: UnknowHostException " + e1); diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index 6c5aa1d..572abc0 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java @@ -38,6 +38,7 @@ import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLING; import static android.net.wifi.WifiManager.WIFI_AP_STATE_FAILED; import android.app.ActivityManagerNative; +import android.net.LinkAddress; import android.net.NetworkInfo; import android.net.DhcpInfo; import android.net.NetworkUtils; @@ -1252,19 +1253,14 @@ public class WifiStateMachine extends HierarchicalStateMachine { } private void configureLinkProperties() { - try { - mLinkProperties.setInterface(NetworkInterface.getByName(mInterfaceName)); - } catch (SocketException e) { - Log.e(TAG, "SocketException creating NetworkInterface from " + mInterfaceName + - ". e=" + e); - return; - } catch (NullPointerException e) { - Log.e(TAG, "NPE creating NetworkInterface. e=" + e); - return; - } + + mLinkProperties.setInterfaceName(mInterfaceName); + // TODO - fix this for v6 synchronized (mDhcpInfo) { - mLinkProperties.addAddress(NetworkUtils.intToInetAddress(mDhcpInfo.ipAddress)); + mLinkProperties.addLinkAddress(new LinkAddress( + NetworkUtils.intToInetAddress(mDhcpInfo.ipAddress), + NetworkUtils.intToInetAddress(mDhcpInfo.netmask))); mLinkProperties.setGateway(NetworkUtils.intToInetAddress(mDhcpInfo.gateway)); mLinkProperties.addDns(NetworkUtils.intToInetAddress(mDhcpInfo.dns1)); mLinkProperties.addDns(NetworkUtils.intToInetAddress(mDhcpInfo.dns2)); |