DataConnection.java revision 1a87ab3d7170d618f048c4f5af8c7504a587aaa5
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; 20ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.CommandException; 21ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.DctConstants; 22ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.Phone; 23cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.PhoneConstants; 244918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RILConstants; 254918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RetryManager; 266356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwaltimport com.android.internal.telephony.ServiceStateTracker; 27ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.AsyncChannel; 28ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.Protocol; 29ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.State; 30ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.StateMachine; 31ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 32ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.app.PendingIntent; 3362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.content.Context; 3462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.ConnectivityManager; 35ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.net.LinkProperties; 3662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.NetworkAgent; 3796cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwaltimport android.net.NetworkCapabilities; 3862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.NetworkInfo; 39957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkeyimport android.net.NetworkMisc; 409c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monkimport android.net.ProxyInfo; 41ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.AsyncResult; 422cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Savilleimport android.os.Build; 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 * A recent change is to move retry handling into this class, with that change the 75ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * old retry manager is now used internally rather than exposed to the DCT. Also, 76ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * bringUp now has an initialRetry which is used limit the number of retries 77ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * during the initial bring up of the connection. After the connection becomes active 78ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * the current max retry is restored to the configured value. 79ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 80ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * NOTE: All DataConnection objects must be running on the same looper, which is the default 81ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * as the coordinator has members which are used without synchronization. 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 83ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepublic final class DataConnection extends StateMachine { 84ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean DBG = true; 85ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean VDBG = true; 86ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 87ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Retry configuration: A doubling of retry times from 5secs to 30minutes */ 88ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String DEFAULT_DATA_RETRY_CONFIG = "default_randomization=2000," 89ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "5000,10000,20000,40000,80000:5000,160000:5000," 90ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "320000:5000,640000:5000,1280000:5000,1800000:5000"; 91ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 92ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Retry configuration for secondary networks: 4 tries in 20 sec */ 93ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String SECONDARY_DATA_RETRY_CONFIG = 94ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "max_retries=3, 5000, 5000, 5000"; 95ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 96aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran private static final String NETWORK_TYPE = "MOBILE"; 97aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran 98ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The data connection controller 99ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcController mDcController; 100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The Tester for failing all bringup's 102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcTesterFailBringUpAll mDcTesterFailBringUpAll; 103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static AtomicInteger mInstanceNumber = new AtomicInteger(0); 105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private AsyncChannel mAc; 106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Utilities for the DataConnection 108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcRetryAlarmController mDcRetryAlarmController; 109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The DCT that's talking to us, we only support one! 1111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private DcTracker mDct = null; 112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville protected String[] mPcscfAddr; 114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving connecting parameters. 117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class ConnectionParams { 119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mInitialMaxRetry; 122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mProfileId; 123203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int mRilRat; 12412fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao boolean mRetryWhenSSChange; 125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 126ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt final int mConnectionGeneration; 127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams(ApnContext apnContext, int initialMaxRetry, int profileId, 129ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt int rilRadioTechnology, boolean retryWhenSSChange, Message onCompletedMsg, 130ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt int connectionGeneration) { 131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInitialMaxRetry = initialMaxRetry; 133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mProfileId = profileId; 134203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rilRadioTechnology; 13512fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao mRetryWhenSSChange = retryWhenSSChange; 136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 137ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt mConnectionGeneration = connectionGeneration; 138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mInitialMaxRetry=" + mInitialMaxRetry + " mProfileId=" + mProfileId 144203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRat=" + mRilRat 145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving disconnecting parameters. 151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class DisconnectParams { 153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String mReason; 156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams(ApnContext apnContext, String reason, Message onCompletedMsg) { 159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReason = reason; 161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mReason=" + mReason 168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1712563e7e1ec513121b980045571a245aa5390f1c5Wink Saville 172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ApnSetting mApnSetting; 173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ConnectionParams mConnectionParams; 174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DisconnectParams mDisconnectParams; 175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mDcFailCause; 176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private Phone mPhone; 178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private LinkProperties mLinkProperties = new LinkProperties(); 179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mCreateTime; 180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mLastFailTime; 181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mLastFailCause; 182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String NULL_IP = "0.0.0.0"; 183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private Object mUserData; 184203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mRilRat = Integer.MAX_VALUE; 185203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mDataRegState = Integer.MAX_VALUE; 18662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkInfo mNetworkInfo; 18762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkAgent mNetworkAgent; 188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Package visible variables 190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mCid; 192ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt HashMap<ApnContext, ConnectionParams> mApnContexts = null; 193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville PendingIntent mReconnectIntent = null; 194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville RetryManager mRetryManager = new RetryManager(); 195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ***** Event codes for driving the state machine, package visible for Dcc 198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int BASE = Protocol.BASE_DATA_CONNECTION; 199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_CONNECT = BASE + 0; 200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_SETUP_DATA_CONNECTION_DONE = BASE + 1; 201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_GET_LAST_FAIL_DONE = BASE + 2; 202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DEACTIVATE_DONE = BASE + 3; 203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT = BASE + 4; 204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RIL_CONNECTED = BASE + 5; 205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT_ALL = BASE + 6; 206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DATA_STATE_CHANGED = BASE + 7; 207ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_TEAR_DOWN_NOW = BASE + 8; 208ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_LOST_CONNECTION = BASE + 9; 209ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RETRY_CONNECTION = BASE + 10; 210203e588e3c42a81aa8a56f595119c181a63b12caWink Saville static final int EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED = BASE + 11; 21162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt static final int EVENT_DATA_CONNECTION_ROAM_ON = BASE + 12; 21262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt static final int EVENT_DATA_CONNECTION_ROAM_OFF = BASE + 13; 21365bee39d7e417fb898c3948696d5d8a38046c449fenglu static final int EVENT_BW_REFRESH_RESPONSE = BASE + 14; 2146356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt static final int EVENT_DATA_CONNECTION_VOICE_CALL_STARTED = BASE + 15; 2156356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt static final int EVENT_DATA_CONNECTION_VOICE_CALL_ENDED = BASE + 16; 2166356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 2176356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt private static final int CMD_TO_STRING_COUNT = 2186356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt EVENT_DATA_CONNECTION_VOICE_CALL_ENDED - BASE + 1; 219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; 221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static { 222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_CONNECT - BASE] = "EVENT_CONNECT"; 223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_SETUP_DATA_CONNECTION_DONE - BASE] = 224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "EVENT_SETUP_DATA_CONNECTION_DONE"; 225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_GET_LAST_FAIL_DONE - BASE] = "EVENT_GET_LAST_FAIL_DONE"; 226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DEACTIVATE_DONE - BASE] = "EVENT_DEACTIVATE_DONE"; 227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT - BASE] = "EVENT_DISCONNECT"; 228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RIL_CONNECTED - BASE] = "EVENT_RIL_CONNECTED"; 229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT_ALL - BASE] = "EVENT_DISCONNECT_ALL"; 230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DATA_STATE_CHANGED - BASE] = "EVENT_DATA_STATE_CHANGED"; 231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_TEAR_DOWN_NOW - BASE] = "EVENT_TEAR_DOWN_NOW"; 232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_LOST_CONNECTION - BASE] = "EVENT_LOST_CONNECTION"; 233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RETRY_CONNECTION - BASE] = "EVENT_RETRY_CONNECTION"; 234203e588e3c42a81aa8a56f595119c181a63b12caWink Saville sCmdToString[EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED - BASE] = 235203e588e3c42a81aa8a56f595119c181a63b12caWink Saville "EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED"; 23662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_ROAM_ON - BASE] = "EVENT_DATA_CONNECTION_ROAM_ON"; 23762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_ROAM_OFF - BASE] = "EVENT_DATA_CONNECTION_ROAM_OFF"; 23865bee39d7e417fb898c3948696d5d8a38046c449fenglu sCmdToString[EVENT_BW_REFRESH_RESPONSE - BASE] = "EVENT_BW_REFRESH_RESPONSE"; 2396356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_VOICE_CALL_STARTED - BASE] = 2406356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt "EVENT_DATA_CONNECTION_VOICE_CALL_STARTED"; 2416356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_VOICE_CALL_ENDED - BASE] = 2426356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt "EVENT_DATA_CONNECTION_VOICE_CALL_ENDED"; 243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Convert cmd to string or null if unknown 245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static String cmdToString(int cmd) { 246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String value; 247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cmd -= BASE; 248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((cmd >= 0) && (cmd < sCmdToString.length)) { 249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = sCmdToString[cmd]; 250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 251454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville value = DcAsyncChannel.cmdToString(cmd + BASE); 252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (value == null) { 254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = "0x" + Integer.toHexString(cmd + BASE); 255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return value; 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 260cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Create the connection object 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 262cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param phone the Phone 263cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param id the connection id 264cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return DataConnection that was created. 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu static DataConnection makeDataConnection(Phone phone, int id, 2671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DcTracker dct, DcTesterFailBringUpAll failBringUpAll, 268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection dc = new DataConnection(phone, 270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DC-" + mInstanceNumber.incrementAndGet(), id, dct, failBringUpAll, dcc); 271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dc.start(); 272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) dc.log("Made " + dc.getName()); 273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return dc; 274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void dispose() { 277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("dispose: call quiteNow()"); 278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quitNow(); 279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* Getter functions */ 282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 283f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities getCopyNetworkCapabilities() { 28462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return makeNetworkCapabilities(); 285f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 286f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties getCopyLinkProperties() { 288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return new LinkProperties(mLinkProperties); 289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean getIsInactive() { 292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getCurrentState() == mInactiveState; 293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int getCid() { 296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mCid; 297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting getApnSetting() { 300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mApnSetting; 301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 3039c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk void setLinkPropertiesHttpProxy(ProxyInfo proxy) { 304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties.setHttpProxy(proxy); 305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class UpdateLinkPropertyResult { 308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public DataCallResponse.SetupResult setupResult = DataCallResponse.SetupResult.SUCCESS; 309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties oldLp; 310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties newLp; 311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public UpdateLinkPropertyResult(LinkProperties curLp) { 312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville oldLp = curLp; 313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville newLp = curLp; 314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isIpv4Connected() { 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean ret = false; 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Collection <InetAddress> addresses = mLinkProperties.getAddresses(); 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (InetAddress addr: addresses) { 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (addr instanceof java.net.Inet4Address) { 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville java.net.Inet4Address i4addr = (java.net.Inet4Address) addr; 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!i4addr.isAnyLocalAddress() && !i4addr.isLinkLocalAddress() && 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !i4addr.isLoopbackAddress() && !i4addr.isMulticastAddress()) { 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = true; 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isIpv6Connected() { 335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean ret = false; 336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Collection <InetAddress> addresses = mLinkProperties.getAddresses(); 337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (InetAddress addr: addresses) { 339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (addr instanceof java.net.Inet6Address) { 340a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville java.net.Inet6Address i6addr = (java.net.Inet6Address) addr; 341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!i6addr.isAnyLocalAddress() && !i6addr.isLinkLocalAddress() && 342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !i6addr.isLoopbackAddress() && !i6addr.isMulticastAddress()) { 343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = true; 344a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 345a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 348a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 349a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 350a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult updateLinkProperty(DataCallResponse newState) { 352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties); 353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (newState == null) return result; 355ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 356ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult setupResult; 357ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp = new LinkProperties(); 358ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 360ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.setupResult = setLinkProperties(newState, result.newLp); 361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result.setupResult != DataCallResponse.SetupResult.SUCCESS) { 362ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("updateLinkProperty failed : " + result.setupResult); 363ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 365ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // copy HTTP proxy as it is not part DataCallResponse. 366ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp.setHttpProxy(mLinkProperties.getHttpProxy()); 367ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 368e9701717e43cc5aacbcf624f77a53be92350662cw checkSetMtu(mApnSetting, result.newLp); 369e9701717e43cc5aacbcf624f77a53be92350662cw 37027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties = result.newLp; 37127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 37227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 37327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 374ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG && (! result.oldLp.equals(result.newLp))) { 375ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty old LP=" + result.oldLp); 376ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty new LP=" + result.newLp); 377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 378f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 379d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt if (result.newLp.equals(result.oldLp) == false && 380d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt mNetworkAgent != null) { 381d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 382d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt } 383d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt 384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 386ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 387e9701717e43cc5aacbcf624f77a53be92350662cw /** 388e9701717e43cc5aacbcf624f77a53be92350662cw * Read the MTU value from link properties where it can be set from network. In case 389e9701717e43cc5aacbcf624f77a53be92350662cw * not set by the network, set it again using the mtu szie value defined in the APN 390e9701717e43cc5aacbcf624f77a53be92350662cw * database for the connected APN 391e9701717e43cc5aacbcf624f77a53be92350662cw */ 392e9701717e43cc5aacbcf624f77a53be92350662cw private void checkSetMtu(ApnSetting apn, LinkProperties lp) { 393e9701717e43cc5aacbcf624f77a53be92350662cw if (lp == null) return; 394e9701717e43cc5aacbcf624f77a53be92350662cw 395e9701717e43cc5aacbcf624f77a53be92350662cw if (apn == null || lp == null) return; 396e9701717e43cc5aacbcf624f77a53be92350662cw 397e9701717e43cc5aacbcf624f77a53be92350662cw if (lp.getMtu() != PhoneConstants.UNSET_MTU) { 398e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by call response to: " + lp.getMtu()); 399e9701717e43cc5aacbcf624f77a53be92350662cw return; 400e9701717e43cc5aacbcf624f77a53be92350662cw } 401e9701717e43cc5aacbcf624f77a53be92350662cw 402e9701717e43cc5aacbcf624f77a53be92350662cw if (apn != null && apn.mtu != PhoneConstants.UNSET_MTU) { 403e9701717e43cc5aacbcf624f77a53be92350662cw lp.setMtu(apn.mtu); 404e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by APN to: " + apn.mtu); 405e9701717e43cc5aacbcf624f77a53be92350662cw return; 406e9701717e43cc5aacbcf624f77a53be92350662cw } 407e9701717e43cc5aacbcf624f77a53be92350662cw 408e9701717e43cc5aacbcf624f77a53be92350662cw int mtu = mPhone.getContext().getResources().getInteger( 409e9701717e43cc5aacbcf624f77a53be92350662cw com.android.internal.R.integer.config_mobile_mtu); 410e9701717e43cc5aacbcf624f77a53be92350662cw if (mtu != PhoneConstants.UNSET_MTU) { 411e9701717e43cc5aacbcf624f77a53be92350662cw lp.setMtu(mtu); 412e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by config resource to: " + mtu); 413e9701717e43cc5aacbcf624f77a53be92350662cw } 414e9701717e43cc5aacbcf624f77a53be92350662cw } 415e9701717e43cc5aacbcf624f77a53be92350662cw 416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Constructor (NOTE: uses dcc.getHandler() as its Handler) 4171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private DataConnection(Phone phone, String name, int id, 4181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DcTracker dct, DcTesterFailBringUpAll failBringUpAll, 419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville super(name, dcc.getHandler()); 421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogRecSize(300); 422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogOnlyTransitions(true); 423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DataConnection constructor E"); 424ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = phone; 426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = dct; 427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = failBringUpAll; 428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = dcc; 429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mId = id; 430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = new DcRetryAlarmController(mPhone, this); 43262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 43362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mRilRat = ss.getRilDataRadioTechnology(); 434203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = mPhone.getServiceState().getDataRegState(); 43562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 43662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, 437aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran networkType, NETWORK_TYPE, TelephonyManager.getNetworkTypeName(networkType)); 438ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mNetworkInfo.setRoaming(ss.getDataRoaming()); 43962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setIsAvailable(true); 440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDefaultState); 442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mInactiveState, mDefaultState); 443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActivatingState, mDefaultState); 444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mRetryingState, mDefaultState); 445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActiveState, mDefaultState); 446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingState, mDefaultState); 447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingErrorCreatingConnection, mDefaultState); 448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setInitialState(mInactiveState); 449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 450ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt mApnContexts = new HashMap<ApnContext, ConnectionParams>(); 451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DataConnection constructor X"); 452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private String getRetryConfig(boolean forDefault) { 455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int nt = mPhone.getServiceState().getNetworkType(); 456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 4572cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Saville if (Build.IS_DEBUGGABLE) { 458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String config = SystemProperties.get("test.data_retry_config"); 459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (! TextUtils.isEmpty(config)) { 460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return config; 461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((nt == TelephonyManager.NETWORK_TYPE_CDMA) || 465ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_1xRTT) || 466ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_0) || 467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_A) || 468ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_B) || 469ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EHRPD)) { 470ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // CDMA variant 471ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.cdma.data_retry_config"); 472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Use GSM variant for all others. 474ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (forDefault) { 475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.gsm.data_retry_config"); 476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.gsm.2nd_data_retry_config"); 478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void configureRetry(boolean forDefault) { 483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retryConfig = getRetryConfig(forDefault); 484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(retryConfig)) { 486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (forDefault) { 487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(DEFAULT_DATA_RETRY_CONFIG)) { 488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Should never happen, log an error and default to a simple linear sequence. 489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("configureRetry: Could not configure using " + 490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DEFAULT_DATA_RETRY_CONFIG=" + DEFAULT_DATA_RETRY_CONFIG); 491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.configure(5, 2000, 1000); 492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(SECONDARY_DATA_RETRY_CONFIG)) { 495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Should never happen, log an error and default to a simple sequence. 496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("configureRetry: Could note configure using " + 497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "SECONDARY_DATA_RETRY_CONFIG=" + SECONDARY_DATA_RETRY_CONFIG); 498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.configure(5, 2000, 1000); 499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("configureRetry: forDefault=" + forDefault + " mRetryManager=" + mRetryManager); 504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 508cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Begin setting up a data connection, calls setupDataCall 509cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * and the ConnectionParams will be returned with the 510cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj. 5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 512cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param cp is the connection parameters 5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void onConnect(ConnectionParams cp) { 515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onConnect: carrier='" + mApnSetting.carrier 516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' APN='" + mApnSetting.apn 517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' proxy='" + mApnSetting.proxy + "' port='" + mApnSetting.port + "'"); 5182dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog("DataConnection.onConnect"); 5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if we should fake an error. 521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDcTesterFailBringUpAll.getDcFailBringUp().mCounter > 0) { 522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = new DataCallResponse(); 523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.version = mPhone.mCi.getRilVersion(); 524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.status = mDcTesterFailBringUpAll.getDcFailBringUp().mFailCause.getErrorCode(); 525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.cid = 0; 526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.active = 0; 527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.type = ""; 528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.ifname = ""; 529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.addresses = new String[0]; 530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.dnses = new String[0]; 531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.gateways = new String[0]; 532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.suggestedRetryTime = 533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mSuggestedRetryTime; 534a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville response.pcscf = new String[0]; 535e9701717e43cc5aacbcf624f77a53be92350662cw response.mtu = PhoneConstants.UNSET_MTU; 536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg, response, null); 539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(msg); 540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onConnect: FailBringUpAll=" + mDcTesterFailBringUpAll.getDcFailBringUp() 542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " send error response=" + response); 543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mCounter -= 1; 545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return; 546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 54822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = -1; 54922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mLastFailTime = -1; 550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 552cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // msg.obj will be returned in AsyncResult.userObj; 553cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 554cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville msg.obj = cp; 5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int authType = mApnSetting.authType; 557cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (authType == -1) { 558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville authType = TextUtils.isEmpty(mApnSetting.user) ? RILConstants.SETUP_DATA_AUTH_NONE 559cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville : RILConstants.SETUP_DATA_AUTH_PAP_CHAP; 5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 562cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String protocol; 5636b8e1174d2ef221d6eeab348a819ce0003d3d5a4Chris Manton if (mPhone.getServiceState().getDataRoamingFromRegistration()) { 564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.roamingProtocol; 565cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.protocol; 5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 56922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.mCi.setupDataCall( 570203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Integer.toString(cp.mRilRat + 2), 571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Integer.toString(cp.mProfileId), 572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.apn, mApnSetting.user, mApnSetting.password, 573cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Integer.toString(authType), 574cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protocol, msg); 5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * TearDown the data connection when the deactivation is complete a Message with 579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * msg.what == EVENT_DEACTIVATE_DONE and msg.obj == AsyncResult with AsyncResult.obj 580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * containing the parameter o. 581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param o is the object returned in the AsyncResult.obj. 583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void tearDownData(Object o) { 585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int discReason = RILConstants.DEACTIVATE_REASON_NONE; 5862dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt ApnContext apnContext = null; 587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((o != null) && (o instanceof DisconnectParams)) { 588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams)o; 5892dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext = dp.mApnContext; 590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (TextUtils.equals(dp.mReason, Phone.REASON_RADIO_TURNED_OFF)) { 591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF; 592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (TextUtils.equals(dp.mReason, Phone.REASON_PDP_RESET)) { 593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET; 594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5960e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh if (mPhone.mCi.getRadioState().isOn() 5970e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh || (mPhone.getServiceState().getRilDataRadioTechnology() 5980e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN )) { 5992dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "tearDownData radio is on, call deactivateDataCall"; 6002dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 6012dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (apnContext != null) apnContext.requestLog(str); 602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, discReason, 603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o)); 604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 6052dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately"; 6062dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 6072dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (apnContext != null) apnContext.requestLog(str); 608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = new AsyncResult(o, null, null); 609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, ar)); 610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) { 61462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(mNetworkInfo.getDetailedState(), reason, 61562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getExtraInfo()); 616ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt for (ConnectionParams cp : mApnContexts.values()) { 617ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt ApnContext apnContext = cp.mApnContext; 618f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (apnContext == alreadySent) continue; 619f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (reason != null) apnContext.setReason(reason); 620ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt Pair<ApnContext, Integer> pair = 621ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt new Pair<ApnContext, Integer>(apnContext, cp.mConnectionGeneration); 622ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt Message msg = mDct.obtainMessage(event, pair); 623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfConnected(String reason) { 629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason); 6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfDisconnectDcRetrying(String reason) { 633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DC_RETRYING, reason); 634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllDisconnectCompleted(DcFailCause cause) { 636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DONE, cause.toString()); 6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send the connectionCompletedMsg. 642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cp is the ConnectionParams 644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cause and if no error the cause is DcFailCause.NONE 645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param sendAll is true if all contexts are to be notified 646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyConnectCompleted(ConnectionParams cp, DcFailCause cause, boolean sendAll) { 648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp != null && cp.mOnCompletedMsg != null) { 651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message connectionCompletedMsg = cp.mOnCompletedMsg; 653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp.mOnCompletedMsg = null; 654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (connectionCompletedMsg.obj instanceof ApnContext) { 655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)connectionCompletedMsg.obj; 656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville long timeStamp = System.currentTimeMillis(); 659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.arg1 = mCid; 660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == DcFailCause.NONE) { 662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = timeStamp; 663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg); 664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = cause; 666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = timeStamp; 667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Return message with a Throwable exception to signify an error. 669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == null) cause = DcFailCause.UNKNOWN; 670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg, cause, 671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new Throwable(cause.toString())); 672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("notifyConnectCompleted at " + timeStamp + " cause=" + cause 675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " connectionCompletedMsg=" + msgToString(connectionCompletedMsg)); 676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.sendToTarget(); 679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR, 682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause.toString()); 683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send ar.userObj if its a message, which is should be back to originator. 688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param dp is the DisconnectParams. 690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) { 692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("NotifyDisconnectCompleted"); 693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String reason = null; 696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp != null && dp.mOnCompletedMsg != null) { 698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = dp.mOnCompletedMsg; 700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mOnCompletedMsg = null; 701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj instanceof ApnContext) { 702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)msg.obj; 703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = dp.mReason; 705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log(String.format("msg=%s msg.obj=%s", msg.toString(), 707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>"))); 708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (reason == null) { 714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = DcFailCause.UNKNOWN.toString(); 715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DISCONNECT_DONE, reason); 717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp); 719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 721ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 722ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 723ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Begin Members and methods owned by DataConnectionTracker but stored 724ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * in a DataConnection because there is one per connection. 725ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 726ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The id is owned by DataConnectionTracker. 730ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 731ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private int mId; 732ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 733ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 734ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Get the DataConnection ID 735ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 736ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public int getDataConnectionId() { 737ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mId; 738ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 740ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * End members owned by DataConnectionTracker 743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 746ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 747ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Clear all settings called when entering mInactiveState. 748ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void clearSettings() { 750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("clearSettings"); 751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = -1; 753ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = -1; 754ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 755ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 756ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 757a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = new String[5]; 758a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = new LinkProperties(); 760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = null; 763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Process setup completion. 767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param ar is the result 769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return SetupResult. 770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult onSetupConnectionCompleted(AsyncResult ar) { 772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = (DataCallResponse) ar.result; 773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result; 775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag != mTag) { 777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted stale cp.tag=" + cp.mTag + ", mtag=" + mTag); 779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_Stale; 781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (ar.exception != null) { 782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 783ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception + 784ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " response=" + response); 785ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 786ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception instanceof CommandException 788ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville && ((CommandException) (ar.exception)).getCommandError() 789ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville == CommandException.Error.RADIO_NOT_AVAILABLE) { 790ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_BadCommand; 791ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.RADIO_NOT_AVAILABLE; 792ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if ((response == null) || (response.version < 4)) { 793ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_GetLastErrorFromRil; 794ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 795ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 796ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 797ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 798ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (response.status != 0) { 799ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 800ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 802ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onSetupConnectionCompleted received DataCallResponse: " + response); 803ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = response.cid; 804a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 805a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = response.pcscf; 806a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 807ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = updateLinkProperty(response).setupResult; 808ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 809ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 810ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 811ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 812ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 813ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isDnsOk(String[] domainNameServers) { 814cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1]) 81522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && !mPhone.isDnsCheckDisabled()) { 816cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Work around a race condition where QMI does not fill in DNS: 817cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Deactivate PDP and let DataConnectionTracker retry. 818cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Do not apply the race condition workaround for MMS APN 819cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // if Proxy is an IP-address. 820cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Otherwise, the default APN will not be restored anymore. 821ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mApnSetting.types[0].equals(PhoneConstants.APN_TYPE_MMS) 822ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || !isIpAddress(mApnSetting.mmsProxy)) { 823cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log(String.format( 824cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s", 825ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.types[0], PhoneConstants.APN_TYPE_MMS, mApnSetting.mmsProxy, 826ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville isIpAddress(mApnSetting.mmsProxy))); 827cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 828cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 829cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 830cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 83327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_GPRS = "4092,8760,48000,4096,8760,48000"; 83427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EDGE = "4093,26280,70800,4096,16384,70800"; 83527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_UMTS = "58254,349525,1048576,58254,349525,1048576"; 836d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao private static final String TCP_BUFFER_SIZES_1XRTT= "16384,32768,131072,4096,16384,102400"; 83727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EVDO = "4094,87380,262144,4096,16384,262144"; 838d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao private static final String TCP_BUFFER_SIZES_EHRPD= "131072,262144,1048576,4096,16384,524288"; 83927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSDPA= "61167,367002,1101005,8738,52429,262114"; 84027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPA = "40778,244668,734003,16777,100663,301990"; 84127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_LTE = 84227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt "524288,1048576,2097152,262144,524288,1048576"; 84327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPAP= "122334,734003,2202010,32040,192239,576717"; 84427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 84527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private void updateTcpBufferSizes(int rilRat) { 84627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt String sizes = null; 8478fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String ratName = ServiceState.rilRadioTechnologyToString(rilRat).toLowerCase(Locale.ROOT); 8488fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // ServiceState gives slightly different names for EVDO tech ("evdo-rev.0" for ex) 8498fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // - patch it up: 8508fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0 || 8518fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A || 8528fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B) { 8538fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt ratName = "evdo"; 8548fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8558fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 8568fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // in the form: "ratname:rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max" 8578fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] configOverride = mPhone.getContext().getResources().getStringArray( 8588fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt com.android.internal.R.array.config_mobile_tcp_buffers); 8598fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt for (int i = 0; i < configOverride.length; i++) { 8608fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] split = configOverride[i].split(":"); 8618fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (ratName.equals(split[0]) && split.length == 2) { 8628fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = split[1]; 86327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt break; 8648fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8658fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8668fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 8678fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (sizes == null) { 8688fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // no override - use telephony defaults 8698fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // doing it this way allows device or carrier to just override the types they 8708fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // care about and inherit the defaults for the others. 8718fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt switch (rilRat) { 8728fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: 8738fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_GPRS; 8748fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8758fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: 8768fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EDGE; 8778fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8788fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: 8798fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_UMTS; 8808fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 881d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: 882d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao sizes = TCP_BUFFER_SIZES_1XRTT; 883d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao break; 8848fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: 8858fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: 8868fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: 8878fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EVDO; 8888fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 889d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: 890d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao sizes = TCP_BUFFER_SIZES_EHRPD; 891d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao break; 8928fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: 8938fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSDPA; 8948fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8958fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: 8968fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: 8978fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPA; 8988fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8998fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: 9008fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_LTE; 9018fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 9028fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: 9038fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPAP; 9048fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 9058fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt default: 9068fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // Leave empty - this will let ConnectivityService use the system default. 9078fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 9088fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 90927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 91027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties.setTcpBufferSizes(sizes); 91127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 91227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 91362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkCapabilities makeNetworkCapabilities() { 91462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt NetworkCapabilities result = new NetworkCapabilities(); 91562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 91662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 91762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mApnSetting != null) { 91862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt for (String type : mApnSetting.types) { 91962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (type) { 920b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt case PhoneConstants.APN_TYPE_ALL: { 921fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 922fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 923fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 924fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 925fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 926fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 927fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 928b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt break; 929b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt } 93062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DEFAULT: { 931fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 93262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 93362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_MMS: { 935fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 93662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 93762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_SUPL: { 939fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 94062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 94162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 94262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DUN: { 943c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt ApnSetting securedDunApn = mDct.fetchDunApn(); 944c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt if (securedDunApn == null || securedDunApn.equals(mApnSetting)) { 945c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); 946c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt } 94762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 94862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 94962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_FOTA: { 950fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 95162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 95262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 95362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IMS: { 954fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 95562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 95662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 95762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_CBS: { 958fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 95962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 96062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 96162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IA: { 962fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 96362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 96462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 96562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 96662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 96762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 968af171aa4dcf294bf2d1b9bed54ef9a6b0ec76361Paul Jensen result.maybeMarkCapabilitiesRestricted(); 96962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 97062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int up = 14; 97162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int down = 14; 97262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (mRilRat) { 97327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: up = 80; down = 80; break; 97427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: up = 59; down = 236; break; 97527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: up = 384; down = 384; break; 97627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A: // fall through 97727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B: up = 14; down = 14; break; 97827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: up = 153; down = 2457; break; 97927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: up = 1843; down = 3174; break; 98027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: up = 100; down = 100; break; 98127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: up = 2048; down = 14336; break; 98227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: up = 5898; down = 14336; break; 98327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: up = 5898; down = 14336; break; 98427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: up = 1843; down = 5017; break; 98527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: up = 51200; down = 102400; break; 98627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: up = 153; down = 2516; break; 98727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: up = 11264; down = 43008; break; 98862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 98962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 99062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkUpstreamBandwidthKbps(up); 99162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkDownstreamBandwidthKbps(down); 992edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt 993edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt result.setNetworkSpecifier(Integer.toString(mPhone.getSubId())); 994edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt 99562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return result; 99662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 99762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isIpAddress(String address) { 999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (address == null) return false; 1000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return Patterns.IP_ADDRESS.matcher(address).matches(); 1002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult setLinkProperties(DataCallResponse response, 1005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp) { 1006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if system property dns usable 1007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean okToUseSystemPropertyDns = false; 1008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String propertyPrefix = "net." + response.ifname + "."; 1009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String dnsServers[] = new String[2]; 1010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); 1011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); 1012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville okToUseSystemPropertyDns = isDnsOk(dnsServers); 1013ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 1015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return response.setLinkProperties(lp, okToUseSystemPropertyDns); 1016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1017ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1018ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 10199a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * Initialize connection, this will fail if the 10209a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * apnSettings are not compatible. 10219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * 10229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @param cp the Connection paramemters 10239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @return true if initialization was successful. 10249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville */ 10259a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville private boolean initConnection(ConnectionParams cp) { 10269a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ApnContext apnContext = cp.mApnContext; 10279a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (mApnSetting == null) { 10289a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // Only change apn setting if it isn't set, it will 10299a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // only NOT be set only if we're in DcInactiveState. 10309a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnSetting = apnContext.getApnSetting(); 1031bc1e44907073900212fb87da372174483525f3edJay Shrauner } 1032bc1e44907073900212fb87da372174483525f3edJay Shrauner if (mApnSetting == null || !mApnSetting.canHandleType(apnContext.getApnType())) { 10339a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10349a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: incompatible apnSetting in ConnectionParams cp=" + cp 10359a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " dc=" + DataConnection.this); 10369a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10379a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return false; 10389a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10399a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mTag += 1; 10409a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams = cp; 10419a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams.mTag = mTag; 10429a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10431a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt // always update the ConnectionParams with the latest or the 10441a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt // connectionGeneration gets stale 10451a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt mApnContexts.put(apnContext, cp); 10461a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt 10479a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville configureRetry(mApnSetting.canHandleType(PhoneConstants.APN_TYPE_DEFAULT)); 10489a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setRetryCount(0); 10499a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setCurMaxRetryCount(mConnectionParams.mInitialMaxRetry); 1050fcc57e87d1620ab7dc877d65e7e85dca77132054Wink Saville mRetryManager.setRetryForever(false); 10519a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10529a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10539a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: " 10549a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() 10559a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mApnList=" + mApnContexts 10569a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mConnectionParams=" + mConnectionParams); 10579a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10589a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return true; 10599a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10609a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10619a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville /** 1062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The parent state for all other states. 1063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDefaultState extends State { 1065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: enter"); 1068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1069203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Register for DRS or RAT change 1070203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), 1071203e588e3c42a81aa8a56f595119c181a63b12caWink Saville DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); 1072203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1073ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().registerForDataRoamingOn(getHandler(), 107462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_ON, null); 1075ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().registerForDataRoamingOff(getHandler(), 107662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null); 107762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Add ourselves to the list of data connections 1079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addDc(DataConnection.this); 1080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: exit"); 1084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 108546f190903e93c653b90b970c1a21159bb957575bWink Saville // Unregister for DRS or RAT change. 108646f190903e93c653b90b970c1a21159bb957575bWink Saville mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); 108746f190903e93c653b90b970c1a21159bb957575bWink Saville 1088ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().unregisterForDataRoamingOn(getHandler()); 1089ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().unregisterForDataRoamingOff(getHandler()); 109062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 109146f190903e93c653b90b970c1a21159bb957575bWink Saville // Remove ourselves from the DC lists 109246f190903e93c653b90b970c1a21159bb957575bWink Saville mDcController.removeDc(DataConnection.this); 1093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.disconnected(); 1096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = null; 1097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.dispose(); 1099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = null; 1100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = null; 1101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReconnectIntent = null; 1102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = null; 1103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 1104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = null; 1105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = null; 1106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = null; 1107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mUserData = null; 1108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = null; 1109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = null; 1110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal = HANDLED; 1115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefault msg=" + getWhatToString(msg.what) 1118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RefCount=" + mApnContexts.size()); 1119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 1122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("Disconnecting to previous connection mAc=" + mAc); 1124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED); 1126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = new AsyncChannel(); 1128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.connected(null, getHandler(), msg.replyTo); 1129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected"); 1130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_SUCCESSFUL, mId, "hi"); 1132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 113645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville if (DBG) { 113745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcDefault: CMD_CHANNEL_DISCONNECTED before quiting call dump"); 113845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville dumpToLog(); 113945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 114045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 1141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quit(); 1142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1144454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_IS_INACTIVE: { 1145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean val = getIsInactive(); 1146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_IS_INACTIVE isInactive=" + val); 1147454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_IS_INACTIVE, val ? 1 : 0); 1148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1150454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_CID: { 1151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int cid = getCid(); 1152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_CID cid=" + cid); 1153454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_CID, cid); 1154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1156454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_APNSETTING: { 1157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting = getApnSetting(); 1158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_APNSETTING mApnSetting=" + apnSetting); 1159454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_APNSETTING, apnSetting); 1160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1162454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_LINK_PROPERTIES: { 1163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp = getCopyLinkProperties(); 1164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp); 1165454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_PROPERTIES, lp); 1166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1168454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: { 11699c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk ProxyInfo proxy = (ProxyInfo) msg.obj; 1170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy); 1171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLinkPropertiesHttpProxy(proxy); 1172454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY); 11731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mNetworkAgent != null) { 11741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNetworkAgent.sendLinkProperties(mLinkProperties); 11751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1178f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt case DcAsyncChannel.REQ_GET_NETWORK_CAPABILITIES: { 1179f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities nc = getCopyNetworkCapabilities(); 1180f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (VDBG) log("REQ_GET_NETWORK_CAPABILITIES networkCapabilities" + nc); 1181f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_NETWORK_CAPABILITIES, nc); 1182f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt break; 1183f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 1184454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: msg.what=REQ_RESET"); 1186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); 1190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.UNKNOWN, false); 1192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT RefCount=" 1197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL RefCount=" 1205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1207ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1208ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1209ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_TEAR_DOWN_NOW: 1211ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW"); 1212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, 0, null); 1213ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1214ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1215ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: 1216ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1217ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_LOST_CONNECTION" 1218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: 1224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_RETRY_CONNECTION" 1226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1231203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1232203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1233203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1234203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drsRatPair.first; 123527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt if (mRilRat != drsRatPair.second) { 123627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(drsRatPair.second); 123727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 1238203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = drsRatPair.second; 1239203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1240203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcDefaultState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1241203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " drs=" + mDataRegState 1242203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRilRat=" + mRilRat); 1243203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 124462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 124562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 124662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 124762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 124862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mNetworkAgent != null) { 12496356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt updateNetworkInfoSuspendState(); 125062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkCapabilities(makeNetworkCapabilities()); 125162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 125227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 125362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 125462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 125562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 125662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: 125762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 125862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 125962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 126062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: 126162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 1262203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1263203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState: shouldn't happen but ignore msg.what=" 1267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 12756356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 12766356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt private boolean updateNetworkInfoSuspendState() { 12776356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final NetworkInfo.DetailedState oldState = mNetworkInfo.getDetailedState(); 12786356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 12796356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // this is only called when we are either connected or suspended. Decide which. 12806356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (mNetworkAgent == null) { 12816356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt Rlog.e(getName(), "Setting suspend state without a NetworkAgent"); 12826356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12836356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 12846356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // if we are not in-service change to SUSPENDED 12856356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final ServiceStateTracker sst = mPhone.getServiceStateTracker(); 12866356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (sst.getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) { 1287c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.SUSPENDED, null, 1288c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12896356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } else { 12906356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // check for voice call and concurrency issues 12916356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (sst.isConcurrentVoiceAndDataAllowed() == false) { 12926356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final CallTracker ct = mPhone.getCallTracker(); 12936356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (ct.getState() != PhoneConstants.State.IDLE) { 1294c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.SUSPENDED, null, 1295c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12966356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt return (oldState != NetworkInfo.DetailedState.SUSPENDED); 12976356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12986356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 1299c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, 1300c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 13016356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 13026356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt return (oldState != mNetworkInfo.getDetailedState()); 13036356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 13046356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 1305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDefaultState mDefaultState = new DcDefaultState(); 1306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is inactive and expects a EVENT_CONNECT. 1309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcInactiveState extends State { 1311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed connecting 1312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(ConnectionParams cp, DcFailCause cause) { 1313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams cp,cause"); 1314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = cp; 1315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1318ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1319ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed disconnected 1320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DisconnectParams dp) { 1321ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams dp"); 1322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts of the failure cause 1328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DcFailCause cause) { 1329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag += 1; 1337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: enter() mTag=" + mTag); 1338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != null) { 1340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyConnectCompleted +ALL failCause=" 1342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(mConnectionParams, mDcFailCause, true); 1345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams != null) { 1347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyDisconnectCompleted +ALL failCause=" 1349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(mDisconnectParams, true); 1352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams == null && mConnectionParams == null && mDcFailCause != null) { 1354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1355ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyAllDisconnectCompleted failCause=" 1356ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1357ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1358ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllDisconnectCompleted(mDcFailCause); 1359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1360ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from cid mapping, before clearSettings 1362ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1363ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville clearSettings(); 1365ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1366ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1367ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1368ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1369ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1370ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1372ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1374ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1375ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1376454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset"); 1379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 13849a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcInactiveState: mag.what=EVENT_CONNECT"); 13859a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 13869a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 13879a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 13889a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 13899a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 13909a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 13919a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcInactiveState: msg.what=EVENT_CONNECT initConnection failed"); 13929a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 13939a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 13949a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 1395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1398ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT"); 1401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL"); 1407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState nothandled msg.what=" + getWhatToString(msg.what)); 1414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcInactiveState mInactiveState = new DcInactiveState(); 1422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1424ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is retrying and expects a EVENT_RETRY_CONNECTION. 1425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcRetryingState extends State { 1427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1429203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if ((mConnectionParams.mRilRat != mRilRat) 1430203e588e3c42a81aa8a56f595119c181a63b12caWink Saville || (mDataRegState != ServiceState.STATE_IN_SERVICE)){ 1431203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // RAT has changed or we're not in service so don't even begin retrying. 1432203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1433203e588e3c42a81aa8a56f595119c181a63b12caWink Saville String s = "DcRetryingState: enter() not retrying rat changed" 1434203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + ", mConnectionParams.mRilRat=" + mConnectionParams.mRilRat 1435203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " != mRilRat:" + mRilRat 1436203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " transitionTo(mInactiveState)"; 1437203e588e3c42a81aa8a56f595119c181a63b12caWink Saville logAndAddLogRec(s); 1438203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1439203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1440203e588e3c42a81aa8a56f595119c181a63b12caWink Saville transitionTo(mInactiveState); 1441203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } else { 1442203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1443203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcRetryingState: enter() mTag=" + mTag 1444203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + ", call notifyAllOfDisconnectDcRetrying lostConnection"); 1445203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1447203e588e3c42a81aa8a56f595119c181a63b12caWink Saville notifyAllOfDisconnectDcRetrying(Phone.REASON_LOST_DATA_CONNECTION); 1448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1449203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Remove ourselves from cid mapping 1450203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1451203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mCid = -1; 1452203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1460203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1461203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1462203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1463203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int drs = drsRatPair.first; 1464203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int rat = drsRatPair.second; 1465203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if ((rat == mRilRat) && (drs == mDataRegState)) { 1466203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1467203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcRetryingState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1468203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " strange no change in drs=" + drs 1469203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " rat=" + rat + " ignoring"); 1470203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1471203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } else { 147212fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao // have to retry connecting since no attach event will come 147312fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao if (mConnectionParams.mRetryWhenSSChange) { 147412fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao retVal = NOT_HANDLED; 147512fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao break; 147612fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao } 1477203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // We've lost the connection and we're retrying but DRS or RAT changed 1478203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // so we may never succeed, might as well give up. 1479203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1480203e588e3c42a81aa8a56f595119c181a63b12caWink Saville deferMessage(msg); 1481203e588e3c42a81aa8a56f595119c181a63b12caWink Saville transitionTo(mInactiveState); 1482203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1483203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1484203e588e3c42a81aa8a56f595119c181a63b12caWink Saville String s = "DcRetryingState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1485203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " giving up changed from " + mRilRat 1486203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " to rat=" + rat 1487203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " or drs changed from " + mDataRegState + " to drs=" + drs; 1488203e588e3c42a81aa8a56f595119c181a63b12caWink Saville logAndAddLogRec(s); 1489203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1490203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drs; 1491203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rat; 149262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt // TODO - pass the other type here too? 149362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 149462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 149562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 149662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 1497203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1498203e588e3c42a81aa8a56f595119c181a63b12caWink Saville retVal = HANDLED; 1499203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1500203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: { 1502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 == mTag) { 1503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.increaseRetryCount(); 1504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState EVENT_RETRY_CONNECTION" 1506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RetryCount=" + mRetryManager.getRetryCount() 1507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville onConnect(mConnectionParams); 1510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActivatingState); 1511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState stale EVENT_RETRY_CONNECTION" 1514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + msg.arg1 + " != mTag:" + mTag); 1515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1520454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: { 1521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState: msg.what=RSP_RESET, ignore we're already reset"); 1523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(mConnectionParams, 1525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.RESET_BY_FRAMEWORK); 1526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 15319a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 15339a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT" 15349a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() + " cp=" + cp 1535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 15379a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 15389a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 15399a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 15409a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 15419a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 15429a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT initConnection failed"); 15439a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 15449a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 15459a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 15469a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 1547ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1553ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if ((mApnContexts.remove(dp.mApnContext) != null) && 1554ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt (mApnContexts.size() == 0)) { 1555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT " + " RefCount=" 1557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size() + " dp=" + dp); 1558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(dp); 1560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 15629a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcRetryingState: msg.what=EVENT_DISCONNECT"); 1563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT/DISCONNECT_ALL " 1571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "RefCount=" + mApnContexts.size()); 1572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: { 1579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState nothandled msg.what=" + getWhatToString(msg.what)); 1581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcRetryingState mRetryingState = new DcRetryingState(); 1590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is activating a connection. 1593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActivatingState extends State { 1595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 1599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp; 1600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActivatingState: msg=" + msgToString(msg)); 1602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1603203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1605203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Activating can't process until we're done. 1606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_SETUP_DATA_CONNECTION_DONE: 1611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar); 1615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result != DataCallResponse.SetupResult.ERR_Stale) { 1616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:"+ mConnectionParams 1618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1621c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1622c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState onSetupConnectionCompleted result=" + result 1623c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1624c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 16252dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) { 16262dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt cp.mApnContext.requestLog("onSetupConnectionCompleted result=" + result); 16272dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt } 1628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (result) { 1629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case SUCCESS: 1630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // All is well 1631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActiveState); 1633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_BadCommand: 1635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Vendor ril rejected the command and didn't connect. 1636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_UnacceptableParameter: 1642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The addresses given from the RIL are bad 1643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(cp); 1644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingErrorCreatingConnection); 1645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_GetLastErrorFromRil: 1647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Request failed and this is an old RIL 1648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.getLastDataCallFailCause( 1649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp)); 1650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_RilError: 1652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delay = mDcRetryAlarmController.getSuggestedRetryTime( 1653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection.this, ar); 16542dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcActivatingState: ERR_RilError " 16552dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " delay=" + delay 16562dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 16572dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result=" + result 16582dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result.isRestartRadioFail=" + 16592dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt result.mFailCause.isRestartRadioFail() 16602dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result.isPermanentFail=" + 16612dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt mDct.isPermanentFail(result.mFailCause); 16622dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 16632dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog(str); 16640d2abb5518d6a86619d2c2db04867c338b2092d4Robert Greenwalt if (result.mFailCause.isRestartRadioFail() || 16650d2abb5518d6a86619d2c2db04867c338b2092d4Robert Greenwalt (cp.mApnContext != null && 16660d2abb5518d6a86619d2c2db04867c338b2092d4Robert Greenwalt cp.mApnContext.restartOnError( 16670d2abb5518d6a86619d2c2db04867c338b2092d4Robert Greenwalt result.mFailCause.getErrorCode()))) { 1668979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError restart radio"); 1669979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mDct.sendRestartRadio(); 1670979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1671979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1672796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan } else if (mDct.isPermanentFail(result.mFailCause)) { 1673979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError perm error"); 1674979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1675979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1676979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (delay >= 0) { 1677979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError retry"); 1678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, 1679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag, delay); 1680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1682979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError no retry"); 1683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_Stale: 1688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_SETUP_DATA_CONNECTION_DONE" 1689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville throw new RuntimeException("Unknown SetupResult, should not happen"); 1693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_GET_LAST_FAIL_DONE: 1698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:" + mConnectionParams 1703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause cause = DcFailCause.UNKNOWN; 1707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 1709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int rilFailCause = ((int[]) (ar.result))[0]; 1710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = DcFailCause.fromInt(rilFailCause); 17111db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (cause == DcFailCause.NONE) { 17121db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (DBG) { 17131db7da14111228a5079d2970d7d0ce34173000b5Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 17141db7da14111228a5079d2970d7d0ce34173000b5Wink Saville + " BAD: error was NONE, change to UNKNOWN"); 17151db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 17161db7da14111228a5079d2970d7d0ce34173000b5Wink Saville cause = DcFailCause.UNKNOWN; 17171db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 1718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1721ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int retryDelay = mRetryManager.getRetryTimer(); 1722c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1723c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 1724c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " cause=" + cause 1725c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " retryDelay=" + retryDelay 1726c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 1727c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1728c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1729979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (cause.isRestartRadioFail()) { 1730979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) { 1731979786625e7ceacf4a545a25704ef8a15338a854Wink Saville log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE" 1732979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " restart radio"); 1733979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } 1734979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mDct.sendRestartRadio(); 1735979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1736979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1737796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan } else if (mDct.isPermanentFail(cause)) { 1738979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE perm er"); 1739979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1740979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1741979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if ((retryDelay >= 0) && (mRetryManager.isRetryNeeded())) { 1742979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE retry"); 1743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retryDelay); 1745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1746ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1747979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE no retry"); 1748ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_GET_LAST_FAIL_DONE" 1753ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1754ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1755ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1756ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1758ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActivatingState not handled msg.what=" + 1762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville getWhatToString(msg.what) + " RefCount=" + mApnContexts.size()); 1763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActivatingState mActivatingState = new DcActivatingState(); 1771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is connected, expecting an EVENT_DISCONNECT. 1774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActiveState extends State { 1776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override public void enter() { 1777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: enter dc=" + DataConnection.this); 1778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.getRetryCount() != 0) { 1780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState: connected after retrying call notifyAllOfConnected"); 1781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.setRetryCount(0); 1782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 17835488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan 17845488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan boolean createNetworkAgent = true; 17855488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan // If a disconnect is already pending, avoid notifying all of connected 17861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (hasMessages(EVENT_DISCONNECT) || 17871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasMessages(EVENT_DISCONNECT_ALL) || 17881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasDeferredMessages(EVENT_DISCONNECT) || 17891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasDeferredMessages(EVENT_DISCONNECT_ALL)) { 17905488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan log("DcActiveState: skipping notifyAllOfConnected()"); 17915488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan createNetworkAgent = false; 17925488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } else { 17935488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan // If we were retrying there maybe more than one, otherwise they'll only be one. 17945488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan notifyAllOfConnected(Phone.REASON_CONNECTED); 17955488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1796ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 17976356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().registerForVoiceCallStarted(getHandler(), 17986356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_STARTED, null); 17996356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().registerForVoiceCallEnded(getHandler(), 18006356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_ENDED, null); 18016356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 1802ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If the EVENT_CONNECT set the current max retry restore it here 1803ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // if it didn't then this is effectively a NOP. 1804ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.restoreCurMaxRetryCount(); 1805ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addActiveDcByCid(DataConnection.this); 180662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 180762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, 180862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getReason(), null); 180962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setExtraInfo(mApnSetting.apn); 181027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 1811957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey 1812957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey final NetworkMisc misc = new NetworkMisc(); 1813957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey misc.subscriberId = mPhone.getSubscriberId(); 18145488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan 18155488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (createNetworkAgent) { 18165488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(), 18175488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan "DcNetworkAgent", mNetworkInfo, makeNetworkCapabilities(), mLinkProperties, 18185488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan 50, misc); 18195488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1820ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1821ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1822ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1823ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1824ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: exit dc=" + this); 182527b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra String reason = mNetworkInfo.getReason(); 182622ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang if(mDcController.isExecutingCarrierChange()) { 182722ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang reason = Phone.REASON_CARRIER_CHANGE; 182822ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang } else if (mDisconnectParams != null && mDisconnectParams.mReason != null) { 182927b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason = mDisconnectParams.mReason; 183027b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra } else if (mDcFailCause != null) { 183127b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason = mDcFailCause.toString(); 183227b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra } 18336356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().unregisterForVoiceCallStarted(getHandler()); 18346356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().unregisterForVoiceCallEnded(getHandler()); 18356356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 183662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, 183727b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason, mNetworkInfo.getExtraInfo()); 18385488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 18395488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 18405488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent = null; 18415488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1842ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1843ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1844ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1845ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1846ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1847ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1848ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1849ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 1850ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 18513f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt // either add this new apn context to our set or 18523f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt // update the existing cp with the latest connection generation number 18533f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt mApnContexts.put(cp.mApnContext, cp); 1854c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1855c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this); 1856c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1857ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.NONE, false); 1858ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1859ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1860ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1861ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1862ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1863c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1864c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_DISCONNECT dp=" + dp 1865c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1866c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1867ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if (mApnContexts.containsKey(dp.mApnContext)) { 1868ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1869ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" 1870ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1871ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1872ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1873ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.size() == 1) { 1874ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 1875ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1876ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1877ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1878ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1879ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1880ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1881ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.remove(dp.mApnContext); 1882ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1883ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1884ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1885ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState ERROR no such apnContext=" + dp.mApnContext 1886c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " in this dc=" + DataConnection.this); 1887ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1888ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1889ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1890ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1891ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1892ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1894c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_DISCONNECT clearing apn contexts," 1895c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1896ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1897ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1898ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1899ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1900ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1901ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1902ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1903ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1904ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1905ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1906ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: { 1907c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1908c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_LOST_CONNECTION dc=" + DataConnection.this); 1909c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1910ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.isRetryNeeded()) { 1911ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // We're going to retry 1912ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delayMillis = mRetryManager.getRetryTimer(); 1913ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1914ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState EVENT_LOST_CONNECTION startRetryAlarm" 1915ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag + " delay=" + delayMillis + "ms"); 1916ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1918ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville delayMillis); 1919ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1920ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1921ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1922ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1923ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1924ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1925ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1926ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 192762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: { 192862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 19295488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 19305488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 19315488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 193262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 193362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 193462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 193562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: { 193662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 19375488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 19385488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 19395488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 194062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 194162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 194262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 194365bee39d7e417fb898c3948696d5d8a38046c449fenglu case EVENT_BW_REFRESH_RESPONSE: { 194465bee39d7e417fb898c3948696d5d8a38046c449fenglu AsyncResult ar = (AsyncResult)msg.obj; 194565bee39d7e417fb898c3948696d5d8a38046c449fenglu if (ar.exception != null) { 194665bee39d7e417fb898c3948696d5d8a38046c449fenglu log("EVENT_BW_REFRESH_RESPONSE: error ignoring, e=" + ar.exception); 194765bee39d7e417fb898c3948696d5d8a38046c449fenglu } else { 194865bee39d7e417fb898c3948696d5d8a38046c449fenglu final ArrayList<Integer> capInfo = (ArrayList<Integer>)ar.result; 194965bee39d7e417fb898c3948696d5d8a38046c449fenglu final int lceBwDownKbps = capInfo.get(0); 195065bee39d7e417fb898c3948696d5d8a38046c449fenglu NetworkCapabilities nc = makeNetworkCapabilities(); 195165bee39d7e417fb898c3948696d5d8a38046c449fenglu if (mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) { 195265bee39d7e417fb898c3948696d5d8a38046c449fenglu nc.setLinkDownstreamBandwidthKbps(lceBwDownKbps); 195365bee39d7e417fb898c3948696d5d8a38046c449fenglu if (mNetworkAgent != null) { 195465bee39d7e417fb898c3948696d5d8a38046c449fenglu mNetworkAgent.sendNetworkCapabilities(nc); 195565bee39d7e417fb898c3948696d5d8a38046c449fenglu } 195665bee39d7e417fb898c3948696d5d8a38046c449fenglu } 195765bee39d7e417fb898c3948696d5d8a38046c449fenglu } 19586356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt retVal = HANDLED; 19596356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt break; 19606356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 19616356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt case EVENT_DATA_CONNECTION_VOICE_CALL_STARTED: 19626356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt case EVENT_DATA_CONNECTION_VOICE_CALL_ENDED: { 19635488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (updateNetworkInfoSuspendState() && mNetworkAgent != null) { 19646356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // state changed 19656356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 19666356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 196765bee39d7e417fb898c3948696d5d8a38046c449fenglu retVal = HANDLED; 196865bee39d7e417fb898c3948696d5d8a38046c449fenglu break; 196965bee39d7e417fb898c3948696d5d8a38046c449fenglu } 1970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState not handled msg.what=" + getWhatToString(msg.what)); 1973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActiveState mActiveState = new DcActiveState(); 1981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting. 1984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectingState extends State { 1986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " 1993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 2000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) ar.userObj; 20012dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt 20022dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount=" 20032dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + mApnContexts.size(); 20042dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 20052dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (dp.mApnContext != null) dp.mApnContext.requestLog(str); 20062dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt 2007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp.mTag == mTag) { 2008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 2009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 2010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj); 2011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 2012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 2013ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectState stale EVENT_DEACTIVATE_DONE" 2014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + dp.mTag + " mTag=" + mTag); 2015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 2017ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 2018ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2019ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 2020ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 2021ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectingState not handled msg.what=" 2022ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 2023ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2024ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 2025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 2026ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 2028ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2029ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2030ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectingState mDisconnectingState = new DcDisconnectingState(); 2031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting after an creating a connection. 2034ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectionErrorCreatingConnection extends State { 2036ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 2038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 2039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2040ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 2041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 2042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 2043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 2044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 20452dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcDisconnectionErrorCreatingConnection" + 20462dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt " msg.what=EVENT_DEACTIVATE_DONE"; 20472dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 20482dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog(str); 2049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2050ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 2051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 2052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, 2053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER); 2054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 2055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 2056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 2057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection stale EVENT_DEACTIVATE_DONE" 2058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + cp.mTag + ", mTag=" + mTag); 2059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 2062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 2063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 2065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 2066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection not handled msg.what=" 2067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 2068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2069ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 2070ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 2071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 2073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection = 2076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new DcDisconnectionErrorCreatingConnection(); 2077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 207862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 207962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private class DcNetworkAgent extends NetworkAgent { 208062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt public DcNetworkAgent(Looper l, Context c, String TAG, NetworkInfo ni, 2081957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) { 2082957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey super(l, c, TAG, ni, nc, lp, score, misc); 208362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 208462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 208545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 208662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt protected void unwanted() { 20871484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (mNetworkAgent != this) { 208845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcNetworkAgent: unwanted found mNetworkAgent=" + mNetworkAgent + 20891484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt ", which isn't me. Aborting unwanted"); 20901484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt return; 20911484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt } 20924a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt // this can only happen if our exit has been called - we're already disconnected 20934a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt if (mApnContexts == null) return; 209437cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt for (ConnectionParams cp : mApnContexts.values()) { 209537cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt final ApnContext apnContext = cp.mApnContext; 209637cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt final Pair<ApnContext, Integer> pair = 209737cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt new Pair<ApnContext, Integer>(apnContext, cp.mConnectionGeneration); 209845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcNetworkAgent: [unwanted]: disconnect apnContext=" + apnContext); 209937cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt Message msg = mDct.obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, pair); 2100305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DisconnectParams dp = new DisconnectParams(apnContext, apnContext.getReason(), msg); 2101305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DataConnection.this.sendMessage(DataConnection.this. 2102305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt obtainMessage(EVENT_DISCONNECT, dp)); 2103305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt } 210462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 210565bee39d7e417fb898c3948696d5d8a38046c449fenglu 210665bee39d7e417fb898c3948696d5d8a38046c449fenglu @Override 210765bee39d7e417fb898c3948696d5d8a38046c449fenglu protected void pollLceData() { 210865bee39d7e417fb898c3948696d5d8a38046c449fenglu if(mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) { // active LCE service 210965bee39d7e417fb898c3948696d5d8a38046c449fenglu mPhone.mCi.pullLceData(DataConnection.this.obtainMessage(EVENT_BW_REFRESH_RESPONSE)); 211065bee39d7e417fb898c3948696d5d8a38046c449fenglu } 211165bee39d7e417fb898c3948696d5d8a38046c449fenglu } 211262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 211362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 2114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ******* "public" interface 2115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used for testing purposes. 2118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* package */ void tearDownNow() { 2120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownNow()"); 2121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_TEAR_DOWN_NOW)); 2122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return the string for msg.what as our info. 2126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected String getWhatToString(int what) { 2129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return cmdToString(what); 2130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String msgToString(Message msg) { 2133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retVal; 2134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg == null) { 2135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = "null"; 2136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 2137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville StringBuilder b = new StringBuilder(); 2138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("{what="); 2140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(cmdToString(msg.what)); 2141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" when="); 2143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis(), b); 2144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 != 0) { 2146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg1="); 2147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg1); 2148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg2 != 0) { 2151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg2="); 2152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg2); 2153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj != null) { 2156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" obj="); 2157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.obj); 2158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" target="); 2161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.getTarget()); 2162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" replyTo="); 2164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.replyTo); 2165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("}"); 2167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = b.toString(); 2169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 2171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static void slog(String s) { 2174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d("DC", s); 2175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug 2179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2182cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2183cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void log(String s) { 2184cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.d(getName(), s); 21850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug attribute 2189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logd(String s) { 2194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(getName(), s); 2195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 21960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with verbose attribute 2199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logv(String s) { 2204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.v(getName(), s); 2205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2207ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2208ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with info attribute 2209ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2211ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2213ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logi(String s) { 2214ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.i(getName(), s); 2215ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2216ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2217ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with warning attribute 2219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logw(String s) { 2224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.w(getName(), s); 22250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 22260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s) { 2234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s); 2235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param e is a Throwable which logs additional information. 2242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s, Throwable e) { 2245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s, e); 2246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Doesn't print mApnList of ApnContext's which would be recursive */ 2249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toStringSimple() { 2250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getName() + ": State=" + getCurrentState().getName() 2251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size() 2252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mCid=" + mCid + " mCreateTime=" + mCreateTime 2253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastastFailTime=" + mLastFailTime 2254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastFailCause=" + mLastFailCause 2255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag 2256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mRetryManager=" + mRetryManager 2257f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt + " mLinkProperties=" + mLinkProperties 225862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt + " linkCapabilities=" + makeNetworkCapabilities(); 2259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 2263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{" + toStringSimple() + " mApnContexts=" + mApnContexts + "}"; 2264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 226645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville private void dumpToLog() { 226745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville dump(null, new PrintWriter(new StringWriter(0)) { 226845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 226945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville public void println(String s) { 227045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville DataConnection.this.logd(s); 227145eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 227245eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 227345eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 227445eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville public void flush() { 227545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 227645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville }, null); 227745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 227845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 2279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Dump the current state. 2281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param fd 2283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param pw 2284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param args 2285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 22860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 22870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 2288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.print("DataConnection "); 22890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 2290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts.size=" + mApnContexts.size()); 2291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts=" + mApnContexts); 2292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDataConnectionTracker=" + mDct); 2294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnSetting=" + mApnSetting); 2295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mTag=" + mTag); 2296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCid=" + mCid); 2297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mRetryManager=" + mRetryManager); 2298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mConnectionParams=" + mConnectionParams); 2299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDisconnectParams=" + mDisconnectParams); 2300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcFailCause=" + mDcFailCause); 2301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mPhone=" + mPhone); 2303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLinkProperties=" + mLinkProperties); 2305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2306203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mDataRegState=" + mDataRegState); 2307203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mRilRat=" + mRilRat); 230862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt pw.println(" mNetworkCapabilities=" + makeNetworkCapabilities()); 2309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime)); 2310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime)); 2311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailCause=" + mLastFailCause); 2312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mUserData=" + mUserData); 2314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mInstanceNumber=" + mInstanceNumber); 2315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mAc=" + mAc); 2316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcRetryAlarmController=" + mDcRetryAlarmController); 2317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 23180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 23190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2320