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