125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi/* 225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * Copyright (C) 2016 The Android Open Source Project 325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * 425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * Licensed under the Apache License, Version 2.0 (the "License"); 525bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * you may not use this file except in compliance with the License. 625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * You may obtain a copy of the License at 725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * 825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * http://www.apache.org/licenses/LICENSE-2.0 925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * 1025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * Unless required by applicable law or agreed to in writing, software 1125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * distributed under the License is distributed on an "AS IS" BASIS, 1225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * See the License for the specific language governing permissions and 1425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * limitations under the License. 1525bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi */ 1625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 1725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichipackage android.net.metrics; 1825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 1925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichiimport android.annotation.SystemApi; 2025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichiimport android.os.Parcel; 2125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichiimport android.os.Parcelable; 225df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichiimport android.util.SparseArray; 235df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi 245df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichiimport com.android.internal.util.MessageUtils; 2525bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 2625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi/** 2725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * {@hide} 2825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi */ 2925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi@SystemApi 3025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichipublic final class IpReachabilityEvent extends IpConnectivityEvent implements Parcelable { 3125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 3225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static final int PROBE = 1 << 8; 3325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static final int NUD_FAILED = 2 << 8; 3425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static final int PROVISIONING_LOST = 3 << 8; 3525bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 3625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public final String ifName; 3725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi // eventType byte format (MSB to LSB): 3825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi // byte 0: unused 3925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi // byte 1: unused 4025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi // byte 2: type of event: PROBE, NUD_FAILED, PROVISIONING_LOST 4125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi // byte 3: kernel errno from RTNetlink or IpReachabilityMonitor 4225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public final int eventType; 4325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 4425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi private IpReachabilityEvent(String ifName, int eventType) { 4525bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi this.ifName = ifName; 4625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi this.eventType = eventType; 4725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 4825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 4925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi private IpReachabilityEvent(Parcel in) { 5025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi this.ifName = in.readString(); 5125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi this.eventType = in.readInt(); 5225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 5325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 5425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public void writeToParcel(Parcel out, int flags) { 5525bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi out.writeString(ifName); 5625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi out.writeInt(eventType); 5725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 5825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 5925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public int describeContents() { 6025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi return 0; 6125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 6225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 6325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static final Parcelable.Creator<IpReachabilityEvent> CREATOR 6425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi = new Parcelable.Creator<IpReachabilityEvent>() { 6525bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public IpReachabilityEvent createFromParcel(Parcel in) { 6625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi return new IpReachabilityEvent(in); 6725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 6825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 6925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public IpReachabilityEvent[] newArray(int size) { 7025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi return new IpReachabilityEvent[size]; 7125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 7225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi }; 7325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 7425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static void logProbeEvent(String ifName, int nlErrorCode) { 7561cbccc2bf7983b50e7a7f1fdb1858caeab6fd96Hugo Benichi logEvent(new IpReachabilityEvent(ifName, PROBE | (nlErrorCode & 0xFF))); 7625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 7725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 7825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static void logNudFailed(String ifName) { 7961cbccc2bf7983b50e7a7f1fdb1858caeab6fd96Hugo Benichi logEvent(new IpReachabilityEvent(ifName, NUD_FAILED)); 8025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 8125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 8225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static void logProvisioningLost(String ifName) { 8361cbccc2bf7983b50e7a7f1fdb1858caeab6fd96Hugo Benichi logEvent(new IpReachabilityEvent(ifName, PROVISIONING_LOST)); 8425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 855df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi 865df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi @Override 875df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi public String toString() { 885df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi return String.format("IpReachabilityEvent(%s, %s)", ifName, 895df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi Decoder.constants.get(eventType)); 905df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi } 915df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi 925df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi final static class Decoder { 935df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi static final SparseArray<String> constants = 945df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi MessageUtils.findMessageNames(new Class[]{IpReachabilityEvent.class}, 955df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi new String[]{"PROBE", "PROVISIONING_", "NUD_"}); 965df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi } 9725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi}; 98