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