10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
174918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savillepackage com.android.internal.telephony.dataconnection;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
196356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwaltimport com.android.internal.telephony.CallTracker;
204c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxuimport com.android.internal.telephony.CarrierSignalAgent;
21ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.CommandException;
22ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.DctConstants;
23ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.Phone;
24cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.PhoneConstants;
254918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RILConstants;
264918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RetryManager;
276356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwaltimport com.android.internal.telephony.ServiceStateTracker;
28ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.AsyncChannel;
29ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.Protocol;
30ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.State;
31ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.StateMachine;
32ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
33ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.app.PendingIntent;
3462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.content.Context;
3562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.ConnectivityManager;
36ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.net.LinkProperties;
3762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.NetworkAgent;
3896cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwaltimport android.net.NetworkCapabilities;
3962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.NetworkInfo;
40957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkeyimport android.net.NetworkMisc;
419c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monkimport android.net.ProxyInfo;
42ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.AsyncResult;
4362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.os.Looper;
44ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.Message;
45ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.SystemClock;
46ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.SystemProperties;
47ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.Rlog;
48203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.telephony.ServiceState;
49ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.TelephonyManager;
50203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.text.TextUtils;
51203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.util.Pair;
52ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.util.Patterns;
53ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.util.TimeUtils;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
5745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Savilleimport java.io.StringWriter;
58ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.ArrayList;
598fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwaltimport java.util.Locale;
60ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.concurrent.atomic.AtomicInteger;
61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.net.InetAddress;
62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.Collection;
63ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwaltimport java.util.HashMap;
64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
67ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville *
68ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * DataConnection StateMachine.
69ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville *
70ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * This a class for representing a single data connection, with instances of this
71ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * class representing a connection via the cellular network. There may be multiple
72ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * data connections and all of them are managed by the <code>DataConnectionTracker</code>.
73ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville *
74ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * NOTE: All DataConnection objects must be running on the same looper, which is the default
75ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * as the coordinator has members which are used without synchronization.
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
773a5b9323f422134b68a92c36813001ec8bed2866Jack Yupublic class DataConnection extends StateMachine {
78ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private static final boolean DBG = true;
79ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private static final boolean VDBG = true;
80ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
81aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran    private static final String NETWORK_TYPE = "MOBILE";
82aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran
83ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    // The data connection controller
84ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DcController mDcController;
85ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
86ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    // The Tester for failing all bringup's
87ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DcTesterFailBringUpAll mDcTesterFailBringUpAll;
88ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
89ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private static AtomicInteger mInstanceNumber = new AtomicInteger(0);
90ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private AsyncChannel mAc;
91ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
92ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    // The DCT that's talking to us, we only support one!
931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private DcTracker mDct = null;
94ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected String[] mPcscfAddr;
96a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
97ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
98ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Used internally for saving connecting parameters.
99ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
1003a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    public static class ConnectionParams {
101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        int mTag;
102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ApnContext mApnContext;
103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        int mProfileId;
104203e588e3c42a81aa8a56f595119c181a63b12caWink Saville        int mRilRat;
105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Message mOnCompletedMsg;
106ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt        final int mConnectionGeneration;
107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1080e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        ConnectionParams(ApnContext apnContext, int profileId,
1090e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                int rilRadioTechnology, Message onCompletedMsg, int connectionGeneration) {
110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mApnContext = apnContext;
111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mProfileId = profileId;
112203e588e3c42a81aa8a56f595119c181a63b12caWink Saville            mRilRat = rilRadioTechnology;
113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mOnCompletedMsg = onCompletedMsg;
114ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt            mConnectionGeneration = connectionGeneration;
115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public String toString() {
119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            return "{mTag=" + mTag + " mApnContext=" + mApnContext
1200e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                    + " mProfileId=" + mProfileId
121203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                    + " mRat=" + mRilRat
122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}";
123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Used internally for saving disconnecting parameters.
128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
129e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    public static class DisconnectParams {
130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        int mTag;
131e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        public ApnContext mApnContext;
132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        String mReason;
133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Message mOnCompletedMsg;
134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        DisconnectParams(ApnContext apnContext, String reason, Message onCompletedMsg) {
136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mApnContext = apnContext;
137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mReason = reason;
138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mOnCompletedMsg = onCompletedMsg;
139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public String toString() {
143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            return "{mTag=" + mTag + " mApnContext=" + mApnContext
144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    + " mReason=" + mReason
145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}";
146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1482563e7e1ec513121b980045571a245aa5390f1c5Wink Saville
149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private ApnSetting mApnSetting;
150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private ConnectionParams mConnectionParams;
151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DisconnectParams mDisconnectParams;
152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DcFailCause mDcFailCause;
153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private Phone mPhone;
155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private LinkProperties mLinkProperties = new LinkProperties();
156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private long mCreateTime;
157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private long mLastFailTime;
158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DcFailCause mLastFailCause;
159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private static final String NULL_IP = "0.0.0.0";
160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private Object mUserData;
161203e588e3c42a81aa8a56f595119c181a63b12caWink Saville    private int mRilRat = Integer.MAX_VALUE;
162203e588e3c42a81aa8a56f595119c181a63b12caWink Saville    private int mDataRegState = Integer.MAX_VALUE;
16362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt    private NetworkInfo mNetworkInfo;
16462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt    private NetworkAgent mNetworkAgent;
165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    int mTag;
1673a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    public int mCid;
1683a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    public HashMap<ApnContext, ConnectionParams> mApnContexts = null;
169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    PendingIntent mReconnectIntent = null;
170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    // ***** Event codes for driving the state machine, package visible for Dcc
173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int BASE = Protocol.BASE_DATA_CONNECTION;
174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int EVENT_CONNECT = BASE + 0;
175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int EVENT_SETUP_DATA_CONNECTION_DONE = BASE + 1;
176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int EVENT_GET_LAST_FAIL_DONE = BASE + 2;
177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int EVENT_DEACTIVATE_DONE = BASE + 3;
178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int EVENT_DISCONNECT = BASE + 4;
179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int EVENT_RIL_CONNECTED = BASE + 5;
180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int EVENT_DISCONNECT_ALL = BASE + 6;
181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int EVENT_DATA_STATE_CHANGED = BASE + 7;
182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int EVENT_TEAR_DOWN_NOW = BASE + 8;
183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static final int EVENT_LOST_CONNECTION = BASE + 9;
184203e588e3c42a81aa8a56f595119c181a63b12caWink Saville    static final int EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED = BASE + 11;
18562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt    static final int EVENT_DATA_CONNECTION_ROAM_ON = BASE + 12;
18662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt    static final int EVENT_DATA_CONNECTION_ROAM_OFF = BASE + 13;
18765bee39d7e417fb898c3948696d5d8a38046c449fenglu    static final int EVENT_BW_REFRESH_RESPONSE = BASE + 14;
1886356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt    static final int EVENT_DATA_CONNECTION_VOICE_CALL_STARTED = BASE + 15;
1896356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt    static final int EVENT_DATA_CONNECTION_VOICE_CALL_ENDED = BASE + 16;
1906356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt
1916356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt    private static final int CMD_TO_STRING_COUNT =
1926356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt            EVENT_DATA_CONNECTION_VOICE_CALL_ENDED - BASE + 1;
193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT];
195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static {
196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sCmdToString[EVENT_CONNECT - BASE] = "EVENT_CONNECT";
197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sCmdToString[EVENT_SETUP_DATA_CONNECTION_DONE - BASE] =
198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                "EVENT_SETUP_DATA_CONNECTION_DONE";
199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sCmdToString[EVENT_GET_LAST_FAIL_DONE - BASE] = "EVENT_GET_LAST_FAIL_DONE";
200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sCmdToString[EVENT_DEACTIVATE_DONE - BASE] = "EVENT_DEACTIVATE_DONE";
201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sCmdToString[EVENT_DISCONNECT - BASE] = "EVENT_DISCONNECT";
202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sCmdToString[EVENT_RIL_CONNECTED - BASE] = "EVENT_RIL_CONNECTED";
203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sCmdToString[EVENT_DISCONNECT_ALL - BASE] = "EVENT_DISCONNECT_ALL";
204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sCmdToString[EVENT_DATA_STATE_CHANGED - BASE] = "EVENT_DATA_STATE_CHANGED";
205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sCmdToString[EVENT_TEAR_DOWN_NOW - BASE] = "EVENT_TEAR_DOWN_NOW";
206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sCmdToString[EVENT_LOST_CONNECTION - BASE] = "EVENT_LOST_CONNECTION";
207203e588e3c42a81aa8a56f595119c181a63b12caWink Saville        sCmdToString[EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED - BASE] =
208203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                "EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED";
20962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        sCmdToString[EVENT_DATA_CONNECTION_ROAM_ON - BASE] = "EVENT_DATA_CONNECTION_ROAM_ON";
21062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        sCmdToString[EVENT_DATA_CONNECTION_ROAM_OFF - BASE] = "EVENT_DATA_CONNECTION_ROAM_OFF";
21165bee39d7e417fb898c3948696d5d8a38046c449fenglu        sCmdToString[EVENT_BW_REFRESH_RESPONSE - BASE] = "EVENT_BW_REFRESH_RESPONSE";
2126356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        sCmdToString[EVENT_DATA_CONNECTION_VOICE_CALL_STARTED - BASE] =
2136356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                "EVENT_DATA_CONNECTION_VOICE_CALL_STARTED";
2146356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        sCmdToString[EVENT_DATA_CONNECTION_VOICE_CALL_ENDED - BASE] =
2156356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                "EVENT_DATA_CONNECTION_VOICE_CALL_ENDED";
216ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
217ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    // Convert cmd to string or null if unknown
218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static String cmdToString(int cmd) {
219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        String value;
220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        cmd -= BASE;
221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if ((cmd >= 0) && (cmd < sCmdToString.length)) {
222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            value = sCmdToString[cmd];
223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
224454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            value = DcAsyncChannel.cmdToString(cmd + BASE);
225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (value == null) {
227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            value = "0x" + Integer.toHexString(cmd + BASE);
228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return value;
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
233cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Create the connection object
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
235cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * @param phone the Phone
236cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * @param id the connection id
237cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * @return DataConnection that was created.
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
239e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    public static DataConnection makeDataConnection(Phone phone, int id,
2401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            DcTracker dct, DcTesterFailBringUpAll failBringUpAll,
241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            DcController dcc) {
242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        DataConnection dc = new DataConnection(phone,
243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                "DC-" + mInstanceNumber.incrementAndGet(), id, dct, failBringUpAll, dcc);
244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        dc.start();
245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (DBG) dc.log("Made " + dc.getName());
246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return dc;
247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    void dispose() {
250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        log("dispose: call quiteNow()");
251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        quitNow();
252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /* Getter functions */
255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
256f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt    NetworkCapabilities getCopyNetworkCapabilities() {
25762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        return makeNetworkCapabilities();
258f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt    }
259f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt
260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    LinkProperties getCopyLinkProperties() {
261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return new LinkProperties(mLinkProperties);
262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    boolean getIsInactive() {
265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return getCurrentState() == mInactiveState;
266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    int getCid() {
269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return mCid;
270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    ApnSetting getApnSetting() {
273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return mApnSetting;
274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2769c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk    void setLinkPropertiesHttpProxy(ProxyInfo proxy) {
277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mLinkProperties.setHttpProxy(proxy);
278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2803a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    public static class UpdateLinkPropertyResult {
281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public DataCallResponse.SetupResult setupResult = DataCallResponse.SetupResult.SUCCESS;
282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public LinkProperties oldLp;
283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public LinkProperties newLp;
284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public UpdateLinkPropertyResult(LinkProperties curLp) {
285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            oldLp = curLp;
286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            newLp = curLp;
287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public boolean isIpv4Connected() {
291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        boolean ret = false;
292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Collection <InetAddress> addresses = mLinkProperties.getAddresses();
293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (InetAddress addr: addresses) {
295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (addr instanceof java.net.Inet4Address) {
296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                java.net.Inet4Address i4addr = (java.net.Inet4Address) addr;
297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                if (!i4addr.isAnyLocalAddress() && !i4addr.isLinkLocalAddress() &&
298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        !i4addr.isLoopbackAddress() && !i4addr.isMulticastAddress()) {
299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    ret = true;
300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    break;
301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return ret;
305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public boolean isIpv6Connected() {
308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        boolean ret = false;
309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Collection <InetAddress> addresses = mLinkProperties.getAddresses();
310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (InetAddress addr: addresses) {
312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (addr instanceof java.net.Inet6Address) {
313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                java.net.Inet6Address i6addr = (java.net.Inet6Address) addr;
314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                if (!i6addr.isAnyLocalAddress() && !i6addr.isLinkLocalAddress() &&
315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        !i6addr.isLoopbackAddress() && !i6addr.isMulticastAddress()) {
316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    ret = true;
317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    break;
318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return ret;
322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
3243a5b9323f422134b68a92c36813001ec8bed2866Jack Yu    public UpdateLinkPropertyResult updateLinkProperty(DataCallResponse newState) {
325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties);
326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (newState == null) return result;
328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        DataCallResponse.SetupResult setupResult;
330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        result.newLp = new LinkProperties();
331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // set link properties based on data call response
333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        result.setupResult = setLinkProperties(newState, result.newLp);
334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (result.setupResult != DataCallResponse.SetupResult.SUCCESS) {
335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) log("updateLinkProperty failed : " + result.setupResult);
336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            return result;
337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // copy HTTP proxy as it is not part DataCallResponse.
339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        result.newLp.setHttpProxy(mLinkProperties.getHttpProxy());
340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
341e9701717e43cc5aacbcf624f77a53be92350662cw        checkSetMtu(mApnSetting, result.newLp);
342e9701717e43cc5aacbcf624f77a53be92350662cw
34327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt        mLinkProperties = result.newLp;
34427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt
34527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt        updateTcpBufferSizes(mRilRat);
34627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt
347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (DBG && (! result.oldLp.equals(result.newLp))) {
348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            log("updateLinkProperty old LP=" + result.oldLp);
349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            log("updateLinkProperty new LP=" + result.newLp);
350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
351f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt
352d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt        if (result.newLp.equals(result.oldLp) == false &&
353d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt                mNetworkAgent != null) {
354d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt            mNetworkAgent.sendLinkProperties(mLinkProperties);
355d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt        }
356d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt
357ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return result;
358ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
360e9701717e43cc5aacbcf624f77a53be92350662cw    /**
361e9701717e43cc5aacbcf624f77a53be92350662cw     * Read the MTU value from link properties where it can be set from network. In case
362e9701717e43cc5aacbcf624f77a53be92350662cw     * not set by the network, set it again using the mtu szie value defined in the APN
363e9701717e43cc5aacbcf624f77a53be92350662cw     * database for the connected APN
364e9701717e43cc5aacbcf624f77a53be92350662cw     */
365e9701717e43cc5aacbcf624f77a53be92350662cw    private void checkSetMtu(ApnSetting apn, LinkProperties lp) {
366e9701717e43cc5aacbcf624f77a53be92350662cw        if (lp == null) return;
367e9701717e43cc5aacbcf624f77a53be92350662cw
368e9701717e43cc5aacbcf624f77a53be92350662cw        if (apn == null || lp == null) return;
369e9701717e43cc5aacbcf624f77a53be92350662cw
370e9701717e43cc5aacbcf624f77a53be92350662cw        if (lp.getMtu() != PhoneConstants.UNSET_MTU) {
371e9701717e43cc5aacbcf624f77a53be92350662cw            if (DBG) log("MTU set by call response to: " + lp.getMtu());
372e9701717e43cc5aacbcf624f77a53be92350662cw            return;
373e9701717e43cc5aacbcf624f77a53be92350662cw        }
374e9701717e43cc5aacbcf624f77a53be92350662cw
375e9701717e43cc5aacbcf624f77a53be92350662cw        if (apn != null && apn.mtu != PhoneConstants.UNSET_MTU) {
376e9701717e43cc5aacbcf624f77a53be92350662cw            lp.setMtu(apn.mtu);
377e9701717e43cc5aacbcf624f77a53be92350662cw            if (DBG) log("MTU set by APN to: " + apn.mtu);
378e9701717e43cc5aacbcf624f77a53be92350662cw            return;
379e9701717e43cc5aacbcf624f77a53be92350662cw        }
380e9701717e43cc5aacbcf624f77a53be92350662cw
381e9701717e43cc5aacbcf624f77a53be92350662cw        int mtu = mPhone.getContext().getResources().getInteger(
382e9701717e43cc5aacbcf624f77a53be92350662cw                com.android.internal.R.integer.config_mobile_mtu);
383e9701717e43cc5aacbcf624f77a53be92350662cw        if (mtu != PhoneConstants.UNSET_MTU) {
384e9701717e43cc5aacbcf624f77a53be92350662cw            lp.setMtu(mtu);
385e9701717e43cc5aacbcf624f77a53be92350662cw            if (DBG) log("MTU set by config resource to: " + mtu);
386e9701717e43cc5aacbcf624f77a53be92350662cw        }
387e9701717e43cc5aacbcf624f77a53be92350662cw    }
388e9701717e43cc5aacbcf624f77a53be92350662cw
389ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    //***** Constructor (NOTE: uses dcc.getHandler() as its Handler)
3901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private DataConnection(Phone phone, String name, int id,
3911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                DcTracker dct, DcTesterFailBringUpAll failBringUpAll,
392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                DcController dcc) {
393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        super(name, dcc.getHandler());
394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        setLogRecSize(300);
395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        setLogOnlyTransitions(true);
3969c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu        if (DBG) log("DataConnection created");
397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
398ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mPhone = phone;
399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDct = dct;
400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcTesterFailBringUpAll = failBringUpAll;
401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcController = dcc;
402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mId = id;
403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mCid = -1;
40462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        ServiceState ss = mPhone.getServiceState();
40562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        mRilRat = ss.getRilDataRadioTechnology();
406203e588e3c42a81aa8a56f595119c181a63b12caWink Saville        mDataRegState = mPhone.getServiceState().getDataRegState();
40762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        int networkType = ss.getDataNetworkType();
40862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_MOBILE,
409aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran                networkType, NETWORK_TYPE, TelephonyManager.getNetworkTypeName(networkType));
410ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao        mNetworkInfo.setRoaming(ss.getDataRoaming());
41162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        mNetworkInfo.setIsAvailable(true);
412a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        // The network should be by default metered until we find it has NET_CAPABILITY_NOT_METERED
413a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        // capability.
414a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        mNetworkInfo.setMetered(true);
415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        addState(mDefaultState);
417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            addState(mInactiveState, mDefaultState);
418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            addState(mActivatingState, mDefaultState);
419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            addState(mActiveState, mDefaultState);
420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            addState(mDisconnectingState, mDefaultState);
421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            addState(mDisconnectingErrorCreatingConnection, mDefaultState);
422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        setInitialState(mInactiveState);
423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
424ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt        mApnContexts = new HashMap<ApnContext, ConnectionParams>();
425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
428cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Begin setting up a data connection, calls setupDataCall
429cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * and the ConnectionParams will be returned with the
430cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj.
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
432cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * @param cp is the connection parameters
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private void onConnect(ConnectionParams cp) {
435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (DBG) log("onConnect: carrier='" + mApnSetting.carrier
436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                + "' APN='" + mApnSetting.apn
437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                + "' proxy='" + mApnSetting.proxy + "' port='" + mApnSetting.port + "'");
4382dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt        if (cp.mApnContext != null) cp.mApnContext.requestLog("DataConnection.onConnect");
4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // Check if we should fake an error.
441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (mDcTesterFailBringUpAll.getDcFailBringUp().mCounter  > 0) {
442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            DataCallResponse response = new DataCallResponse();
443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            response.version = mPhone.mCi.getRilVersion();
444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            response.status = mDcTesterFailBringUpAll.getDcFailBringUp().mFailCause.getErrorCode();
445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            response.cid = 0;
446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            response.active = 0;
447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            response.type = "";
448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            response.ifname = "";
449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            response.addresses = new String[0];
450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            response.dnses = new String[0];
451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            response.gateways = new String[0];
452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            response.suggestedRetryTime =
453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    mDcTesterFailBringUpAll.getDcFailBringUp().mSuggestedRetryTime;
454a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            response.pcscf = new String[0];
455e9701717e43cc5aacbcf624f77a53be92350662cw            response.mtu = PhoneConstants.UNSET_MTU;
456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp);
458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            AsyncResult.forMessage(msg, response, null);
459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            sendMessage(msg);
460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) {
461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                log("onConnect: FailBringUpAll=" + mDcTesterFailBringUpAll.getDcFailBringUp()
462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        + " send error response=" + response);
463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDcTesterFailBringUpAll.getDcFailBringUp().mCounter -= 1;
465ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            return;
466ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
46822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCreateTime = -1;
46922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mLastFailTime = -1;
470ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mLastFailCause = DcFailCause.NONE;
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
472cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // msg.obj will be returned in AsyncResult.userObj;
473cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp);
474cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.obj = cp;
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        int authType = mApnSetting.authType;
477cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (authType == -1) {
478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            authType = TextUtils.isEmpty(mApnSetting.user) ? RILConstants.SETUP_DATA_AUTH_NONE
479cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    : RILConstants.SETUP_DATA_AUTH_PAP_CHAP;
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
482cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String protocol;
4836b8e1174d2ef221d6eeab348a819ce0003d3d5a4Chris Manton        if (mPhone.getServiceState().getDataRoamingFromRegistration()) {
484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            protocol = mApnSetting.roamingProtocol;
485cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            protocol = mApnSetting.protocol;
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
48922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.mCi.setupDataCall(
4905d5ec64fcd293928776aebe5c92278afb5bc019dPavel Zhamaitsiak                cp.mRilRat,
4915d5ec64fcd293928776aebe5c92278afb5bc019dPavel Zhamaitsiak                cp.mProfileId,
492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                mApnSetting.apn, mApnSetting.user, mApnSetting.password,
4935d5ec64fcd293928776aebe5c92278afb5bc019dPavel Zhamaitsiak                authType,
494cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                protocol, msg);
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * TearDown the data connection when the deactivation is complete a Message with
499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * msg.what == EVENT_DEACTIVATE_DONE and msg.obj == AsyncResult with AsyncResult.obj
500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * containing the parameter o.
501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param o is the object returned in the AsyncResult.obj.
503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private void tearDownData(Object o) {
505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        int discReason = RILConstants.DEACTIVATE_REASON_NONE;
5062dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt        ApnContext apnContext = null;
507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if ((o != null) && (o instanceof DisconnectParams)) {
508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            DisconnectParams dp = (DisconnectParams)o;
5092dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt            apnContext = dp.mApnContext;
510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (TextUtils.equals(dp.mReason, Phone.REASON_RADIO_TURNED_OFF)) {
511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF;
512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else if (TextUtils.equals(dp.mReason, Phone.REASON_PDP_RESET)) {
513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET;
514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
5160e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh        if (mPhone.mCi.getRadioState().isOn()
5170e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh                || (mPhone.getServiceState().getRilDataRadioTechnology()
5180e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh                        == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN )) {
5192dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt            String str = "tearDownData radio is on, call deactivateDataCall";
5202dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt            if (DBG) log(str);
5212dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt            if (apnContext != null) apnContext.requestLog(str);
522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mPhone.mCi.deactivateDataCall(mCid, discReason,
523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o));
524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
5252dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt            String str = "tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately";
5262dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt            if (DBG) log(str);
5272dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt            if (apnContext != null) apnContext.requestLog(str);
528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            AsyncResult ar = new AsyncResult(o, null, null);
529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, ar));
530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) {
53462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        mNetworkInfo.setDetailedState(mNetworkInfo.getDetailedState(), reason,
53562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                mNetworkInfo.getExtraInfo());
536ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt        for (ConnectionParams cp : mApnContexts.values()) {
537ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt            ApnContext apnContext = cp.mApnContext;
538f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt            if (apnContext == alreadySent) continue;
539f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt            if (reason != null) apnContext.setReason(reason);
540ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt            Pair<ApnContext, Integer> pair =
541ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt                    new Pair<ApnContext, Integer>(apnContext, cp.mConnectionGeneration);
542ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt            Message msg = mDct.obtainMessage(event, pair);
543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            AsyncResult.forMessage(msg);
544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            msg.sendToTarget();
545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private void notifyAllOfConnected(String reason) {
549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason);
5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private void notifyAllOfDisconnectDcRetrying(String reason) {
553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DC_RETRYING, reason);
554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private void notifyAllDisconnectCompleted(DcFailCause cause) {
556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DONE, cause.toString());
5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Send the connectionCompletedMsg.
562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param cp is the ConnectionParams
564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param cause and if no error the cause is DcFailCause.NONE
565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param sendAll is true if all contexts are to be notified
566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private void notifyConnectCompleted(ConnectionParams cp, DcFailCause cause, boolean sendAll) {
568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ApnContext alreadySent = null;
569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (cp != null && cp.mOnCompletedMsg != null) {
571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            // Get the completed message but only use it once
572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Message connectionCompletedMsg = cp.mOnCompletedMsg;
573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            cp.mOnCompletedMsg = null;
5747d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu            alreadySent = cp.mApnContext;
575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            long timeStamp = System.currentTimeMillis();
577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            connectionCompletedMsg.arg1 = mCid;
578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (cause == DcFailCause.NONE) {
580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                mCreateTime = timeStamp;
581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                AsyncResult.forMessage(connectionCompletedMsg);
582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else {
583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                mLastFailCause = cause;
584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                mLastFailTime = timeStamp;
585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                // Return message with a Throwable exception to signify an error.
587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                if (cause == null) cause = DcFailCause.UNKNOWN;
588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                AsyncResult.forMessage(connectionCompletedMsg, cause,
589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        new Throwable(cause.toString()));
590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) {
592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                log("notifyConnectCompleted at " + timeStamp + " cause=" + cause
593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        + " connectionCompletedMsg=" + msgToString(connectionCompletedMsg));
594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            connectionCompletedMsg.sendToTarget();
597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (sendAll) {
5990e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu            log("Send to all. " + alreadySent + " " + cause.toString());
600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            notifyAllWithEvent(alreadySent, DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR,
601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    cause.toString());
602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Send ar.userObj if its a message, which is should be back to originator.
607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param dp is the DisconnectParams.
609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) {
611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG) log("NotifyDisconnectCompleted");
612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ApnContext alreadySent = null;
614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        String reason = null;
615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (dp != null && dp.mOnCompletedMsg != null) {
617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            // Get the completed message but only use it once
618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Message msg = dp.mOnCompletedMsg;
619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            dp.mOnCompletedMsg = null;
620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (msg.obj instanceof ApnContext) {
621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                alreadySent = (ApnContext)msg.obj;
622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            reason = dp.mReason;
624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG) {
625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                log(String.format("msg=%s msg.obj=%s", msg.toString(),
626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>")));
627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            AsyncResult.forMessage(msg);
629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            msg.sendToTarget();
630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (sendAll) {
632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (reason == null) {
633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                reason = DcFailCause.UNKNOWN.toString();
634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            notifyAllWithEvent(alreadySent, DctConstants.EVENT_DISCONNECT_DONE, reason);
636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp);
638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /*
641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * **************************************************************************
642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Begin Members and methods owned by DataConnectionTracker but stored
643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * in a DataConnection because there is one per connection.
644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * **************************************************************************
645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /*
648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The id is owned by DataConnectionTracker.
649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private int mId;
651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Get the DataConnection ID
654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public int getDataConnectionId() {
656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return mId;
657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /*
660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * **************************************************************************
661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * End members owned by DataConnectionTracker
662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * **************************************************************************
663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Clear all settings called when entering mInactiveState.
667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private void clearSettings() {
669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (DBG) log("clearSettings");
670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mCreateTime = -1;
672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mLastFailTime = -1;
673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mLastFailCause = DcFailCause.NONE;
674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mCid = -1;
675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
676a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPcscfAddr = new String[5];
677a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mLinkProperties = new LinkProperties();
679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mApnContexts.clear();
680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mApnSetting = null;
681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcFailCause = null;
682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Process setup completion.
686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param ar is the result
688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @return SetupResult.
689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DataCallResponse.SetupResult onSetupConnectionCompleted(AsyncResult ar) {
691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        DataCallResponse response = (DataCallResponse) ar.result;
692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ConnectionParams cp = (ConnectionParams) ar.userObj;
693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        DataCallResponse.SetupResult result;
694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (cp.mTag != mTag) {
696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) {
697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                log("onSetupConnectionCompleted stale cp.tag=" + cp.mTag + ", mtag=" + mTag);
698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            result = DataCallResponse.SetupResult.ERR_Stale;
700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else if (ar.exception != null) {
701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) {
702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception +
703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    " response=" + response);
704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (ar.exception instanceof CommandException
707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    && ((CommandException) (ar.exception)).getCommandError()
708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    == CommandException.Error.RADIO_NOT_AVAILABLE) {
709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                result = DataCallResponse.SetupResult.ERR_BadCommand;
710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                result.mFailCause = DcFailCause.RADIO_NOT_AVAILABLE;
711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else if ((response == null) || (response.version < 4)) {
712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                result = DataCallResponse.SetupResult.ERR_GetLastErrorFromRil;
713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else {
714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                result = DataCallResponse.SetupResult.ERR_RilError;
715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                result.mFailCause = DcFailCause.fromInt(response.status);
716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else if (response.status != 0) {
718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            result = DataCallResponse.SetupResult.ERR_RilError;
719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            result.mFailCause = DcFailCause.fromInt(response.status);
720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
7213a5b9323f422134b68a92c36813001ec8bed2866Jack Yu            if (DBG) log("onSetupConnectionCompleted received successful DataCallResponse");
722ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mCid = response.cid;
723a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
724a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mPcscfAddr = response.pcscf;
725a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
726ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            result = updateLinkProperty(response).setupResult;
727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return result;
730ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
731ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
732ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private boolean isDnsOk(String[] domainNameServers) {
733cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1])
73422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && !mPhone.isDnsCheckDisabled()) {
735cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // Work around a race condition where QMI does not fill in DNS:
736cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // Deactivate PDP and let DataConnectionTracker retry.
737cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // Do not apply the race condition workaround for MMS APN
738cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // if Proxy is an IP-address.
739cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // Otherwise, the default APN will not be restored anymore.
740ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (!mApnSetting.types[0].equals(PhoneConstants.APN_TYPE_MMS)
741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                || !isIpAddress(mApnSetting.mmsProxy)) {
742cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log(String.format(
743cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s",
744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        mApnSetting.types[0], PhoneConstants.APN_TYPE_MMS, mApnSetting.mmsProxy,
745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        isIpAddress(mApnSetting.mmsProxy)));
746cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                return false;
747cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
748cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
749cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return true;
7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
75227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt    private static final String TCP_BUFFER_SIZES_GPRS = "4092,8760,48000,4096,8760,48000";
75327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt    private static final String TCP_BUFFER_SIZES_EDGE = "4093,26280,70800,4096,16384,70800";
75427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt    private static final String TCP_BUFFER_SIZES_UMTS = "58254,349525,1048576,58254,349525,1048576";
755d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao    private static final String TCP_BUFFER_SIZES_1XRTT= "16384,32768,131072,4096,16384,102400";
75627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt    private static final String TCP_BUFFER_SIZES_EVDO = "4094,87380,262144,4096,16384,262144";
757d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao    private static final String TCP_BUFFER_SIZES_EHRPD= "131072,262144,1048576,4096,16384,524288";
75827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt    private static final String TCP_BUFFER_SIZES_HSDPA= "61167,367002,1101005,8738,52429,262114";
75927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt    private static final String TCP_BUFFER_SIZES_HSPA = "40778,244668,734003,16777,100663,301990";
76027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt    private static final String TCP_BUFFER_SIZES_LTE  =
76127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            "524288,1048576,2097152,262144,524288,1048576";
76227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt    private static final String TCP_BUFFER_SIZES_HSPAP= "122334,734003,2202010,32040,192239,576717";
76327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt
76427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt    private void updateTcpBufferSizes(int rilRat) {
76527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt        String sizes = null;
7662f43e7848e6039b1f7541ef129fedad3b66947f0Robert Greenwalt        if (rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA) {
7672f43e7848e6039b1f7541ef129fedad3b66947f0Robert Greenwalt            // for now treat CA as LTE.  Plan to surface the extra bandwith in a more
7682f43e7848e6039b1f7541ef129fedad3b66947f0Robert Greenwalt            // precise manner which should affect buffer sizes
7692f43e7848e6039b1f7541ef129fedad3b66947f0Robert Greenwalt            rilRat = ServiceState.RIL_RADIO_TECHNOLOGY_LTE;
7702f43e7848e6039b1f7541ef129fedad3b66947f0Robert Greenwalt        }
7718fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt        String ratName = ServiceState.rilRadioTechnologyToString(rilRat).toLowerCase(Locale.ROOT);
7728fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt        // ServiceState gives slightly different names for EVDO tech ("evdo-rev.0" for ex)
7738fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt        // - patch it up:
7748fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt        if (rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0 ||
7758fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A ||
7768fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B) {
7778fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt            ratName = "evdo";
7788fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt        }
7798fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt
7808fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt        // in the form: "ratname:rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max"
7818fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt        String[] configOverride = mPhone.getContext().getResources().getStringArray(
7828fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                com.android.internal.R.array.config_mobile_tcp_buffers);
7838fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt        for (int i = 0; i < configOverride.length; i++) {
7848fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt            String[] split = configOverride[i].split(":");
7858fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt            if (ratName.equals(split[0]) && split.length == 2) {
7868fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                sizes = split[1];
78727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt                break;
7888fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt            }
7898fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt        }
7908fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt
7918fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt        if (sizes == null) {
7928fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt            // no override - use telephony defaults
7938fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt            // doing it this way allows device or carrier to just override the types they
7948fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt            // care about and inherit the defaults for the others.
7958fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt            switch (rilRat) {
7968fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS:
7978fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    sizes = TCP_BUFFER_SIZES_GPRS;
7988fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    break;
7998fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE:
8008fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    sizes = TCP_BUFFER_SIZES_EDGE;
8018fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    break;
8028fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS:
8038fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    sizes = TCP_BUFFER_SIZES_UMTS;
8048fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    break;
805d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao                case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT:
806d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao                    sizes = TCP_BUFFER_SIZES_1XRTT;
807d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao                    break;
8088fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0:
8098fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A:
8108fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B:
8118fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    sizes = TCP_BUFFER_SIZES_EVDO;
8128fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    break;
813d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao                case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD:
814d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao                    sizes = TCP_BUFFER_SIZES_EHRPD;
815d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao                    break;
8168fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA:
8178fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    sizes = TCP_BUFFER_SIZES_HSDPA;
8188fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    break;
8198fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA:
8208fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA:
8218fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    sizes = TCP_BUFFER_SIZES_HSPA;
8228fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    break;
8238fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_LTE:
824000f48b9c960010bf41cd22b8625b4ff16c2e719Ajay Nambi                case ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA:
8258fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    sizes = TCP_BUFFER_SIZES_LTE;
8268fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    break;
8278fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP:
8288fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    sizes = TCP_BUFFER_SIZES_HSPAP;
8298fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    break;
8308fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                default:
8318fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    // Leave empty - this will let ConnectivityService use the system default.
8328fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt                    break;
8338fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt            }
83427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt        }
83527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt        mLinkProperties.setTcpBufferSizes(sizes);
83627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt    }
83727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt
838692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt    /**
839692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * Indicates if when this connection was established we had a restricted/privileged
840692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * NetworkRequest and needed it to overcome data-enabled limitations.
841692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     *
842692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * This gets set once per connection setup and is based on conditions at that time.
843692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * We could theoretically have dynamic capabilities but now is not a good time to
844692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * experiement with that.
845692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     *
846692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * This flag overrides the APN-based restriction capability, restricting the network
847692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * based on both having a NetworkRequest with restricted AND needing a restricted
848692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * bit to overcome user-disabled status.  This allows us to handle the common case
849692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * of having both restricted requests and unrestricted requests for the same apn:
850692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * if conditions require a restricted network to overcome user-disabled then it must
851692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * be restricted, otherwise it is unrestricted (or restricted based on APN type).
852692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     *
853692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * Because we're not supporting dynamic capabilities, if conditions change and we go from
854692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * data-enabled to not or vice-versa we will need to tear down networks to deal with it
855692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * at connection setup time with the new state.
856692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     *
857692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * This supports a privileged app bringing up a network without general apps having access
858692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * to it when the network is otherwise unavailable (hipri).  The first use case is
859692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * pre-paid SIM reprovisioning over internet, where the carrier insists on no traffic
860692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     * other than from the privileged carrier-app.
861692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt     */
862692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt    private boolean mRestrictedNetworkOverride = false;
863692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt
864692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt    // Should be called once when the call goes active to examine the state of things and
865692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt    // declare the restriction override for the life of the connection
866692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt    private void setNetworkRestriction() {
867692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        mRestrictedNetworkOverride = false;
868692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        // first, if we have no restricted requests, this override can stay FALSE:
869692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        boolean noRestrictedRequests = true;
870692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        for (ApnContext apnContext : mApnContexts.keySet()) {
871443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt            noRestrictedRequests &= apnContext.hasNoRestrictedRequests(true /* exclude DUN */);
872692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        }
873692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        if (noRestrictedRequests) {
874692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt            return;
875692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        }
876692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt
877692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        // Do we need a restricted network to satisfy the request?
878692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        // Is this network metered?  If not, then don't add restricted
879692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        if (!mApnSetting.isMetered(mPhone.getContext(), mPhone.getSubId(),
880692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt                mPhone.getServiceState().getDataRoaming())) {
881692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt            return;
882692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        }
883692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt
884a8f5a859f8e4a15902d729af5d2edc9a9433ba41Jack Yu        // Is data disabled?
885692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        mRestrictedNetworkOverride = (mDct.isDataEnabled(true) == false);
886692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt    }
887692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt
88862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt    private NetworkCapabilities makeNetworkCapabilities() {
88962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        NetworkCapabilities result = new NetworkCapabilities();
89062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        result.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
89162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt
89262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        if (mApnSetting != null) {
89362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt            for (String type : mApnSetting.types) {
89462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                switch (type) {
895b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt                    case PhoneConstants.APN_TYPE_ALL: {
896fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
897fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS);
898fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL);
899fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA);
900fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
901fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS);
902fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA);
903b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt                        break;
904b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt                    }
90562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    case PhoneConstants.APN_TYPE_DEFAULT: {
906fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
90762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                        break;
90862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    }
90962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    case PhoneConstants.APN_TYPE_MMS: {
910fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS);
91162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                        break;
91262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    }
91362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    case PhoneConstants.APN_TYPE_SUPL: {
914fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL);
91562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                        break;
91662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    }
91762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    case PhoneConstants.APN_TYPE_DUN: {
918c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt                        ApnSetting securedDunApn = mDct.fetchDunApn();
919c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt                        if (securedDunApn == null || securedDunApn.equals(mApnSetting)) {
920c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt                            result.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
921c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt                        }
92262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                        break;
92362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    }
92462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    case PhoneConstants.APN_TYPE_FOTA: {
925fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA);
92662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                        break;
92762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    }
92862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    case PhoneConstants.APN_TYPE_IMS: {
929fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
93062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                        break;
93162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    }
93262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    case PhoneConstants.APN_TYPE_CBS: {
933fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS);
93462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                        break;
93562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    }
93662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    case PhoneConstants.APN_TYPE_IA: {
937fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA);
93862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                        break;
93962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    }
9404a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi                    case PhoneConstants.APN_TYPE_EMERGENCY: {
9414a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi                        result.addCapability(NetworkCapabilities.NET_CAPABILITY_EIMS);
9424a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi                        break;
9434a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi                    }
94462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    default:
94562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                }
94662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt            }
9478b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu
9488b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu            // If none of the APN types associated with this APN setting is metered,
9498b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu            // then we apply NOT_METERED capability to the network.
9503d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu            if (!mApnSetting.isMetered(mPhone.getContext(), mPhone.getSubId(),
9513d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu                    mPhone.getServiceState().getDataRoaming())) {
9528b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu                result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
953a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu                mNetworkInfo.setMetered(false);
954a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu            } else {
955a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu                result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
956a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu                mNetworkInfo.setMetered(true);
9578b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu            }
9588b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu
959af171aa4dcf294bf2d1b9bed54ef9a6b0ec76361Paul Jensen            result.maybeMarkCapabilitiesRestricted();
96062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        }
961692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        if (mRestrictedNetworkOverride) {
962692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt            result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
963443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt            // don't use dun on restriction-overriden networks.
964443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt            result.removeCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
965692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt        }
966692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt
96762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        int up = 14;
96862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        int down = 14;
96962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        switch (mRilRat) {
97027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: up = 80; down = 80; break;
97127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: up = 59; down = 236; break;
97227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: up = 384; down = 384; break;
97327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A: // fall through
97427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B: up = 14; down = 14; break;
97527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: up = 153; down = 2457; break;
97627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: up = 1843; down = 3174; break;
97727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: up = 100; down = 100; break;
97827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: up = 2048; down = 14336; break;
97927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: up = 5898; down = 14336; break;
98027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: up = 5898; down = 14336; break;
98127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: up = 1843; down = 5017; break;
98227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: up = 51200; down = 102400; break;
983000f48b9c960010bf41cd22b8625b4ff16c2e719Ajay Nambi            case ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA: up = 51200; down = 102400; break;
98427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: up = 153; down = 2516; break;
98527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: up = 11264; down = 43008; break;
98662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt            default:
98762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        }
98862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        result.setLinkUpstreamBandwidthKbps(up);
98962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        result.setLinkDownstreamBandwidthKbps(down);
990edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt
991edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt        result.setNetworkSpecifier(Integer.toString(mPhone.getSubId()));
992edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt
99362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        return result;
99462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt    }
99562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt
996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private boolean isIpAddress(String address) {
997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (address == null) return false;
998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return Patterns.IP_ADDRESS.matcher(address).matches();
1000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DataCallResponse.SetupResult setLinkProperties(DataCallResponse response,
1003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            LinkProperties lp) {
1004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // Check if system property dns usable
1005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        boolean okToUseSystemPropertyDns = false;
1006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        String propertyPrefix = "net." + response.ifname + ".";
1007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        String dnsServers[] = new String[2];
1008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1");
1009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2");
1010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        okToUseSystemPropertyDns = isDnsOk(dnsServers);
1011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // set link properties based on data call response
1013ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return response.setLinkProperties(lp, okToUseSystemPropertyDns);
1014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
10179a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville     * Initialize connection, this will fail if the
10189a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville     * apnSettings are not compatible.
10199a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville     *
10200e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu     * @param cp the Connection parameters
10219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville     * @return true if initialization was successful.
10229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville     */
10239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville    private boolean initConnection(ConnectionParams cp) {
10249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville        ApnContext apnContext = cp.mApnContext;
10259a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville        if (mApnSetting == null) {
10269a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville            // Only change apn setting if it isn't set, it will
10279a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville            // only NOT be set only if we're in DcInactiveState.
10289a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville            mApnSetting = apnContext.getApnSetting();
1029bc1e44907073900212fb87da372174483525f3edJay Shrauner        }
1030bc1e44907073900212fb87da372174483525f3edJay Shrauner        if (mApnSetting == null || !mApnSetting.canHandleType(apnContext.getApnType())) {
10319a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville            if (DBG) {
10329a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                log("initConnection: incompatible apnSetting in ConnectionParams cp=" + cp
10339a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                        + " dc=" + DataConnection.this);
10349a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville            }
10359a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville            return false;
10369a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville        }
10379a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville        mTag += 1;
10389a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville        mConnectionParams = cp;
10399a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville        mConnectionParams.mTag = mTag;
10409a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville
10411a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt        // always update the ConnectionParams with the latest or the
10421a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt        // connectionGeneration gets stale
10431a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt        mApnContexts.put(apnContext, cp);
10441a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt
10459a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville        if (DBG) {
10469a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville            log("initConnection: "
10479a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                    + " RefCount=" + mApnContexts.size()
10489a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                    + " mApnList=" + mApnContexts
10499a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                    + " mConnectionParams=" + mConnectionParams);
10509a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville        }
10519a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville        return true;
10529a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville    }
10539a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville
10549a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville    /**
1055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The parent state for all other states.
1056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
1057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private class DcDefaultState extends State {
1058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void enter() {
1060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) log("DcDefaultState: enter");
1061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1062203e588e3c42a81aa8a56f595119c181a63b12caWink Saville            // Register for DRS or RAT change
1063203e588e3c42a81aa8a56f595119c181a63b12caWink Saville            mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(),
1064203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                    DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null);
1065203e588e3c42a81aa8a56f595119c181a63b12caWink Saville
1066ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao            mPhone.getServiceStateTracker().registerForDataRoamingOn(getHandler(),
106762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    DataConnection.EVENT_DATA_CONNECTION_ROAM_ON, null);
1068ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao            mPhone.getServiceStateTracker().registerForDataRoamingOff(getHandler(),
106962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null);
107062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt
1071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            // Add ourselves to the list of data connections
1072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDcController.addDc(DataConnection.this);
1073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void exit() {
1076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) log("DcDefaultState: exit");
1077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
107846f190903e93c653b90b970c1a21159bb957575bWink Saville            // Unregister for DRS or RAT change.
107946f190903e93c653b90b970c1a21159bb957575bWink Saville            mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler());
108046f190903e93c653b90b970c1a21159bb957575bWink Saville
1081ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao            mPhone.getServiceStateTracker().unregisterForDataRoamingOn(getHandler());
1082ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao            mPhone.getServiceStateTracker().unregisterForDataRoamingOff(getHandler());
108362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt
108446f190903e93c653b90b970c1a21159bb957575bWink Saville            // Remove ourselves from the DC lists
108546f190903e93c653b90b970c1a21159bb957575bWink Saville            mDcController.removeDc(DataConnection.this);
1086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (mAc != null) {
1088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                mAc.disconnected();
1089ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                mAc = null;
1090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mApnContexts = null;
1092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mReconnectIntent = null;
1093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDct = null;
1094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mApnSetting = null;
1095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mPhone = null;
1096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mLinkProperties = null;
1097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mLastFailCause = null;
1098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mUserData = null;
1099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDcController = null;
1100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDcTesterFailBringUpAll = null;
1101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public boolean processMessage(Message msg) {
1105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            boolean retVal = HANDLED;
1106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG) {
1108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                log("DcDefault msg=" + getWhatToString(msg.what)
1109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        + " RefCount=" + mApnContexts.size());
1110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            switch (msg.what) {
1112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: {
1113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (mAc != null) {
1114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        if (VDBG) log("Disconnecting to previous connection mAc=" + mAc);
1115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED,
1116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED);
1117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    } else {
1118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        mAc = new AsyncChannel();
1119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        mAc.connected(null, getHandler(), msg.replyTo);
1120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected");
1121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED,
1122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                AsyncChannel.STATUS_SUCCESSFUL, mId, "hi");
1123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {
112745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville                    if (DBG) {
112845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville                        log("DcDefault: CMD_CHANNEL_DISCONNECTED before quiting call dump");
112945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville                        dumpToLog();
113045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville                    }
113145eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville
1132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    quit();
1133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1135454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                case DcAsyncChannel.REQ_IS_INACTIVE: {
1136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    boolean val = getIsInactive();
1137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) log("REQ_IS_INACTIVE  isInactive=" + val);
1138454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                    mAc.replyToMessage(msg, DcAsyncChannel.RSP_IS_INACTIVE, val ? 1 : 0);
1139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1141454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                case DcAsyncChannel.REQ_GET_CID: {
1142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    int cid = getCid();
1143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) log("REQ_GET_CID  cid=" + cid);
1144454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                    mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_CID, cid);
1145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1147454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                case DcAsyncChannel.REQ_GET_APNSETTING: {
1148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    ApnSetting apnSetting = getApnSetting();
1149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) log("REQ_GET_APNSETTING  mApnSetting=" + apnSetting);
1150454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                    mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_APNSETTING, apnSetting);
1151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1153454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                case DcAsyncChannel.REQ_GET_LINK_PROPERTIES: {
1154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    LinkProperties lp = getCopyLinkProperties();
1155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp);
1156454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                    mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_PROPERTIES, lp);
1157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1159454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                case DcAsyncChannel.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: {
11609c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk                    ProxyInfo proxy = (ProxyInfo) msg.obj;
1161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy);
1162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    setLinkPropertiesHttpProxy(proxy);
1163454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                    mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY);
11641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (mNetworkAgent != null) {
11651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        mNetworkAgent.sendLinkProperties(mLinkProperties);
11661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
1167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1169f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt                case DcAsyncChannel.REQ_GET_NETWORK_CAPABILITIES: {
1170f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt                    NetworkCapabilities nc = getCopyNetworkCapabilities();
1171f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt                    if (VDBG) log("REQ_GET_NETWORK_CAPABILITIES networkCapabilities" + nc);
1172f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt                    mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_NETWORK_CAPABILITIES, nc);
1173f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt                    break;
1174f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt                }
1175454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                case DcAsyncChannel.REQ_RESET:
1176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) log("DcDefaultState: msg.what=REQ_RESET");
1177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    transitionTo(mInactiveState);
1178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_CONNECT:
1180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected");
1181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    ConnectionParams cp = (ConnectionParams) msg.obj;
1182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    notifyConnectCompleted(cp, DcFailCause.UNKNOWN, false);
1183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_DISCONNECT:
1186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) {
1187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        log("DcDefaultState deferring msg.what=EVENT_DISCONNECT RefCount="
1188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                + mApnContexts.size());
1189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    deferMessage(msg);
1191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_DISCONNECT_ALL:
1194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) {
1195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL RefCount="
1196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                + mApnContexts.size());
1197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    deferMessage(msg);
1199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_TEAR_DOWN_NOW:
1202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW");
1203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    mPhone.mCi.deactivateDataCall(mCid, 0,  null);
1204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_LOST_CONNECTION:
1207ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) {
1208ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        String s = "DcDefaultState ignore EVENT_LOST_CONNECTION"
1209ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                + " tag=" + msg.arg1 + ":mTag=" + mTag;
1210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        logAndAddLogRec(s);
1211ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1213203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED:
1214203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                    AsyncResult ar = (AsyncResult)msg.obj;
1215203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                    Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result;
1216203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                    mDataRegState = drsRatPair.first;
121727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt                    if (mRilRat != drsRatPair.second) {
121827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt                        updateTcpBufferSizes(drsRatPair.second);
121927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt                    }
1220203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                    mRilRat = drsRatPair.second;
1221203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                    if (DBG) {
1222203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                        log("DcDefaultState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED"
1223203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                                + " drs=" + mDataRegState
1224203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                                + " mRilRat=" + mRilRat);
1225203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                    }
122662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    ServiceState ss = mPhone.getServiceState();
122762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    int networkType = ss.getDataNetworkType();
122862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    mNetworkInfo.setSubtype(networkType,
122962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                            TelephonyManager.getNetworkTypeName(networkType));
123062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    if (mNetworkAgent != null) {
12316356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                        updateNetworkInfoSuspendState();
123262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                        mNetworkAgent.sendNetworkCapabilities(makeNetworkCapabilities());
123362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                        mNetworkAgent.sendNetworkInfo(mNetworkInfo);
123427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt                        mNetworkAgent.sendLinkProperties(mLinkProperties);
123562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    }
123662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    break;
123762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt
123862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                case EVENT_DATA_CONNECTION_ROAM_ON:
123962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    mNetworkInfo.setRoaming(true);
124062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    break;
124162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt
124262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                case EVENT_DATA_CONNECTION_ROAM_OFF:
124362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    mNetworkInfo.setRoaming(false);
1244203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                    break;
1245203e588e3c42a81aa8a56f595119c181a63b12caWink Saville
1246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                default:
1247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) {
1248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        log("DcDefaultState: shouldn't happen but ignore msg.what="
1249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                + getWhatToString(msg.what));
1250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            return retVal;
1255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
12576356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt
12586356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt    private boolean updateNetworkInfoSuspendState() {
12596356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        final NetworkInfo.DetailedState oldState = mNetworkInfo.getDetailedState();
12606356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt
12616356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        // this is only called when we are either connected or suspended.  Decide which.
12626356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        if (mNetworkAgent == null) {
12636356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt            Rlog.e(getName(), "Setting suspend state without a NetworkAgent");
12646356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        }
12656356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt
12666356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        // if we are not in-service change to SUSPENDED
12676356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        final ServiceStateTracker sst = mPhone.getServiceStateTracker();
12686356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        if (sst.getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) {
1269c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt            mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.SUSPENDED, null,
1270c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt                    mNetworkInfo.getExtraInfo());
12716356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        } else {
12726356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt            // check for voice call and concurrency issues
12736356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt            if (sst.isConcurrentVoiceAndDataAllowed() == false) {
12746356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                final CallTracker ct = mPhone.getCallTracker();
12756356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                if (ct.getState() != PhoneConstants.State.IDLE) {
1276c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt                    mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.SUSPENDED, null,
1277c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt                            mNetworkInfo.getExtraInfo());
12786356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                    return (oldState != NetworkInfo.DetailedState.SUSPENDED);
12796356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                }
12806356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt            }
1281c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt            mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null,
1282c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt                    mNetworkInfo.getExtraInfo());
12836356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        }
12846356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt        return (oldState != mNetworkInfo.getDetailedState());
12856356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt    }
12866356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt
1287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DcDefaultState mDefaultState = new DcDefaultState();
1288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
1290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The state machine is inactive and expects a EVENT_CONNECT.
1291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
1292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private class DcInactiveState extends State {
1293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // Inform all contexts we've failed connecting
1294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void setEnterNotificationParams(ConnectionParams cp, DcFailCause cause) {
12950e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu            if (VDBG) log("DcInactiveState: setEnterNotificationParams cp,cause");
1296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mConnectionParams = cp;
1297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDisconnectParams = null;
1298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDcFailCause = cause;
1299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // Inform all contexts we've failed disconnected
1302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void setEnterNotificationParams(DisconnectParams dp) {
13030e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu            if (VDBG) log("DcInactiveState: setEnterNotificationParams dp");
1304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mConnectionParams = null;
1305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDisconnectParams = dp;
1306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDcFailCause = DcFailCause.NONE;
1307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // Inform all contexts of the failure cause
1310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void setEnterNotificationParams(DcFailCause cause) {
1311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mConnectionParams = null;
1312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDisconnectParams = null;
1313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDcFailCause = cause;
1314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void enter() {
1318ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mTag += 1;
1319ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) log("DcInactiveState: enter() mTag=" + mTag);
1320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1321ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (mConnectionParams != null) {
1322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                if (DBG) {
1323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    log("DcInactiveState: enter notifyConnectCompleted +ALL failCause="
1324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            + mDcFailCause);
1325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                notifyConnectCompleted(mConnectionParams, mDcFailCause, true);
1327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (mDisconnectParams != null) {
1329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                if (DBG) {
1330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    log("DcInactiveState: enter notifyDisconnectCompleted +ALL failCause="
1331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            + mDcFailCause);
1332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                notifyDisconnectCompleted(mDisconnectParams, true);
1334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (mDisconnectParams == null && mConnectionParams == null && mDcFailCause != null) {
1336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                if (DBG) {
1337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    log("DcInactiveState: enter notifyAllDisconnectCompleted failCause="
1338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            + mDcFailCause);
1339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                notifyAllDisconnectCompleted(mDcFailCause);
1341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            // Remove ourselves from cid mapping, before clearSettings
1344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDcController.removeActiveDcByCid(DataConnection.this);
1345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            clearSettings();
1347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void exit() {
1351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public boolean processMessage(Message msg) {
1355ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            boolean retVal;
1356ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1357ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            switch (msg.what) {
1358454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                case DcAsyncChannel.REQ_RESET:
1359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) {
1360ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset");
1361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1362ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1363ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1365ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_CONNECT:
13669a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                    if (DBG) log("DcInactiveState: mag.what=EVENT_CONNECT");
13679a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                    ConnectionParams cp = (ConnectionParams) msg.obj;
13689a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                    if (initConnection(cp)) {
13699a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                        onConnect(mConnectionParams);
13709a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                        transitionTo(mActivatingState);
13719a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                    } else {
13729a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                        if (DBG) {
13739a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                            log("DcInactiveState: msg.what=EVENT_CONNECT initConnection failed");
13749a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                        }
13759a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                        notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER,
13769a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville                                false);
1377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_DISCONNECT:
1382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT");
1383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    notifyDisconnectCompleted((DisconnectParams)msg.obj, false);
1384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1386ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1387ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_DISCONNECT_ALL:
1388ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL");
1389ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    notifyDisconnectCompleted((DisconnectParams)msg.obj, false);
1390ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                default:
1394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) {
1395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        log("DcInactiveState nothandled msg.what=" + getWhatToString(msg.what));
1396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = NOT_HANDLED;
1398ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            return retVal;
1401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DcInactiveState mInactiveState = new DcInactiveState();
1404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
1406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The state machine is activating a connection.
1407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
1408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private class DcActivatingState extends State {
1409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public boolean processMessage(Message msg) {
1411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            boolean retVal;
1412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            AsyncResult ar;
1413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            ConnectionParams cp;
1414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) log("DcActivatingState: msg=" + msgToString(msg));
1416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            switch (msg.what) {
1417203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED:
1418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_CONNECT:
1419203e588e3c42a81aa8a56f595119c181a63b12caWink Saville                    // Activating can't process until we're done.
1420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    deferMessage(msg);
1421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1424ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_SETUP_DATA_CONNECTION_DONE:
1425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    ar = (AsyncResult) msg.obj;
1426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    cp = (ConnectionParams) ar.userObj;
1427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar);
1429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (result != DataCallResponse.SetupResult.ERR_Stale) {
1430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        if (mConnectionParams != cp) {
1431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            loge("DcActivatingState: WEIRD mConnectionsParams:"+ mConnectionParams
1432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                    + " != cp:" + cp);
1433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        }
1434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1435c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                    if (DBG) {
1436c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                        log("DcActivatingState onSetupConnectionCompleted result=" + result
1437c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                                + " dc=" + DataConnection.this);
1438c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                    }
14392dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                    if (cp.mApnContext != null) {
14402dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                        cp.mApnContext.requestLog("onSetupConnectionCompleted result=" + result);
14412dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                    }
1442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    switch (result) {
1443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        case SUCCESS:
1444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            // All is well
1445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            mDcFailCause = DcFailCause.NONE;
1446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            transitionTo(mActiveState);
1447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            break;
1448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        case ERR_BadCommand:
1449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            // Vendor ril rejected the command and didn't connect.
1450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            // Transition to inactive but send notifications after
1451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            // we've entered the mInactive state.
1452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            mInactiveState.setEnterNotificationParams(cp, result.mFailCause);
1453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            transitionTo(mInactiveState);
1454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            break;
1455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        case ERR_UnacceptableParameter:
1456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            // The addresses given from the RIL are bad
1457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            tearDownData(cp);
1458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            transitionTo(mDisconnectingErrorCreatingConnection);
1459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            break;
1460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        case ERR_GetLastErrorFromRil:
1461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            // Request failed and this is an old RIL
1462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            mPhone.mCi.getLastDataCallFailCause(
1463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                    obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp));
1464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            break;
1465ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        case ERR_RilError:
14660e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
14670e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            // Retrieve the suggested retry delay from the modem and save it.
14680e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            // If the modem want us to retry the current APN again, it will
14690e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            // suggest a positive delay value (in milliseconds). Otherwise we'll get
14700e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            // NO_SUGGESTED_RETRY_DELAY here.
14710e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            long delay = getSuggestedRetryDelay(ar);
14720e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            cp.mApnContext.setModemSuggestedDelay(delay);
14730e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
14742dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                            String str = "DcActivatingState: ERR_RilError "
14752dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                                    + " delay=" + delay
14762dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                                    + " result=" + result
14772dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                                    + " result.isRestartRadioFail=" +
14782dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                                    result.mFailCause.isRestartRadioFail()
14792dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                                    + " result.isPermanentFail=" +
14802dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                                    mDct.isPermanentFail(result.mFailCause);
14812dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                            if (DBG) log(str);
14822dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                            if (cp.mApnContext != null) cp.mApnContext.requestLog(str);
14830e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
14840e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            // Save the cause. DcTracker.onDataSetupComplete will check this
14850e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            // failure cause and determine if we need to retry this APN later
14860e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            // or not.
14870e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            mInactiveState.setEnterNotificationParams(cp, result.mFailCause);
14880e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                            transitionTo(mInactiveState);
1489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            break;
1490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        case ERR_Stale:
1491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            loge("DcActivatingState: stale EVENT_SETUP_DATA_CONNECTION_DONE"
1492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                    + " tag:" + cp.mTag + " != mTag:" + mTag);
1493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            break;
1494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        default:
1495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            throw new RuntimeException("Unknown SetupResult, should not happen");
1496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_GET_LAST_FAIL_DONE:
1501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    ar = (AsyncResult) msg.obj;
1502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    cp = (ConnectionParams) ar.userObj;
1503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (cp.mTag == mTag) {
1504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        if (mConnectionParams != cp) {
1505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            loge("DcActivatingState: WEIRD mConnectionsParams:" + mConnectionParams
1506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                    + " != cp:" + cp);
1507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        }
1508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        DcFailCause cause = DcFailCause.UNKNOWN;
1510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        if (ar.exception == null) {
1512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            int rilFailCause = ((int[]) (ar.result))[0];
1513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            cause = DcFailCause.fromInt(rilFailCause);
15141db7da14111228a5079d2970d7d0ce34173000b5Wink Saville                            if (cause == DcFailCause.NONE) {
15151db7da14111228a5079d2970d7d0ce34173000b5Wink Saville                                if (DBG) {
15161db7da14111228a5079d2970d7d0ce34173000b5Wink Saville                                    log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE"
15171db7da14111228a5079d2970d7d0ce34173000b5Wink Saville                                            + " BAD: error was NONE, change to UNKNOWN");
15181db7da14111228a5079d2970d7d0ce34173000b5Wink Saville                                }
15191db7da14111228a5079d2970d7d0ce34173000b5Wink Saville                                cause = DcFailCause.UNKNOWN;
15201db7da14111228a5079d2970d7d0ce34173000b5Wink Saville                            }
1521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        }
1522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        mDcFailCause = cause;
1523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1524c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                        if (DBG) {
1525c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                            log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE"
15260e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                                    + " cause=" + cause + " dc=" + DataConnection.this);
1527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        }
15280e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
15290e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                        mInactiveState.setEnterNotificationParams(cp, cause);
15300e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                        transitionTo(mInactiveState);
1531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    } else {
1532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        loge("DcActivatingState: stale EVENT_GET_LAST_FAIL_DONE"
1533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                + " tag:" + cp.mTag + " != mTag:" + mTag);
1534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                default:
1540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) {
1541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        log("DcActivatingState not handled msg.what=" +
1542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                getWhatToString(msg.what) + " RefCount=" + mApnContexts.size());
1543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = NOT_HANDLED;
1545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1547ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            return retVal;
1548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DcActivatingState mActivatingState = new DcActivatingState();
1551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
1553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The state machine is connected, expecting an EVENT_DISCONNECT.
1554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
1555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private class DcActiveState extends State {
1556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override public void enter() {
1557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) log("DcActiveState: enter dc=" + DataConnection.this);
1558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
15591fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt            // verify and get updated information in case these things
15601fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt            // are obsolete
15611fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt            {
15621fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                ServiceState ss = mPhone.getServiceState();
15631fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                final int networkType = ss.getDataNetworkType();
15641fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                if (mNetworkInfo.getSubtype() != networkType) {
15651fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                    log("DcActiveState with incorrect subtype (" + mNetworkInfo.getSubtype() +
15661fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                            ", " + networkType + "), updating.");
15671fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                }
15681fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                mNetworkInfo.setSubtype(networkType, TelephonyManager.getNetworkTypeName(networkType));
15691fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                final boolean roaming = ss.getDataRoaming();
15701fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                if (roaming != mNetworkInfo.isRoaming()) {
15711fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                    log("DcActiveState with incorrect roaming (" + mNetworkInfo.isRoaming() +
15721fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                            ", " + roaming +"), updating.");
15731fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                }
15741fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt                mNetworkInfo.setRoaming(roaming);
15751fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt            }
15761fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt
15775488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan            boolean createNetworkAgent = true;
15785488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan            // If a disconnect is already pending, avoid notifying all of connected
15791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (hasMessages(EVENT_DISCONNECT) ||
15801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    hasMessages(EVENT_DISCONNECT_ALL) ||
15811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    hasDeferredMessages(EVENT_DISCONNECT) ||
15821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    hasDeferredMessages(EVENT_DISCONNECT_ALL)) {
15835488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                log("DcActiveState: skipping notifyAllOfConnected()");
15845488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                createNetworkAgent = false;
15855488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan            } else {
15865488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                // If we were retrying there maybe more than one, otherwise they'll only be one.
15875488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                notifyAllOfConnected(Phone.REASON_CONNECTED);
15885488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan            }
1589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
15906356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt            mPhone.getCallTracker().registerForVoiceCallStarted(getHandler(),
15916356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                    DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_STARTED, null);
15926356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt            mPhone.getCallTracker().registerForVoiceCallEnded(getHandler(),
15936356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                    DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_ENDED, null);
15946356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt
1595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            // If the EVENT_CONNECT set the current max retry restore it here
1596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            // if it didn't then this is effectively a NOP.
1597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDcController.addActiveDcByCid(DataConnection.this);
159862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt
159962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt            mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED,
160062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    mNetworkInfo.getReason(), null);
160162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt            mNetworkInfo.setExtraInfo(mApnSetting.apn);
160227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt            updateTcpBufferSizes(mRilRat);
1603957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey
1604957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey            final NetworkMisc misc = new NetworkMisc();
16054c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu            final CarrierSignalAgent carrierSignalAgent = mPhone.getCarrierSignalAgent();
16064c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu            if(carrierSignalAgent.hasRegisteredCarrierSignalReceivers()) {
16074c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                // carrierSignal Receivers will place the carrier-specific provisioning notification
16084c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                misc.provisioningNotificationDisabled = true;
16094c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu            }
1610957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey            misc.subscriberId = mPhone.getSubscriberId();
16115488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan
16125488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan            if (createNetworkAgent) {
1613692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt                setNetworkRestriction();
16145488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(),
16155488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                        "DcNetworkAgent", mNetworkInfo, makeNetworkCapabilities(), mLinkProperties,
16165488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                        50, misc);
16175488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan            }
1618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void exit() {
1622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) log("DcActiveState: exit dc=" + this);
162327b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra            String reason = mNetworkInfo.getReason();
162422ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang            if(mDcController.isExecutingCarrierChange()) {
162522ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang                reason = Phone.REASON_CARRIER_CHANGE;
162622ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang            } else if (mDisconnectParams != null && mDisconnectParams.mReason != null) {
162727b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra                reason = mDisconnectParams.mReason;
162827b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra            } else if (mDcFailCause != null) {
162927b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra                reason = mDcFailCause.toString();
163027b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra            }
16316356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt            mPhone.getCallTracker().unregisterForVoiceCallStarted(getHandler());
16326356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt            mPhone.getCallTracker().unregisterForVoiceCallEnded(getHandler());
16336356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt
163462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt            mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED,
163527b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra                    reason, mNetworkInfo.getExtraInfo());
16365488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan            if (mNetworkAgent != null) {
16375488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                mNetworkAgent.sendNetworkInfo(mNetworkInfo);
16385488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                mNetworkAgent = null;
16395488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan            }
1640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public boolean processMessage(Message msg) {
1644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            boolean retVal;
1645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            switch (msg.what) {
1647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_CONNECT: {
1648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    ConnectionParams cp = (ConnectionParams) msg.obj;
16493f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt                    // either add this new apn context to our set or
16503f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt                    // update the existing cp with the latest connection generation number
16513f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt                    mApnContexts.put(cp.mApnContext, cp);
1652c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                    if (DBG) {
1653c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                        log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this);
1654c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                    }
1655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    notifyConnectCompleted(cp, DcFailCause.NONE, false);
1656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_DISCONNECT: {
1660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    DisconnectParams dp = (DisconnectParams) msg.obj;
1661c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                    if (DBG) {
1662c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                        log("DcActiveState: EVENT_DISCONNECT dp=" + dp
1663c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                                + " dc=" + DataConnection.this);
1664c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                    }
1665ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt                    if (mApnContexts.containsKey(dp.mApnContext)) {
1666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        if (DBG) {
1667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            log("DcActiveState msg.what=EVENT_DISCONNECT RefCount="
1668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                    + mApnContexts.size());
1669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        }
1670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        if (mApnContexts.size() == 1) {
1672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            mApnContexts.clear();
1673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            mDisconnectParams = dp;
1674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            mConnectionParams = null;
1675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            dp.mTag = mTag;
1676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            tearDownData(dp);
1677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            transitionTo(mDisconnectingState);
1678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        } else {
1679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            mApnContexts.remove(dp.mApnContext);
1680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            notifyDisconnectCompleted(dp, false);
1681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        }
1682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    } else {
1683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        log("DcActiveState ERROR no such apnContext=" + dp.mApnContext
1684c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                                + " in this dc=" + DataConnection.this);
1685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        notifyDisconnectCompleted(dp, false);
1686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_DISCONNECT_ALL: {
1691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) {
1692c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                        log("DcActiveState EVENT_DISCONNECT clearing apn contexts,"
1693c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                                + " dc=" + DataConnection.this);
1694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    DisconnectParams dp = (DisconnectParams) msg.obj;
1696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    mDisconnectParams = dp;
1697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    mConnectionParams = null;
1698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    dp.mTag = mTag;
1699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    tearDownData(dp);
1700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    transitionTo(mDisconnectingState);
1701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
1704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_LOST_CONNECTION: {
1705c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                    if (DBG) {
1706c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                        log("DcActiveState EVENT_LOST_CONNECTION dc=" + DataConnection.this);
1707c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville                    }
17080e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
17090e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                    mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION);
17100e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu                    transitionTo(mInactiveState);
1711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
171462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                case EVENT_DATA_CONNECTION_ROAM_ON: {
171562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    mNetworkInfo.setRoaming(true);
17165488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                    if (mNetworkAgent != null) {
17175488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                        mNetworkAgent.sendNetworkInfo(mNetworkInfo);
17185488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                    }
171962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    retVal = HANDLED;
172062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    break;
172162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                }
172262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                case EVENT_DATA_CONNECTION_ROAM_OFF: {
172362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    mNetworkInfo.setRoaming(false);
17245488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                    if (mNetworkAgent != null) {
17255488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                        mNetworkAgent.sendNetworkInfo(mNetworkInfo);
17265488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                    }
172762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    retVal = HANDLED;
172862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                    break;
172962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt                }
173065bee39d7e417fb898c3948696d5d8a38046c449fenglu                case EVENT_BW_REFRESH_RESPONSE: {
173165bee39d7e417fb898c3948696d5d8a38046c449fenglu                    AsyncResult ar = (AsyncResult)msg.obj;
173265bee39d7e417fb898c3948696d5d8a38046c449fenglu                    if (ar.exception != null) {
173365bee39d7e417fb898c3948696d5d8a38046c449fenglu                        log("EVENT_BW_REFRESH_RESPONSE: error ignoring, e=" + ar.exception);
173465bee39d7e417fb898c3948696d5d8a38046c449fenglu                    } else {
173565bee39d7e417fb898c3948696d5d8a38046c449fenglu                        final ArrayList<Integer> capInfo = (ArrayList<Integer>)ar.result;
173665bee39d7e417fb898c3948696d5d8a38046c449fenglu                        final int lceBwDownKbps = capInfo.get(0);
173765bee39d7e417fb898c3948696d5d8a38046c449fenglu                        NetworkCapabilities nc = makeNetworkCapabilities();
173865bee39d7e417fb898c3948696d5d8a38046c449fenglu                        if (mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) {
173965bee39d7e417fb898c3948696d5d8a38046c449fenglu                            nc.setLinkDownstreamBandwidthKbps(lceBwDownKbps);
174065bee39d7e417fb898c3948696d5d8a38046c449fenglu                            if (mNetworkAgent != null) {
174165bee39d7e417fb898c3948696d5d8a38046c449fenglu                                mNetworkAgent.sendNetworkCapabilities(nc);
174265bee39d7e417fb898c3948696d5d8a38046c449fenglu                            }
174365bee39d7e417fb898c3948696d5d8a38046c449fenglu                        }
174465bee39d7e417fb898c3948696d5d8a38046c449fenglu                    }
17456356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                    retVal = HANDLED;
17466356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                    break;
17476356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                }
17486356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                case EVENT_DATA_CONNECTION_VOICE_CALL_STARTED:
17496356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                case EVENT_DATA_CONNECTION_VOICE_CALL_ENDED: {
17505488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan                    if (updateNetworkInfoSuspendState() && mNetworkAgent != null) {
17516356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                        // state changed
17526356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                        mNetworkAgent.sendNetworkInfo(mNetworkInfo);
17536356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt                    }
175465bee39d7e417fb898c3948696d5d8a38046c449fenglu                    retVal = HANDLED;
175565bee39d7e417fb898c3948696d5d8a38046c449fenglu                    break;
175665bee39d7e417fb898c3948696d5d8a38046c449fenglu                }
1757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                default:
1758ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) {
1759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        log("DcActiveState not handled msg.what=" + getWhatToString(msg.what));
1760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = NOT_HANDLED;
1762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            return retVal;
1765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DcActiveState mActiveState = new DcActiveState();
1768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
1770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The state machine is disconnecting.
1771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
1772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private class DcDisconnectingState extends State {
1773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public boolean processMessage(Message msg) {
1775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            boolean retVal;
1776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            switch (msg.what) {
1778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_CONNECT:
1779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = "
1780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            + mApnContexts.size());
1781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    deferMessage(msg);
1782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1783ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1784ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1785ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_DEACTIVATE_DONE:
1786ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    AsyncResult ar = (AsyncResult) msg.obj;
1787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    DisconnectParams dp = (DisconnectParams) ar.userObj;
17882dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt
17892dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                    String str = "DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount="
17902dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                            + mApnContexts.size();
17912dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                    if (DBG) log(str);
17922dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                    if (dp.mApnContext != null) dp.mApnContext.requestLog(str);
17932dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt
1794ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (dp.mTag == mTag) {
1795ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        // Transition to inactive but send notifications after
1796ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        // we've entered the mInactive state.
1797ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj);
1798ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        transitionTo(mInactiveState);
1799ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    } else {
1800ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        if (DBG) log("DcDisconnectState stale EVENT_DEACTIVATE_DONE"
1801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                + " dp.tag=" + dp.mTag + " mTag=" + mTag);
1802ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1803ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1804ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1805ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1806ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                default:
1807ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) {
1808ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        log("DcDisconnectingState not handled msg.what="
1809ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                + getWhatToString(msg.what));
1810ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1811ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = NOT_HANDLED;
1812ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1813ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1814ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            return retVal;
1815ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1816ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1817ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DcDisconnectingState mDisconnectingState = new DcDisconnectingState();
1818ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1819ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
1820ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The state machine is disconnecting after an creating a connection.
1821ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
1822ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private class DcDisconnectionErrorCreatingConnection extends State {
1823ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        @Override
1824ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public boolean processMessage(Message msg) {
1825ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            boolean retVal;
1826ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1827ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            switch (msg.what) {
1828ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                case EVENT_DEACTIVATE_DONE:
1829ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    AsyncResult ar = (AsyncResult) msg.obj;
1830ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    ConnectionParams cp = (ConnectionParams) ar.userObj;
1831ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (cp.mTag == mTag) {
18322dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                        String str = "DcDisconnectionErrorCreatingConnection" +
18332dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                                " msg.what=EVENT_DEACTIVATE_DONE";
18342dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                        if (DBG) log(str);
18352dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt                        if (cp.mApnContext != null) cp.mApnContext.requestLog(str);
1836ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1837ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        // Transition to inactive but send notifications after
1838ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        // we've entered the mInactive state.
1839ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        mInactiveState.setEnterNotificationParams(cp,
1840ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER);
1841ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        transitionTo(mInactiveState);
1842ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    } else {
1843ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        if (DBG) {
1844ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                            log("DcDisconnectionErrorCreatingConnection stale EVENT_DEACTIVATE_DONE"
1845ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                    + " dp.tag=" + cp.mTag + ", mTag=" + mTag);
1846ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        }
1847ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1848ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = HANDLED;
1849ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1850ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1851ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                default:
1852ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    if (VDBG) {
1853ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                        log("DcDisconnectionErrorCreatingConnection not handled msg.what="
1854ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                + getWhatToString(msg.what));
1855ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    }
1856ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    retVal = NOT_HANDLED;
1857ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    break;
1858ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1859ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            return retVal;
1860ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1861ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1862ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection =
1863ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                new DcDisconnectionErrorCreatingConnection();
1864ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
186562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt
186662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt    private class DcNetworkAgent extends NetworkAgent {
186762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        public DcNetworkAgent(Looper l, Context c, String TAG, NetworkInfo ni,
1868957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey                NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) {
1869957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey            super(l, c, TAG, ni, nc, lp, score, misc);
187062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        }
187162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt
187245eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville        @Override
187362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        protected void unwanted() {
18741484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt            if (mNetworkAgent != this) {
187545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville                log("DcNetworkAgent: unwanted found mNetworkAgent=" + mNetworkAgent +
18761484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt                        ", which isn't me.  Aborting unwanted");
18771484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt                return;
18781484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt            }
18794a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt            // this can only happen if our exit has been called - we're already disconnected
18804a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt            if (mApnContexts == null) return;
188137cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt            for (ConnectionParams cp : mApnContexts.values()) {
188237cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt                final ApnContext apnContext = cp.mApnContext;
188337cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt                final Pair<ApnContext, Integer> pair =
188437cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt                        new Pair<ApnContext, Integer>(apnContext, cp.mConnectionGeneration);
188545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville                log("DcNetworkAgent: [unwanted]: disconnect apnContext=" + apnContext);
188637cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt                Message msg = mDct.obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, pair);
1887305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt                DisconnectParams dp = new DisconnectParams(apnContext, apnContext.getReason(), msg);
1888305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt                DataConnection.this.sendMessage(DataConnection.this.
1889305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt                        obtainMessage(EVENT_DISCONNECT, dp));
1890305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt            }
189162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        }
189265bee39d7e417fb898c3948696d5d8a38046c449fenglu
189365bee39d7e417fb898c3948696d5d8a38046c449fenglu        @Override
189465bee39d7e417fb898c3948696d5d8a38046c449fenglu        protected void pollLceData() {
189565bee39d7e417fb898c3948696d5d8a38046c449fenglu            if(mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) {  // active LCE service
189665bee39d7e417fb898c3948696d5d8a38046c449fenglu                mPhone.mCi.pullLceData(DataConnection.this.obtainMessage(EVENT_BW_REFRESH_RESPONSE));
189765bee39d7e417fb898c3948696d5d8a38046c449fenglu            }
189865bee39d7e417fb898c3948696d5d8a38046c449fenglu        }
1899a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu
1900a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu        @Override
1901a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu        protected void networkStatus(int status, String redirectUrl) {
1902a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu            if(!TextUtils.isEmpty(redirectUrl)) {
1903a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu                log("validation status: " + status + " with redirection URL: " + redirectUrl);
1904a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu                /* its possible that we have multiple DataConnection with INTERNET_CAPABILITY
1905a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu                   all fail the validation with the same redirection url, send CMD back to DCTracker
1906a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu                   and let DcTracker to make the decision */
1907a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu                Message msg = mDct.obtainMessage(DctConstants.EVENT_REDIRECTION_DETECTED,
1908a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu                        redirectUrl);
1909a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu                msg.sendToTarget();
1910a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu            }
1911a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu        }
191262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt    }
191362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt
1914ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    // ******* "public" interface
1915ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1916ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
1917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Used for testing purposes.
1918ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
1919ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /* package */ void tearDownNow() {
1920ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (DBG) log("tearDownNow()");
1921ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sendMessage(obtainMessage(EVENT_TEAR_DOWN_NOW));
1922ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1923ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1924ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
19250e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu     * Using the result of the SETUP_DATA_CALL determine the retry delay.
19260e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu     *
19270e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu     * @param ar is the result from SETUP_DATA_CALL
19280e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu     * @return NO_SUGGESTED_RETRY_DELAY if no retry is needed otherwise the delay to the
19290e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu     *         next SETUP_DATA_CALL
19300e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu     */
19310e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    private long getSuggestedRetryDelay(AsyncResult ar) {
19320e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
19330e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        DataCallResponse response = (DataCallResponse) ar.result;
19340e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
19350852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        /** According to ril.h
19360852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu         * The value < 0 means no value is suggested
19370852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu         * The value 0 means retry should be done ASAP.
19380852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu         * The value of Integer.MAX_VALUE(0x7fffffff) means no retry.
19390852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu         */
19400852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu
19410852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        // The value < 0 means no value is suggested
19420852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        if (response.suggestedRetryTime < 0) {
19430e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu            if (DBG) log("No suggested retry delay.");
19440e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu            return RetryManager.NO_SUGGESTED_RETRY_DELAY;
19450e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        }
19460852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        // The value of Integer.MAX_VALUE(0x7fffffff) means no retry.
19470852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        else if (response.suggestedRetryTime == Integer.MAX_VALUE) {
19480852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu            if (DBG) log("Modem suggested not retrying.");
19490852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu            return RetryManager.NO_RETRY;
19500852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        }
19510e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
19520e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        // We need to cast it to long because the value returned from RIL is a 32-bit integer,
19530e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        // but the time values used in AlarmManager are all 64-bit long.
19540e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        return (long) response.suggestedRetryTime;
19550e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
19560e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
19570e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    /**
1958ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @return the string for msg.what as our info.
1959ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
1960ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Override
1961ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected String getWhatToString(int what) {
1962ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return cmdToString(what);
1963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private static String msgToString(Message msg) {
1966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        String retVal;
1967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (msg == null) {
1968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            retVal = "null";
1969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
1970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            StringBuilder   b = new StringBuilder();
1971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            b.append("{what=");
1973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            b.append(cmdToString(msg.what));
1974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            b.append(" when=");
1976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis(), b);
1977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (msg.arg1 != 0) {
1979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                b.append(" arg1=");
1980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                b.append(msg.arg1);
1981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (msg.arg2 != 0) {
1984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                b.append(" arg2=");
1985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                b.append(msg.arg2);
1986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (msg.obj != null) {
1989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                b.append(" obj=");
1990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                b.append(msg.obj);
1991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            b.append(" target=");
1994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            b.append(msg.getTarget());
1995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            b.append(" replyTo=");
1997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            b.append(msg.replyTo);
1998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            b.append("}");
2000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            retVal = b.toString();
2002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
2003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return retVal;
2004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
2005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    static void slog(String s) {
2007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Rlog.d("DC", s);
2008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
2009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
2011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Log with debug
2012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
2013ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param s is string log
2014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
2015cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2016cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void log(String s) {
2017cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Rlog.d(getName(), s);
20180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
20190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2020ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
2021ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Log with debug attribute
2022ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
2023ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param s is string log
2024ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
2025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Override
2026ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected void logd(String s) {
2027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Rlog.d(getName(), s);
2028ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
20290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2030ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
2031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Log with verbose attribute
2032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
2033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param s is string log
2034ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
2035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Override
2036ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected void logv(String s) {
2037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Rlog.v(getName(), s);
2038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
2039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2040ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
2041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Log with info attribute
2042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
2043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param s is string log
2044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
2045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Override
2046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected void logi(String s) {
2047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Rlog.i(getName(), s);
2048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
2049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2050ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
2051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Log with warning attribute
2052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
2053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param s is string log
2054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
2055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Override
2056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected void logw(String s) {
2057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Rlog.w(getName(), s);
20580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
20590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
2061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Log with error attribute
2062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
2063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param s is string log
2064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
2065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Override
2066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected void loge(String s) {
2067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Rlog.e(getName(), s);
2068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
2069ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2070ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
2071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Log with error attribute
2072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
2073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param s is string log
2074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param e is a Throwable which logs additional information.
2075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
2076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Override
2077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected void loge(String s, Throwable e) {
2078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Rlog.e(getName(), s, e);
2079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
2080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /** Doesn't print mApnList of ApnContext's which would be recursive */
2082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public String toStringSimple() {
2083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return getName() + ": State=" + getCurrentState().getName()
2084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size()
2085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                + " mCid=" + mCid + " mCreateTime=" + mCreateTime
2086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                + " mLastastFailTime=" + mLastFailTime
2087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                + " mLastFailCause=" + mLastFailCause
2088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                + " mTag=" + mTag
2089f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt                + " mLinkProperties=" + mLinkProperties
2090443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt                + " linkCapabilities=" + makeNetworkCapabilities()
2091443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt                + " mRestrictedNetworkOverride=" + mRestrictedNetworkOverride;
2092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
2093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Override
2095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public String toString() {
2096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return "{" + toStringSimple() + " mApnContexts=" + mApnContexts + "}";
2097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
2098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
209945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville    private void dumpToLog() {
210045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville        dump(null, new PrintWriter(new StringWriter(0)) {
210145eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville            @Override
210245eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville            public void println(String s) {
210345eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville                DataConnection.this.logd(s);
210445eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville            }
210545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville
210645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville            @Override
210745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville            public void flush() {
210845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville            }
210945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville        }, null);
211045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville    }
211145eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville
2112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
2113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Dump the current state.
2114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
2115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param fd
2116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param pw
2117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @param args
2118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
21190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
21200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
2121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.print("DataConnection ");
21220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.dump(fd, pw, args);
2123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mApnContexts.size=" + mApnContexts.size());
2124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mApnContexts=" + mApnContexts);
2125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.flush();
2126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mDataConnectionTracker=" + mDct);
2127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mApnSetting=" + mApnSetting);
2128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mTag=" + mTag);
2129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mCid=" + mCid);
2130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mConnectionParams=" + mConnectionParams);
2131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mDisconnectParams=" + mDisconnectParams);
2132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mDcFailCause=" + mDcFailCause);
2133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.flush();
2134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mPhone=" + mPhone);
2135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.flush();
2136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mLinkProperties=" + mLinkProperties);
2137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.flush();
2138203e588e3c42a81aa8a56f595119c181a63b12caWink Saville        pw.println(" mDataRegState=" + mDataRegState);
2139203e588e3c42a81aa8a56f595119c181a63b12caWink Saville        pw.println(" mRilRat=" + mRilRat);
214062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt        pw.println(" mNetworkCapabilities=" + makeNetworkCapabilities());
2141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime));
2142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime));
2143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mLastFailCause=" + mLastFailCause);
2144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.flush();
2145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mUserData=" + mUserData);
2146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mInstanceNumber=" + mInstanceNumber);
2147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" mAc=" + mAc);
2148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.flush();
21490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
21500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
21510e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
2152