Add NetworkStack metrics to system API

Test: atest FrameworksNetTests NetworkStackTests
Bug: 112869080
Change-Id: Ie52c55f248c173e2a5ee603ecd004fbac9004ac1
This commit is contained in:
Remi NGUYEN VAN
2019-01-19 21:13:24 +09:00
parent 1f4cce2f19
commit 7b84fb336f
18 changed files with 905 additions and 200 deletions

View File

@@ -17,6 +17,8 @@
package android.net.metrics;
import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
@@ -36,11 +38,15 @@ import java.util.List;
* the APF program in place with a new APF program.
* {@hide}
*/
public final class ApfProgramEvent implements Parcelable {
@TestApi
@SystemApi
public final class ApfProgramEvent implements IpConnectivityLog.Event {
// Bitflag constants describing what an Apf program filters.
// Bits are indexeds from LSB to MSB, starting at index 0.
/** @hide */
public static final int FLAG_MULTICAST_FILTER_ON = 0;
/** @hide */
public static final int FLAG_HAS_IPV4_ADDRESS = 1;
/** {@hide} */
@@ -48,21 +54,33 @@ public final class ApfProgramEvent implements Parcelable {
@Retention(RetentionPolicy.SOURCE)
public @interface Flags {}
/** @hide */
@UnsupportedAppUsage
public long lifetime; // Maximum computed lifetime of the program in seconds
public final long lifetime; // Maximum computed lifetime of the program in seconds
/** @hide */
@UnsupportedAppUsage
public long actualLifetime; // Effective program lifetime in seconds
public final long actualLifetime; // Effective program lifetime in seconds
/** @hide */
@UnsupportedAppUsage
public int filteredRas; // Number of RAs filtered by the APF program
public final int filteredRas; // Number of RAs filtered by the APF program
/** @hide */
@UnsupportedAppUsage
public int currentRas; // Total number of current RAs at generation time
public final int currentRas; // Total number of current RAs at generation time
/** @hide */
@UnsupportedAppUsage
public int programLength; // Length of the APF program in bytes
public final int programLength; // Length of the APF program in bytes
/** @hide */
@UnsupportedAppUsage
public int flags; // Bitfield compound of FLAG_* constants
public final int flags; // Bitfield compound of FLAG_* constants
@UnsupportedAppUsage
public ApfProgramEvent() {
private ApfProgramEvent(long lifetime, long actualLifetime, int filteredRas, int currentRas,
int programLength, int flags) {
this.lifetime = lifetime;
this.actualLifetime = actualLifetime;
this.filteredRas = filteredRas;
this.currentRas = currentRas;
this.programLength = programLength;
this.flags = flags;
}
private ApfProgramEvent(Parcel in) {
@@ -74,6 +92,75 @@ public final class ApfProgramEvent implements Parcelable {
this.flags = in.readInt();
}
/**
* Utility to create an instance of {@link ApfProgramEvent}.
*/
public static class Builder {
private long mLifetime;
private long mActualLifetime;
private int mFilteredRas;
private int mCurrentRas;
private int mProgramLength;
private int mFlags;
/**
* Set the maximum computed lifetime of the program in seconds.
*/
public Builder setLifetime(long lifetime) {
mLifetime = lifetime;
return this;
}
/**
* Set the effective program lifetime in seconds.
*/
public Builder setActualLifetime(long lifetime) {
mActualLifetime = lifetime;
return this;
}
/**
* Set the number of RAs filtered by the APF program.
*/
public Builder setFilteredRas(int filteredRas) {
mFilteredRas = filteredRas;
return this;
}
/**
* Set the total number of current RAs at generation time.
*/
public Builder setCurrentRas(int currentRas) {
mCurrentRas = currentRas;
return this;
}
/**
* Set the length of the APF program in bytes.
*/
public Builder setProgramLength(int programLength) {
mProgramLength = programLength;
return this;
}
/**
* Set the flags describing what an Apf program filters.
*/
public Builder setFlags(boolean hasIPv4, boolean multicastFilterOn) {
mFlags = flagsFor(hasIPv4, multicastFilterOn);
return this;
}
/**
* Build a new {@link ApfProgramEvent}.
*/
public ApfProgramEvent build() {
return new ApfProgramEvent(mLifetime, mActualLifetime, mFilteredRas, mCurrentRas,
mProgramLength, mFlags);
}
}
/** @hide */
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeLong(lifetime);
@@ -84,6 +171,7 @@ public final class ApfProgramEvent implements Parcelable {
out.writeInt(flags);
}
/** @hide */
@Override
public int describeContents() {
return 0;
@@ -96,6 +184,7 @@ public final class ApfProgramEvent implements Parcelable {
programLength, actualLifetime, lifetimeString, namesOf(flags));
}
/** @hide */
public static final Parcelable.Creator<ApfProgramEvent> CREATOR
= new Parcelable.Creator<ApfProgramEvent>() {
public ApfProgramEvent createFromParcel(Parcel in) {
@@ -107,6 +196,7 @@ public final class ApfProgramEvent implements Parcelable {
}
};
/** @hide */
@UnsupportedAppUsage
public static @Flags int flagsFor(boolean hasIPv4, boolean multicastFilterOn) {
int bitfield = 0;

View File

@@ -16,6 +16,8 @@
package android.net.metrics;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,42 +26,70 @@ import android.os.Parcelable;
* An event logged for an interface with APF capabilities when its IpClient state machine exits.
* {@hide}
*/
public final class ApfStats implements Parcelable {
@SystemApi
@TestApi
public final class ApfStats implements IpConnectivityLog.Event {
/** time interval in milliseconds these stastistics covers. */
/**
* time interval in milliseconds these stastistics covers.
* @hide
*/
@UnsupportedAppUsage
public long durationMs;
/** number of received RAs. */
public final long durationMs;
/**
* number of received RAs.
* @hide
*/
@UnsupportedAppUsage
public int receivedRas;
/** number of received RAs matching a known RA. */
public final int receivedRas;
/**
* number of received RAs matching a known RA.
* @hide
*/
@UnsupportedAppUsage
public int matchingRas;
/** number of received RAs ignored due to the MAX_RAS limit. */
public final int matchingRas;
/**
* number of received RAs ignored due to the MAX_RAS limit.
* @hide
*/
@UnsupportedAppUsage
public int droppedRas;
/** number of received RAs with a minimum lifetime of 0. */
public final int droppedRas;
/**
* number of received RAs with a minimum lifetime of 0.
* @hide
*/
@UnsupportedAppUsage
public int zeroLifetimeRas;
/** number of received RAs that could not be parsed. */
public final int zeroLifetimeRas;
/**
* number of received RAs that could not be parsed.
* @hide
*/
@UnsupportedAppUsage
public int parseErrors;
/** number of APF program updates from receiving RAs.. */
public final int parseErrors;
/**
* number of APF program updates from receiving RAs.
* @hide
*/
@UnsupportedAppUsage
public int programUpdates;
/** total number of APF program updates. */
public final int programUpdates;
/**
* total number of APF program updates.
* @hide
*/
@UnsupportedAppUsage
public int programUpdatesAll;
/** number of APF program updates from allowing multicast traffic. */
public final int programUpdatesAll;
/**
* number of APF program updates from allowing multicast traffic.
* @hide
*/
@UnsupportedAppUsage
public int programUpdatesAllowingMulticast;
/** maximum APF program size advertised by hardware. */
public final int programUpdatesAllowingMulticast;
/**
* maximum APF program size advertised by hardware.
* @hide
*/
@UnsupportedAppUsage
public int maxProgramSize;
@UnsupportedAppUsage
public ApfStats() {
}
public final int maxProgramSize;
private ApfStats(Parcel in) {
this.durationMs = in.readLong();
@@ -74,6 +104,130 @@ public final class ApfStats implements Parcelable {
this.maxProgramSize = in.readInt();
}
private ApfStats(long durationMs, int receivedRas, int matchingRas, int droppedRas,
int zeroLifetimeRas, int parseErrors, int programUpdates, int programUpdatesAll,
int programUpdatesAllowingMulticast, int maxProgramSize) {
this.durationMs = durationMs;
this.receivedRas = receivedRas;
this.matchingRas = matchingRas;
this.droppedRas = droppedRas;
this.zeroLifetimeRas = zeroLifetimeRas;
this.parseErrors = parseErrors;
this.programUpdates = programUpdates;
this.programUpdatesAll = programUpdatesAll;
this.programUpdatesAllowingMulticast = programUpdatesAllowingMulticast;
this.maxProgramSize = maxProgramSize;
}
/**
* Utility to create an instance of {@link ApfStats}.
* @hide
*/
@SystemApi
@TestApi
public static class Builder {
private long mDurationMs;
private int mReceivedRas;
private int mMatchingRas;
private int mDroppedRas;
private int mZeroLifetimeRas;
private int mParseErrors;
private int mProgramUpdates;
private int mProgramUpdatesAll;
private int mProgramUpdatesAllowingMulticast;
private int mMaxProgramSize;
/**
* Set the time interval in milliseconds these statistics covers.
*/
public Builder setDurationMs(long durationMs) {
mDurationMs = durationMs;
return this;
}
/**
* Set the number of received RAs.
*/
public Builder setReceivedRas(int receivedRas) {
mReceivedRas = receivedRas;
return this;
}
/**
* Set the number of received RAs matching a known RA.
*/
public Builder setMatchingRas(int matchingRas) {
mMatchingRas = matchingRas;
return this;
}
/**
* Set the number of received RAs ignored due to the MAX_RAS limit.
*/
public Builder setDroppedRas(int droppedRas) {
mDroppedRas = droppedRas;
return this;
}
/**
* Set the number of received RAs with a minimum lifetime of 0.
*/
public Builder setZeroLifetimeRas(int zeroLifetimeRas) {
mZeroLifetimeRas = zeroLifetimeRas;
return this;
}
/**
* Set the number of received RAs that could not be parsed.
*/
public Builder setParseErrors(int parseErrors) {
mParseErrors = parseErrors;
return this;
}
/**
* Set the number of APF program updates from receiving RAs.
*/
public Builder setProgramUpdates(int programUpdates) {
mProgramUpdates = programUpdates;
return this;
}
/**
* Set the total number of APF program updates.
*/
public Builder setProgramUpdatesAll(int programUpdatesAll) {
mProgramUpdatesAll = programUpdatesAll;
return this;
}
/**
* Set the number of APF program updates from allowing multicast traffic.
*/
public Builder setProgramUpdatesAllowingMulticast(int programUpdatesAllowingMulticast) {
mProgramUpdatesAllowingMulticast = programUpdatesAllowingMulticast;
return this;
}
/**
* Set the maximum APF program size advertised by hardware.
*/
public Builder setMaxProgramSize(int maxProgramSize) {
mMaxProgramSize = maxProgramSize;
return this;
}
/**
* Create a new {@link ApfStats}.
*/
public ApfStats build() {
return new ApfStats(mDurationMs, mReceivedRas, mMatchingRas, mDroppedRas,
mZeroLifetimeRas, mParseErrors, mProgramUpdates, mProgramUpdatesAll,
mProgramUpdatesAllowingMulticast, mMaxProgramSize);
}
}
/** @hide */
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeLong(durationMs);
@@ -88,6 +242,7 @@ public final class ApfStats implements Parcelable {
out.writeInt(maxProgramSize);
}
/** @hide */
@Override
public int describeContents() {
return 0;
@@ -108,6 +263,7 @@ public final class ApfStats implements Parcelable {
.toString();
}
/** @hide */
public static final Parcelable.Creator<ApfStats> CREATOR = new Parcelable.Creator<ApfStats>() {
public ApfStats createFromParcel(Parcel in) {
return new ApfStats(in);

View File

@@ -16,6 +16,8 @@
package android.net.metrics;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,7 +26,9 @@ import android.os.Parcelable;
* An event recorded when a DhcpClient state machine transitions to a new state.
* {@hide}
*/
public final class DhcpClientEvent implements Parcelable {
@SystemApi
@TestApi
public final class DhcpClientEvent implements IpConnectivityLog.Event {
// Names for recording DhcpClient pseudo-state transitions.
/** {@hide} Represents transitions from DhcpInitState to DhcpBoundState */
@@ -32,11 +36,13 @@ public final class DhcpClientEvent implements Parcelable {
/** {@hide} Represents transitions from and to DhcpBoundState via DhcpRenewingState */
public static final String RENEWING_BOUND = "RenewingBoundState";
/** @hide */
public final String msg;
/** @hide */
public final int durationMs;
@UnsupportedAppUsage
public DhcpClientEvent(String msg, int durationMs) {
private DhcpClientEvent(String msg, int durationMs) {
this.msg = msg;
this.durationMs = durationMs;
}
@@ -46,12 +52,45 @@ public final class DhcpClientEvent implements Parcelable {
this.durationMs = in.readInt();
}
/**
* Utility to create an instance of {@link ApfProgramEvent}.
*/
public static class Builder {
private String mMsg;
private int mDurationMs;
/**
* Set the message of the event.
*/
public Builder setMsg(String msg) {
mMsg = msg;
return this;
}
/**
* Set the duration of the event in milliseconds.
*/
public Builder setDurationMs(int durationMs) {
mDurationMs = durationMs;
return this;
}
/**
* Create a new {@link DhcpClientEvent}.
*/
public DhcpClientEvent build() {
return new DhcpClientEvent(mMsg, mDurationMs);
}
}
/** @hide */
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(msg);
out.writeInt(durationMs);
}
/** @hide */
@Override
public int describeContents() {
return 0;
@@ -62,6 +101,7 @@ public final class DhcpClientEvent implements Parcelable {
return String.format("DhcpClientEvent(%s, %dms)", msg, durationMs);
}
/** @hide */
public static final Parcelable.Creator<DhcpClientEvent> CREATOR
= new Parcelable.Creator<DhcpClientEvent>() {
public DhcpClientEvent createFromParcel(Parcel in) {

View File

@@ -16,7 +16,8 @@
package android.net.metrics;
import android.annotation.UnsupportedAppUsage;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -27,48 +28,34 @@ import com.android.internal.util.MessageUtils;
* Event class used to record error events when parsing DHCP response packets.
* {@hide}
*/
public final class DhcpErrorEvent implements Parcelable {
@SystemApi
@TestApi
public final class DhcpErrorEvent implements IpConnectivityLog.Event {
public static final int L2_ERROR = 1;
public static final int L3_ERROR = 2;
public static final int L4_ERROR = 3;
public static final int DHCP_ERROR = 4;
public static final int MISC_ERROR = 5;
@UnsupportedAppUsage
public static final int L2_TOO_SHORT = makeErrorCode(L2_ERROR, 1);
@UnsupportedAppUsage
public static final int L2_WRONG_ETH_TYPE = makeErrorCode(L2_ERROR, 2);
@UnsupportedAppUsage
public static final int L3_TOO_SHORT = makeErrorCode(L3_ERROR, 1);
@UnsupportedAppUsage
public static final int L3_NOT_IPV4 = makeErrorCode(L3_ERROR, 2);
@UnsupportedAppUsage
public static final int L3_INVALID_IP = makeErrorCode(L3_ERROR, 3);
@UnsupportedAppUsage
public static final int L4_NOT_UDP = makeErrorCode(L4_ERROR, 1);
@UnsupportedAppUsage
public static final int L4_WRONG_PORT = makeErrorCode(L4_ERROR, 2);
@UnsupportedAppUsage
public static final int BOOTP_TOO_SHORT = makeErrorCode(DHCP_ERROR, 1);
@UnsupportedAppUsage
public static final int DHCP_BAD_MAGIC_COOKIE = makeErrorCode(DHCP_ERROR, 2);
@UnsupportedAppUsage
public static final int DHCP_INVALID_OPTION_LENGTH = makeErrorCode(DHCP_ERROR, 3);
@UnsupportedAppUsage
public static final int DHCP_NO_MSG_TYPE = makeErrorCode(DHCP_ERROR, 4);
@UnsupportedAppUsage
public static final int DHCP_UNKNOWN_MSG_TYPE = makeErrorCode(DHCP_ERROR, 5);
@UnsupportedAppUsage
public static final int DHCP_NO_COOKIE = makeErrorCode(DHCP_ERROR, 6);
@UnsupportedAppUsage
public static final int BUFFER_UNDERFLOW = makeErrorCode(MISC_ERROR, 1);
@UnsupportedAppUsage
public static final int RECEIVE_ERROR = makeErrorCode(MISC_ERROR, 2);
@UnsupportedAppUsage
public static final int PARSING_ERROR = makeErrorCode(MISC_ERROR, 3);
// error code byte format (MSB to LSB):
@@ -76,9 +63,9 @@ public final class DhcpErrorEvent implements Parcelable {
// byte 1: error subtype
// byte 2: unused
// byte 3: optional code
/** @hide */
public final int errorCode;
@UnsupportedAppUsage
public DhcpErrorEvent(int errorCode) {
this.errorCode = errorCode;
}
@@ -87,16 +74,19 @@ public final class DhcpErrorEvent implements Parcelable {
this.errorCode = in.readInt();
}
/** @hide */
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(errorCode);
}
/** @hide */
@Override
public int describeContents() {
return 0;
}
/** @hide */
public static final Parcelable.Creator<DhcpErrorEvent> CREATOR
= new Parcelable.Creator<DhcpErrorEvent>() {
public DhcpErrorEvent createFromParcel(Parcel in) {
@@ -108,7 +98,6 @@ public final class DhcpErrorEvent implements Parcelable {
}
};
@UnsupportedAppUsage
public static int errorCodeWithOption(int errorCode, int option) {
return (0xFFFF0000 & errorCode) | (0xFF & option);
}

View File

@@ -16,6 +16,8 @@
package android.net.metrics;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.net.ConnectivityMetricsEvent;
import android.net.IIpConnectivityMetrics;
@@ -23,6 +25,7 @@ import android.os.Parcelable;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.BitUtils;
@@ -30,18 +33,28 @@ import com.android.internal.util.BitUtils;
* Class for logging IpConnectvity events with IpConnectivityMetrics
* {@hide}
*/
@SystemApi
@TestApi
public class IpConnectivityLog {
private static final String TAG = IpConnectivityLog.class.getSimpleName();
private static final boolean DBG = false;
/** @hide */
public static final String SERVICE_NAME = "connmetrics";
private IIpConnectivityMetrics mService;
/**
* An event to be logged.
*/
public interface Event extends Parcelable {}
/** @hide */
@UnsupportedAppUsage
public IpConnectivityLog() {
}
/** @hide */
@VisibleForTesting
public IpConnectivityLog(IIpConnectivityMetrics service) {
mService = service;
@@ -67,6 +80,7 @@ public class IpConnectivityLog {
* @param ev the event to log. If the event timestamp is 0,
* the timestamp is set to the current time in milliseconds.
* @return true if the event was successfully logged.
* @hide
*/
public boolean log(ConnectivityMetricsEvent ev) {
if (!checkLoggerService()) {
@@ -94,7 +108,7 @@ public class IpConnectivityLog {
* @param data is a Parcelable instance representing the event.
* @return true if the event was successfully logged.
*/
public boolean log(long timestamp, Parcelable data) {
public boolean log(long timestamp, Event data) {
ConnectivityMetricsEvent ev = makeEv(data);
ev.timestamp = timestamp;
return log(ev);
@@ -106,8 +120,7 @@ public class IpConnectivityLog {
* @param data is a Parcelable instance representing the event.
* @return true if the event was successfully logged.
*/
@UnsupportedAppUsage
public boolean log(String ifname, Parcelable data) {
public boolean log(String ifname, Event data) {
ConnectivityMetricsEvent ev = makeEv(data);
ev.ifname = ifname;
return log(ev);
@@ -121,7 +134,7 @@ public class IpConnectivityLog {
* @param data is a Parcelable instance representing the event.
* @return true if the event was successfully logged.
*/
public boolean log(int netid, int[] transports, Parcelable data) {
public boolean log(int netid, int[] transports, Event data) {
ConnectivityMetricsEvent ev = makeEv(data);
ev.netId = netid;
ev.transports = BitUtils.packBits(transports);
@@ -133,12 +146,11 @@ public class IpConnectivityLog {
* @param data is a Parcelable instance representing the event.
* @return true if the event was successfully logged.
*/
@UnsupportedAppUsage
public boolean log(Parcelable data) {
public boolean log(Event data) {
return log(makeEv(data));
}
private static ConnectivityMetricsEvent makeEv(Parcelable data) {
private static ConnectivityMetricsEvent makeEv(Event data) {
ConnectivityMetricsEvent ev = new ConnectivityMetricsEvent();
ev.data = data;
return ev;

View File

@@ -17,7 +17,8 @@
package android.net.metrics;
import android.annotation.IntDef;
import android.annotation.UnsupportedAppUsage;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -28,11 +29,13 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* An event recorded by IpManager when IP provisioning completes for a network or
* An event recorded by IpClient when IP provisioning completes for a network or
* when a network disconnects.
* {@hide}
*/
public final class IpManagerEvent implements Parcelable {
@SystemApi
@TestApi
public final class IpManagerEvent implements IpConnectivityLog.Event {
public static final int PROVISIONING_OK = 1;
public static final int PROVISIONING_FAIL = 2;
@@ -43,6 +46,7 @@ public final class IpManagerEvent implements Parcelable {
public static final int ERROR_INVALID_PROVISIONING = 7;
public static final int ERROR_INTERFACE_NOT_FOUND = 8;
/** @hide */
@IntDef(value = {
PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE,
ERROR_STARTING_IPV4, ERROR_STARTING_IPV6, ERROR_STARTING_IPREACHABILITYMONITOR,
@@ -51,10 +55,11 @@ public final class IpManagerEvent implements Parcelable {
@Retention(RetentionPolicy.SOURCE)
public @interface EventType {}
/** @hide */
public final @EventType int eventType;
/** @hide */
public final long durationMs;
@UnsupportedAppUsage
public IpManagerEvent(@EventType int eventType, long duration) {
this.eventType = eventType;
this.durationMs = duration;
@@ -65,17 +70,20 @@ public final class IpManagerEvent implements Parcelable {
this.durationMs = in.readLong();
}
/** @hide */
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(eventType);
out.writeLong(durationMs);
}
/** @hide */
@Override
public int describeContents() {
return 0;
}
/** @hide */
public static final Parcelable.Creator<IpManagerEvent> CREATOR
= new Parcelable.Creator<IpManagerEvent>() {
public IpManagerEvent createFromParcel(Parcel in) {

View File

@@ -16,7 +16,8 @@
package android.net.metrics;
import android.annotation.UnsupportedAppUsage;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -28,7 +29,9 @@ import com.android.internal.util.MessageUtils;
* a neighbor probe result.
* {@hide}
*/
public final class IpReachabilityEvent implements Parcelable {
@SystemApi
@TestApi
public final class IpReachabilityEvent implements IpConnectivityLog.Event {
// Event types.
/** A probe forced by IpReachabilityMonitor. */
@@ -47,9 +50,9 @@ public final class IpReachabilityEvent implements Parcelable {
// byte 1: unused
// byte 2: type of event: PROBE, NUD_FAILED, PROVISIONING_LOST
// byte 3: when byte 2 == PROBE, errno code from RTNetlink or IpReachabilityMonitor.
/** @hide */
public final int eventType;
@UnsupportedAppUsage
public IpReachabilityEvent(int eventType) {
this.eventType = eventType;
}
@@ -58,16 +61,19 @@ public final class IpReachabilityEvent implements Parcelable {
this.eventType = in.readInt();
}
/** @hide */
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(eventType);
}
/** @hide */
@Override
public int describeContents() {
return 0;
}
/** @hide */
public static final Parcelable.Creator<IpReachabilityEvent> CREATOR
= new Parcelable.Creator<IpReachabilityEvent>() {
public IpReachabilityEvent createFromParcel(Parcel in) {
@@ -79,18 +85,6 @@ public final class IpReachabilityEvent implements Parcelable {
}
};
/**
* Returns the NUD failure event type code corresponding to the given conditions.
*/
@UnsupportedAppUsage
public static int nudFailureEventType(boolean isFromProbe, boolean isProvisioningLost) {
if (isFromProbe) {
return isProvisioningLost ? PROVISIONING_LOST : NUD_FAILED;
} else {
return isProvisioningLost ? PROVISIONING_LOST_ORGANIC : NUD_FAILED_ORGANIC;
}
}
@Override
public String toString() {
int hi = eventType & 0xff00;

View File

@@ -17,6 +17,8 @@
package android.net.metrics;
import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -29,7 +31,9 @@ import java.lang.annotation.RetentionPolicy;
/**
* {@hide}
*/
public final class NetworkEvent implements Parcelable {
@SystemApi
@TestApi
public final class NetworkEvent implements IpConnectivityLog.Event {
public static final int NETWORK_CONNECTED = 1;
public static final int NETWORK_VALIDATED = 2;
@@ -46,6 +50,7 @@ public final class NetworkEvent implements Parcelable {
public static final int NETWORK_CONSECUTIVE_DNS_TIMEOUT_FOUND = 12;
/** @hide */
@IntDef(value = {
NETWORK_CONNECTED,
NETWORK_VALIDATED,
@@ -63,7 +68,9 @@ public final class NetworkEvent implements Parcelable {
@Retention(RetentionPolicy.SOURCE)
public @interface EventType {}
/** @hide */
public final @EventType int eventType;
/** @hide */
public final long durationMs;
public NetworkEvent(@EventType int eventType, long durationMs) {
@@ -80,17 +87,20 @@ public final class NetworkEvent implements Parcelable {
durationMs = in.readLong();
}
/** @hide */
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(eventType);
out.writeLong(durationMs);
}
/** @hide */
@Override
public int describeContents() {
return 0;
}
/** @hide */
public static final Parcelable.Creator<NetworkEvent> CREATOR
= new Parcelable.Creator<NetworkEvent>() {
public NetworkEvent createFromParcel(Parcel in) {

View File

@@ -24,7 +24,7 @@ import android.os.Parcelable;
* An event logged when the APF packet socket receives an RA packet.
* {@hide}
*/
public final class RaEvent implements Parcelable {
public final class RaEvent implements IpConnectivityLog.Event {
public static final long NO_LIFETIME = -1L;

View File

@@ -17,6 +17,8 @@
package android.net.metrics;
import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -30,7 +32,9 @@ import java.lang.annotation.RetentionPolicy;
* An event recorded by NetworkMonitor when sending a probe for finding captive portals.
* {@hide}
*/
public final class ValidationProbeEvent implements Parcelable {
@SystemApi
@TestApi
public final class ValidationProbeEvent implements IpConnectivityLog.Event {
public static final int PROBE_DNS = 0;
public static final int PROBE_HTTP = 1;
@@ -45,20 +49,27 @@ public final class ValidationProbeEvent implements Parcelable {
private static final int FIRST_VALIDATION = 1 << 8;
private static final int REVALIDATION = 2 << 8;
/** @hide */
@IntDef(value = {DNS_FAILURE, DNS_SUCCESS})
@Retention(RetentionPolicy.SOURCE)
public @interface ReturnCode {}
public long durationMs;
/** @hide */
public final long durationMs;
// probeType byte format (MSB to LSB):
// byte 0: unused
// byte 1: unused
// byte 2: 0 = UNKNOWN, 1 = FIRST_VALIDATION, 2 = REVALIDATION
// byte 3: PROBE_* constant
public int probeType;
public @ReturnCode int returnCode;
/** @hide */
public final int probeType;
/** @hide */
public final @ReturnCode int returnCode;
public ValidationProbeEvent() {
private ValidationProbeEvent(long durationMs, int probeType, int returnCode) {
this.durationMs = durationMs;
this.probeType = probeType;
this.returnCode = returnCode;
}
private ValidationProbeEvent(Parcel in) {
@@ -67,6 +78,47 @@ public final class ValidationProbeEvent implements Parcelable {
returnCode = in.readInt();
}
/**
* Utility to create an instance of {@link ApfProgramEvent}.
*/
public static class Builder {
private long mDurationMs;
private int mProbeType;
private int mReturnCode;
/**
* Set the duration of the probe in milliseconds.
*/
public Builder setDurationMs(long durationMs) {
mDurationMs = durationMs;
return this;
}
/**
* Set the probe type based on whether it was the first validation.
*/
public Builder setProbeType(int probeType, boolean firstValidation) {
mProbeType = makeProbeType(probeType, firstValidation);
return this;
}
/**
* Set the return code of the probe.
*/
public Builder setReturnCode(int returnCode) {
mReturnCode = returnCode;
return this;
}
/**
* Create a new {@link ValidationProbeEvent}.
*/
public ValidationProbeEvent build() {
return new ValidationProbeEvent(mDurationMs, mProbeType, mReturnCode);
}
}
/** @hide */
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeLong(durationMs);
@@ -74,11 +126,13 @@ public final class ValidationProbeEvent implements Parcelable {
out.writeInt(returnCode);
}
/** @hide */
@Override
public int describeContents() {
return 0;
}
/** @hide */
public static final Parcelable.Creator<ValidationProbeEvent> CREATOR
= new Parcelable.Creator<ValidationProbeEvent>() {
public ValidationProbeEvent createFromParcel(Parcel in) {
@@ -90,7 +144,7 @@ public final class ValidationProbeEvent implements Parcelable {
}
};
public static int makeProbeType(int probeType, boolean firstValidation) {
private static int makeProbeType(int probeType, boolean firstValidation) {
return (probeType & 0xff) | (firstValidation ? FIRST_VALIDATION : REVALIDATION);
}
@@ -98,7 +152,7 @@ public final class ValidationProbeEvent implements Parcelable {
return Decoder.constants.get(probeType & 0xff, "PROBE_???");
}
public static String getValidationStage(int probeType) {
private static String getValidationStage(int probeType) {
return Decoder.constants.get(probeType & 0xff00, "UNKNOWN");
}