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