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/** 270d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi * An event recorded when IpReachabilityMonitor sends a neighbor probe or receives 280d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi * a neighbor probe result. 2925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi * {@hide} 3025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi */ 3125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi@SystemApi 32cfddd6879283860bb4d2cf2972ea086f585a37ecHugo Benichipublic final class IpReachabilityEvent implements Parcelable { 3325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 340d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi // Event types. 350d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi /** A probe forced by IpReachabilityMonitor. */ 360d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi public static final int PROBE = 1 << 8; 370d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi /** Neighbor unreachable after a forced probe. */ 380d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi public static final int NUD_FAILED = 2 << 8; 390d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi /** Neighbor unreachable after a forced probe, IP provisioning is also lost. */ 400d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi public static final int PROVISIONING_LOST = 3 << 8; 410d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi /** {@hide} Neighbor unreachable notification from kernel. */ 420d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi public static final int NUD_FAILED_ORGANIC = 4 << 8; 430d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi /** {@hide} Neighbor unreachable notification from kernel, IP provisioning is also lost. */ 440d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi public static final int PROVISIONING_LOST_ORGANIC = 5 << 8; 4525bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 4625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public final String ifName; 4725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi // eventType byte format (MSB to LSB): 4825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi // byte 0: unused 4925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi // byte 1: unused 5025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi // byte 2: type of event: PROBE, NUD_FAILED, PROVISIONING_LOST 510d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi // byte 3: when byte 2 == PROBE, errno code from RTNetlink or IpReachabilityMonitor. 5225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public final int eventType; 5325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 54cfddd6879283860bb4d2cf2972ea086f585a37ecHugo Benichi /** {@hide} */ 55cfddd6879283860bb4d2cf2972ea086f585a37ecHugo Benichi public IpReachabilityEvent(String ifName, int eventType) { 5625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi this.ifName = ifName; 5725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi this.eventType = eventType; 5825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 5925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 6025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi private IpReachabilityEvent(Parcel in) { 6125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi this.ifName = in.readString(); 6225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi this.eventType = in.readInt(); 6325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 6425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 650d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi @Override 6625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public void writeToParcel(Parcel out, int flags) { 6725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi out.writeString(ifName); 6825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi out.writeInt(eventType); 6925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 7025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 710d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi @Override 7225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public int describeContents() { 7325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi return 0; 7425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 7525bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 7625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static final Parcelable.Creator<IpReachabilityEvent> CREATOR 7725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi = new Parcelable.Creator<IpReachabilityEvent>() { 7825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public IpReachabilityEvent createFromParcel(Parcel in) { 7925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi return new IpReachabilityEvent(in); 8025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 8125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 8225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public IpReachabilityEvent[] newArray(int size) { 8325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi return new IpReachabilityEvent[size]; 8425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 8525bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi }; 8625bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 8725bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static void logProbeEvent(String ifName, int nlErrorCode) { 8825bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 8925bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 9025bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static void logNudFailed(String ifName) { 9125bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 9225bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi 9325bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi public static void logProvisioningLost(String ifName) { 9425bf8f5d5678e747933ae9e4051daa99ddfcfaa3Hugo Benichi } 955df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi 960d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi /** 970d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi * Returns the NUD failure event type code corresponding to the given conditions. 980d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi * {@hide} 990d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi */ 1000d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi public static int nudFailureEventType(boolean isFromProbe, boolean isProvisioningLost) { 1010d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi if (isFromProbe) { 1020d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi return isProvisioningLost ? PROVISIONING_LOST : NUD_FAILED; 1030d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi } else { 1040d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi return isProvisioningLost ? PROVISIONING_LOST_ORGANIC : NUD_FAILED_ORGANIC; 1050d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi } 1060d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi } 1070d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi 1085df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi @Override 1095df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi public String toString() { 1100d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi int hi = eventType & 0xff00; 1110d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi int lo = eventType & 0x00ff; 1120d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi String eventName = Decoder.constants.get(hi); 1130d1c65b221dee1ef80a03c25877e7fd58fc106deHugo Benichi return String.format("IpReachabilityEvent(%s, %s:%02x)", ifName, eventName, lo); 1145df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi } 1155df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi 1165df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi final static class Decoder { 1175df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi static final SparseArray<String> constants = 1185df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi MessageUtils.findMessageNames(new Class[]{IpReachabilityEvent.class}, 1195df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi new String[]{"PROBE", "PROVISIONING_", "NUD_"}); 1205df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi } 121cfddd6879283860bb4d2cf2972ea086f585a37ecHugo Benichi} 122