16241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi/* 26241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * Copyright (C) 2016 The Android Open Source Project 36241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * 46241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * Licensed under the Apache License, Version 2.0 (the "License"); 56241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * you may not use this file except in compliance with the License. 66241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * You may obtain a copy of the License at 76241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * 86241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * http://www.apache.org/licenses/LICENSE-2.0 96241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * 106241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * Unless required by applicable law or agreed to in writing, software 116241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * distributed under the License is distributed on an "AS IS" BASIS, 126241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * See the License for the specific language governing permissions and 146241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * limitations under the License. 156241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi */ 166241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 176241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichipackage android.net.metrics; 186241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 194b6dfc2ef54723768a67887ce2a42d4f8f64d0f4Hugo Benichiimport android.annotation.SystemApi; 206241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichiimport android.os.Parcel; 216241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichiimport android.os.Parcelable; 225df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichiimport android.util.SparseArray; 235df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi 245df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichiimport com.android.internal.util.MessageUtils; 256241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 266241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi/** 276241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi * {@hide} Event class used to record error events when parsing DHCP response packets. 286241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi */ 294b6dfc2ef54723768a67887ce2a42d4f8f64d0f4Hugo Benichi@SystemApi 30627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichipublic final class DhcpErrorEvent extends IpConnectivityEvent implements Parcelable { 316241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int L2_ERROR = 1; 326241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int L3_ERROR = 2; 336241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int L4_ERROR = 3; 346241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int DHCP_ERROR = 4; 356241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int MISC_ERROR = 5; 366241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 376241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int L2_TOO_SHORT = makeErrorCode(L2_ERROR, 1); 386241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int L2_WRONG_ETH_TYPE = makeErrorCode(L2_ERROR, 2); 396241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 406241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int L3_TOO_SHORT = makeErrorCode(L3_ERROR, 1); 416241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int L3_NOT_IPV4 = makeErrorCode(L3_ERROR, 2); 426241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int L3_INVALID_IP = makeErrorCode(L3_ERROR, 3); 436241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 446241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int L4_NOT_UDP = makeErrorCode(L4_ERROR, 1); 456241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int L4_WRONG_PORT = makeErrorCode(L4_ERROR, 2); 466241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 476241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int BOOTP_TOO_SHORT = makeErrorCode(DHCP_ERROR, 1); 486241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int DHCP_BAD_MAGIC_COOKIE = makeErrorCode(DHCP_ERROR, 2); 496241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int DHCP_INVALID_OPTION_LENGTH = makeErrorCode(DHCP_ERROR, 3); 506241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int DHCP_NO_MSG_TYPE = makeErrorCode(DHCP_ERROR, 4); 516241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int DHCP_UNKNOWN_MSG_TYPE = makeErrorCode(DHCP_ERROR, 5); 526241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 536241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final int BUFFER_UNDERFLOW = makeErrorCode(MISC_ERROR, 1); 542677b1957b444e2dae5737feee989109b811547cHugo Benichi public static final int RECEIVE_ERROR = makeErrorCode(MISC_ERROR, 2); 556241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 562677b1957b444e2dae5737feee989109b811547cHugo Benichi public final String ifName; 576241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi // error code byte format (MSB to LSB): 586241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi // byte 0: error type 596241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi // byte 1: error subtype 606241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi // byte 2: unused 616241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi // byte 3: optional code 626241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public final int errorCode; 636241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 642677b1957b444e2dae5737feee989109b811547cHugo Benichi private DhcpErrorEvent(String ifName, int errorCode) { 652677b1957b444e2dae5737feee989109b811547cHugo Benichi this.ifName = ifName; 666241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi this.errorCode = errorCode; 676241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi } 686241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 696241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi private DhcpErrorEvent(Parcel in) { 702677b1957b444e2dae5737feee989109b811547cHugo Benichi this.ifName = in.readString(); 716241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi this.errorCode = in.readInt(); 726241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi } 736241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 746241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public void writeToParcel(Parcel out, int flags) { 752677b1957b444e2dae5737feee989109b811547cHugo Benichi out.writeString(ifName); 766241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi out.writeInt(errorCode); 776241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi } 786241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 79627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi public int describeContents() { 80627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi return 0; 81627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi } 82627b42494d82eca4fd51abfc0a5d7f330862b881Hugo Benichi 836241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public static final Parcelable.Creator<DhcpErrorEvent> CREATOR 846241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi = new Parcelable.Creator<DhcpErrorEvent>() { 856241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public DhcpErrorEvent createFromParcel(Parcel in) { 866241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi return new DhcpErrorEvent(in); 876241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi } 886241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 896241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi public DhcpErrorEvent[] newArray(int size) { 906241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi return new DhcpErrorEvent[size]; 916241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi } 926241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi }; 936241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 942677b1957b444e2dae5737feee989109b811547cHugo Benichi public static void logParseError(String ifName, int errorCode) { 9561cbccc2bf7983b50e7a7f1fdb1858caeab6fd96Hugo Benichi logEvent(new DhcpErrorEvent(ifName, errorCode)); 966241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi } 976241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 982677b1957b444e2dae5737feee989109b811547cHugo Benichi public static void logReceiveError(String ifName) { 9961cbccc2bf7983b50e7a7f1fdb1858caeab6fd96Hugo Benichi logEvent(new DhcpErrorEvent(ifName, RECEIVE_ERROR)); 1002677b1957b444e2dae5737feee989109b811547cHugo Benichi } 1012677b1957b444e2dae5737feee989109b811547cHugo Benichi 1022677b1957b444e2dae5737feee989109b811547cHugo Benichi public static int errorCodeWithOption(int errorCode, int option) { 1032677b1957b444e2dae5737feee989109b811547cHugo Benichi return (0xFFFF0000 & errorCode) | (0xFF & option); 1046241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi } 1056241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi 1066241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi private static int makeErrorCode(int type, int subtype) { 1076241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi return (type << 24) | ((0xFF & subtype) << 16); 1086241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi } 1095df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi 1105df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi @Override 1115df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi public String toString() { 1125df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi return String.format("DhcpErrorEvent(%s, %s)", ifName, Decoder.constants.get(errorCode)); 1135df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi } 1145df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi 1155df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi final static class Decoder { 1165df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi static final SparseArray<String> constants = 1175df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi MessageUtils.findMessageNames(new Class[]{DhcpErrorEvent.class}, 1185df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi new String[]{"L2_", "L3_", "L4_", "BOOTP_", "DHCP_", "BUFFER_", "RECEIVE_"}); 1195df9d729f6c78215f287701d7e136dfc922e2bd3Hugo Benichi } 1206241874355c0e0d9ff04e993ad1d522c66b8c50bHugo Benichi} 121