diff --git a/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java b/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java index 731d5e673926d..a491ffccad1f1 100644 --- a/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java +++ b/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java @@ -27,28 +27,38 @@ public class ConnectivityServiceChangeEvent extends IpConnectivityEvent implemen // The ID of the network that has become the new default or NETID_UNSET if none. private final int mNetId; - // The ID of the network that was the default before or NETID_UNSET if none. - private final int mPrevNetId; // The list of transport types of the new default network, for example TRANSPORT_WIFI, as // defined in NetworkCapabilities.java. private final int[] mTransportTypes; + // The ID of the network that was the default before or NETID_UNSET if none. + private final int mPrevNetId; + // Whether the previous network had IPv4/IPv6 connectivity. + private final boolean mPrevIPv4; + private final boolean mPrevIPv6; - public ConnectivityServiceChangeEvent(int netId, int prevNetId, int[] transportTypes) { + public ConnectivityServiceChangeEvent(int netId, int[] transportTypes, + int prevNetId, boolean prevIPv4, boolean prevIPv6) { mNetId = netId; - mPrevNetId = prevNetId; mTransportTypes = transportTypes; + mPrevNetId = prevNetId; + mPrevIPv4 = prevIPv4; + mPrevIPv6 = prevIPv6; } public ConnectivityServiceChangeEvent(Parcel in) { mNetId = in.readInt(); - mPrevNetId = in.readInt(); mTransportTypes = in.createIntArray(); + mPrevNetId = in.readInt(); + mPrevIPv4 = (in.readByte() > 0); + mPrevIPv6 = (in.readByte() > 0); } public void writeToParcel(Parcel out, int flags) { out.writeInt(mNetId); - out.writeInt(mPrevNetId); out.writeIntArray(mTransportTypes); + out.writeInt(mPrevNetId); + out.writeByte(mPrevIPv4 ? (byte) 1 : (byte) 0); + out.writeByte(mPrevIPv6 ? (byte) 1 : (byte) 0); } public static final Parcelable.Creator CREATOR @@ -62,8 +72,10 @@ public class ConnectivityServiceChangeEvent extends IpConnectivityEvent implemen } }; - public static void logEvent(int netId, int prevNetId, int[] transportTypes) { + public static void logEvent(int netId, int[] transportTypes, + int prevNetId, boolean prevIPv4, boolean prevIPv6) { IpConnectivityEvent.logEvent(IpConnectivityEvent.IPCE_CONSRV_DEFAULT_NET_CHANGE, - new ConnectivityServiceChangeEvent(netId, prevNetId, transportTypes)); + new ConnectivityServiceChangeEvent( + netId, transportTypes, prevNetId, prevIPv4, prevIPv6)); } }; diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index d8b3a97de3788..e5fe03a06f625 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2208,9 +2208,7 @@ public class ConnectivityService extends IConnectivityManager.Stub rematchAllNetworksAndRequests(null, 0); if (wasDefault && getDefaultNetwork() == null) { // Log that we lost the default network and there is no replacement. - final int[] transportTypes = new int[0]; - ConnectivityServiceChangeEvent.logEvent(NETID_UNSET, nai.network.netId, - transportTypes); + logConnectivityServiceChangeEvent(null, nai); } if (nai.created) { // Tell netd to clean up the configuration for this network @@ -4434,7 +4432,6 @@ public class ConnectivityService extends IConnectivityManager.Stub } private void makeDefault(NetworkAgentInfo newNetwork, NetworkAgentInfo prevNetwork) { - int prevNetId = (prevNetwork == null) ? NETID_UNSET : prevNetwork.network.netId; if (DBG) log("Switching to new default network: " + newNetwork); setupDataActivityTracking(newNetwork); try { @@ -4446,8 +4443,8 @@ public class ConnectivityService extends IConnectivityManager.Stub handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy()); updateTcpBufferSizes(newNetwork); setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers()); - ConnectivityServiceChangeEvent.logEvent(newNetwork.network.netId, prevNetId, - newNetwork.networkCapabilities.getTransportTypes()); + + logConnectivityServiceChangeEvent(newNetwork, prevNetwork); } // Handles a network appearing or improving its score. @@ -5068,4 +5065,22 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkAgentInfo nai, NetworkRequest defaultRequest) { return new NetworkMonitor(context, handler, nai, defaultRequest); } + + private static void logConnectivityServiceChangeEvent( + NetworkAgentInfo next, NetworkAgentInfo prev) { + final int newNetId = (next == null) ? NETID_UNSET : next.network.netId; + final int[] newTransportTypes = (next == null) + ? new int[0] + : next.networkCapabilities.getTransportTypes(); + + final int oldNetId = (prev == null) ? NETID_UNSET : prev.network.netId; + final boolean hadIPv4 = (prev != null) && + prev.linkProperties.hasIPv4Address() && + prev.linkProperties.hasIPv4DefaultRoute(); + final boolean hadIPv6 = (prev != null) && + prev.linkProperties.hasGlobalIPv6Address() && + prev.linkProperties.hasIPv6DefaultRoute(); + ConnectivityServiceChangeEvent.logEvent(newNetId, newTransportTypes, + oldNetId, hadIPv4, hadIPv6); + } }