DataConnection.java revision 4c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3
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); 412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDefaultState); 414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mInactiveState, mDefaultState); 415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActivatingState, mDefaultState); 416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActiveState, mDefaultState); 417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingState, mDefaultState); 418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingErrorCreatingConnection, mDefaultState); 419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setInitialState(mInactiveState); 420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 421ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt mApnContexts = new HashMap<ApnContext, ConnectionParams>(); 422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 425cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Begin setting up a data connection, calls setupDataCall 426cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * and the ConnectionParams will be returned with the 427cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj. 4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 429cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param cp is the connection parameters 4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void onConnect(ConnectionParams cp) { 432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onConnect: carrier='" + mApnSetting.carrier 433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' APN='" + mApnSetting.apn 434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' proxy='" + mApnSetting.proxy + "' port='" + mApnSetting.port + "'"); 4352dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog("DataConnection.onConnect"); 4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if we should fake an error. 438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDcTesterFailBringUpAll.getDcFailBringUp().mCounter > 0) { 439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = new DataCallResponse(); 440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.version = mPhone.mCi.getRilVersion(); 441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.status = mDcTesterFailBringUpAll.getDcFailBringUp().mFailCause.getErrorCode(); 442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.cid = 0; 443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.active = 0; 444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.type = ""; 445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.ifname = ""; 446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.addresses = new String[0]; 447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.dnses = new String[0]; 448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.gateways = new String[0]; 449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.suggestedRetryTime = 450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mSuggestedRetryTime; 451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville response.pcscf = new String[0]; 452e9701717e43cc5aacbcf624f77a53be92350662cw response.mtu = PhoneConstants.UNSET_MTU; 453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg, response, null); 456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(msg); 457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onConnect: FailBringUpAll=" + mDcTesterFailBringUpAll.getDcFailBringUp() 459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " send error response=" + response); 460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mCounter -= 1; 462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return; 463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 46522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = -1; 46622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mLastFailTime = -1; 467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 469cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // msg.obj will be returned in AsyncResult.userObj; 470cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 471cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville msg.obj = cp; 4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int authType = mApnSetting.authType; 474cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (authType == -1) { 475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville authType = TextUtils.isEmpty(mApnSetting.user) ? RILConstants.SETUP_DATA_AUTH_NONE 476cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville : RILConstants.SETUP_DATA_AUTH_PAP_CHAP; 4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 479cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String protocol; 4806b8e1174d2ef221d6eeab348a819ce0003d3d5a4Chris Manton if (mPhone.getServiceState().getDataRoamingFromRegistration()) { 481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.roamingProtocol; 482cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.protocol; 4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 48622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.mCi.setupDataCall( 4875d5ec64fcd293928776aebe5c92278afb5bc019dPavel Zhamaitsiak cp.mRilRat, 4885d5ec64fcd293928776aebe5c92278afb5bc019dPavel Zhamaitsiak cp.mProfileId, 489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.apn, mApnSetting.user, mApnSetting.password, 4905d5ec64fcd293928776aebe5c92278afb5bc019dPavel Zhamaitsiak authType, 491cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protocol, msg); 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * TearDown the data connection when the deactivation is complete a Message with 496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * msg.what == EVENT_DEACTIVATE_DONE and msg.obj == AsyncResult with AsyncResult.obj 497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * containing the parameter o. 498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param o is the object returned in the AsyncResult.obj. 500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void tearDownData(Object o) { 502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int discReason = RILConstants.DEACTIVATE_REASON_NONE; 5032dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt ApnContext apnContext = null; 504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((o != null) && (o instanceof DisconnectParams)) { 505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams)o; 5062dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext = dp.mApnContext; 507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (TextUtils.equals(dp.mReason, Phone.REASON_RADIO_TURNED_OFF)) { 508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF; 509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (TextUtils.equals(dp.mReason, Phone.REASON_PDP_RESET)) { 510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET; 511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5130e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh if (mPhone.mCi.getRadioState().isOn() 5140e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh || (mPhone.getServiceState().getRilDataRadioTechnology() 5150e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN )) { 5162dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "tearDownData radio is on, call deactivateDataCall"; 5172dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 5182dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (apnContext != null) apnContext.requestLog(str); 519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, discReason, 520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o)); 521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 5222dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately"; 5232dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 5242dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (apnContext != null) apnContext.requestLog(str); 525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = new AsyncResult(o, null, null); 526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, ar)); 527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) { 53162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(mNetworkInfo.getDetailedState(), reason, 53262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getExtraInfo()); 533ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt for (ConnectionParams cp : mApnContexts.values()) { 534ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt ApnContext apnContext = cp.mApnContext; 535f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (apnContext == alreadySent) continue; 536f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (reason != null) apnContext.setReason(reason); 537ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt Pair<ApnContext, Integer> pair = 538ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt new Pair<ApnContext, Integer>(apnContext, cp.mConnectionGeneration); 539ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt Message msg = mDct.obtainMessage(event, pair); 540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfConnected(String reason) { 546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason); 5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfDisconnectDcRetrying(String reason) { 550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DC_RETRYING, reason); 551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllDisconnectCompleted(DcFailCause cause) { 553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DONE, cause.toString()); 5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send the connectionCompletedMsg. 559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cp is the ConnectionParams 561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cause and if no error the cause is DcFailCause.NONE 562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param sendAll is true if all contexts are to be notified 563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyConnectCompleted(ConnectionParams cp, DcFailCause cause, boolean sendAll) { 565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp != null && cp.mOnCompletedMsg != null) { 568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message connectionCompletedMsg = cp.mOnCompletedMsg; 570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp.mOnCompletedMsg = null; 5717d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu alreadySent = cp.mApnContext; 572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville long timeStamp = System.currentTimeMillis(); 574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.arg1 = mCid; 575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == DcFailCause.NONE) { 577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = timeStamp; 578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg); 579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = cause; 581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = timeStamp; 582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Return message with a Throwable exception to signify an error. 584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == null) cause = DcFailCause.UNKNOWN; 585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg, cause, 586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new Throwable(cause.toString())); 587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("notifyConnectCompleted at " + timeStamp + " cause=" + cause 590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " connectionCompletedMsg=" + msgToString(connectionCompletedMsg)); 591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.sendToTarget(); 594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 5960e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu log("Send to all. " + alreadySent + " " + cause.toString()); 597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR, 598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause.toString()); 599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send ar.userObj if its a message, which is should be back to originator. 604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param dp is the DisconnectParams. 606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) { 608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("NotifyDisconnectCompleted"); 609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String reason = null; 612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp != null && dp.mOnCompletedMsg != null) { 614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = dp.mOnCompletedMsg; 616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mOnCompletedMsg = null; 617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj instanceof ApnContext) { 618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)msg.obj; 619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = dp.mReason; 621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log(String.format("msg=%s msg.obj=%s", msg.toString(), 623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>"))); 624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (reason == null) { 630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = DcFailCause.UNKNOWN.toString(); 631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DISCONNECT_DONE, reason); 633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp); 635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Begin Members and methods owned by DataConnectionTracker but stored 640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * in a DataConnection because there is one per connection. 641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The id is owned by DataConnectionTracker. 646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private int mId; 648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Get the DataConnection ID 651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public int getDataConnectionId() { 653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mId; 654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * End members owned by DataConnectionTracker 659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Clear all settings called when entering mInactiveState. 664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void clearSettings() { 666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("clearSettings"); 667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = -1; 669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = -1; 670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 673a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = new String[5]; 674a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = new LinkProperties(); 676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = null; 679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Process setup completion. 683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param ar is the result 685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return SetupResult. 686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult onSetupConnectionCompleted(AsyncResult ar) { 688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = (DataCallResponse) ar.result; 689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result; 691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag != mTag) { 693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted stale cp.tag=" + cp.mTag + ", mtag=" + mTag); 695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_Stale; 697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (ar.exception != null) { 698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception + 700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " response=" + response); 701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception instanceof CommandException 704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville && ((CommandException) (ar.exception)).getCommandError() 705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville == CommandException.Error.RADIO_NOT_AVAILABLE) { 706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_BadCommand; 707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.RADIO_NOT_AVAILABLE; 708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if ((response == null) || (response.version < 4)) { 709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_GetLastErrorFromRil; 710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (response.status != 0) { 715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 7183a5b9323f422134b68a92c36813001ec8bed2866Jack Yu if (DBG) log("onSetupConnectionCompleted received successful DataCallResponse"); 719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = response.cid; 720a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 721a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = response.pcscf; 722a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 723ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = updateLinkProperty(response).setupResult; 724ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 725ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 726ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isDnsOk(String[] domainNameServers) { 730cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1]) 73122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && !mPhone.isDnsCheckDisabled()) { 732cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Work around a race condition where QMI does not fill in DNS: 733cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Deactivate PDP and let DataConnectionTracker retry. 734cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Do not apply the race condition workaround for MMS APN 735cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // if Proxy is an IP-address. 736cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Otherwise, the default APN will not be restored anymore. 737ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mApnSetting.types[0].equals(PhoneConstants.APN_TYPE_MMS) 738ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || !isIpAddress(mApnSetting.mmsProxy)) { 739cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log(String.format( 740cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s", 741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.types[0], PhoneConstants.APN_TYPE_MMS, mApnSetting.mmsProxy, 742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville isIpAddress(mApnSetting.mmsProxy))); 743cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 744cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 745cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 746cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 74927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_GPRS = "4092,8760,48000,4096,8760,48000"; 75027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EDGE = "4093,26280,70800,4096,16384,70800"; 75127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_UMTS = "58254,349525,1048576,58254,349525,1048576"; 752d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao private static final String TCP_BUFFER_SIZES_1XRTT= "16384,32768,131072,4096,16384,102400"; 75327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EVDO = "4094,87380,262144,4096,16384,262144"; 754d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao private static final String TCP_BUFFER_SIZES_EHRPD= "131072,262144,1048576,4096,16384,524288"; 75527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSDPA= "61167,367002,1101005,8738,52429,262114"; 75627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPA = "40778,244668,734003,16777,100663,301990"; 75727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_LTE = 75827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt "524288,1048576,2097152,262144,524288,1048576"; 75927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPAP= "122334,734003,2202010,32040,192239,576717"; 76027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 76127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private void updateTcpBufferSizes(int rilRat) { 76227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt String sizes = null; 7638fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String ratName = ServiceState.rilRadioTechnologyToString(rilRat).toLowerCase(Locale.ROOT); 7648fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // ServiceState gives slightly different names for EVDO tech ("evdo-rev.0" for ex) 7658fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // - patch it up: 7668fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0 || 7678fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A || 7688fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B) { 7698fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt ratName = "evdo"; 7708fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 7718fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 7728fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // in the form: "ratname:rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max" 7738fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] configOverride = mPhone.getContext().getResources().getStringArray( 7748fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt com.android.internal.R.array.config_mobile_tcp_buffers); 7758fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt for (int i = 0; i < configOverride.length; i++) { 7768fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] split = configOverride[i].split(":"); 7778fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (ratName.equals(split[0]) && split.length == 2) { 7788fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = split[1]; 77927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt break; 7808fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 7818fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 7828fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 7838fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (sizes == null) { 7848fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // no override - use telephony defaults 7858fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // doing it this way allows device or carrier to just override the types they 7868fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // care about and inherit the defaults for the others. 7878fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt switch (rilRat) { 7888fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: 7898fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_GPRS; 7908fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 7918fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: 7928fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EDGE; 7938fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 7948fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: 7958fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_UMTS; 7968fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 797d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: 798d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao sizes = TCP_BUFFER_SIZES_1XRTT; 799d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao break; 8008fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: 8018fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: 8028fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: 8038fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EVDO; 8048fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 805d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: 806d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao sizes = TCP_BUFFER_SIZES_EHRPD; 807d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao break; 8088fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: 8098fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSDPA; 8108fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8118fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: 8128fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: 8138fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPA; 8148fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8158fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: 8168fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_LTE; 8178fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8188fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: 8198fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPAP; 8208fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8218fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt default: 8228fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // Leave empty - this will let ConnectivityService use the system default. 8238fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8248fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 82527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 82627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties.setTcpBufferSizes(sizes); 82727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 82827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 82962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkCapabilities makeNetworkCapabilities() { 83062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt NetworkCapabilities result = new NetworkCapabilities(); 83162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 83262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 83362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mApnSetting != null) { 83462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt for (String type : mApnSetting.types) { 83562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (type) { 836b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt case PhoneConstants.APN_TYPE_ALL: { 837fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 838fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 839fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 840fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 841fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 842fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 843fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 844b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt break; 845b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt } 84662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DEFAULT: { 847fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 84862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 84962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 85062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_MMS: { 851fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 85262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 85362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 85462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_SUPL: { 855fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 85662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 85762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 85862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DUN: { 859c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt ApnSetting securedDunApn = mDct.fetchDunApn(); 860c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt if (securedDunApn == null || securedDunApn.equals(mApnSetting)) { 861c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); 862c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt } 86362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 86462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 86562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_FOTA: { 866fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 86762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 86862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 86962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IMS: { 870fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 87162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 87262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 87362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_CBS: { 874fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 87562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 87662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 87762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IA: { 878fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 87962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 88062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 8814a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi case PhoneConstants.APN_TYPE_EMERGENCY: { 8824a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi result.addCapability(NetworkCapabilities.NET_CAPABILITY_EIMS); 8834a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi break; 8844a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi } 88562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 88662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 88762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 8888b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu 8898b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu // If none of the APN types associated with this APN setting is metered, 8908b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu // then we apply NOT_METERED capability to the network. 8913d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu if (!mApnSetting.isMetered(mPhone.getContext(), mPhone.getSubId(), 8923d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu mPhone.getServiceState().getDataRoaming())) { 8938b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); 8948b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu } 8958b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu 896af171aa4dcf294bf2d1b9bed54ef9a6b0ec76361Paul Jensen result.maybeMarkCapabilitiesRestricted(); 89762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 89862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int up = 14; 89962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int down = 14; 90062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (mRilRat) { 90127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: up = 80; down = 80; break; 90227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: up = 59; down = 236; break; 90327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: up = 384; down = 384; break; 90427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A: // fall through 90527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B: up = 14; down = 14; break; 90627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: up = 153; down = 2457; break; 90727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: up = 1843; down = 3174; break; 90827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: up = 100; down = 100; break; 90927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: up = 2048; down = 14336; break; 91027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: up = 5898; down = 14336; break; 91127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: up = 5898; down = 14336; break; 91227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: up = 1843; down = 5017; break; 91327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: up = 51200; down = 102400; break; 91427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: up = 153; down = 2516; break; 91527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: up = 11264; down = 43008; break; 91662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 91762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkUpstreamBandwidthKbps(up); 91962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkDownstreamBandwidthKbps(down); 920edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt 921edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt result.setNetworkSpecifier(Integer.toString(mPhone.getSubId())); 922edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt 92362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return result; 92462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 926ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isIpAddress(String address) { 927ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (address == null) return false; 928ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 929ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return Patterns.IP_ADDRESS.matcher(address).matches(); 930ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 931ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 932ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult setLinkProperties(DataCallResponse response, 933ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp) { 934ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if system property dns usable 935ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean okToUseSystemPropertyDns = false; 936ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String propertyPrefix = "net." + response.ifname + "."; 937ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String dnsServers[] = new String[2]; 938ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); 939ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); 940ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville okToUseSystemPropertyDns = isDnsOk(dnsServers); 941ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 942ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 943ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return response.setLinkProperties(lp, okToUseSystemPropertyDns); 944ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 945ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 946ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 9479a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * Initialize connection, this will fail if the 9489a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * apnSettings are not compatible. 9499a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * 9500e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * @param cp the Connection parameters 9519a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @return true if initialization was successful. 9529a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville */ 9539a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville private boolean initConnection(ConnectionParams cp) { 9549a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ApnContext apnContext = cp.mApnContext; 9559a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (mApnSetting == null) { 9569a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // Only change apn setting if it isn't set, it will 9579a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // only NOT be set only if we're in DcInactiveState. 9589a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnSetting = apnContext.getApnSetting(); 959bc1e44907073900212fb87da372174483525f3edJay Shrauner } 960bc1e44907073900212fb87da372174483525f3edJay Shrauner if (mApnSetting == null || !mApnSetting.canHandleType(apnContext.getApnType())) { 9619a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 9629a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: incompatible apnSetting in ConnectionParams cp=" + cp 9639a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " dc=" + DataConnection.this); 9649a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 9659a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return false; 9669a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 9679a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mTag += 1; 9689a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams = cp; 9699a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams.mTag = mTag; 9709a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 9711a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt // always update the ConnectionParams with the latest or the 9721a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt // connectionGeneration gets stale 9731a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt mApnContexts.put(apnContext, cp); 9741a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt 9759a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 9769a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: " 9779a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() 9789a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mApnList=" + mApnContexts 9799a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mConnectionParams=" + mConnectionParams); 9809a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 9819a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return true; 9829a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 9839a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 9849a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville /** 985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The parent state for all other states. 986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDefaultState extends State { 988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: enter"); 991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 992203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Register for DRS or RAT change 993203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), 994203e588e3c42a81aa8a56f595119c181a63b12caWink Saville DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); 995203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 996ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().registerForDataRoamingOn(getHandler(), 99762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_ON, null); 998ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().registerForDataRoamingOff(getHandler(), 99962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null); 100062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Add ourselves to the list of data connections 1002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addDc(DataConnection.this); 1003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: exit"); 1007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 100846f190903e93c653b90b970c1a21159bb957575bWink Saville // Unregister for DRS or RAT change. 100946f190903e93c653b90b970c1a21159bb957575bWink Saville mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); 101046f190903e93c653b90b970c1a21159bb957575bWink Saville 1011ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().unregisterForDataRoamingOn(getHandler()); 1012ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().unregisterForDataRoamingOff(getHandler()); 101362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 101446f190903e93c653b90b970c1a21159bb957575bWink Saville // Remove ourselves from the DC lists 101546f190903e93c653b90b970c1a21159bb957575bWink Saville mDcController.removeDc(DataConnection.this); 1016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1017ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1018ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.disconnected(); 1019ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = null; 1020ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1021ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = null; 1022ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReconnectIntent = null; 1023ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = null; 1024ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 1025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = null; 1026ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = null; 1027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = null; 1028ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mUserData = null; 1029ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = null; 1030ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = null; 1031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1034ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal = HANDLED; 1036ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefault msg=" + getWhatToString(msg.what) 1039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RefCount=" + mApnContexts.size()); 1040ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 1043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("Disconnecting to previous connection mAc=" + mAc); 1045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED); 1047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = new AsyncChannel(); 1049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.connected(null, getHandler(), msg.replyTo); 1050ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected"); 1051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_SUCCESSFUL, mId, "hi"); 1053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 105745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville if (DBG) { 105845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcDefault: CMD_CHANNEL_DISCONNECTED before quiting call dump"); 105945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville dumpToLog(); 106045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 106145eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 1062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quit(); 1063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1065454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_IS_INACTIVE: { 1066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean val = getIsInactive(); 1067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_IS_INACTIVE isInactive=" + val); 1068454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_IS_INACTIVE, val ? 1 : 0); 1069ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1070ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1071454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_CID: { 1072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int cid = getCid(); 1073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_CID cid=" + cid); 1074454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_CID, cid); 1075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1077454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_APNSETTING: { 1078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting = getApnSetting(); 1079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_APNSETTING mApnSetting=" + apnSetting); 1080454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_APNSETTING, apnSetting); 1081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1083454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_LINK_PROPERTIES: { 1084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp = getCopyLinkProperties(); 1085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp); 1086454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_PROPERTIES, lp); 1087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1089454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: { 10909c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk ProxyInfo proxy = (ProxyInfo) msg.obj; 1091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy); 1092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLinkPropertiesHttpProxy(proxy); 1093454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY); 10941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mNetworkAgent != null) { 10951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNetworkAgent.sendLinkProperties(mLinkProperties); 10961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1099f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt case DcAsyncChannel.REQ_GET_NETWORK_CAPABILITIES: { 1100f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities nc = getCopyNetworkCapabilities(); 1101f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (VDBG) log("REQ_GET_NETWORK_CAPABILITIES networkCapabilities" + nc); 1102f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_NETWORK_CAPABILITIES, nc); 1103f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt break; 1104f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 1105454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: msg.what=REQ_RESET"); 1107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); 1111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.UNKNOWN, false); 1113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT RefCount=" 1118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL RefCount=" 1126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_TEAR_DOWN_NOW: 1132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW"); 1133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, 0, null); 1134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: 1137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_LOST_CONNECTION" 1139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1143203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1144203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1145203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1146203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drsRatPair.first; 114727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt if (mRilRat != drsRatPair.second) { 114827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(drsRatPair.second); 114927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 1150203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = drsRatPair.second; 1151203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1152203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcDefaultState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1153203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " drs=" + mDataRegState 1154203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRilRat=" + mRilRat); 1155203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 115662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 115762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 115862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 115962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 116062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mNetworkAgent != null) { 11616356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt updateNetworkInfoSuspendState(); 116262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkCapabilities(makeNetworkCapabilities()); 116362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 116427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 116562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 116662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 116762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 116862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: 116962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 117062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 117162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 117262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: 117362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 1174203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1175203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState: shouldn't happen but ignore msg.what=" 1179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 11876356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 11886356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt private boolean updateNetworkInfoSuspendState() { 11896356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final NetworkInfo.DetailedState oldState = mNetworkInfo.getDetailedState(); 11906356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 11916356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // this is only called when we are either connected or suspended. Decide which. 11926356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (mNetworkAgent == null) { 11936356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt Rlog.e(getName(), "Setting suspend state without a NetworkAgent"); 11946356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 11956356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 11966356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // if we are not in-service change to SUSPENDED 11976356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final ServiceStateTracker sst = mPhone.getServiceStateTracker(); 11986356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (sst.getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) { 1199c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.SUSPENDED, null, 1200c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12016356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } else { 12026356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // check for voice call and concurrency issues 12036356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (sst.isConcurrentVoiceAndDataAllowed() == false) { 12046356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final CallTracker ct = mPhone.getCallTracker(); 12056356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (ct.getState() != PhoneConstants.State.IDLE) { 1206c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.SUSPENDED, null, 1207c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12086356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt return (oldState != NetworkInfo.DetailedState.SUSPENDED); 12096356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12106356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 1211c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, 1212c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12136356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12146356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt return (oldState != mNetworkInfo.getDetailedState()); 12156356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12166356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 1217ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDefaultState mDefaultState = new DcDefaultState(); 1218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is inactive and expects a EVENT_CONNECT. 1221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcInactiveState extends State { 1223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed connecting 1224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(ConnectionParams cp, DcFailCause cause) { 12250e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (VDBG) log("DcInactiveState: setEnterNotificationParams cp,cause"); 1226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = cp; 1227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed disconnected 1232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DisconnectParams dp) { 12330e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (VDBG) log("DcInactiveState: setEnterNotificationParams dp"); 1234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts of the failure cause 1240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DcFailCause cause) { 1241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag += 1; 1249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: enter() mTag=" + mTag); 1250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != null) { 1252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyConnectCompleted +ALL failCause=" 1254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(mConnectionParams, mDcFailCause, true); 1257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams != null) { 1259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyDisconnectCompleted +ALL failCause=" 1261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(mDisconnectParams, true); 1264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams == null && mConnectionParams == null && mDcFailCause != null) { 1266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyAllDisconnectCompleted failCause=" 1268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllDisconnectCompleted(mDcFailCause); 1271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from cid mapping, before clearSettings 1274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville clearSettings(); 1277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1288454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset"); 1291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 12969a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcInactiveState: mag.what=EVENT_CONNECT"); 12979a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 12989a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 12999a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 13009a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 13019a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 13029a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 13039a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcInactiveState: msg.what=EVENT_CONNECT initConnection failed"); 13049a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 13059a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 13069a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 1307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT"); 1313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1318ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL"); 1319ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1321ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState nothandled msg.what=" + getWhatToString(msg.what)); 1326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcInactiveState mInactiveState = new DcInactiveState(); 1334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is activating a connection. 1337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActivatingState extends State { 1339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 1343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp; 1344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActivatingState: msg=" + msgToString(msg)); 1346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1347203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1349203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Activating can't process until we're done. 1350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_SETUP_DATA_CONNECTION_DONE: 1355ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1356ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1357ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1358ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar); 1359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result != DataCallResponse.SetupResult.ERR_Stale) { 1360ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:"+ mConnectionParams 1362ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1363ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1365c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1366c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState onSetupConnectionCompleted result=" + result 1367c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1368c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 13692dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) { 13702dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt cp.mApnContext.requestLog("onSetupConnectionCompleted result=" + result); 13712dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt } 1372ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (result) { 1373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case SUCCESS: 1374ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // All is well 1375ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1376ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActiveState); 1377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_BadCommand: 1379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Vendor ril rejected the command and didn't connect. 1380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_UnacceptableParameter: 1386ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The addresses given from the RIL are bad 1387ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(cp); 1388ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingErrorCreatingConnection); 1389ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1390ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_GetLastErrorFromRil: 1391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Request failed and this is an old RIL 1392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.getLastDataCallFailCause( 1393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp)); 1394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_RilError: 13960e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 13970e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // Retrieve the suggested retry delay from the modem and save it. 13980e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // If the modem want us to retry the current APN again, it will 13990e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // suggest a positive delay value (in milliseconds). Otherwise we'll get 14000e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // NO_SUGGESTED_RETRY_DELAY here. 14010e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu long delay = getSuggestedRetryDelay(ar); 14020e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu cp.mApnContext.setModemSuggestedDelay(delay); 14030e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 14042dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcActivatingState: ERR_RilError " 14052dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " delay=" + delay 14062dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result=" + result 14072dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result.isRestartRadioFail=" + 14082dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt result.mFailCause.isRestartRadioFail() 14092dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result.isPermanentFail=" + 14102dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt mDct.isPermanentFail(result.mFailCause); 14112dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 14122dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog(str); 14130e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 14140e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // Save the cause. DcTracker.onDataSetupComplete will check this 14150e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // failure cause and determine if we need to retry this APN later 14160e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // or not. 14170e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 14180e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu transitionTo(mInactiveState); 1419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_Stale: 1421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_SETUP_DATA_CONNECTION_DONE" 1422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1424ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville throw new RuntimeException("Unknown SetupResult, should not happen"); 1426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_GET_LAST_FAIL_DONE: 1431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:" + mConnectionParams 1436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause cause = DcFailCause.UNKNOWN; 1440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 1442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int rilFailCause = ((int[]) (ar.result))[0]; 1443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = DcFailCause.fromInt(rilFailCause); 14441db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (cause == DcFailCause.NONE) { 14451db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (DBG) { 14461db7da14111228a5079d2970d7d0ce34173000b5Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 14471db7da14111228a5079d2970d7d0ce34173000b5Wink Saville + " BAD: error was NONE, change to UNKNOWN"); 14481db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 14491db7da14111228a5079d2970d7d0ce34173000b5Wink Saville cause = DcFailCause.UNKNOWN; 14501db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 1451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1454c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1455c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 14560e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu + " cause=" + cause + " dc=" + DataConnection.this); 1457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 14580e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 14590e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mInactiveState.setEnterNotificationParams(cp, cause); 14600e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu transitionTo(mInactiveState); 1461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_GET_LAST_FAIL_DONE" 1463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1465ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1466ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1468ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1469ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1470ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1471ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActivatingState not handled msg.what=" + 1472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville getWhatToString(msg.what) + " RefCount=" + mApnContexts.size()); 1473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1474ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActivatingState mActivatingState = new DcActivatingState(); 1481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is connected, expecting an EVENT_DISCONNECT. 1484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActiveState extends State { 1486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override public void enter() { 1487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: enter dc=" + DataConnection.this); 1488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 14895488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan boolean createNetworkAgent = true; 14905488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan // If a disconnect is already pending, avoid notifying all of connected 14911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (hasMessages(EVENT_DISCONNECT) || 14921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasMessages(EVENT_DISCONNECT_ALL) || 14931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasDeferredMessages(EVENT_DISCONNECT) || 14941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasDeferredMessages(EVENT_DISCONNECT_ALL)) { 14955488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan log("DcActiveState: skipping notifyAllOfConnected()"); 14965488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan createNetworkAgent = false; 14975488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } else { 14985488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan // If we were retrying there maybe more than one, otherwise they'll only be one. 14995488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan notifyAllOfConnected(Phone.REASON_CONNECTED); 15005488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 15026356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().registerForVoiceCallStarted(getHandler(), 15036356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_STARTED, null); 15046356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().registerForVoiceCallEnded(getHandler(), 15056356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_ENDED, null); 15066356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 1507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If the EVENT_CONNECT set the current max retry restore it here 1508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // if it didn't then this is effectively a NOP. 1509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addActiveDcByCid(DataConnection.this); 151062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 151162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, 151262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getReason(), null); 151362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setExtraInfo(mApnSetting.apn); 151427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 1515957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey 1516957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey final NetworkMisc misc = new NetworkMisc(); 15174c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu final CarrierSignalAgent carrierSignalAgent = mPhone.getCarrierSignalAgent(); 15184c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu if(carrierSignalAgent.hasRegisteredCarrierSignalReceivers()) { 15194c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu // carrierSignal Receivers will place the carrier-specific provisioning notification 15204c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu misc.provisioningNotificationDisabled = true; 15214c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu } 1522957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey misc.subscriberId = mPhone.getSubscriberId(); 15235488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan 15245488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (createNetworkAgent) { 15255488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(), 15265488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan "DcNetworkAgent", mNetworkInfo, makeNetworkCapabilities(), mLinkProperties, 15275488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan 50, misc); 15285488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: exit dc=" + this); 153427b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra String reason = mNetworkInfo.getReason(); 153522ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang if(mDcController.isExecutingCarrierChange()) { 153622ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang reason = Phone.REASON_CARRIER_CHANGE; 153722ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang } else if (mDisconnectParams != null && mDisconnectParams.mReason != null) { 153827b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason = mDisconnectParams.mReason; 153927b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra } else if (mDcFailCause != null) { 154027b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason = mDcFailCause.toString(); 154127b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra } 15426356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().unregisterForVoiceCallStarted(getHandler()); 15436356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().unregisterForVoiceCallEnded(getHandler()); 15446356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 154562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, 154627b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason, mNetworkInfo.getExtraInfo()); 15475488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 15485488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 15495488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent = null; 15505488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 1559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 15603f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt // either add this new apn context to our set or 15613f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt // update the existing cp with the latest connection generation number 15623f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt mApnContexts.put(cp.mApnContext, cp); 1563c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1564c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this); 1565c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.NONE, false); 1567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1572c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1573c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_DISCONNECT dp=" + dp 1574c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1575c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1576ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if (mApnContexts.containsKey(dp.mApnContext)) { 1577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" 1579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.size() == 1) { 1583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 1584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.remove(dp.mApnContext); 1591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState ERROR no such apnContext=" + dp.mApnContext 1595c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " in this dc=" + DataConnection.this); 1596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1603c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_DISCONNECT clearing apn contexts," 1604c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: { 1616c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1617c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_LOST_CONNECTION dc=" + DataConnection.this); 1618c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 16190e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 16200e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 16210e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu transitionTo(mInactiveState); 1622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 162562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: { 162662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 16275488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 16285488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 16295488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 163062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 163162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 163262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 163362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: { 163462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 16355488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 16365488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 16375488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 163862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 163962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 164062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 164165bee39d7e417fb898c3948696d5d8a38046c449fenglu case EVENT_BW_REFRESH_RESPONSE: { 164265bee39d7e417fb898c3948696d5d8a38046c449fenglu AsyncResult ar = (AsyncResult)msg.obj; 164365bee39d7e417fb898c3948696d5d8a38046c449fenglu if (ar.exception != null) { 164465bee39d7e417fb898c3948696d5d8a38046c449fenglu log("EVENT_BW_REFRESH_RESPONSE: error ignoring, e=" + ar.exception); 164565bee39d7e417fb898c3948696d5d8a38046c449fenglu } else { 164665bee39d7e417fb898c3948696d5d8a38046c449fenglu final ArrayList<Integer> capInfo = (ArrayList<Integer>)ar.result; 164765bee39d7e417fb898c3948696d5d8a38046c449fenglu final int lceBwDownKbps = capInfo.get(0); 164865bee39d7e417fb898c3948696d5d8a38046c449fenglu NetworkCapabilities nc = makeNetworkCapabilities(); 164965bee39d7e417fb898c3948696d5d8a38046c449fenglu if (mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) { 165065bee39d7e417fb898c3948696d5d8a38046c449fenglu nc.setLinkDownstreamBandwidthKbps(lceBwDownKbps); 165165bee39d7e417fb898c3948696d5d8a38046c449fenglu if (mNetworkAgent != null) { 165265bee39d7e417fb898c3948696d5d8a38046c449fenglu mNetworkAgent.sendNetworkCapabilities(nc); 165365bee39d7e417fb898c3948696d5d8a38046c449fenglu } 165465bee39d7e417fb898c3948696d5d8a38046c449fenglu } 165565bee39d7e417fb898c3948696d5d8a38046c449fenglu } 16566356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt retVal = HANDLED; 16576356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt break; 16586356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 16596356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt case EVENT_DATA_CONNECTION_VOICE_CALL_STARTED: 16606356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt case EVENT_DATA_CONNECTION_VOICE_CALL_ENDED: { 16615488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (updateNetworkInfoSuspendState() && mNetworkAgent != null) { 16626356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // state changed 16636356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 16646356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 166565bee39d7e417fb898c3948696d5d8a38046c449fenglu retVal = HANDLED; 166665bee39d7e417fb898c3948696d5d8a38046c449fenglu break; 166765bee39d7e417fb898c3948696d5d8a38046c449fenglu } 1668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState not handled msg.what=" + getWhatToString(msg.what)); 1671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActiveState mActiveState = new DcActiveState(); 1679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting. 1682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectingState extends State { 1684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " 1691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) ar.userObj; 16992dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt 17002dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount=" 17012dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + mApnContexts.size(); 17022dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 17032dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (dp.mApnContext != null) dp.mApnContext.requestLog(str); 17042dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt 1705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp.mTag == mTag) { 1706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj); 1709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectState stale EVENT_DEACTIVATE_DONE" 1712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + dp.mTag + " mTag=" + mTag); 1713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectingState not handled msg.what=" 1720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1721ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1722ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1723ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1724ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1725ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1726ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectingState mDisconnectingState = new DcDisconnectingState(); 1729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1730ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1731ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting after an creating a connection. 1732ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1733ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectionErrorCreatingConnection extends State { 1734ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1735ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1736ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1737ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1738ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1740ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 1742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 17432dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcDisconnectionErrorCreatingConnection" + 17442dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt " msg.what=EVENT_DEACTIVATE_DONE"; 17452dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 17462dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog(str); 1747ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1748ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, 1751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER); 1752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1753ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1754ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1755ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection stale EVENT_DEACTIVATE_DONE" 1756ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + cp.mTag + ", mTag=" + mTag); 1757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1758ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection not handled msg.what=" 1765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection = 1774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new DcDisconnectionErrorCreatingConnection(); 1775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 177662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 177762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private class DcNetworkAgent extends NetworkAgent { 177862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt public DcNetworkAgent(Looper l, Context c, String TAG, NetworkInfo ni, 1779957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) { 1780957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey super(l, c, TAG, ni, nc, lp, score, misc); 178162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 178262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 178345eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 178462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt protected void unwanted() { 17851484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (mNetworkAgent != this) { 178645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcNetworkAgent: unwanted found mNetworkAgent=" + mNetworkAgent + 17871484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt ", which isn't me. Aborting unwanted"); 17881484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt return; 17891484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt } 17904a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt // this can only happen if our exit has been called - we're already disconnected 17914a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt if (mApnContexts == null) return; 179237cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt for (ConnectionParams cp : mApnContexts.values()) { 179337cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt final ApnContext apnContext = cp.mApnContext; 179437cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt final Pair<ApnContext, Integer> pair = 179537cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt new Pair<ApnContext, Integer>(apnContext, cp.mConnectionGeneration); 179645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcNetworkAgent: [unwanted]: disconnect apnContext=" + apnContext); 179737cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt Message msg = mDct.obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, pair); 1798305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DisconnectParams dp = new DisconnectParams(apnContext, apnContext.getReason(), msg); 1799305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DataConnection.this.sendMessage(DataConnection.this. 1800305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt obtainMessage(EVENT_DISCONNECT, dp)); 1801305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt } 180262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 180365bee39d7e417fb898c3948696d5d8a38046c449fenglu 180465bee39d7e417fb898c3948696d5d8a38046c449fenglu @Override 180565bee39d7e417fb898c3948696d5d8a38046c449fenglu protected void pollLceData() { 180665bee39d7e417fb898c3948696d5d8a38046c449fenglu if(mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) { // active LCE service 180765bee39d7e417fb898c3948696d5d8a38046c449fenglu mPhone.mCi.pullLceData(DataConnection.this.obtainMessage(EVENT_BW_REFRESH_RESPONSE)); 180865bee39d7e417fb898c3948696d5d8a38046c449fenglu } 180965bee39d7e417fb898c3948696d5d8a38046c449fenglu } 1810a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu 1811a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu @Override 1812a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu protected void networkStatus(int status, String redirectUrl) { 1813a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu if(!TextUtils.isEmpty(redirectUrl)) { 1814a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu log("validation status: " + status + " with redirection URL: " + redirectUrl); 1815a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu /* its possible that we have multiple DataConnection with INTERNET_CAPABILITY 1816a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu all fail the validation with the same redirection url, send CMD back to DCTracker 1817a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu and let DcTracker to make the decision */ 1818a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu Message msg = mDct.obtainMessage(DctConstants.EVENT_REDIRECTION_DETECTED, 1819a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu redirectUrl); 1820a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu msg.sendToTarget(); 1821a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu } 1822a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu } 182362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 182462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1825ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ******* "public" interface 1826ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1827ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1828ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used for testing purposes. 1829ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1830ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* package */ void tearDownNow() { 1831ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownNow()"); 1832ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_TEAR_DOWN_NOW)); 1833ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1834ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1835ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 18360e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * Using the result of the SETUP_DATA_CALL determine the retry delay. 18370e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * 18380e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * @param ar is the result from SETUP_DATA_CALL 18390e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * @return NO_SUGGESTED_RETRY_DELAY if no retry is needed otherwise the delay to the 18400e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * next SETUP_DATA_CALL 18410e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu */ 18420e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu private long getSuggestedRetryDelay(AsyncResult ar) { 18430e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 18440e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu DataCallResponse response = (DataCallResponse) ar.result; 18450e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 18460852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu /** According to ril.h 18470852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu * The value < 0 means no value is suggested 18480852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu * The value 0 means retry should be done ASAP. 18490852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu * The value of Integer.MAX_VALUE(0x7fffffff) means no retry. 18500852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu */ 18510852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu 18520852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu // The value < 0 means no value is suggested 18530852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu if (response.suggestedRetryTime < 0) { 18540e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (DBG) log("No suggested retry delay."); 18550e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return RetryManager.NO_SUGGESTED_RETRY_DELAY; 18560e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 18570852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu // The value of Integer.MAX_VALUE(0x7fffffff) means no retry. 18580852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu else if (response.suggestedRetryTime == Integer.MAX_VALUE) { 18590852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu if (DBG) log("Modem suggested not retrying."); 18600852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu return RetryManager.NO_RETRY; 18610852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu } 18620e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 18630e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // We need to cast it to long because the value returned from RIL is a 32-bit integer, 18640e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // but the time values used in AlarmManager are all 64-bit long. 18650e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return (long) response.suggestedRetryTime; 18660e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 18670e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 18680e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu /** 1869ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return the string for msg.what as our info. 1870ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1871ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1872ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected String getWhatToString(int what) { 1873ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return cmdToString(what); 1874ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1875ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1876ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String msgToString(Message msg) { 1877ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retVal; 1878ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg == null) { 1879ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = "null"; 1880ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1881ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville StringBuilder b = new StringBuilder(); 1882ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1883ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("{what="); 1884ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(cmdToString(msg.what)); 1885ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1886ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" when="); 1887ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis(), b); 1888ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1889ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 != 0) { 1890ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg1="); 1891ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg1); 1892ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1894ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg2 != 0) { 1895ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg2="); 1896ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg2); 1897ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1898ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1899ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj != null) { 1900ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" obj="); 1901ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.obj); 1902ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1903ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1904ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" target="); 1905ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.getTarget()); 1906ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1907ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" replyTo="); 1908ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.replyTo); 1909ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1910ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("}"); 1911ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1912ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = b.toString(); 1913ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1914ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1915ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1916ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static void slog(String s) { 1918ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d("DC", s); 1919ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1920ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1921ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1922ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug 1923ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1924ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1925ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1926cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1927cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void log(String s) { 1928cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.d(getName(), s); 19290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 19300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1931ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1932ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug attribute 1933ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1934ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1935ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1936ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1937ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logd(String s) { 1938ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(getName(), s); 1939ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 19400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1941ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1942ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with verbose attribute 1943ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1944ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1945ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1946ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1947ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logv(String s) { 1948ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.v(getName(), s); 1949ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1950ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1951ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1952ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with info attribute 1953ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1954ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1955ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1956ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1957ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logi(String s) { 1958ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.i(getName(), s); 1959ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1960ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1961ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1962ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with warning attribute 1963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logw(String s) { 1968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.w(getName(), s); 19690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 19700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 1973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s) { 1978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s); 1979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 1983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param e is a Throwable which logs additional information. 1986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s, Throwable e) { 1989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s, e); 1990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Doesn't print mApnList of ApnContext's which would be recursive */ 1993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toStringSimple() { 1994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getName() + ": State=" + getCurrentState().getName() 1995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size() 1996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mCid=" + mCid + " mCreateTime=" + mCreateTime 1997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastastFailTime=" + mLastFailTime 1998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastFailCause=" + mLastFailCause 1999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag 2000f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt + " mLinkProperties=" + mLinkProperties 200162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt + " linkCapabilities=" + makeNetworkCapabilities(); 2002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 2006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{" + toStringSimple() + " mApnContexts=" + mApnContexts + "}"; 2007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 200945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville private void dumpToLog() { 201045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville dump(null, new PrintWriter(new StringWriter(0)) { 201145eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 201245eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville public void println(String s) { 201345eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville DataConnection.this.logd(s); 201445eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 201545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 201645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 201745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville public void flush() { 201845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 201945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville }, null); 202045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 202145eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 2022ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2023ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Dump the current state. 2024ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param fd 2026ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param pw 2027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param args 2028ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 20290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 20300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 2031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.print("DataConnection "); 20320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 2033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts.size=" + mApnContexts.size()); 2034ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts=" + mApnContexts); 2035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2036ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDataConnectionTracker=" + mDct); 2037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnSetting=" + mApnSetting); 2038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mTag=" + mTag); 2039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCid=" + mCid); 2040ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mConnectionParams=" + mConnectionParams); 2041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDisconnectParams=" + mDisconnectParams); 2042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcFailCause=" + mDcFailCause); 2043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mPhone=" + mPhone); 2045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLinkProperties=" + mLinkProperties); 2047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2048203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mDataRegState=" + mDataRegState); 2049203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mRilRat=" + mRilRat); 205062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt pw.println(" mNetworkCapabilities=" + makeNetworkCapabilities()); 2051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime)); 2052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime)); 2053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailCause=" + mLastFailCause); 2054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mUserData=" + mUserData); 2056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mInstanceNumber=" + mInstanceNumber); 2057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mAc=" + mAc); 2058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 20590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 20610e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 2062