Loading core/java/android/net/LinkProperties.java +110 −27 Original line number Diff line number Diff line Loading @@ -52,11 +52,26 @@ import java.util.Collections; public class LinkProperties implements Parcelable { String mIfaceName; private Collection<LinkAddress> mLinkAddresses; private Collection<InetAddress> mDnses; private Collection<RouteInfo> mRoutes; private Collection<LinkAddress> mLinkAddresses = new ArrayList<LinkAddress>(); private Collection<InetAddress> mDnses = new ArrayList<InetAddress>(); private Collection<RouteInfo> mRoutes = new ArrayList<RouteInfo>(); private ProxyProperties mHttpProxy; public static class CompareAddressesResult { public ArrayList<LinkAddress> removed = new ArrayList<LinkAddress>(); public ArrayList<LinkAddress> added = new ArrayList<LinkAddress>(); @Override public String toString() { String retVal = "removedAddresses=["; for (LinkAddress addr : removed) retVal += addr.toString() + ","; retVal += "] addedAddresses=["; for (LinkAddress addr : added) retVal += addr.toString() + ","; retVal += "]"; return retVal; } } public LinkProperties() { clear(); } Loading Loading @@ -121,9 +136,9 @@ public class LinkProperties implements Parcelable { public void clear() { mIfaceName = null; mLinkAddresses = new ArrayList<LinkAddress>(); mDnses = new ArrayList<InetAddress>(); mRoutes = new ArrayList<RouteInfo>(); mLinkAddresses.clear(); mDnses.clear(); mRoutes.clear(); mHttpProxy = null; } Loading Loading @@ -155,6 +170,63 @@ public class LinkProperties implements Parcelable { return ifaceName + linkAddresses + routes + dns + proxy; } /** * Compares this {@code LinkProperties} interface name against the target * * @param target LinkProperties to compare. * @return {@code true} if both are identical, {@code false} otherwise. */ public boolean isIdenticalInterfaceName(LinkProperties target) { return TextUtils.equals(getInterfaceName(), target.getInterfaceName()); } /** * Compares this {@code LinkProperties} interface name against the target * * @param target LinkProperties to compare. * @return {@code true} if both are identical, {@code false} otherwise. */ public boolean isIdenticalAddresses(LinkProperties target) { Collection<InetAddress> targetAddresses = target.getAddresses(); Collection<InetAddress> sourceAddresses = getAddresses(); return (sourceAddresses.size() == targetAddresses.size()) ? sourceAddresses.containsAll(targetAddresses) : false; } /** * Compares this {@code LinkProperties} DNS addresses against the target * * @param target LinkProperties to compare. * @return {@code true} if both are identical, {@code false} otherwise. */ public boolean isIdenticalDnses(LinkProperties target) { Collection<InetAddress> targetDnses = target.getDnses(); return (mDnses.size() == targetDnses.size()) ? mDnses.containsAll(targetDnses) : false; } /** * Compares this {@code LinkProperties} Routes against the target * * @param target LinkProperties to compare. * @return {@code true} if both are identical, {@code false} otherwise. */ public boolean isIdenticalRoutes(LinkProperties target) { Collection<RouteInfo> targetRoutes = target.getRoutes(); return (mRoutes.size() == targetRoutes.size()) ? mRoutes.containsAll(targetRoutes) : false; } /** * Compares this {@code LinkProperties} HttpProxy against the target * * @param target LinkProperties to compare. * @return {@code true} if both are identical, {@code false} otherwise. */ public boolean isIdenticalHttpProxy(LinkProperties target) { return getHttpProxy() == null ? target.getHttpProxy() == null : getHttpProxy().equals(target.getHttpProxy()); } @Override /** Loading @@ -176,30 +248,41 @@ public class LinkProperties implements Parcelable { if (!(obj instanceof LinkProperties)) return false; boolean sameAddresses; boolean sameDnses; boolean sameRoutes; LinkProperties target = (LinkProperties) obj; Collection<InetAddress> targetAddresses = target.getAddresses(); Collection<InetAddress> sourceAddresses = getAddresses(); sameAddresses = (sourceAddresses.size() == targetAddresses.size()) ? sourceAddresses.containsAll(targetAddresses) : false; Collection<InetAddress> targetDnses = target.getDnses(); sameDnses = (mDnses.size() == targetDnses.size()) ? mDnses.containsAll(targetDnses) : false; Collection<RouteInfo> targetRoutes = target.getRoutes(); sameRoutes = (mRoutes.size() == targetRoutes.size()) ? mRoutes.containsAll(targetRoutes) : false; return isIdenticalInterfaceName(target) && isIdenticalAddresses(target) && isIdenticalDnses(target) && isIdenticalRoutes(target) && isIdenticalHttpProxy(target); } return sameAddresses && sameDnses && sameRoutes && TextUtils.equals(getInterfaceName(), target.getInterfaceName()) && (getHttpProxy() == null ? target.getHttpProxy() == null : getHttpProxy().equals(target.getHttpProxy())); /** * Return two lists, a list of addresses that would be removed from * mLinkAddresses and a list of addresses that would be added to * mLinkAddress which would then result in target and mLinkAddresses * being the same list. * * @param target is a new list of addresses * @return the removed and added lists. */ public CompareAddressesResult compareAddresses(LinkProperties target) { /* * Duplicate the LinkAddresses into removed, we will be removing * address which are common between mLinkAddresses and target * leaving the addresses that are different. And address which * are in target but not in mLinkAddresses are placed in the * addedAddresses. */ CompareAddressesResult result = new CompareAddressesResult(); result.removed = new ArrayList<LinkAddress>(mLinkAddresses); result.added.clear(); for (LinkAddress newAddress : target.getLinkAddresses()) { if (! result.removed.remove(newAddress)) { result.added.add(newAddress); } } return result; } @Override Loading services/java/com/android/server/ConnectivityService.java +54 −5 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.net.EthernetDataTracker; import android.net.IConnectivityManager; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.LinkProperties.CompareAddressesResult; import android.net.MobileDataStateTracker; import android.net.NetworkConfig; import android.net.NetworkInfo; Loading Loading @@ -61,6 +62,7 @@ import java.io.FileDescriptor; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.net.Inet6Address; import java.net.InetAddress; import java.net.Inet4Address; import java.net.UnknownHostException; Loading @@ -76,6 +78,7 @@ import java.util.List; public class ConnectivityService extends IConnectivityManager.Stub { private static final boolean DBG = true; private static final boolean VDBG = true; private static final String TAG = "ConnectivityService"; // how long to wait before switching back to a radio's default network Loading @@ -98,6 +101,11 @@ public class ConnectivityService extends IConnectivityManager.Stub { */ private NetworkStateTracker mNetTrackers[]; /** * The link properties that define the current links */ private LinkProperties mCurrentLinkProperties[]; /** * A per Net list of the PID's that requested access to the net * used both as a refcount and for per-PID DNS selection Loading Loading @@ -302,6 +310,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { mNetTrackers = new NetworkStateTracker[ ConnectivityManager.MAX_NETWORK_TYPE+1]; mCurrentLinkProperties = new LinkProperties[ConnectivityManager.MAX_NETWORK_TYPE+1]; mNetworkPreference = getPersistedNetworkPreference(); Loading Loading @@ -442,6 +451,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { mNetConfigs[netType].radio); continue; } mCurrentLinkProperties[netType] = mNetTrackers[netType].getLinkProperties(); } mTethering = new Tethering(mContext, mHandler.getLooper()); Loading Loading @@ -1409,6 +1419,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { * right routing table entries exist. */ private void handleConnectivityChange(int netType, boolean doReset) { int resetMask = doReset ? NetworkUtils.RESET_ALL_ADDRESSES : 0; /* * If a non-default network is enabled, add the host routes that * will allow it's DNS servers to be accessed. Loading @@ -1416,6 +1428,45 @@ public class ConnectivityService extends IConnectivityManager.Stub { handleDnsConfigurationChange(netType); if (mNetTrackers[netType].getNetworkInfo().isConnected()) { LinkProperties newLp = mNetTrackers[netType].getLinkProperties(); LinkProperties curLp = mCurrentLinkProperties[netType]; mCurrentLinkProperties[netType] = newLp; if (VDBG) { log("handleConnectivityChange: changed linkProperty[" + netType + "]:" + " doReset=" + doReset + " resetMask=" + resetMask + "\n curLp=" + curLp + "\n newLp=" + newLp); } if (curLp.isIdenticalInterfaceName(newLp)) { CompareAddressesResult car = curLp.compareAddresses(newLp); if ((car.removed.size() != 0) || (car.added.size() != 0)) { for (LinkAddress linkAddr : car.removed) { if (linkAddr.getAddress() instanceof Inet4Address) { resetMask |= NetworkUtils.RESET_IPV4_ADDRESSES; } if (linkAddr.getAddress() instanceof Inet6Address) { resetMask |= NetworkUtils.RESET_IPV6_ADDRESSES; } } if (DBG) { log("handleConnectivityChange: addresses changed" + " linkProperty[" + netType + "]:" + " resetMask=" + resetMask + "\n car=" + car); } } else { if (DBG) { log("handleConnectivityChange: address are the same reset per doReset" + " linkProperty[" + netType + "]:" + " resetMask=" + resetMask); } } } else { resetMask = NetworkUtils.RESET_ALL_ADDRESSES; log("handleConnectivityChange: interface not not equivalent reset both" + " linkProperty[" + netType + "]:" + " resetMask=" + resetMask); } if (mNetConfigs[netType].isDefault()) { handleApplyDefaultProxy(netType); addDefaultRoute(mNetTrackers[netType]); Loading @@ -1430,15 +1481,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { } } if (doReset) { if (doReset || resetMask != 0) { LinkProperties linkProperties = mNetTrackers[netType].getLinkProperties(); if (linkProperties != null) { String iface = linkProperties.getInterfaceName(); if (TextUtils.isEmpty(iface) == false) { if (DBG) { log("resetConnections(" + iface + ", NetworkUtils.RESET_ALL_ADDRESSES)"); } NetworkUtils.resetConnections(iface, NetworkUtils.RESET_ALL_ADDRESSES); if (DBG) log("resetConnections(" + iface + ", " + resetMask + ")"); NetworkUtils.resetConnections(iface, resetMask); } } } Loading telephony/java/com/android/internal/telephony/DataCallState.java +1 −1 Original line number Diff line number Diff line Loading @@ -52,7 +52,7 @@ public class DataCallState { /** * Class returned by onSetupConnectionCompleted. */ protected enum SetupResult { public enum SetupResult { SUCCESS, ERR_BadCommand, ERR_UnacceptableParameter, Loading telephony/java/com/android/internal/telephony/DataConnection.java +35 −47 Original line number Diff line number Diff line Loading @@ -17,30 +17,25 @@ package com.android.internal.telephony; import com.android.internal.telephony.DataCallState.SetupResult; import com.android.internal.util.AsyncChannel; import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import android.app.PendingIntent; import android.net.LinkAddress; import android.net.LinkCapabilities; import android.net.LinkProperties; import android.net.NetworkUtils; import android.net.LinkProperties.CompareAddressesResult; import android.net.ProxyProperties; import android.os.AsyncResult; import android.os.Bundle; import android.os.Message; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemProperties; import android.text.TextUtils; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * {@hide} Loading Loading @@ -497,8 +492,7 @@ public abstract class DataConnection extends StateMachine { } else { if (DBG) log("onSetupConnectionCompleted received DataCallState: " + response); cid = response.cid; // set link properties based on data call response result = setLinkProperties(response, mLinkProperties); result = updateLinkProperty(response).setupResult; } return result; Loading Loading @@ -527,48 +521,41 @@ public abstract class DataConnection extends StateMachine { return response.setLinkProperties(lp, okToUseSystemPropertyDns); } private DataConnectionAc.LinkPropertyChangeAction updateLinkProperty( DataCallState newState) { DataConnectionAc.LinkPropertyChangeAction changed = DataConnectionAc.LinkPropertyChangeAction.NONE; public static class UpdateLinkPropertyResult { public DataCallState.SetupResult setupResult = DataCallState.SetupResult.SUCCESS; public LinkProperties oldLp; public LinkProperties newLp; public UpdateLinkPropertyResult(LinkProperties curLp) { oldLp = curLp; newLp = curLp; } } private UpdateLinkPropertyResult updateLinkProperty(DataCallState newState) { UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties); if (newState == null) return changed; if (newState == null) return result; DataCallState.SetupResult result; LinkProperties newLp = new LinkProperties(); DataCallState.SetupResult setupResult; result.newLp = new LinkProperties(); // set link properties based on data call response result = setLinkProperties(newState, newLp); if (result != DataCallState.SetupResult.SUCCESS) { if (DBG) log("UpdateLinkProperty failed : " + result); return changed; result.setupResult = setLinkProperties(newState, result.newLp); if (result.setupResult != DataCallState.SetupResult.SUCCESS) { if (DBG) log("updateLinkProperty failed : " + result.setupResult); return result; } // copy HTTP proxy as it is not part DataCallState. newLp.setHttpProxy(mLinkProperties.getHttpProxy()); result.newLp.setHttpProxy(mLinkProperties.getHttpProxy()); if (DBG) log("old LP=" + mLinkProperties); if (DBG) log("new LP=" + newLp); // Check consistency of link address. Currently we expect // only one "global" address is assigned per each IP type. Collection<LinkAddress> oLinks = mLinkProperties.getLinkAddresses(); Collection<LinkAddress> nLinks = newLp.getLinkAddresses(); for (LinkAddress oldLink : oLinks) { for (LinkAddress newLink : nLinks) { if ((NetworkUtils.addressTypeMatches(oldLink.getAddress(), newLink.getAddress())) && (oldLink.equals(newLink) == false)) { return DataConnectionAc.LinkPropertyChangeAction.RESET; } } if (DBG && (! result.oldLp.equals(result.newLp))) { if (DBG) log("updateLinkProperty old != new"); if (VDBG) log("updateLinkProperty old LP=" + result.oldLp); if (VDBG) log("updateLinkProperty new LP=" + result.newLp); } mLinkProperties = result.newLp; if (mLinkProperties == null || !mLinkProperties.equals(newLp)) { mLinkProperties = newLp; changed = DataConnectionAc.LinkPropertyChangeAction.CHANGED; } return changed; return result; } /** Loading Loading @@ -643,14 +630,15 @@ public abstract class DataConnection extends StateMachine { } case DataConnectionAc.REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE: { DataCallState newState = (DataCallState) msg.obj; DataConnectionAc.LinkPropertyChangeAction action = updateLinkProperty(newState); UpdateLinkPropertyResult result = updateLinkProperty(newState); if (VDBG) { log("REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE action=" + action + " newState=" + newState); log("REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE result=" + result + " newState=" + newState); } mAc.replyToMessage(msg, DataConnectionAc.RSP_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE, action.ordinal()); result); break; } case DataConnectionAc.REQ_GET_LINK_CAPABILITIES: { Loading Loading @@ -688,7 +676,7 @@ public abstract class DataConnection extends StateMachine { case DataConnectionAc.REQ_GET_APNCONTEXT_LIST: { if (VDBG) log("REQ_GET_APNCONTEXT_LIST num in list=" + mApnList.size()); mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_APNCONTEXT_LIST, new ArrayList(mApnList)); new ArrayList<ApnContext>(mApnList)); break; } case DataConnectionAc.REQ_SET_RECONNECT_INTENT: { Loading telephony/java/com/android/internal/telephony/DataConnectionAc.java +8 −6 Original line number Diff line number Diff line Loading @@ -16,12 +16,14 @@ package com.android.internal.telephony; import com.android.internal.telephony.DataConnection.UpdateLinkPropertyResult; import com.android.internal.util.AsyncChannel; import com.android.internal.util.Protocol; import android.app.PendingIntent; import android.net.LinkCapabilities; import android.net.LinkProperties; import android.net.LinkProperties.CompareAddressesResult; import android.net.ProxyProperties; import android.os.Message; Loading Loading @@ -310,18 +312,18 @@ public class DataConnectionAc extends AsyncChannel { if (DBG) log("reqUpdateLinkPropertiesDataCallState"); } public LinkPropertyChangeAction rspUpdateLinkPropertiesDataCallState(Message response) { LinkPropertyChangeAction retVal = LinkPropertyChangeAction.fromInt(response.arg1); if (DBG) log("rspUpdateLinkPropertiesState=" + retVal); public UpdateLinkPropertyResult rspUpdateLinkPropertiesDataCallState(Message response) { UpdateLinkPropertyResult retVal = (UpdateLinkPropertyResult)response.obj; if (DBG) log("rspUpdateLinkPropertiesState: retVal=" + retVal); return retVal; } /** * Update link properties in the data connection * * @return true if link property has been updated. false otherwise. * @return the removed and added addresses. */ public LinkPropertyChangeAction updateLinkPropertiesDataCallStateSync(DataCallState newState) { public UpdateLinkPropertyResult updateLinkPropertiesDataCallStateSync(DataCallState newState) { Message response = sendMessageSynchronously(REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE, newState); if ((response != null) && Loading @@ -329,7 +331,7 @@ public class DataConnectionAc extends AsyncChannel { return rspUpdateLinkPropertiesDataCallState(response); } else { log("getLinkProperties error response=" + response); return LinkPropertyChangeAction.NONE; return new UpdateLinkPropertyResult(new LinkProperties()); } } Loading Loading
core/java/android/net/LinkProperties.java +110 −27 Original line number Diff line number Diff line Loading @@ -52,11 +52,26 @@ import java.util.Collections; public class LinkProperties implements Parcelable { String mIfaceName; private Collection<LinkAddress> mLinkAddresses; private Collection<InetAddress> mDnses; private Collection<RouteInfo> mRoutes; private Collection<LinkAddress> mLinkAddresses = new ArrayList<LinkAddress>(); private Collection<InetAddress> mDnses = new ArrayList<InetAddress>(); private Collection<RouteInfo> mRoutes = new ArrayList<RouteInfo>(); private ProxyProperties mHttpProxy; public static class CompareAddressesResult { public ArrayList<LinkAddress> removed = new ArrayList<LinkAddress>(); public ArrayList<LinkAddress> added = new ArrayList<LinkAddress>(); @Override public String toString() { String retVal = "removedAddresses=["; for (LinkAddress addr : removed) retVal += addr.toString() + ","; retVal += "] addedAddresses=["; for (LinkAddress addr : added) retVal += addr.toString() + ","; retVal += "]"; return retVal; } } public LinkProperties() { clear(); } Loading Loading @@ -121,9 +136,9 @@ public class LinkProperties implements Parcelable { public void clear() { mIfaceName = null; mLinkAddresses = new ArrayList<LinkAddress>(); mDnses = new ArrayList<InetAddress>(); mRoutes = new ArrayList<RouteInfo>(); mLinkAddresses.clear(); mDnses.clear(); mRoutes.clear(); mHttpProxy = null; } Loading Loading @@ -155,6 +170,63 @@ public class LinkProperties implements Parcelable { return ifaceName + linkAddresses + routes + dns + proxy; } /** * Compares this {@code LinkProperties} interface name against the target * * @param target LinkProperties to compare. * @return {@code true} if both are identical, {@code false} otherwise. */ public boolean isIdenticalInterfaceName(LinkProperties target) { return TextUtils.equals(getInterfaceName(), target.getInterfaceName()); } /** * Compares this {@code LinkProperties} interface name against the target * * @param target LinkProperties to compare. * @return {@code true} if both are identical, {@code false} otherwise. */ public boolean isIdenticalAddresses(LinkProperties target) { Collection<InetAddress> targetAddresses = target.getAddresses(); Collection<InetAddress> sourceAddresses = getAddresses(); return (sourceAddresses.size() == targetAddresses.size()) ? sourceAddresses.containsAll(targetAddresses) : false; } /** * Compares this {@code LinkProperties} DNS addresses against the target * * @param target LinkProperties to compare. * @return {@code true} if both are identical, {@code false} otherwise. */ public boolean isIdenticalDnses(LinkProperties target) { Collection<InetAddress> targetDnses = target.getDnses(); return (mDnses.size() == targetDnses.size()) ? mDnses.containsAll(targetDnses) : false; } /** * Compares this {@code LinkProperties} Routes against the target * * @param target LinkProperties to compare. * @return {@code true} if both are identical, {@code false} otherwise. */ public boolean isIdenticalRoutes(LinkProperties target) { Collection<RouteInfo> targetRoutes = target.getRoutes(); return (mRoutes.size() == targetRoutes.size()) ? mRoutes.containsAll(targetRoutes) : false; } /** * Compares this {@code LinkProperties} HttpProxy against the target * * @param target LinkProperties to compare. * @return {@code true} if both are identical, {@code false} otherwise. */ public boolean isIdenticalHttpProxy(LinkProperties target) { return getHttpProxy() == null ? target.getHttpProxy() == null : getHttpProxy().equals(target.getHttpProxy()); } @Override /** Loading @@ -176,30 +248,41 @@ public class LinkProperties implements Parcelable { if (!(obj instanceof LinkProperties)) return false; boolean sameAddresses; boolean sameDnses; boolean sameRoutes; LinkProperties target = (LinkProperties) obj; Collection<InetAddress> targetAddresses = target.getAddresses(); Collection<InetAddress> sourceAddresses = getAddresses(); sameAddresses = (sourceAddresses.size() == targetAddresses.size()) ? sourceAddresses.containsAll(targetAddresses) : false; Collection<InetAddress> targetDnses = target.getDnses(); sameDnses = (mDnses.size() == targetDnses.size()) ? mDnses.containsAll(targetDnses) : false; Collection<RouteInfo> targetRoutes = target.getRoutes(); sameRoutes = (mRoutes.size() == targetRoutes.size()) ? mRoutes.containsAll(targetRoutes) : false; return isIdenticalInterfaceName(target) && isIdenticalAddresses(target) && isIdenticalDnses(target) && isIdenticalRoutes(target) && isIdenticalHttpProxy(target); } return sameAddresses && sameDnses && sameRoutes && TextUtils.equals(getInterfaceName(), target.getInterfaceName()) && (getHttpProxy() == null ? target.getHttpProxy() == null : getHttpProxy().equals(target.getHttpProxy())); /** * Return two lists, a list of addresses that would be removed from * mLinkAddresses and a list of addresses that would be added to * mLinkAddress which would then result in target and mLinkAddresses * being the same list. * * @param target is a new list of addresses * @return the removed and added lists. */ public CompareAddressesResult compareAddresses(LinkProperties target) { /* * Duplicate the LinkAddresses into removed, we will be removing * address which are common between mLinkAddresses and target * leaving the addresses that are different. And address which * are in target but not in mLinkAddresses are placed in the * addedAddresses. */ CompareAddressesResult result = new CompareAddressesResult(); result.removed = new ArrayList<LinkAddress>(mLinkAddresses); result.added.clear(); for (LinkAddress newAddress : target.getLinkAddresses()) { if (! result.removed.remove(newAddress)) { result.added.add(newAddress); } } return result; } @Override Loading
services/java/com/android/server/ConnectivityService.java +54 −5 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.net.EthernetDataTracker; import android.net.IConnectivityManager; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.LinkProperties.CompareAddressesResult; import android.net.MobileDataStateTracker; import android.net.NetworkConfig; import android.net.NetworkInfo; Loading Loading @@ -61,6 +62,7 @@ import java.io.FileDescriptor; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.net.Inet6Address; import java.net.InetAddress; import java.net.Inet4Address; import java.net.UnknownHostException; Loading @@ -76,6 +78,7 @@ import java.util.List; public class ConnectivityService extends IConnectivityManager.Stub { private static final boolean DBG = true; private static final boolean VDBG = true; private static final String TAG = "ConnectivityService"; // how long to wait before switching back to a radio's default network Loading @@ -98,6 +101,11 @@ public class ConnectivityService extends IConnectivityManager.Stub { */ private NetworkStateTracker mNetTrackers[]; /** * The link properties that define the current links */ private LinkProperties mCurrentLinkProperties[]; /** * A per Net list of the PID's that requested access to the net * used both as a refcount and for per-PID DNS selection Loading Loading @@ -302,6 +310,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { mNetTrackers = new NetworkStateTracker[ ConnectivityManager.MAX_NETWORK_TYPE+1]; mCurrentLinkProperties = new LinkProperties[ConnectivityManager.MAX_NETWORK_TYPE+1]; mNetworkPreference = getPersistedNetworkPreference(); Loading Loading @@ -442,6 +451,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { mNetConfigs[netType].radio); continue; } mCurrentLinkProperties[netType] = mNetTrackers[netType].getLinkProperties(); } mTethering = new Tethering(mContext, mHandler.getLooper()); Loading Loading @@ -1409,6 +1419,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { * right routing table entries exist. */ private void handleConnectivityChange(int netType, boolean doReset) { int resetMask = doReset ? NetworkUtils.RESET_ALL_ADDRESSES : 0; /* * If a non-default network is enabled, add the host routes that * will allow it's DNS servers to be accessed. Loading @@ -1416,6 +1428,45 @@ public class ConnectivityService extends IConnectivityManager.Stub { handleDnsConfigurationChange(netType); if (mNetTrackers[netType].getNetworkInfo().isConnected()) { LinkProperties newLp = mNetTrackers[netType].getLinkProperties(); LinkProperties curLp = mCurrentLinkProperties[netType]; mCurrentLinkProperties[netType] = newLp; if (VDBG) { log("handleConnectivityChange: changed linkProperty[" + netType + "]:" + " doReset=" + doReset + " resetMask=" + resetMask + "\n curLp=" + curLp + "\n newLp=" + newLp); } if (curLp.isIdenticalInterfaceName(newLp)) { CompareAddressesResult car = curLp.compareAddresses(newLp); if ((car.removed.size() != 0) || (car.added.size() != 0)) { for (LinkAddress linkAddr : car.removed) { if (linkAddr.getAddress() instanceof Inet4Address) { resetMask |= NetworkUtils.RESET_IPV4_ADDRESSES; } if (linkAddr.getAddress() instanceof Inet6Address) { resetMask |= NetworkUtils.RESET_IPV6_ADDRESSES; } } if (DBG) { log("handleConnectivityChange: addresses changed" + " linkProperty[" + netType + "]:" + " resetMask=" + resetMask + "\n car=" + car); } } else { if (DBG) { log("handleConnectivityChange: address are the same reset per doReset" + " linkProperty[" + netType + "]:" + " resetMask=" + resetMask); } } } else { resetMask = NetworkUtils.RESET_ALL_ADDRESSES; log("handleConnectivityChange: interface not not equivalent reset both" + " linkProperty[" + netType + "]:" + " resetMask=" + resetMask); } if (mNetConfigs[netType].isDefault()) { handleApplyDefaultProxy(netType); addDefaultRoute(mNetTrackers[netType]); Loading @@ -1430,15 +1481,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { } } if (doReset) { if (doReset || resetMask != 0) { LinkProperties linkProperties = mNetTrackers[netType].getLinkProperties(); if (linkProperties != null) { String iface = linkProperties.getInterfaceName(); if (TextUtils.isEmpty(iface) == false) { if (DBG) { log("resetConnections(" + iface + ", NetworkUtils.RESET_ALL_ADDRESSES)"); } NetworkUtils.resetConnections(iface, NetworkUtils.RESET_ALL_ADDRESSES); if (DBG) log("resetConnections(" + iface + ", " + resetMask + ")"); NetworkUtils.resetConnections(iface, resetMask); } } } Loading
telephony/java/com/android/internal/telephony/DataCallState.java +1 −1 Original line number Diff line number Diff line Loading @@ -52,7 +52,7 @@ public class DataCallState { /** * Class returned by onSetupConnectionCompleted. */ protected enum SetupResult { public enum SetupResult { SUCCESS, ERR_BadCommand, ERR_UnacceptableParameter, Loading
telephony/java/com/android/internal/telephony/DataConnection.java +35 −47 Original line number Diff line number Diff line Loading @@ -17,30 +17,25 @@ package com.android.internal.telephony; import com.android.internal.telephony.DataCallState.SetupResult; import com.android.internal.util.AsyncChannel; import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import android.app.PendingIntent; import android.net.LinkAddress; import android.net.LinkCapabilities; import android.net.LinkProperties; import android.net.NetworkUtils; import android.net.LinkProperties.CompareAddressesResult; import android.net.ProxyProperties; import android.os.AsyncResult; import android.os.Bundle; import android.os.Message; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemProperties; import android.text.TextUtils; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * {@hide} Loading Loading @@ -497,8 +492,7 @@ public abstract class DataConnection extends StateMachine { } else { if (DBG) log("onSetupConnectionCompleted received DataCallState: " + response); cid = response.cid; // set link properties based on data call response result = setLinkProperties(response, mLinkProperties); result = updateLinkProperty(response).setupResult; } return result; Loading Loading @@ -527,48 +521,41 @@ public abstract class DataConnection extends StateMachine { return response.setLinkProperties(lp, okToUseSystemPropertyDns); } private DataConnectionAc.LinkPropertyChangeAction updateLinkProperty( DataCallState newState) { DataConnectionAc.LinkPropertyChangeAction changed = DataConnectionAc.LinkPropertyChangeAction.NONE; public static class UpdateLinkPropertyResult { public DataCallState.SetupResult setupResult = DataCallState.SetupResult.SUCCESS; public LinkProperties oldLp; public LinkProperties newLp; public UpdateLinkPropertyResult(LinkProperties curLp) { oldLp = curLp; newLp = curLp; } } private UpdateLinkPropertyResult updateLinkProperty(DataCallState newState) { UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties); if (newState == null) return changed; if (newState == null) return result; DataCallState.SetupResult result; LinkProperties newLp = new LinkProperties(); DataCallState.SetupResult setupResult; result.newLp = new LinkProperties(); // set link properties based on data call response result = setLinkProperties(newState, newLp); if (result != DataCallState.SetupResult.SUCCESS) { if (DBG) log("UpdateLinkProperty failed : " + result); return changed; result.setupResult = setLinkProperties(newState, result.newLp); if (result.setupResult != DataCallState.SetupResult.SUCCESS) { if (DBG) log("updateLinkProperty failed : " + result.setupResult); return result; } // copy HTTP proxy as it is not part DataCallState. newLp.setHttpProxy(mLinkProperties.getHttpProxy()); result.newLp.setHttpProxy(mLinkProperties.getHttpProxy()); if (DBG) log("old LP=" + mLinkProperties); if (DBG) log("new LP=" + newLp); // Check consistency of link address. Currently we expect // only one "global" address is assigned per each IP type. Collection<LinkAddress> oLinks = mLinkProperties.getLinkAddresses(); Collection<LinkAddress> nLinks = newLp.getLinkAddresses(); for (LinkAddress oldLink : oLinks) { for (LinkAddress newLink : nLinks) { if ((NetworkUtils.addressTypeMatches(oldLink.getAddress(), newLink.getAddress())) && (oldLink.equals(newLink) == false)) { return DataConnectionAc.LinkPropertyChangeAction.RESET; } } if (DBG && (! result.oldLp.equals(result.newLp))) { if (DBG) log("updateLinkProperty old != new"); if (VDBG) log("updateLinkProperty old LP=" + result.oldLp); if (VDBG) log("updateLinkProperty new LP=" + result.newLp); } mLinkProperties = result.newLp; if (mLinkProperties == null || !mLinkProperties.equals(newLp)) { mLinkProperties = newLp; changed = DataConnectionAc.LinkPropertyChangeAction.CHANGED; } return changed; return result; } /** Loading Loading @@ -643,14 +630,15 @@ public abstract class DataConnection extends StateMachine { } case DataConnectionAc.REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE: { DataCallState newState = (DataCallState) msg.obj; DataConnectionAc.LinkPropertyChangeAction action = updateLinkProperty(newState); UpdateLinkPropertyResult result = updateLinkProperty(newState); if (VDBG) { log("REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE action=" + action + " newState=" + newState); log("REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE result=" + result + " newState=" + newState); } mAc.replyToMessage(msg, DataConnectionAc.RSP_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE, action.ordinal()); result); break; } case DataConnectionAc.REQ_GET_LINK_CAPABILITIES: { Loading Loading @@ -688,7 +676,7 @@ public abstract class DataConnection extends StateMachine { case DataConnectionAc.REQ_GET_APNCONTEXT_LIST: { if (VDBG) log("REQ_GET_APNCONTEXT_LIST num in list=" + mApnList.size()); mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_APNCONTEXT_LIST, new ArrayList(mApnList)); new ArrayList<ApnContext>(mApnList)); break; } case DataConnectionAc.REQ_SET_RECONNECT_INTENT: { Loading
telephony/java/com/android/internal/telephony/DataConnectionAc.java +8 −6 Original line number Diff line number Diff line Loading @@ -16,12 +16,14 @@ package com.android.internal.telephony; import com.android.internal.telephony.DataConnection.UpdateLinkPropertyResult; import com.android.internal.util.AsyncChannel; import com.android.internal.util.Protocol; import android.app.PendingIntent; import android.net.LinkCapabilities; import android.net.LinkProperties; import android.net.LinkProperties.CompareAddressesResult; import android.net.ProxyProperties; import android.os.Message; Loading Loading @@ -310,18 +312,18 @@ public class DataConnectionAc extends AsyncChannel { if (DBG) log("reqUpdateLinkPropertiesDataCallState"); } public LinkPropertyChangeAction rspUpdateLinkPropertiesDataCallState(Message response) { LinkPropertyChangeAction retVal = LinkPropertyChangeAction.fromInt(response.arg1); if (DBG) log("rspUpdateLinkPropertiesState=" + retVal); public UpdateLinkPropertyResult rspUpdateLinkPropertiesDataCallState(Message response) { UpdateLinkPropertyResult retVal = (UpdateLinkPropertyResult)response.obj; if (DBG) log("rspUpdateLinkPropertiesState: retVal=" + retVal); return retVal; } /** * Update link properties in the data connection * * @return true if link property has been updated. false otherwise. * @return the removed and added addresses. */ public LinkPropertyChangeAction updateLinkPropertiesDataCallStateSync(DataCallState newState) { public UpdateLinkPropertyResult updateLinkPropertiesDataCallStateSync(DataCallState newState) { Message response = sendMessageSynchronously(REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE, newState); if ((response != null) && Loading @@ -329,7 +331,7 @@ public class DataConnectionAc extends AsyncChannel { return rspUpdateLinkPropertiesDataCallState(response); } else { log("getLinkProperties error response=" + response); return LinkPropertyChangeAction.NONE; return new UpdateLinkPropertyResult(new LinkProperties()); } } Loading