Merge "Add initial connectivity metrics handling." into nyc-dev
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index b1398f1..d88ddfd 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -71,6 +71,7 @@
import android.net.RouteInfo;
import android.net.UidRange;
import android.net.Uri;
+import android.net.metrics.ConnectivityServiceChangeEvent;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -4511,6 +4512,7 @@
private void makeDefault(NetworkAgentInfo newNetwork) {
if (DBG) log("Switching to new default network: " + newNetwork);
+ ConnectivityServiceChangeEvent.logEvent(newNetwork.network.netId);
setupDataActivityTracking(newNetwork);
try {
mNetd.setDefaultNetId(newNetwork.network.netId);
@@ -5141,5 +5143,4 @@
NetworkAgentInfo nai, NetworkRequest defaultRequest) {
return new NetworkMonitor(context, handler, nai, defaultRequest);
}
-
}
diff --git a/services/core/java/com/android/server/connectivity/MetricsLoggerService.java b/services/core/java/com/android/server/connectivity/MetricsLoggerService.java
index f6dc9b9..7cac227 100644
--- a/services/core/java/com/android/server/connectivity/MetricsLoggerService.java
+++ b/services/core/java/com/android/server/connectivity/MetricsLoggerService.java
@@ -60,7 +60,7 @@
private long mLastSentEventTimeMillis = System.currentTimeMillis();
private final void enforceConnectivityInternalPermission() {
- getContext().enforceCallingPermission(
+ getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.CONNECTIVITY_INTERNAL,
"MetricsLoggerService");
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index bce7733..bbb162e 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -34,6 +34,8 @@
import android.net.ProxyInfo;
import android.net.TrafficStats;
import android.net.Uri;
+import android.net.metrics.CaptivePortalCheckResultEvent;
+import android.net.metrics.CaptivePortalStateChangeEvent;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
@@ -297,9 +299,13 @@
transitionTo(mLingeringState);
return HANDLED;
case CMD_NETWORK_CONNECTED:
+ CaptivePortalStateChangeEvent.logEvent(
+ CaptivePortalStateChangeEvent.NETWORK_MONITOR_CONNECTED);
transitionTo(mEvaluatingState);
return HANDLED;
case CMD_NETWORK_DISCONNECTED:
+ CaptivePortalStateChangeEvent.logEvent(
+ CaptivePortalStateChangeEvent.NETWORK_MONITOR_DISCONNECTED);
if (mLaunchCaptivePortalAppBroadcastReceiver != null) {
mContext.unregisterReceiver(mLaunchCaptivePortalAppBroadcastReceiver);
mLaunchCaptivePortalAppBroadcastReceiver = null;
@@ -349,6 +355,8 @@
private class ValidatedState extends State {
@Override
public void enter() {
+ CaptivePortalStateChangeEvent.logEvent(
+ CaptivePortalStateChangeEvent.NETWORK_MONITOR_VALIDATED);
mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED,
NETWORK_TEST_RESULT_VALID, 0, mNetworkAgentInfo));
}
@@ -457,6 +465,8 @@
// will be unresponsive. isCaptivePortal() could be executed on another Thread
// if this is found to cause problems.
int httpResponseCode = isCaptivePortal();
+ CaptivePortalCheckResultEvent.logEvent(mNetworkAgentInfo.network.netId,
+ httpResponseCode);
if (httpResponseCode == 204) {
transitionTo(mValidatedState);
} else if (httpResponseCode >= 200 && httpResponseCode <= 399) {
diff --git a/services/net/java/android/net/dhcp/DhcpClient.java b/services/net/java/android/net/dhcp/DhcpClient.java
index e2562cd..9955f6c 100644
--- a/services/net/java/android/net/dhcp/DhcpClient.java
+++ b/services/net/java/android/net/dhcp/DhcpClient.java
@@ -30,6 +30,8 @@
import android.net.InterfaceConfiguration;
import android.net.LinkAddress;
import android.net.NetworkUtils;
+import android.net.metrics.IpConnectivityEvent;
+import android.net.metrics.DhcpClientEvent;
import android.os.IBinder;
import android.os.INetworkManagementService;
import android.os.Message;
@@ -355,11 +357,15 @@
if (!stopped) {
Log.e(TAG, "Read error", e);
}
+ DhcpClientEvent.logEvent(IpConnectivityEvent.IPCE_DHCP_RECV_ERROR,
+ mIfaceName, e.getMessage());
} catch (DhcpPacket.ParseException e) {
Log.e(TAG, "Can't parse packet: " + e.getMessage());
if (PACKET_DBG) {
Log.d(TAG, HexDump.dumpHexString(mPacket, 0, length));
}
+ DhcpClientEvent.logEvent(IpConnectivityEvent.IPCE_DHCP_PARSE_ERROR, mIfaceName,
+ e.getMessage());
}
}
if (DBG) Log.d(TAG, "Receive thread stopped");
@@ -456,7 +462,9 @@
abstract class LoggingState extends State {
public void enter() {
- if (STATE_DBG) Log.d(TAG, "Entering state " + getName());
+ String msg = "Entering state " + getName();
+ if (STATE_DBG) Log.d(TAG, msg);
+ DhcpClientEvent.logEvent(IpConnectivityEvent.IPCE_DHCP_STATE_CHANGE, mIfaceName, msg);
}
private String messageName(int what) {
diff --git a/services/net/java/android/net/ip/IpReachabilityMonitor.java b/services/net/java/android/net/ip/IpReachabilityMonitor.java
index 5b4fd50..af3175a 100644
--- a/services/net/java/android/net/ip/IpReachabilityMonitor.java
+++ b/services/net/java/android/net/ip/IpReachabilityMonitor.java
@@ -24,6 +24,8 @@
import android.net.LinkProperties.ProvisioningChange;
import android.net.ProxyInfo;
import android.net.RouteInfo;
+import android.net.metrics.IpReachabilityMonitorMessageEvent;
+import android.net.metrics.IpReachabilityMonitorProbeEvent;
import android.net.netlink.NetlinkConstants;
import android.net.netlink.NetlinkErrorMessage;
import android.net.netlink.NetlinkMessage;
@@ -162,7 +164,7 @@
private boolean mRunning;
/**
- * Make the kernel to perform neighbor reachability detection (IPv4 ARP or IPv6 ND)
+ * Make the kernel perform neighbor reachability detection (IPv4 ARP or IPv6 ND)
* for the given IP address on the specified interface index.
*
* @return true, if the request was successfully passed to the kernel; false otherwise.
@@ -203,7 +205,8 @@
} catch (ErrnoException | InterruptedIOException | SocketException e) {
Log.d(TAG, "Error " + msgSnippet, e);
}
-
+ IpReachabilityMonitorProbeEvent.logEvent("ifindex-" + ifIndex, ip.getHostAddress(),
+ returnValue);
return returnValue;
}
@@ -400,8 +403,7 @@
return (numUnicastProbes * retransTimeMs) + gracePeriodMs;
}
-
- // TODO: simply the number of objects by making this extend Thread.
+ // TODO: simplify the number of objects by making this extend Thread.
private final class NetlinkSocketObserver implements Runnable {
private NetlinkSocket mSocket;
@@ -519,6 +521,8 @@
final short msgType = neighMsg.getHeader().nlmsg_type;
final short nudState = ndMsg.ndm_state;
+ IpReachabilityMonitorMessageEvent.logEvent(maybeGetInterfaceName(mInterfaceIndex),
+ destination.getHostAddress(), msgType, nudState);
final String eventMsg = "NeighborEvent{"
+ "elapsedMs=" + whenMs + ", "
+ destination.getHostAddress() + ", "
@@ -549,4 +553,11 @@
}
}
}
+
+ private String maybeGetInterfaceName(int index) {
+ if (index == mInterfaceIndex) {
+ return mInterfaceName;
+ }
+ return "ifindex-" + index;
+ }
}
diff --git a/services/net/java/android/net/metrics/CaptivePortalCheckResultEvent.java b/services/net/java/android/net/metrics/CaptivePortalCheckResultEvent.java
new file mode 100644
index 0000000..163f7e40
--- /dev/null
+++ b/services/net/java/android/net/metrics/CaptivePortalCheckResultEvent.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2016 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.metrics;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class CaptivePortalCheckResultEvent extends IpConnectivityEvent implements Parcelable {
+ public static final String TAG = "CaptivePortalCheckResultEvent";
+
+ private int mNetId;
+ private int mResult;
+
+ public CaptivePortalCheckResultEvent(int netId, int result) {
+ mNetId = netId;
+ mResult = result;
+ }
+
+ public CaptivePortalCheckResultEvent(Parcel in) {
+ mNetId = in.readInt();
+ mResult = in.readInt();
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(mNetId);
+ out.writeInt(mResult);
+ }
+
+ public static final Parcelable.Creator<CaptivePortalCheckResultEvent> CREATOR
+ = new Parcelable.Creator<CaptivePortalCheckResultEvent>() {
+ public CaptivePortalCheckResultEvent createFromParcel(Parcel in) {
+ return new CaptivePortalCheckResultEvent(in);
+ }
+
+ public CaptivePortalCheckResultEvent[] newArray(int size) {
+ return new CaptivePortalCheckResultEvent[size];
+ }
+ };
+
+ public static void logEvent(int netId, int result) {
+ IpConnectivityEvent.logEvent(IpConnectivityEvent.IPCE_NETMON_CHECK_RESULT,
+ new CaptivePortalCheckResultEvent(netId, result));
+ }
+};
diff --git a/services/net/java/android/net/metrics/CaptivePortalStateChangeEvent.java b/services/net/java/android/net/metrics/CaptivePortalStateChangeEvent.java
new file mode 100644
index 0000000..d0cc120
--- /dev/null
+++ b/services/net/java/android/net/metrics/CaptivePortalStateChangeEvent.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016 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.metrics;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class CaptivePortalStateChangeEvent extends IpConnectivityEvent implements Parcelable {
+ public static final String TAG = "CaptivePortalStateChangeEvent";
+
+ public static final int NETWORK_MONITOR_CONNECTED = 0;
+ public static final int NETWORK_MONITOR_DISCONNECTED = 1;
+ public static final int NETWORK_MONITOR_VALIDATED = 2;
+ private int mState;
+
+ public CaptivePortalStateChangeEvent(int state) {
+ mState = state;
+ }
+
+ public CaptivePortalStateChangeEvent(Parcel in) {
+ mState = in.readInt();
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(mState);
+ }
+
+ public static final Parcelable.Creator<CaptivePortalStateChangeEvent> CREATOR
+ = new Parcelable.Creator<CaptivePortalStateChangeEvent>() {
+ public CaptivePortalStateChangeEvent createFromParcel(Parcel in) {
+ return new CaptivePortalStateChangeEvent(in);
+ }
+
+ public CaptivePortalStateChangeEvent[] newArray(int size) {
+ return new CaptivePortalStateChangeEvent[size];
+ }
+ };
+
+ public static void logEvent(int state) {
+ IpConnectivityEvent.logEvent(IpConnectivityEvent.IPCE_NETMON_STATE_CHANGE,
+ new CaptivePortalStateChangeEvent(state));
+ }
+};
diff --git a/services/net/java/android/net/metrics/ConnectivityServiceChangeEvent.java b/services/net/java/android/net/metrics/ConnectivityServiceChangeEvent.java
new file mode 100644
index 0000000..92b376c
--- /dev/null
+++ b/services/net/java/android/net/metrics/ConnectivityServiceChangeEvent.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016 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.metrics;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class ConnectivityServiceChangeEvent extends IpConnectivityEvent implements Parcelable {
+ public static final String TAG = "ConnectivityServiceChangeEvent";
+
+ private int mNetId;
+
+ public ConnectivityServiceChangeEvent(int netId) {
+ mNetId = netId;
+ }
+
+ public ConnectivityServiceChangeEvent(Parcel in) {
+ mNetId = in.readInt();
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(mNetId);
+ }
+
+ public static final Parcelable.Creator<ConnectivityServiceChangeEvent> CREATOR
+ = new Parcelable.Creator<ConnectivityServiceChangeEvent>() {
+ public ConnectivityServiceChangeEvent createFromParcel(Parcel in) {
+ return new ConnectivityServiceChangeEvent(in);
+ }
+
+ public ConnectivityServiceChangeEvent[] newArray(int size) {
+ return new ConnectivityServiceChangeEvent[size];
+ }
+ };
+
+ public static void logEvent(int netId) {
+ IpConnectivityEvent.logEvent(IpConnectivityEvent.IPCE_CONSRV_DEFAULT_NET_CHANGE,
+ new ConnectivityServiceChangeEvent(netId));
+ }
+};
diff --git a/services/net/java/android/net/metrics/DhcpClientEvent.java b/services/net/java/android/net/metrics/DhcpClientEvent.java
new file mode 100644
index 0000000..2c24034
--- /dev/null
+++ b/services/net/java/android/net/metrics/DhcpClientEvent.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016 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.metrics;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class DhcpClientEvent extends IpConnectivityEvent implements Parcelable {
+ public static final String TAG = "DhcpClientEvent";
+
+ private String mIfName;
+ private String mMsg;
+
+ public DhcpClientEvent(String ifName, String msg) {
+ mIfName = ifName;
+ mMsg = msg;
+ }
+
+ public DhcpClientEvent(Parcel in) {
+ mIfName = in.readString();
+ mMsg = in.readString();
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString(mIfName);
+ out.writeString(mMsg);
+ }
+
+ public static final Parcelable.Creator<DhcpClientEvent> CREATOR
+ = new Parcelable.Creator<DhcpClientEvent>() {
+ public DhcpClientEvent createFromParcel(Parcel in) {
+ return new DhcpClientEvent(in);
+ }
+
+ public DhcpClientEvent[] newArray(int size) {
+ return new DhcpClientEvent[size];
+ }
+ };
+
+ public static void logEvent(int eventType, String ifName, String msg) {
+ IpConnectivityEvent.logEvent(eventType, new DhcpClientEvent(ifName, msg));
+ }
+};
diff --git a/services/net/java/android/net/metrics/IpConnectivityEvent.java b/services/net/java/android/net/metrics/IpConnectivityEvent.java
new file mode 100644
index 0000000..f277bd0
--- /dev/null
+++ b/services/net/java/android/net/metrics/IpConnectivityEvent.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2016 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.metrics;
+
+import android.net.ConnectivityMetricsLogger;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class IpConnectivityEvent implements Parcelable {
+ // IPRM = IpReachabilityMonitor
+ // DHCP = DhcpClient
+ // NETMON = NetworkMonitorEvent
+ // CONSRV = ConnectivityServiceEvent
+ public static final String TAG = "IpConnectivityEvent";
+ public static final int IPCE_IPRM_BASE = 0*1024;
+ public static final int IPCE_DHCP_BASE = 1*1024;
+ public static final int IPCE_NETMON_BASE = 2*1024;
+ public static final int IPCE_CONSRV_BASE = 3*1024;
+
+ public static final int IPCE_IPRM_PROBE_RESULT = IPCE_IPRM_BASE + 0;
+ public static final int IPCE_IPRM_MESSAGE_RECEIVED = IPCE_IPRM_BASE + 1;
+ public static final int IPCE_DHCP_RECV_ERROR = IPCE_DHCP_BASE + 0;
+ public static final int IPCE_DHCP_PARSE_ERROR = IPCE_DHCP_BASE + 1;
+ public static final int IPCE_DHCP_TIMEOUT = IPCE_DHCP_BASE + 2;
+ public static final int IPCE_DHCP_STATE_CHANGE = IPCE_DHCP_BASE + 3;
+ public static final int IPCE_NETMON_STATE_CHANGE = IPCE_NETMON_BASE + 0;
+ public static final int IPCE_NETMON_CHECK_RESULT = IPCE_NETMON_BASE + 1;
+ public static final int IPCE_CONSRV_DEFAULT_NET_CHANGE = IPCE_CONSRV_BASE + 0;
+
+ private static ConnectivityMetricsLogger mMetricsLogger = new ConnectivityMetricsLogger();
+
+ public int describeContents() {
+ return 0;
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ }
+
+ public static void logEvent(int tag, IpConnectivityEvent event) {
+ long timestamp = System.currentTimeMillis();
+ mMetricsLogger.logEvent(timestamp, ConnectivityMetricsLogger.COMPONENT_TAG_CONNECTIVITY,
+ tag, event);
+ }
+};
diff --git a/services/net/java/android/net/metrics/IpReachabilityMonitorMessageEvent.java b/services/net/java/android/net/metrics/IpReachabilityMonitorMessageEvent.java
new file mode 100644
index 0000000..a8c18d6
--- /dev/null
+++ b/services/net/java/android/net/metrics/IpReachabilityMonitorMessageEvent.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2016 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.metrics;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class IpReachabilityMonitorMessageEvent extends IpConnectivityEvent
+ implements Parcelable {
+ public static final String TAG = "IpReachabilityMonitorMessageEvent";
+
+ private String mIfName;
+ private String mDestination;
+ private int mMsgType;
+ private int mNudState;
+
+ public IpReachabilityMonitorMessageEvent(String ifName, String destination, int msgType,
+ int nudState) {
+ mIfName = ifName;
+ mDestination = destination;
+ mMsgType = msgType;
+ mNudState = nudState;
+ }
+
+ public IpReachabilityMonitorMessageEvent(Parcel in) {
+ mIfName = in.readString();
+ mDestination = in.readString();
+ mMsgType = in.readInt();
+ mNudState = in.readInt();
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString(mIfName);
+ out.writeString(mDestination);
+ out.writeInt(mMsgType);
+ out.writeInt(mNudState);
+ }
+
+ public static final Parcelable.Creator<IpReachabilityMonitorMessageEvent> CREATOR
+ = new Parcelable.Creator<IpReachabilityMonitorMessageEvent>() {
+ public IpReachabilityMonitorMessageEvent createFromParcel(Parcel in) {
+ return new IpReachabilityMonitorMessageEvent(in);
+ }
+
+ public IpReachabilityMonitorMessageEvent[] newArray(int size) {
+ return new IpReachabilityMonitorMessageEvent[size];
+ }
+ };
+
+ public static void logEvent(String ifName, String destination, int msgType, int nudState) {
+ IpConnectivityEvent.logEvent(IpConnectivityEvent.IPCE_IPRM_MESSAGE_RECEIVED,
+ new IpReachabilityMonitorMessageEvent(ifName, destination, msgType, nudState));
+ }
+};
diff --git a/services/net/java/android/net/metrics/IpReachabilityMonitorProbeEvent.java b/services/net/java/android/net/metrics/IpReachabilityMonitorProbeEvent.java
new file mode 100644
index 0000000..172cbf8
--- /dev/null
+++ b/services/net/java/android/net/metrics/IpReachabilityMonitorProbeEvent.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016 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.metrics;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class IpReachabilityMonitorProbeEvent extends IpConnectivityEvent
+ implements Parcelable {
+ public static final String TAG = "IpReachabilityMonitorProbeEvent";
+
+ private String mIfName;
+ private String mDestination;
+ private boolean mSuccess;
+
+ public IpReachabilityMonitorProbeEvent(String ifName, String destination, boolean success) {
+ mIfName = ifName;
+ mDestination = destination;
+ mSuccess = success;
+ }
+
+ public IpReachabilityMonitorProbeEvent(Parcel in) {
+ mIfName = in.readString();
+ mDestination = in.readString();
+ mSuccess = in.readByte() > 0 ? true : false;
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString(mIfName);
+ out.writeString(mDestination);
+ out.writeByte((byte)(mSuccess ? 1 : 0));
+ }
+
+ public static final Parcelable.Creator<IpReachabilityMonitorProbeEvent> CREATOR
+ = new Parcelable.Creator<IpReachabilityMonitorProbeEvent>() {
+ public IpReachabilityMonitorProbeEvent createFromParcel(Parcel in) {
+ return new IpReachabilityMonitorProbeEvent(in);
+ }
+
+ public IpReachabilityMonitorProbeEvent[] newArray(int size) {
+ return new IpReachabilityMonitorProbeEvent[size];
+ }
+ };
+
+ public static void logEvent(String ifName, String destination, boolean success) {
+ IpConnectivityEvent.logEvent(IpConnectivityEvent.IPCE_IPRM_PROBE_RESULT,
+ new IpReachabilityMonitorProbeEvent(ifName, destination, success));
+ }
+};