DcFailCause.java revision ad31aa03d7cab4d719d81c23df2db33e029c8ced
1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.internal.telephony.dataconnection;
17
18import android.content.res.Resources;
19import java.util.HashMap;
20
21/**
22 * Returned as the reason for a connection failure as defined
23 * by RIL_DataCallFailCause in ril.h and some local errors.
24 */
25public enum DcFailCause {
26    NONE(0),
27
28    // This series of errors as specified by the standards
29    // specified in ril.h
30    OPERATOR_BARRED(0x08),                  /* no retry */
31    INSUFFICIENT_RESOURCES(0x1A),
32    MISSING_UNKNOWN_APN(0x1B),              /* no retry */
33    UNKNOWN_PDP_ADDRESS_TYPE(0x1C),         /* no retry */
34    USER_AUTHENTICATION(0x1D),              /* no retry */
35    ACTIVATION_REJECT_GGSN(0x1E),           /* no retry */
36    ACTIVATION_REJECT_UNSPECIFIED(0x1F),
37    SERVICE_OPTION_NOT_SUPPORTED(0x20),     /* no retry */
38    SERVICE_OPTION_NOT_SUBSCRIBED(0x21),    /* no retry */
39    SERVICE_OPTION_OUT_OF_ORDER(0x22),
40    NSAPI_IN_USE(0x23),                     /* no retry */
41    REGULAR_DEACTIVATION(0x24),             /* possibly restart radio, based on config */
42    ONLY_IPV4_ALLOWED(0x32),                /* no retry */
43    ONLY_IPV6_ALLOWED(0x33),                /* no retry */
44    ONLY_SINGLE_BEARER_ALLOWED(0x34),
45    PROTOCOL_ERRORS(0x6F),                  /* no retry */
46
47    // Local errors generated by Vendor RIL
48    // specified in ril.h
49    REGISTRATION_FAIL(-1),
50    GPRS_REGISTRATION_FAIL(-2),
51    SIGNAL_LOST(-3),
52    PREF_RADIO_TECH_CHANGED(-4),            /* no retry */
53    RADIO_POWER_OFF(-5),                    /* no retry */
54    TETHERED_CALL_ACTIVE(-6),               /* no retry */
55    ERROR_UNSPECIFIED(0xFFFF),
56
57    // Errors generated by the Framework
58    // specified here
59    UNKNOWN(0x10000),
60    RADIO_NOT_AVAILABLE(0x10001),                   /* no retry */
61    UNACCEPTABLE_NETWORK_PARAMETER(0x10002),        /* no retry */
62    CONNECTION_TO_DATACONNECTIONAC_BROKEN(0x10003),
63    LOST_CONNECTION(0x10004),
64    RESET_BY_FRAMEWORK(0x10005);
65
66    private final boolean mRestartRadioOnRegularDeactivation = Resources.getSystem().getBoolean(
67            com.android.internal.R.bool.config_restart_radio_on_pdp_fail_regular_deactivation);
68    private final int mErrorCode;
69    private static final HashMap<Integer, DcFailCause> sErrorCodeToFailCauseMap;
70    static {
71        sErrorCodeToFailCauseMap = new HashMap<Integer, DcFailCause>();
72        for (DcFailCause fc : values()) {
73            sErrorCodeToFailCauseMap.put(fc.getErrorCode(), fc);
74        }
75    }
76
77    DcFailCause(int errorCode) {
78        mErrorCode = errorCode;
79    }
80
81    public int getErrorCode() {
82        return mErrorCode;
83    }
84
85    /** Radio has failed such that the radio should be restarted */
86    public boolean isRestartRadioFail() {
87        return (this == REGULAR_DEACTIVATION && mRestartRadioOnRegularDeactivation);
88    }
89
90    public boolean isPermanentFail() {
91        return (this == OPERATOR_BARRED) || (this == MISSING_UNKNOWN_APN) ||
92                (this == UNKNOWN_PDP_ADDRESS_TYPE) || (this == USER_AUTHENTICATION) ||
93                (this == ACTIVATION_REJECT_GGSN) || (this == SERVICE_OPTION_NOT_SUPPORTED) ||
94                (this == SERVICE_OPTION_NOT_SUBSCRIBED) || (this == NSAPI_IN_USE) ||
95                (this == ONLY_IPV4_ALLOWED) || (this == ONLY_IPV6_ALLOWED) ||
96                (this == PROTOCOL_ERRORS) ||
97                (this == RADIO_POWER_OFF) || (this == TETHERED_CALL_ACTIVE) ||
98                (this == RADIO_NOT_AVAILABLE) || (this == UNACCEPTABLE_NETWORK_PARAMETER) ||
99                (this == SIGNAL_LOST);
100    }
101
102    public boolean isEventLoggable() {
103        return (this == OPERATOR_BARRED) || (this == INSUFFICIENT_RESOURCES) ||
104                (this == UNKNOWN_PDP_ADDRESS_TYPE) || (this == USER_AUTHENTICATION) ||
105                (this == ACTIVATION_REJECT_GGSN) || (this == ACTIVATION_REJECT_UNSPECIFIED) ||
106                (this == SERVICE_OPTION_NOT_SUBSCRIBED) ||
107                (this == SERVICE_OPTION_NOT_SUPPORTED) ||
108                (this == SERVICE_OPTION_OUT_OF_ORDER) || (this == NSAPI_IN_USE) ||
109                (this == ONLY_IPV4_ALLOWED) || (this == ONLY_IPV6_ALLOWED) ||
110                (this == PROTOCOL_ERRORS) || (this == SIGNAL_LOST) ||
111                (this == RADIO_POWER_OFF) || (this == TETHERED_CALL_ACTIVE) ||
112                (this == UNACCEPTABLE_NETWORK_PARAMETER);
113    }
114
115    public static DcFailCause fromInt(int errorCode) {
116        DcFailCause fc = sErrorCodeToFailCauseMap.get(errorCode);
117        if (fc == null) {
118            fc = UNKNOWN;
119        }
120        return fc;
121    }
122}
123