Various fixes in IpReachability event logging
- fold IpReachabilityMonitor* classes into a single IpReachabilityEvent.
- only log an event for NUD_FAILED Netlink answers.
- distinguish between NUD_FAILED with or without lost of provisioning.
- do not record host ip addresses.
- record interface name instead of interface index when losing
provisioning.
- also return an error code when probeNeighbor fails, and log this error
code in IpReachability events.
Bug: 28204408
Change-Id: I5f0def0ab1ace7e467a0c69b3b82d07ef2252307
diff --git a/core/java/android/net/metrics/IpConnectivityEvent.java b/core/java/android/net/metrics/IpConnectivityEvent.java
index 2eb8edb..d455a0f 100644
--- a/core/java/android/net/metrics/IpConnectivityEvent.java
+++ b/core/java/android/net/metrics/IpConnectivityEvent.java
@@ -39,9 +39,10 @@
public static final int IPCE_IPMGR_BASE = 4 * 1024;
public static final int IPCE_DNS_BASE = 5 * 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_IPRM_REACHABILITY_LOST = IPCE_IPRM_BASE + 2;
+ public static final int IPCE_IPRM_PROBE_STARTED = IPCE_IPRM_BASE + 0;
+ public static final int IPCE_IPRM_PROBE_FAILURE = IPCE_IPRM_BASE + 1;
+ public static final int IPCE_IPRM_NUD_FAILED = IPCE_IPRM_BASE + 2;
+ public static final int IPCE_IPRM_PROVISIONING_LOST = IPCE_IPRM_BASE + 3;
public static final int IPCE_DHCP_RECV_ERROR = IPCE_DHCP_BASE + 0;
public static final int IPCE_DHCP_PARSE_ERROR = IPCE_DHCP_BASE + 1;
diff --git a/core/java/android/net/metrics/IpReachabilityEvent.java b/core/java/android/net/metrics/IpReachabilityEvent.java
new file mode 100644
index 0000000..73dcb94
--- /dev/null
+++ b/core/java/android/net/metrics/IpReachabilityEvent.java
@@ -0,0 +1,84 @@
+/*
+ * 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.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * {@hide}
+ */
+@SystemApi
+public final class IpReachabilityEvent extends IpConnectivityEvent implements Parcelable {
+
+ public static final int PROBE = 1 << 8;
+ public static final int NUD_FAILED = 2 << 8;
+ public static final int PROVISIONING_LOST = 3 << 8;
+
+ public final String ifName;
+ // eventType byte format (MSB to LSB):
+ // byte 0: unused
+ // byte 1: unused
+ // byte 2: type of event: PROBE, NUD_FAILED, PROVISIONING_LOST
+ // byte 3: kernel errno from RTNetlink or IpReachabilityMonitor
+ public final int eventType;
+
+ private IpReachabilityEvent(String ifName, int eventType) {
+ this.ifName = ifName;
+ this.eventType = eventType;
+ }
+
+ private IpReachabilityEvent(Parcel in) {
+ this.ifName = in.readString();
+ this.eventType = in.readInt();
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString(ifName);
+ out.writeInt(eventType);
+ }
+
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Parcelable.Creator<IpReachabilityEvent> CREATOR
+ = new Parcelable.Creator<IpReachabilityEvent>() {
+ public IpReachabilityEvent createFromParcel(Parcel in) {
+ return new IpReachabilityEvent(in);
+ }
+
+ public IpReachabilityEvent[] newArray(int size) {
+ return new IpReachabilityEvent[size];
+ }
+ };
+
+ public static void logProbeEvent(String ifName, int nlErrorCode) {
+ final int tag = (nlErrorCode == 0) ? IPCE_IPRM_PROBE_STARTED : IPCE_IPRM_PROBE_FAILURE;
+ final int eventType = PROBE | (nlErrorCode & 0xFF);
+ logEvent(tag, new IpReachabilityEvent(ifName, eventType));
+ }
+
+ public static void logNudFailed(String ifName) {
+ logEvent(IPCE_IPRM_NUD_FAILED, new IpReachabilityEvent(ifName, NUD_FAILED));
+ }
+
+ public static void logProvisioningLost(String ifName) {
+ logEvent(IPCE_IPRM_PROVISIONING_LOST, new IpReachabilityEvent(ifName, PROVISIONING_LOST));
+ }
+};
diff --git a/core/java/android/net/metrics/IpReachabilityMonitorLostEvent.java b/core/java/android/net/metrics/IpReachabilityMonitorLostEvent.java
deleted file mode 100644
index 5215995..0000000
--- a/core/java/android/net/metrics/IpReachabilityMonitorLostEvent.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * {@hide}
- */
-@SystemApi
-public final class IpReachabilityMonitorLostEvent extends IpConnectivityEvent
- implements Parcelable {
- public final String ifName;
-
- private IpReachabilityMonitorLostEvent(String ifName) {
- this.ifName = ifName;
- }
-
- private IpReachabilityMonitorLostEvent(Parcel in) {
- this.ifName = in.readString();
- }
-
- public void writeToParcel(Parcel out, int flags) {
- out.writeString(ifName);
- }
-
- public int describeContents() {
- return 0;
- }
-
- public static final Parcelable.Creator<IpReachabilityMonitorLostEvent> CREATOR
- = new Parcelable.Creator<IpReachabilityMonitorLostEvent>() {
- public IpReachabilityMonitorLostEvent createFromParcel(Parcel in) {
- return new IpReachabilityMonitorLostEvent(in);
- }
-
- public IpReachabilityMonitorLostEvent[] newArray(int size) {
- return new IpReachabilityMonitorLostEvent[size];
- }
- };
-
- public static void logEvent(String ifName) {
- logEvent(IPCE_IPRM_REACHABILITY_LOST, new IpReachabilityMonitorLostEvent(ifName));
- }
-};
diff --git a/core/java/android/net/metrics/IpReachabilityMonitorMessageEvent.java b/core/java/android/net/metrics/IpReachabilityMonitorMessageEvent.java
deleted file mode 100644
index 0ed8c1c..0000000
--- a/core/java/android/net/metrics/IpReachabilityMonitorMessageEvent.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * {@hide}
- */
-@SystemApi
-public final class IpReachabilityMonitorMessageEvent extends IpConnectivityEvent
- implements Parcelable {
- public final String ifName;
- public final String destination;
- public final int msgType;
- public final int nudState;
-
- private IpReachabilityMonitorMessageEvent(String ifName, String destination, int msgType,
- int nudState) {
- this.ifName = ifName;
- this.destination = destination;
- this.msgType = msgType;
- this.nudState = nudState;
- }
-
- private IpReachabilityMonitorMessageEvent(Parcel in) {
- this.ifName = in.readString();
- this.destination = in.readString();
- this.msgType = in.readInt();
- this.nudState = in.readInt();
- }
-
- public void writeToParcel(Parcel out, int flags) {
- out.writeString(ifName);
- out.writeString(destination);
- out.writeInt(msgType);
- out.writeInt(nudState);
- }
-
- public int describeContents() {
- return 0;
- }
-
- 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) {
- logEvent(IPCE_IPRM_MESSAGE_RECEIVED,
- new IpReachabilityMonitorMessageEvent(ifName, destination, msgType, nudState));
- }
-};
diff --git a/core/java/android/net/metrics/IpReachabilityMonitorProbeEvent.java b/core/java/android/net/metrics/IpReachabilityMonitorProbeEvent.java
deleted file mode 100644
index a55c2b4..0000000
--- a/core/java/android/net/metrics/IpReachabilityMonitorProbeEvent.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * {@hide}
- */
-@SystemApi
-public final class IpReachabilityMonitorProbeEvent extends IpConnectivityEvent
- implements Parcelable {
- public final String ifName;
- public final String destination;
- public final boolean success;
-
- private IpReachabilityMonitorProbeEvent(String ifName, String destination, boolean success) {
- this.ifName = ifName;
- this.destination = destination;
- this.success = success;
- }
-
- private IpReachabilityMonitorProbeEvent(Parcel in) {
- this.ifName = in.readString();
- this.destination = in.readString();
- this.success = in.readByte() > 0 ? true : false;
- }
-
- public void writeToParcel(Parcel out, int flags) {
- out.writeString(ifName);
- out.writeString(destination);
- out.writeByte((byte)(success ? 1 : 0));
- }
-
- public int describeContents() {
- return 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) {
- logEvent(IPCE_IPRM_PROBE_RESULT,
- new IpReachabilityMonitorProbeEvent(ifName, destination, success));
- }
-};