DataConnection.java revision 443b0ae99852b74898fa688f90dee303a80c1b89
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 174918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savillepackage com.android.internal.telephony.dataconnection; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 196356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwaltimport com.android.internal.telephony.CallTracker; 204c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxuimport com.android.internal.telephony.CarrierSignalAgent; 21ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.CommandException; 22ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.DctConstants; 23ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.Phone; 24cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.PhoneConstants; 254918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RILConstants; 264918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RetryManager; 276356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwaltimport com.android.internal.telephony.ServiceStateTracker; 28ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.AsyncChannel; 29ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.Protocol; 30ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.State; 31ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.StateMachine; 32ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 33ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.app.PendingIntent; 3462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.content.Context; 3562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.ConnectivityManager; 36ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.net.LinkProperties; 3762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.NetworkAgent; 3896cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwaltimport android.net.NetworkCapabilities; 3962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.NetworkInfo; 40957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkeyimport android.net.NetworkMisc; 419c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monkimport android.net.ProxyInfo; 42ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.AsyncResult; 4362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.os.Looper; 44ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.Message; 45ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.SystemClock; 46ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.SystemProperties; 47ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.Rlog; 48203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.telephony.ServiceState; 49ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.TelephonyManager; 50203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.text.TextUtils; 51203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.util.Pair; 52ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.util.Patterns; 53ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.util.TimeUtils; 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor; 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter; 5745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Savilleimport java.io.StringWriter; 58ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.ArrayList; 598fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwaltimport java.util.Locale; 60ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.concurrent.atomic.AtomicInteger; 61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.net.InetAddress; 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.Collection; 63ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwaltimport java.util.HashMap; 64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 67ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 68ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * DataConnection StateMachine. 69ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 70ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * This a class for representing a single data connection, with instances of this 71ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * class representing a connection via the cellular network. There may be multiple 72ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * data connections and all of them are managed by the <code>DataConnectionTracker</code>. 73ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 74ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * NOTE: All DataConnection objects must be running on the same looper, which is the default 75ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * as the coordinator has members which are used without synchronization. 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 773a5b9323f422134b68a92c36813001ec8bed2866Jack Yupublic class DataConnection extends StateMachine { 78ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean DBG = true; 79ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean VDBG = true; 80ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 81aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran private static final String NETWORK_TYPE = "MOBILE"; 82aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran 83ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The data connection controller 84ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcController mDcController; 85ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 86ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The Tester for failing all bringup's 87ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcTesterFailBringUpAll mDcTesterFailBringUpAll; 88ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 89ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static AtomicInteger mInstanceNumber = new AtomicInteger(0); 90ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private AsyncChannel mAc; 91ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 92ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The DCT that's talking to us, we only support one! 931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private DcTracker mDct = null; 94ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville protected String[] mPcscfAddr; 96a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 97ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 98ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving connecting parameters. 99ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1003a5b9323f422134b68a92c36813001ec8bed2866Jack Yu public static class ConnectionParams { 101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mProfileId; 104203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int mRilRat; 105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 106ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt final int mConnectionGeneration; 107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1080e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu ConnectionParams(ApnContext apnContext, int profileId, 1090e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu int rilRadioTechnology, Message onCompletedMsg, int connectionGeneration) { 110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mProfileId = profileId; 112203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rilRadioTechnology; 113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 114ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt mConnectionGeneration = connectionGeneration; 115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 1200e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu + " mProfileId=" + mProfileId 121203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRat=" + mRilRat 122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving disconnecting parameters. 128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 129e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu public static class DisconnectParams { 130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 131e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu public ApnContext mApnContext; 132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String mReason; 133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams(ApnContext apnContext, String reason, Message onCompletedMsg) { 136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReason = reason; 138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mReason=" + mReason 145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1482563e7e1ec513121b980045571a245aa5390f1c5Wink Saville 149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ApnSetting mApnSetting; 150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ConnectionParams mConnectionParams; 151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DisconnectParams mDisconnectParams; 152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mDcFailCause; 153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private Phone mPhone; 155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private LinkProperties mLinkProperties = new LinkProperties(); 156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mCreateTime; 157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mLastFailTime; 158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mLastFailCause; 159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String NULL_IP = "0.0.0.0"; 160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private Object mUserData; 161203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mRilRat = Integer.MAX_VALUE; 162203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mDataRegState = Integer.MAX_VALUE; 16362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkInfo mNetworkInfo; 16462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkAgent mNetworkAgent; 165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 1673a5b9323f422134b68a92c36813001ec8bed2866Jack Yu public int mCid; 1683a5b9323f422134b68a92c36813001ec8bed2866Jack Yu public HashMap<ApnContext, ConnectionParams> mApnContexts = null; 169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville PendingIntent mReconnectIntent = null; 170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ***** Event codes for driving the state machine, package visible for Dcc 173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int BASE = Protocol.BASE_DATA_CONNECTION; 174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_CONNECT = BASE + 0; 175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_SETUP_DATA_CONNECTION_DONE = BASE + 1; 176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_GET_LAST_FAIL_DONE = BASE + 2; 177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DEACTIVATE_DONE = BASE + 3; 178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT = BASE + 4; 179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RIL_CONNECTED = BASE + 5; 180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT_ALL = BASE + 6; 181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DATA_STATE_CHANGED = BASE + 7; 182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_TEAR_DOWN_NOW = BASE + 8; 183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_LOST_CONNECTION = BASE + 9; 184203e588e3c42a81aa8a56f595119c181a63b12caWink Saville static final int EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED = BASE + 11; 18562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt static final int EVENT_DATA_CONNECTION_ROAM_ON = BASE + 12; 18662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt static final int EVENT_DATA_CONNECTION_ROAM_OFF = BASE + 13; 18765bee39d7e417fb898c3948696d5d8a38046c449fenglu static final int EVENT_BW_REFRESH_RESPONSE = BASE + 14; 1886356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt static final int EVENT_DATA_CONNECTION_VOICE_CALL_STARTED = BASE + 15; 1896356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt static final int EVENT_DATA_CONNECTION_VOICE_CALL_ENDED = BASE + 16; 1906356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 1916356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt private static final int CMD_TO_STRING_COUNT = 1926356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt EVENT_DATA_CONNECTION_VOICE_CALL_ENDED - BASE + 1; 193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; 195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static { 196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_CONNECT - BASE] = "EVENT_CONNECT"; 197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_SETUP_DATA_CONNECTION_DONE - BASE] = 198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "EVENT_SETUP_DATA_CONNECTION_DONE"; 199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_GET_LAST_FAIL_DONE - BASE] = "EVENT_GET_LAST_FAIL_DONE"; 200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DEACTIVATE_DONE - BASE] = "EVENT_DEACTIVATE_DONE"; 201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT - BASE] = "EVENT_DISCONNECT"; 202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RIL_CONNECTED - BASE] = "EVENT_RIL_CONNECTED"; 203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT_ALL - BASE] = "EVENT_DISCONNECT_ALL"; 204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DATA_STATE_CHANGED - BASE] = "EVENT_DATA_STATE_CHANGED"; 205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_TEAR_DOWN_NOW - BASE] = "EVENT_TEAR_DOWN_NOW"; 206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_LOST_CONNECTION - BASE] = "EVENT_LOST_CONNECTION"; 207203e588e3c42a81aa8a56f595119c181a63b12caWink Saville sCmdToString[EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED - BASE] = 208203e588e3c42a81aa8a56f595119c181a63b12caWink Saville "EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED"; 20962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_ROAM_ON - BASE] = "EVENT_DATA_CONNECTION_ROAM_ON"; 21062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_ROAM_OFF - BASE] = "EVENT_DATA_CONNECTION_ROAM_OFF"; 21165bee39d7e417fb898c3948696d5d8a38046c449fenglu sCmdToString[EVENT_BW_REFRESH_RESPONSE - BASE] = "EVENT_BW_REFRESH_RESPONSE"; 2126356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_VOICE_CALL_STARTED - BASE] = 2136356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt "EVENT_DATA_CONNECTION_VOICE_CALL_STARTED"; 2146356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_VOICE_CALL_ENDED - BASE] = 2156356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt "EVENT_DATA_CONNECTION_VOICE_CALL_ENDED"; 216ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 217ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Convert cmd to string or null if unknown 218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static String cmdToString(int cmd) { 219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String value; 220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cmd -= BASE; 221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((cmd >= 0) && (cmd < sCmdToString.length)) { 222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = sCmdToString[cmd]; 223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 224454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville value = DcAsyncChannel.cmdToString(cmd + BASE); 225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (value == null) { 227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = "0x" + Integer.toHexString(cmd + BASE); 228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return value; 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 233cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Create the connection object 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 235cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param phone the Phone 236cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param id the connection id 237cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return DataConnection that was created. 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 239e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu public static DataConnection makeDataConnection(Phone phone, int id, 2401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DcTracker dct, DcTesterFailBringUpAll failBringUpAll, 241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection dc = new DataConnection(phone, 243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DC-" + mInstanceNumber.incrementAndGet(), id, dct, failBringUpAll, dcc); 244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dc.start(); 245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) dc.log("Made " + dc.getName()); 246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return dc; 247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void dispose() { 250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("dispose: call quiteNow()"); 251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quitNow(); 252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* Getter functions */ 255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 256f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities getCopyNetworkCapabilities() { 25762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return makeNetworkCapabilities(); 258f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 259f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties getCopyLinkProperties() { 261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return new LinkProperties(mLinkProperties); 262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean getIsInactive() { 265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getCurrentState() == mInactiveState; 266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int getCid() { 269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mCid; 270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting getApnSetting() { 273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mApnSetting; 274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2769c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk void setLinkPropertiesHttpProxy(ProxyInfo proxy) { 277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties.setHttpProxy(proxy); 278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2803a5b9323f422134b68a92c36813001ec8bed2866Jack Yu public static class UpdateLinkPropertyResult { 281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public DataCallResponse.SetupResult setupResult = DataCallResponse.SetupResult.SUCCESS; 282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties oldLp; 283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties newLp; 284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public UpdateLinkPropertyResult(LinkProperties curLp) { 285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville oldLp = curLp; 286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville newLp = curLp; 287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isIpv4Connected() { 291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean ret = false; 292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Collection <InetAddress> addresses = mLinkProperties.getAddresses(); 293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (InetAddress addr: addresses) { 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (addr instanceof java.net.Inet4Address) { 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville java.net.Inet4Address i4addr = (java.net.Inet4Address) addr; 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!i4addr.isAnyLocalAddress() && !i4addr.isLinkLocalAddress() && 298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !i4addr.isLoopbackAddress() && !i4addr.isMulticastAddress()) { 299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = true; 300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isIpv6Connected() { 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean ret = false; 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Collection <InetAddress> addresses = mLinkProperties.getAddresses(); 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (InetAddress addr: addresses) { 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (addr instanceof java.net.Inet6Address) { 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville java.net.Inet6Address i6addr = (java.net.Inet6Address) addr; 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!i6addr.isAnyLocalAddress() && !i6addr.isLinkLocalAddress() && 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !i6addr.isLoopbackAddress() && !i6addr.isMulticastAddress()) { 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = true; 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3243a5b9323f422134b68a92c36813001ec8bed2866Jack Yu public UpdateLinkPropertyResult updateLinkProperty(DataCallResponse newState) { 325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties); 326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (newState == null) return result; 328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult setupResult; 330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp = new LinkProperties(); 331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.setupResult = setLinkProperties(newState, result.newLp); 334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result.setupResult != DataCallResponse.SetupResult.SUCCESS) { 335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("updateLinkProperty failed : " + result.setupResult); 336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // copy HTTP proxy as it is not part DataCallResponse. 339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp.setHttpProxy(mLinkProperties.getHttpProxy()); 340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 341e9701717e43cc5aacbcf624f77a53be92350662cw checkSetMtu(mApnSetting, result.newLp); 342e9701717e43cc5aacbcf624f77a53be92350662cw 34327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties = result.newLp; 34427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 34527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 34627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG && (! result.oldLp.equals(result.newLp))) { 348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty old LP=" + result.oldLp); 349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty new LP=" + result.newLp); 350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 351f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 352d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt if (result.newLp.equals(result.oldLp) == false && 353d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt mNetworkAgent != null) { 354d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 355d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt } 356d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt 357ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 358ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 360e9701717e43cc5aacbcf624f77a53be92350662cw /** 361e9701717e43cc5aacbcf624f77a53be92350662cw * Read the MTU value from link properties where it can be set from network. In case 362e9701717e43cc5aacbcf624f77a53be92350662cw * not set by the network, set it again using the mtu szie value defined in the APN 363e9701717e43cc5aacbcf624f77a53be92350662cw * database for the connected APN 364e9701717e43cc5aacbcf624f77a53be92350662cw */ 365e9701717e43cc5aacbcf624f77a53be92350662cw private void checkSetMtu(ApnSetting apn, LinkProperties lp) { 366e9701717e43cc5aacbcf624f77a53be92350662cw if (lp == null) return; 367e9701717e43cc5aacbcf624f77a53be92350662cw 368e9701717e43cc5aacbcf624f77a53be92350662cw if (apn == null || lp == null) return; 369e9701717e43cc5aacbcf624f77a53be92350662cw 370e9701717e43cc5aacbcf624f77a53be92350662cw if (lp.getMtu() != PhoneConstants.UNSET_MTU) { 371e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by call response to: " + lp.getMtu()); 372e9701717e43cc5aacbcf624f77a53be92350662cw return; 373e9701717e43cc5aacbcf624f77a53be92350662cw } 374e9701717e43cc5aacbcf624f77a53be92350662cw 375e9701717e43cc5aacbcf624f77a53be92350662cw if (apn != null && apn.mtu != PhoneConstants.UNSET_MTU) { 376e9701717e43cc5aacbcf624f77a53be92350662cw lp.setMtu(apn.mtu); 377e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by APN to: " + apn.mtu); 378e9701717e43cc5aacbcf624f77a53be92350662cw return; 379e9701717e43cc5aacbcf624f77a53be92350662cw } 380e9701717e43cc5aacbcf624f77a53be92350662cw 381e9701717e43cc5aacbcf624f77a53be92350662cw int mtu = mPhone.getContext().getResources().getInteger( 382e9701717e43cc5aacbcf624f77a53be92350662cw com.android.internal.R.integer.config_mobile_mtu); 383e9701717e43cc5aacbcf624f77a53be92350662cw if (mtu != PhoneConstants.UNSET_MTU) { 384e9701717e43cc5aacbcf624f77a53be92350662cw lp.setMtu(mtu); 385e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by config resource to: " + mtu); 386e9701717e43cc5aacbcf624f77a53be92350662cw } 387e9701717e43cc5aacbcf624f77a53be92350662cw } 388e9701717e43cc5aacbcf624f77a53be92350662cw 389ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Constructor (NOTE: uses dcc.getHandler() as its Handler) 3901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private DataConnection(Phone phone, String name, int id, 3911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DcTracker dct, DcTesterFailBringUpAll failBringUpAll, 392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville super(name, dcc.getHandler()); 394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogRecSize(300); 395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogOnlyTransitions(true); 3969c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (DBG) log("DataConnection created"); 397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 398ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = phone; 399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = dct; 400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = failBringUpAll; 401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = dcc; 402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mId = id; 403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 40462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 40562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mRilRat = ss.getRilDataRadioTechnology(); 406203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = mPhone.getServiceState().getDataRegState(); 40762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 40862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, 409aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran networkType, NETWORK_TYPE, TelephonyManager.getNetworkTypeName(networkType)); 410ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mNetworkInfo.setRoaming(ss.getDataRoaming()); 41162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setIsAvailable(true); 412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDefaultState); 414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mInactiveState, mDefaultState); 415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActivatingState, mDefaultState); 416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActiveState, mDefaultState); 417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingState, mDefaultState); 418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingErrorCreatingConnection, mDefaultState); 419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setInitialState(mInactiveState); 420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 421ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt mApnContexts = new HashMap<ApnContext, ConnectionParams>(); 422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 425cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Begin setting up a data connection, calls setupDataCall 426cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * and the ConnectionParams will be returned with the 427cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj. 4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 429cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param cp is the connection parameters 4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void onConnect(ConnectionParams cp) { 432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onConnect: carrier='" + mApnSetting.carrier 433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' APN='" + mApnSetting.apn 434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' proxy='" + mApnSetting.proxy + "' port='" + mApnSetting.port + "'"); 4352dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog("DataConnection.onConnect"); 4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if we should fake an error. 438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDcTesterFailBringUpAll.getDcFailBringUp().mCounter > 0) { 439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = new DataCallResponse(); 440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.version = mPhone.mCi.getRilVersion(); 441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.status = mDcTesterFailBringUpAll.getDcFailBringUp().mFailCause.getErrorCode(); 442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.cid = 0; 443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.active = 0; 444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.type = ""; 445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.ifname = ""; 446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.addresses = new String[0]; 447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.dnses = new String[0]; 448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.gateways = new String[0]; 449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.suggestedRetryTime = 450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mSuggestedRetryTime; 451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville response.pcscf = new String[0]; 452e9701717e43cc5aacbcf624f77a53be92350662cw response.mtu = PhoneConstants.UNSET_MTU; 453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg, response, null); 456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(msg); 457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onConnect: FailBringUpAll=" + mDcTesterFailBringUpAll.getDcFailBringUp() 459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " send error response=" + response); 460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mCounter -= 1; 462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return; 463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 46522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = -1; 46622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mLastFailTime = -1; 467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 469cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // msg.obj will be returned in AsyncResult.userObj; 470cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 471cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville msg.obj = cp; 4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int authType = mApnSetting.authType; 474cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (authType == -1) { 475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville authType = TextUtils.isEmpty(mApnSetting.user) ? RILConstants.SETUP_DATA_AUTH_NONE 476cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville : RILConstants.SETUP_DATA_AUTH_PAP_CHAP; 4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 479cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String protocol; 4806b8e1174d2ef221d6eeab348a819ce0003d3d5a4Chris Manton if (mPhone.getServiceState().getDataRoamingFromRegistration()) { 481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.roamingProtocol; 482cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.protocol; 4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 48622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.mCi.setupDataCall( 4875d5ec64fcd293928776aebe5c92278afb5bc019dPavel Zhamaitsiak cp.mRilRat, 4885d5ec64fcd293928776aebe5c92278afb5bc019dPavel Zhamaitsiak cp.mProfileId, 489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.apn, mApnSetting.user, mApnSetting.password, 4905d5ec64fcd293928776aebe5c92278afb5bc019dPavel Zhamaitsiak authType, 491cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protocol, msg); 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * TearDown the data connection when the deactivation is complete a Message with 496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * msg.what == EVENT_DEACTIVATE_DONE and msg.obj == AsyncResult with AsyncResult.obj 497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * containing the parameter o. 498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param o is the object returned in the AsyncResult.obj. 500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void tearDownData(Object o) { 502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int discReason = RILConstants.DEACTIVATE_REASON_NONE; 5032dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt ApnContext apnContext = null; 504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((o != null) && (o instanceof DisconnectParams)) { 505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams)o; 5062dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext = dp.mApnContext; 507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (TextUtils.equals(dp.mReason, Phone.REASON_RADIO_TURNED_OFF)) { 508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF; 509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (TextUtils.equals(dp.mReason, Phone.REASON_PDP_RESET)) { 510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET; 511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5130e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh if (mPhone.mCi.getRadioState().isOn() 5140e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh || (mPhone.getServiceState().getRilDataRadioTechnology() 5150e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN )) { 5162dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "tearDownData radio is on, call deactivateDataCall"; 5172dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 5182dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (apnContext != null) apnContext.requestLog(str); 519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, discReason, 520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o)); 521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 5222dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately"; 5232dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 5242dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (apnContext != null) apnContext.requestLog(str); 525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = new AsyncResult(o, null, null); 526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, ar)); 527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) { 53162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(mNetworkInfo.getDetailedState(), reason, 53262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getExtraInfo()); 533ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt for (ConnectionParams cp : mApnContexts.values()) { 534ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt ApnContext apnContext = cp.mApnContext; 535f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (apnContext == alreadySent) continue; 536f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (reason != null) apnContext.setReason(reason); 537ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt Pair<ApnContext, Integer> pair = 538ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt new Pair<ApnContext, Integer>(apnContext, cp.mConnectionGeneration); 539ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt Message msg = mDct.obtainMessage(event, pair); 540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfConnected(String reason) { 546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason); 5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfDisconnectDcRetrying(String reason) { 550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DC_RETRYING, reason); 551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllDisconnectCompleted(DcFailCause cause) { 553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DONE, cause.toString()); 5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send the connectionCompletedMsg. 559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cp is the ConnectionParams 561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cause and if no error the cause is DcFailCause.NONE 562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param sendAll is true if all contexts are to be notified 563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyConnectCompleted(ConnectionParams cp, DcFailCause cause, boolean sendAll) { 565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp != null && cp.mOnCompletedMsg != null) { 568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message connectionCompletedMsg = cp.mOnCompletedMsg; 570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp.mOnCompletedMsg = null; 5717d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu alreadySent = cp.mApnContext; 572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville long timeStamp = System.currentTimeMillis(); 574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.arg1 = mCid; 575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == DcFailCause.NONE) { 577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = timeStamp; 578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg); 579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = cause; 581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = timeStamp; 582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Return message with a Throwable exception to signify an error. 584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == null) cause = DcFailCause.UNKNOWN; 585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg, cause, 586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new Throwable(cause.toString())); 587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("notifyConnectCompleted at " + timeStamp + " cause=" + cause 590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " connectionCompletedMsg=" + msgToString(connectionCompletedMsg)); 591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.sendToTarget(); 594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 5960e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu log("Send to all. " + alreadySent + " " + cause.toString()); 597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR, 598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause.toString()); 599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send ar.userObj if its a message, which is should be back to originator. 604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param dp is the DisconnectParams. 606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) { 608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("NotifyDisconnectCompleted"); 609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String reason = null; 612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp != null && dp.mOnCompletedMsg != null) { 614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = dp.mOnCompletedMsg; 616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mOnCompletedMsg = null; 617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj instanceof ApnContext) { 618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)msg.obj; 619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = dp.mReason; 621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log(String.format("msg=%s msg.obj=%s", msg.toString(), 623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>"))); 624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (reason == null) { 630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = DcFailCause.UNKNOWN.toString(); 631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DISCONNECT_DONE, reason); 633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp); 635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Begin Members and methods owned by DataConnectionTracker but stored 640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * in a DataConnection because there is one per connection. 641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The id is owned by DataConnectionTracker. 646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private int mId; 648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Get the DataConnection ID 651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public int getDataConnectionId() { 653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mId; 654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * End members owned by DataConnectionTracker 659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Clear all settings called when entering mInactiveState. 664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void clearSettings() { 666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("clearSettings"); 667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = -1; 669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = -1; 670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 673a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = new String[5]; 674a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = new LinkProperties(); 676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = null; 679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Process setup completion. 683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param ar is the result 685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return SetupResult. 686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult onSetupConnectionCompleted(AsyncResult ar) { 688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = (DataCallResponse) ar.result; 689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result; 691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag != mTag) { 693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted stale cp.tag=" + cp.mTag + ", mtag=" + mTag); 695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_Stale; 697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (ar.exception != null) { 698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception + 700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " response=" + response); 701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception instanceof CommandException 704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville && ((CommandException) (ar.exception)).getCommandError() 705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville == CommandException.Error.RADIO_NOT_AVAILABLE) { 706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_BadCommand; 707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.RADIO_NOT_AVAILABLE; 708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if ((response == null) || (response.version < 4)) { 709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_GetLastErrorFromRil; 710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (response.status != 0) { 715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 7183a5b9323f422134b68a92c36813001ec8bed2866Jack Yu if (DBG) log("onSetupConnectionCompleted received successful DataCallResponse"); 719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = response.cid; 720a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 721a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = response.pcscf; 722a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 723ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = updateLinkProperty(response).setupResult; 724ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 725ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 726ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isDnsOk(String[] domainNameServers) { 730cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1]) 73122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && !mPhone.isDnsCheckDisabled()) { 732cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Work around a race condition where QMI does not fill in DNS: 733cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Deactivate PDP and let DataConnectionTracker retry. 734cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Do not apply the race condition workaround for MMS APN 735cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // if Proxy is an IP-address. 736cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Otherwise, the default APN will not be restored anymore. 737ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mApnSetting.types[0].equals(PhoneConstants.APN_TYPE_MMS) 738ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || !isIpAddress(mApnSetting.mmsProxy)) { 739cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log(String.format( 740cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s", 741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.types[0], PhoneConstants.APN_TYPE_MMS, mApnSetting.mmsProxy, 742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville isIpAddress(mApnSetting.mmsProxy))); 743cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 744cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 745cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 746cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 74927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_GPRS = "4092,8760,48000,4096,8760,48000"; 75027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EDGE = "4093,26280,70800,4096,16384,70800"; 75127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_UMTS = "58254,349525,1048576,58254,349525,1048576"; 752d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao private static final String TCP_BUFFER_SIZES_1XRTT= "16384,32768,131072,4096,16384,102400"; 75327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EVDO = "4094,87380,262144,4096,16384,262144"; 754d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao private static final String TCP_BUFFER_SIZES_EHRPD= "131072,262144,1048576,4096,16384,524288"; 75527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSDPA= "61167,367002,1101005,8738,52429,262114"; 75627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPA = "40778,244668,734003,16777,100663,301990"; 75727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_LTE = 75827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt "524288,1048576,2097152,262144,524288,1048576"; 75927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPAP= "122334,734003,2202010,32040,192239,576717"; 76027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 76127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private void updateTcpBufferSizes(int rilRat) { 76227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt String sizes = null; 7638fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String ratName = ServiceState.rilRadioTechnologyToString(rilRat).toLowerCase(Locale.ROOT); 7648fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // ServiceState gives slightly different names for EVDO tech ("evdo-rev.0" for ex) 7658fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // - patch it up: 7668fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0 || 7678fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A || 7688fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B) { 7698fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt ratName = "evdo"; 7708fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 7718fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 7728fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // in the form: "ratname:rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max" 7738fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] configOverride = mPhone.getContext().getResources().getStringArray( 7748fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt com.android.internal.R.array.config_mobile_tcp_buffers); 7758fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt for (int i = 0; i < configOverride.length; i++) { 7768fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] split = configOverride[i].split(":"); 7778fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (ratName.equals(split[0]) && split.length == 2) { 7788fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = split[1]; 77927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt break; 7808fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 7818fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 7828fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 7838fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (sizes == null) { 7848fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // no override - use telephony defaults 7858fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // doing it this way allows device or carrier to just override the types they 7868fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // care about and inherit the defaults for the others. 7878fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt switch (rilRat) { 7888fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: 7898fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_GPRS; 7908fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 7918fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: 7928fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EDGE; 7938fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 7948fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: 7958fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_UMTS; 7968fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 797d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: 798d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao sizes = TCP_BUFFER_SIZES_1XRTT; 799d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao break; 8008fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: 8018fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: 8028fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: 8038fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EVDO; 8048fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 805d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: 806d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao sizes = TCP_BUFFER_SIZES_EHRPD; 807d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao break; 8088fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: 8098fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSDPA; 8108fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8118fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: 8128fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: 8138fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPA; 8148fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8158fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: 816000f48b9c960010bf41cd22b8625b4ff16c2e719Ajay Nambi case ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA: 8178fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_LTE; 8188fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8198fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: 8208fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPAP; 8218fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8228fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt default: 8238fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // Leave empty - this will let ConnectivityService use the system default. 8248fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8258fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 82627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 82727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties.setTcpBufferSizes(sizes); 82827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 82927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 830692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt /** 831692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * Indicates if when this connection was established we had a restricted/privileged 832692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * NetworkRequest and needed it to overcome data-enabled limitations. 833692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * 834692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * This gets set once per connection setup and is based on conditions at that time. 835692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * We could theoretically have dynamic capabilities but now is not a good time to 836692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * experiement with that. 837692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * 838692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * This flag overrides the APN-based restriction capability, restricting the network 839692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * based on both having a NetworkRequest with restricted AND needing a restricted 840692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * bit to overcome user-disabled status. This allows us to handle the common case 841692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * of having both restricted requests and unrestricted requests for the same apn: 842692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * if conditions require a restricted network to overcome user-disabled then it must 843692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * be restricted, otherwise it is unrestricted (or restricted based on APN type). 844692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * 845692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * Because we're not supporting dynamic capabilities, if conditions change and we go from 846692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * data-enabled to not or vice-versa we will need to tear down networks to deal with it 847692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * at connection setup time with the new state. 848692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * 849692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * This supports a privileged app bringing up a network without general apps having access 850692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * to it when the network is otherwise unavailable (hipri). The first use case is 851692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * pre-paid SIM reprovisioning over internet, where the carrier insists on no traffic 852692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * other than from the privileged carrier-app. 853692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt */ 854692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt private boolean mRestrictedNetworkOverride = false; 855692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt 856692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt // Should be called once when the call goes active to examine the state of things and 857692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt // declare the restriction override for the life of the connection 858692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt private void setNetworkRestriction() { 859692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt mRestrictedNetworkOverride = false; 860692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt // first, if we have no restricted requests, this override can stay FALSE: 861692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt boolean noRestrictedRequests = true; 862692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt for (ApnContext apnContext : mApnContexts.keySet()) { 863443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt noRestrictedRequests &= apnContext.hasNoRestrictedRequests(true /* exclude DUN */); 864692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt } 865692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt if (noRestrictedRequests) { 866692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt return; 867692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt } 868692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt 869692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt // Do we need a restricted network to satisfy the request? 870692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt // Is this network metered? If not, then don't add restricted 871692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt if (!mApnSetting.isMetered(mPhone.getContext(), mPhone.getSubId(), 872692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt mPhone.getServiceState().getDataRoaming())) { 873692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt return; 874692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt } 875692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt 876a8f5a859f8e4a15902d729af5d2edc9a9433ba41Jack Yu // Is data disabled? 877692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt mRestrictedNetworkOverride = (mDct.isDataEnabled(true) == false); 878692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt } 879692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt 88062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkCapabilities makeNetworkCapabilities() { 88162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt NetworkCapabilities result = new NetworkCapabilities(); 88262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 88362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 88462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mApnSetting != null) { 88562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt for (String type : mApnSetting.types) { 88662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (type) { 887b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt case PhoneConstants.APN_TYPE_ALL: { 888fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 889fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 890fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 891fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 892fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 893fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 894fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 895b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt break; 896b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt } 89762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DEFAULT: { 898fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 89962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 90162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_MMS: { 902fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 90362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 90562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_SUPL: { 906fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 90762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 90962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DUN: { 910c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt ApnSetting securedDunApn = mDct.fetchDunApn(); 911c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt if (securedDunApn == null || securedDunApn.equals(mApnSetting)) { 912c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); 913c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt } 91462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 91562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_FOTA: { 917fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 91862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 91962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IMS: { 921fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 92262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 92362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_CBS: { 925fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 92662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 92762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IA: { 929fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 93062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 93162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 9324a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi case PhoneConstants.APN_TYPE_EMERGENCY: { 9334a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi result.addCapability(NetworkCapabilities.NET_CAPABILITY_EIMS); 9344a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi break; 9354a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi } 93662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 93762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 9398b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu 9408b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu // If none of the APN types associated with this APN setting is metered, 9418b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu // then we apply NOT_METERED capability to the network. 9423d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu if (!mApnSetting.isMetered(mPhone.getContext(), mPhone.getSubId(), 9433d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu mPhone.getServiceState().getDataRoaming())) { 9448b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); 9458b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu } 9468b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu 947af171aa4dcf294bf2d1b9bed54ef9a6b0ec76361Paul Jensen result.maybeMarkCapabilitiesRestricted(); 94862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 949692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt if (mRestrictedNetworkOverride) { 950692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); 951443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt // don't use dun on restriction-overriden networks. 952443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt result.removeCapability(NetworkCapabilities.NET_CAPABILITY_DUN); 953692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt } 954692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt 95562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int up = 14; 95662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int down = 14; 95762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (mRilRat) { 95827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: up = 80; down = 80; break; 95927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: up = 59; down = 236; break; 96027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: up = 384; down = 384; break; 96127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A: // fall through 96227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B: up = 14; down = 14; break; 96327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: up = 153; down = 2457; break; 96427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: up = 1843; down = 3174; break; 96527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: up = 100; down = 100; break; 96627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: up = 2048; down = 14336; break; 96727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: up = 5898; down = 14336; break; 96827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: up = 5898; down = 14336; break; 96927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: up = 1843; down = 5017; break; 97027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: up = 51200; down = 102400; break; 971000f48b9c960010bf41cd22b8625b4ff16c2e719Ajay Nambi case ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA: up = 51200; down = 102400; break; 97227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: up = 153; down = 2516; break; 97327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: up = 11264; down = 43008; break; 97462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 97562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 97662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkUpstreamBandwidthKbps(up); 97762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkDownstreamBandwidthKbps(down); 978edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt 979edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt result.setNetworkSpecifier(Integer.toString(mPhone.getSubId())); 980edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt 98162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return result; 98262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 98362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isIpAddress(String address) { 985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (address == null) return false; 986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return Patterns.IP_ADDRESS.matcher(address).matches(); 988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult setLinkProperties(DataCallResponse response, 991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp) { 992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if system property dns usable 993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean okToUseSystemPropertyDns = false; 994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String propertyPrefix = "net." + response.ifname + "."; 995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String dnsServers[] = new String[2]; 996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); 997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); 998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville okToUseSystemPropertyDns = isDnsOk(dnsServers); 999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 1001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return response.setLinkProperties(lp, okToUseSystemPropertyDns); 1002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 10059a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * Initialize connection, this will fail if the 10069a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * apnSettings are not compatible. 10079a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * 10080e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * @param cp the Connection parameters 10099a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @return true if initialization was successful. 10109a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville */ 10119a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville private boolean initConnection(ConnectionParams cp) { 10129a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ApnContext apnContext = cp.mApnContext; 10139a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (mApnSetting == null) { 10149a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // Only change apn setting if it isn't set, it will 10159a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // only NOT be set only if we're in DcInactiveState. 10169a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnSetting = apnContext.getApnSetting(); 1017bc1e44907073900212fb87da372174483525f3edJay Shrauner } 1018bc1e44907073900212fb87da372174483525f3edJay Shrauner if (mApnSetting == null || !mApnSetting.canHandleType(apnContext.getApnType())) { 10199a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10209a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: incompatible apnSetting in ConnectionParams cp=" + cp 10219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " dc=" + DataConnection.this); 10229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return false; 10249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10259a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mTag += 1; 10269a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams = cp; 10279a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams.mTag = mTag; 10289a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10291a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt // always update the ConnectionParams with the latest or the 10301a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt // connectionGeneration gets stale 10311a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt mApnContexts.put(apnContext, cp); 10321a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt 10339a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10349a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: " 10359a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() 10369a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mApnList=" + mApnContexts 10379a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mConnectionParams=" + mConnectionParams); 10389a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10399a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return true; 10409a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10419a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10429a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville /** 1043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The parent state for all other states. 1044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDefaultState extends State { 1046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: enter"); 1049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1050203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Register for DRS or RAT change 1051203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), 1052203e588e3c42a81aa8a56f595119c181a63b12caWink Saville DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); 1053203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1054ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().registerForDataRoamingOn(getHandler(), 105562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_ON, null); 1056ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().registerForDataRoamingOff(getHandler(), 105762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null); 105862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Add ourselves to the list of data connections 1060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addDc(DataConnection.this); 1061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: exit"); 1065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 106646f190903e93c653b90b970c1a21159bb957575bWink Saville // Unregister for DRS or RAT change. 106746f190903e93c653b90b970c1a21159bb957575bWink Saville mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); 106846f190903e93c653b90b970c1a21159bb957575bWink Saville 1069ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().unregisterForDataRoamingOn(getHandler()); 1070ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().unregisterForDataRoamingOff(getHandler()); 107162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 107246f190903e93c653b90b970c1a21159bb957575bWink Saville // Remove ourselves from the DC lists 107346f190903e93c653b90b970c1a21159bb957575bWink Saville mDcController.removeDc(DataConnection.this); 1074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.disconnected(); 1077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = null; 1078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = null; 1080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReconnectIntent = null; 1081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = null; 1082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 1083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = null; 1084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = null; 1085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = null; 1086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mUserData = null; 1087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = null; 1088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = null; 1089ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal = HANDLED; 1094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefault msg=" + getWhatToString(msg.what) 1097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RefCount=" + mApnContexts.size()); 1098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 1101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("Disconnecting to previous connection mAc=" + mAc); 1103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED); 1105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = new AsyncChannel(); 1107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.connected(null, getHandler(), msg.replyTo); 1108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected"); 1109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_SUCCESSFUL, mId, "hi"); 1111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 111545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville if (DBG) { 111645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcDefault: CMD_CHANNEL_DISCONNECTED before quiting call dump"); 111745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville dumpToLog(); 111845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 111945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 1120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quit(); 1121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1123454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_IS_INACTIVE: { 1124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean val = getIsInactive(); 1125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_IS_INACTIVE isInactive=" + val); 1126454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_IS_INACTIVE, val ? 1 : 0); 1127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1129454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_CID: { 1130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int cid = getCid(); 1131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_CID cid=" + cid); 1132454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_CID, cid); 1133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1135454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_APNSETTING: { 1136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting = getApnSetting(); 1137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_APNSETTING mApnSetting=" + apnSetting); 1138454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_APNSETTING, apnSetting); 1139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1141454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_LINK_PROPERTIES: { 1142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp = getCopyLinkProperties(); 1143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp); 1144454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_PROPERTIES, lp); 1145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1147454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: { 11489c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk ProxyInfo proxy = (ProxyInfo) msg.obj; 1149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy); 1150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLinkPropertiesHttpProxy(proxy); 1151454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY); 11521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mNetworkAgent != null) { 11531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNetworkAgent.sendLinkProperties(mLinkProperties); 11541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1157f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt case DcAsyncChannel.REQ_GET_NETWORK_CAPABILITIES: { 1158f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities nc = getCopyNetworkCapabilities(); 1159f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (VDBG) log("REQ_GET_NETWORK_CAPABILITIES networkCapabilities" + nc); 1160f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_NETWORK_CAPABILITIES, nc); 1161f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt break; 1162f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 1163454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: msg.what=REQ_RESET"); 1165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); 1169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.UNKNOWN, false); 1171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT RefCount=" 1176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL RefCount=" 1184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_TEAR_DOWN_NOW: 1190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW"); 1191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, 0, null); 1192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: 1195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_LOST_CONNECTION" 1197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1201203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1202203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1203203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1204203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drsRatPair.first; 120527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt if (mRilRat != drsRatPair.second) { 120627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(drsRatPair.second); 120727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 1208203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = drsRatPair.second; 1209203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1210203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcDefaultState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1211203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " drs=" + mDataRegState 1212203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRilRat=" + mRilRat); 1213203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 121462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 121562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 121662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 121762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 121862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mNetworkAgent != null) { 12196356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt updateNetworkInfoSuspendState(); 122062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkCapabilities(makeNetworkCapabilities()); 122162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 122227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 122362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 122462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 122562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 122662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: 122762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 122862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 122962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 123062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: 123162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 1232203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1233203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState: shouldn't happen but ignore msg.what=" 1237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 12456356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 12466356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt private boolean updateNetworkInfoSuspendState() { 12476356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final NetworkInfo.DetailedState oldState = mNetworkInfo.getDetailedState(); 12486356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 12496356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // this is only called when we are either connected or suspended. Decide which. 12506356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (mNetworkAgent == null) { 12516356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt Rlog.e(getName(), "Setting suspend state without a NetworkAgent"); 12526356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12536356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 12546356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // if we are not in-service change to SUSPENDED 12556356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final ServiceStateTracker sst = mPhone.getServiceStateTracker(); 12566356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (sst.getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) { 1257c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.SUSPENDED, null, 1258c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12596356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } else { 12606356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // check for voice call and concurrency issues 12616356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (sst.isConcurrentVoiceAndDataAllowed() == false) { 12626356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final CallTracker ct = mPhone.getCallTracker(); 12636356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (ct.getState() != PhoneConstants.State.IDLE) { 1264c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.SUSPENDED, null, 1265c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12666356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt return (oldState != NetworkInfo.DetailedState.SUSPENDED); 12676356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12686356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 1269c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, 1270c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12716356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12726356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt return (oldState != mNetworkInfo.getDetailedState()); 12736356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12746356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 1275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDefaultState mDefaultState = new DcDefaultState(); 1276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is inactive and expects a EVENT_CONNECT. 1279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcInactiveState extends State { 1281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed connecting 1282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(ConnectionParams cp, DcFailCause cause) { 12830e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (VDBG) log("DcInactiveState: setEnterNotificationParams cp,cause"); 1284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = cp; 1285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed disconnected 1290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DisconnectParams dp) { 12910e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (VDBG) log("DcInactiveState: setEnterNotificationParams dp"); 1292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts of the failure cause 1298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DcFailCause cause) { 1299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag += 1; 1307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: enter() mTag=" + mTag); 1308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != null) { 1310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyConnectCompleted +ALL failCause=" 1312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(mConnectionParams, mDcFailCause, true); 1315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams != null) { 1317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1318ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyDisconnectCompleted +ALL failCause=" 1319ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1321ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(mDisconnectParams, true); 1322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams == null && mConnectionParams == null && mDcFailCause != null) { 1324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyAllDisconnectCompleted failCause=" 1326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllDisconnectCompleted(mDcFailCause); 1329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from cid mapping, before clearSettings 1332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville clearSettings(); 1335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1346454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset"); 1349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 13549a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcInactiveState: mag.what=EVENT_CONNECT"); 13559a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 13569a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 13579a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 13589a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 13599a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 13609a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 13619a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcInactiveState: msg.what=EVENT_CONNECT initConnection failed"); 13629a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 13639a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 13649a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 1365ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1366ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1367ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1368ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1369ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1370ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT"); 1371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1372ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1374ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1375ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1376ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL"); 1377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState nothandled msg.what=" + getWhatToString(msg.what)); 1384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1386ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1387ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1388ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1389ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1390ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcInactiveState mInactiveState = new DcInactiveState(); 1392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is activating a connection. 1395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActivatingState extends State { 1397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1398ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 1401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp; 1402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActivatingState: msg=" + msgToString(msg)); 1404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1405203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1407203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Activating can't process until we're done. 1408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_SETUP_DATA_CONNECTION_DONE: 1413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar); 1417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result != DataCallResponse.SetupResult.ERR_Stale) { 1418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:"+ mConnectionParams 1420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1423c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1424c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState onSetupConnectionCompleted result=" + result 1425c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1426c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 14272dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) { 14282dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt cp.mApnContext.requestLog("onSetupConnectionCompleted result=" + result); 14292dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt } 1430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (result) { 1431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case SUCCESS: 1432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // All is well 1433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActiveState); 1435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_BadCommand: 1437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Vendor ril rejected the command and didn't connect. 1438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_UnacceptableParameter: 1444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The addresses given from the RIL are bad 1445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(cp); 1446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingErrorCreatingConnection); 1447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_GetLastErrorFromRil: 1449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Request failed and this is an old RIL 1450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.getLastDataCallFailCause( 1451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp)); 1452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_RilError: 14540e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 14550e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // Retrieve the suggested retry delay from the modem and save it. 14560e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // If the modem want us to retry the current APN again, it will 14570e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // suggest a positive delay value (in milliseconds). Otherwise we'll get 14580e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // NO_SUGGESTED_RETRY_DELAY here. 14590e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu long delay = getSuggestedRetryDelay(ar); 14600e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu cp.mApnContext.setModemSuggestedDelay(delay); 14610e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 14622dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcActivatingState: ERR_RilError " 14632dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " delay=" + delay 14642dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result=" + result 14652dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result.isRestartRadioFail=" + 14662dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt result.mFailCause.isRestartRadioFail() 14672dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result.isPermanentFail=" + 14682dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt mDct.isPermanentFail(result.mFailCause); 14692dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 14702dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog(str); 14710e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 14720e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // Save the cause. DcTracker.onDataSetupComplete will check this 14730e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // failure cause and determine if we need to retry this APN later 14740e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // or not. 14750e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 14760e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu transitionTo(mInactiveState); 1477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_Stale: 1479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_SETUP_DATA_CONNECTION_DONE" 1480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville throw new RuntimeException("Unknown SetupResult, should not happen"); 1484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_GET_LAST_FAIL_DONE: 1489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:" + mConnectionParams 1494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause cause = DcFailCause.UNKNOWN; 1498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 1500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int rilFailCause = ((int[]) (ar.result))[0]; 1501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = DcFailCause.fromInt(rilFailCause); 15021db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (cause == DcFailCause.NONE) { 15031db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (DBG) { 15041db7da14111228a5079d2970d7d0ce34173000b5Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 15051db7da14111228a5079d2970d7d0ce34173000b5Wink Saville + " BAD: error was NONE, change to UNKNOWN"); 15061db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 15071db7da14111228a5079d2970d7d0ce34173000b5Wink Saville cause = DcFailCause.UNKNOWN; 15081db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 1509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1512c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1513c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 15140e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu + " cause=" + cause + " dc=" + DataConnection.this); 1515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 15160e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 15170e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mInactiveState.setEnterNotificationParams(cp, cause); 15180e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu transitionTo(mInactiveState); 1519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_GET_LAST_FAIL_DONE" 1521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActivatingState not handled msg.what=" + 1530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville getWhatToString(msg.what) + " RefCount=" + mApnContexts.size()); 1531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActivatingState mActivatingState = new DcActivatingState(); 1539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is connected, expecting an EVENT_DISCONNECT. 1542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActiveState extends State { 1544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override public void enter() { 1545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: enter dc=" + DataConnection.this); 1546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 15475488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan boolean createNetworkAgent = true; 15485488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan // If a disconnect is already pending, avoid notifying all of connected 15491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (hasMessages(EVENT_DISCONNECT) || 15501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasMessages(EVENT_DISCONNECT_ALL) || 15511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasDeferredMessages(EVENT_DISCONNECT) || 15521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasDeferredMessages(EVENT_DISCONNECT_ALL)) { 15535488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan log("DcActiveState: skipping notifyAllOfConnected()"); 15545488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan createNetworkAgent = false; 15555488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } else { 15565488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan // If we were retrying there maybe more than one, otherwise they'll only be one. 15575488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan notifyAllOfConnected(Phone.REASON_CONNECTED); 15585488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 15606356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().registerForVoiceCallStarted(getHandler(), 15616356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_STARTED, null); 15626356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().registerForVoiceCallEnded(getHandler(), 15636356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_ENDED, null); 15646356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 1565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If the EVENT_CONNECT set the current max retry restore it here 1566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // if it didn't then this is effectively a NOP. 1567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addActiveDcByCid(DataConnection.this); 156862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 156962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, 157062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getReason(), null); 157162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setExtraInfo(mApnSetting.apn); 157227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 1573957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey 1574957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey final NetworkMisc misc = new NetworkMisc(); 15754c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu final CarrierSignalAgent carrierSignalAgent = mPhone.getCarrierSignalAgent(); 15764c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu if(carrierSignalAgent.hasRegisteredCarrierSignalReceivers()) { 15774c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu // carrierSignal Receivers will place the carrier-specific provisioning notification 15784c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu misc.provisioningNotificationDisabled = true; 15794c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu } 1580957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey misc.subscriberId = mPhone.getSubscriberId(); 15815488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan 15825488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (createNetworkAgent) { 1583692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt setNetworkRestriction(); 15845488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(), 15855488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan "DcNetworkAgent", mNetworkInfo, makeNetworkCapabilities(), mLinkProperties, 15865488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan 50, misc); 15875488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: exit dc=" + this); 159327b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra String reason = mNetworkInfo.getReason(); 159422ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang if(mDcController.isExecutingCarrierChange()) { 159522ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang reason = Phone.REASON_CARRIER_CHANGE; 159622ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang } else if (mDisconnectParams != null && mDisconnectParams.mReason != null) { 159727b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason = mDisconnectParams.mReason; 159827b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra } else if (mDcFailCause != null) { 159927b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason = mDcFailCause.toString(); 160027b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra } 16016356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().unregisterForVoiceCallStarted(getHandler()); 16026356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().unregisterForVoiceCallEnded(getHandler()); 16036356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 160462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, 160527b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason, mNetworkInfo.getExtraInfo()); 16065488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 16075488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 16085488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent = null; 16095488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 1618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 16193f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt // either add this new apn context to our set or 16203f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt // update the existing cp with the latest connection generation number 16213f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt mApnContexts.put(cp.mApnContext, cp); 1622c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1623c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this); 1624c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.NONE, false); 1626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1631c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1632c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_DISCONNECT dp=" + dp 1633c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1634c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1635ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if (mApnContexts.containsKey(dp.mApnContext)) { 1636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" 1638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.size() == 1) { 1642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 1643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.remove(dp.mApnContext); 1650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState ERROR no such apnContext=" + dp.mApnContext 1654c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " in this dc=" + DataConnection.this); 1655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1662c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_DISCONNECT clearing apn contexts," 1663c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: { 1675c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1676c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_LOST_CONNECTION dc=" + DataConnection.this); 1677c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 16780e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 16790e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 16800e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu transitionTo(mInactiveState); 1681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 168462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: { 168562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 16865488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 16875488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 16885488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 168962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 169062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 169162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 169262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: { 169362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 16945488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 16955488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 16965488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 169762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 169862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 169962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 170065bee39d7e417fb898c3948696d5d8a38046c449fenglu case EVENT_BW_REFRESH_RESPONSE: { 170165bee39d7e417fb898c3948696d5d8a38046c449fenglu AsyncResult ar = (AsyncResult)msg.obj; 170265bee39d7e417fb898c3948696d5d8a38046c449fenglu if (ar.exception != null) { 170365bee39d7e417fb898c3948696d5d8a38046c449fenglu log("EVENT_BW_REFRESH_RESPONSE: error ignoring, e=" + ar.exception); 170465bee39d7e417fb898c3948696d5d8a38046c449fenglu } else { 170565bee39d7e417fb898c3948696d5d8a38046c449fenglu final ArrayList<Integer> capInfo = (ArrayList<Integer>)ar.result; 170665bee39d7e417fb898c3948696d5d8a38046c449fenglu final int lceBwDownKbps = capInfo.get(0); 170765bee39d7e417fb898c3948696d5d8a38046c449fenglu NetworkCapabilities nc = makeNetworkCapabilities(); 170865bee39d7e417fb898c3948696d5d8a38046c449fenglu if (mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) { 170965bee39d7e417fb898c3948696d5d8a38046c449fenglu nc.setLinkDownstreamBandwidthKbps(lceBwDownKbps); 171065bee39d7e417fb898c3948696d5d8a38046c449fenglu if (mNetworkAgent != null) { 171165bee39d7e417fb898c3948696d5d8a38046c449fenglu mNetworkAgent.sendNetworkCapabilities(nc); 171265bee39d7e417fb898c3948696d5d8a38046c449fenglu } 171365bee39d7e417fb898c3948696d5d8a38046c449fenglu } 171465bee39d7e417fb898c3948696d5d8a38046c449fenglu } 17156356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt retVal = HANDLED; 17166356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt break; 17176356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 17186356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt case EVENT_DATA_CONNECTION_VOICE_CALL_STARTED: 17196356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt case EVENT_DATA_CONNECTION_VOICE_CALL_ENDED: { 17205488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (updateNetworkInfoSuspendState() && mNetworkAgent != null) { 17216356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // state changed 17226356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 17236356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 172465bee39d7e417fb898c3948696d5d8a38046c449fenglu retVal = HANDLED; 172565bee39d7e417fb898c3948696d5d8a38046c449fenglu break; 172665bee39d7e417fb898c3948696d5d8a38046c449fenglu } 1727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState not handled msg.what=" + getWhatToString(msg.what)); 1730ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1731ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1732ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1733ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1734ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1735ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1736ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1737ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActiveState mActiveState = new DcActiveState(); 1738ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1740ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting. 1741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectingState extends State { 1743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1746ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1747ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1748ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " 1750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1753ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1754ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1755ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1756ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) ar.userObj; 17582dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt 17592dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount=" 17602dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + mApnContexts.size(); 17612dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 17622dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (dp.mApnContext != null) dp.mApnContext.requestLog(str); 17632dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt 1764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp.mTag == mTag) { 1765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj); 1768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectState stale EVENT_DEACTIVATE_DONE" 1771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + dp.mTag + " mTag=" + mTag); 1772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectingState not handled msg.what=" 1779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1783ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1784ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1785ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1786ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectingState mDisconnectingState = new DcDisconnectingState(); 1788ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1789ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1790ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting after an creating a connection. 1791ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1792ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectionErrorCreatingConnection extends State { 1793ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1794ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1795ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1796ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1797ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1798ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1799ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1800ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 1801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 18022dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcDisconnectionErrorCreatingConnection" + 18032dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt " msg.what=EVENT_DEACTIVATE_DONE"; 18042dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 18052dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog(str); 1806ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1807ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1808ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1809ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, 1810ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER); 1811ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1812ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1813ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1814ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection stale EVENT_DEACTIVATE_DONE" 1815ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + cp.mTag + ", mTag=" + mTag); 1816ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1817ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1818ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1819ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1820ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1821ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1822ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1823ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection not handled msg.what=" 1824ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1825ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1826ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1827ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1828ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1829ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1830ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1831ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1832ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection = 1833ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new DcDisconnectionErrorCreatingConnection(); 1834ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 183562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 183662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private class DcNetworkAgent extends NetworkAgent { 183762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt public DcNetworkAgent(Looper l, Context c, String TAG, NetworkInfo ni, 1838957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) { 1839957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey super(l, c, TAG, ni, nc, lp, score, misc); 184062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 184162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 184245eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 184362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt protected void unwanted() { 18441484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (mNetworkAgent != this) { 184545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcNetworkAgent: unwanted found mNetworkAgent=" + mNetworkAgent + 18461484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt ", which isn't me. Aborting unwanted"); 18471484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt return; 18481484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt } 18494a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt // this can only happen if our exit has been called - we're already disconnected 18504a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt if (mApnContexts == null) return; 185137cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt for (ConnectionParams cp : mApnContexts.values()) { 185237cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt final ApnContext apnContext = cp.mApnContext; 185337cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt final Pair<ApnContext, Integer> pair = 185437cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt new Pair<ApnContext, Integer>(apnContext, cp.mConnectionGeneration); 185545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcNetworkAgent: [unwanted]: disconnect apnContext=" + apnContext); 185637cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt Message msg = mDct.obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, pair); 1857305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DisconnectParams dp = new DisconnectParams(apnContext, apnContext.getReason(), msg); 1858305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DataConnection.this.sendMessage(DataConnection.this. 1859305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt obtainMessage(EVENT_DISCONNECT, dp)); 1860305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt } 186162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 186265bee39d7e417fb898c3948696d5d8a38046c449fenglu 186365bee39d7e417fb898c3948696d5d8a38046c449fenglu @Override 186465bee39d7e417fb898c3948696d5d8a38046c449fenglu protected void pollLceData() { 186565bee39d7e417fb898c3948696d5d8a38046c449fenglu if(mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) { // active LCE service 186665bee39d7e417fb898c3948696d5d8a38046c449fenglu mPhone.mCi.pullLceData(DataConnection.this.obtainMessage(EVENT_BW_REFRESH_RESPONSE)); 186765bee39d7e417fb898c3948696d5d8a38046c449fenglu } 186865bee39d7e417fb898c3948696d5d8a38046c449fenglu } 1869a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu 1870a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu @Override 1871a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu protected void networkStatus(int status, String redirectUrl) { 1872a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu if(!TextUtils.isEmpty(redirectUrl)) { 1873a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu log("validation status: " + status + " with redirection URL: " + redirectUrl); 1874a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu /* its possible that we have multiple DataConnection with INTERNET_CAPABILITY 1875a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu all fail the validation with the same redirection url, send CMD back to DCTracker 1876a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu and let DcTracker to make the decision */ 1877a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu Message msg = mDct.obtainMessage(DctConstants.EVENT_REDIRECTION_DETECTED, 1878a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu redirectUrl); 1879a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu msg.sendToTarget(); 1880a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu } 1881a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu } 188262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 188362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1884ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ******* "public" interface 1885ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1886ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1887ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used for testing purposes. 1888ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1889ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* package */ void tearDownNow() { 1890ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownNow()"); 1891ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_TEAR_DOWN_NOW)); 1892ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1894ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 18950e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * Using the result of the SETUP_DATA_CALL determine the retry delay. 18960e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * 18970e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * @param ar is the result from SETUP_DATA_CALL 18980e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * @return NO_SUGGESTED_RETRY_DELAY if no retry is needed otherwise the delay to the 18990e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * next SETUP_DATA_CALL 19000e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu */ 19010e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu private long getSuggestedRetryDelay(AsyncResult ar) { 19020e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 19030e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu DataCallResponse response = (DataCallResponse) ar.result; 19040e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 19050852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu /** According to ril.h 19060852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu * The value < 0 means no value is suggested 19070852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu * The value 0 means retry should be done ASAP. 19080852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu * The value of Integer.MAX_VALUE(0x7fffffff) means no retry. 19090852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu */ 19100852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu 19110852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu // The value < 0 means no value is suggested 19120852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu if (response.suggestedRetryTime < 0) { 19130e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (DBG) log("No suggested retry delay."); 19140e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return RetryManager.NO_SUGGESTED_RETRY_DELAY; 19150e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 19160852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu // The value of Integer.MAX_VALUE(0x7fffffff) means no retry. 19170852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu else if (response.suggestedRetryTime == Integer.MAX_VALUE) { 19180852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu if (DBG) log("Modem suggested not retrying."); 19190852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu return RetryManager.NO_RETRY; 19200852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu } 19210e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 19220e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // We need to cast it to long because the value returned from RIL is a 32-bit integer, 19230e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // but the time values used in AlarmManager are all 64-bit long. 19240e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return (long) response.suggestedRetryTime; 19250e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 19260e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 19270e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu /** 1928ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return the string for msg.what as our info. 1929ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1930ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1931ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected String getWhatToString(int what) { 1932ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return cmdToString(what); 1933ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1934ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1935ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String msgToString(Message msg) { 1936ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retVal; 1937ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg == null) { 1938ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = "null"; 1939ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1940ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville StringBuilder b = new StringBuilder(); 1941ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1942ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("{what="); 1943ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(cmdToString(msg.what)); 1944ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1945ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" when="); 1946ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis(), b); 1947ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1948ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 != 0) { 1949ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg1="); 1950ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg1); 1951ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1952ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1953ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg2 != 0) { 1954ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg2="); 1955ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg2); 1956ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1957ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1958ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj != null) { 1959ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" obj="); 1960ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.obj); 1961ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1962ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" target="); 1964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.getTarget()); 1965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" replyTo="); 1967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.replyTo); 1968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("}"); 1970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = b.toString(); 1972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static void slog(String s) { 1977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d("DC", s); 1978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug 1982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1985cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1986cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void log(String s) { 1987cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.d(getName(), s); 19880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 19890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug attribute 1992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logd(String s) { 1997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(getName(), s); 1998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 19990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with verbose attribute 2002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logv(String s) { 2007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.v(getName(), s); 2008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with info attribute 2012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2013ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logi(String s) { 2017ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.i(getName(), s); 2018ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2019ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2020ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2021ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with warning attribute 2022ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2023ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2024ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2026ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logw(String s) { 2027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.w(getName(), s); 20280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2030ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2034ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2036ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s) { 2037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s); 2038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2040ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param e is a Throwable which logs additional information. 2045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s, Throwable e) { 2048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s, e); 2049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2050ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Doesn't print mApnList of ApnContext's which would be recursive */ 2052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toStringSimple() { 2053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getName() + ": State=" + getCurrentState().getName() 2054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size() 2055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mCid=" + mCid + " mCreateTime=" + mCreateTime 2056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastastFailTime=" + mLastFailTime 2057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastFailCause=" + mLastFailCause 2058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag 2059f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt + " mLinkProperties=" + mLinkProperties 2060443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt + " linkCapabilities=" + makeNetworkCapabilities() 2061443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt + " mRestrictedNetworkOverride=" + mRestrictedNetworkOverride; 2062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 2066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{" + toStringSimple() + " mApnContexts=" + mApnContexts + "}"; 2067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 206945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville private void dumpToLog() { 207045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville dump(null, new PrintWriter(new StringWriter(0)) { 207145eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 207245eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville public void println(String s) { 207345eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville DataConnection.this.logd(s); 207445eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 207545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 207645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 207745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville public void flush() { 207845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 207945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville }, null); 208045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 208145eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 2082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Dump the current state. 2084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param fd 2086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param pw 2087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param args 2088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 20890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 20900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 2091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.print("DataConnection "); 20920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 2093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts.size=" + mApnContexts.size()); 2094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts=" + mApnContexts); 2095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDataConnectionTracker=" + mDct); 2097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnSetting=" + mApnSetting); 2098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mTag=" + mTag); 2099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCid=" + mCid); 2100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mConnectionParams=" + mConnectionParams); 2101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDisconnectParams=" + mDisconnectParams); 2102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcFailCause=" + mDcFailCause); 2103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mPhone=" + mPhone); 2105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLinkProperties=" + mLinkProperties); 2107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2108203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mDataRegState=" + mDataRegState); 2109203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mRilRat=" + mRilRat); 211062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt pw.println(" mNetworkCapabilities=" + makeNetworkCapabilities()); 2111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime)); 2112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime)); 2113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailCause=" + mLastFailCause); 2114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mUserData=" + mUserData); 2116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mInstanceNumber=" + mInstanceNumber); 2117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mAc=" + mAc); 2118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 21190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 21210e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 2122