DataConnection.java revision 1484bfe9c58cfd2ddf59a5b8dad7373a36de946d
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 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 20ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.CommandException; 21ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.DctConstants; 22ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.Phone; 234918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.PhoneBase; 24cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.PhoneConstants; 254918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RILConstants; 264918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RetryManager; 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; 399c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monkimport android.net.ProxyInfo; 40ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.AsyncResult; 412cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Savilleimport android.os.Build; 4262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.os.Looper; 43ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.Message; 4462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.os.Messenger; 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; 57ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.ArrayList; 58ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.List; 598fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwaltimport java.util.Locale; 60ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.concurrent.atomic.AtomicInteger; 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.net.InetAddress; 63a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.Collection; 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! 111454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private DcTrackerBase 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; 126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams(ApnContext apnContext, int initialMaxRetry, int profileId, 12812fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao int rilRadioTechnology, boolean retryWhenSSChange, Message onCompletedMsg) { 129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInitialMaxRetry = initialMaxRetry; 131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mProfileId = profileId; 132203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rilRadioTechnology; 13312fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao mRetryWhenSSChange = retryWhenSSChange; 134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mInitialMaxRetry=" + mInitialMaxRetry + " mProfileId=" + mProfileId 141203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRat=" + mRilRat 142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving disconnecting parameters. 148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class DisconnectParams { 150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String mReason; 153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams(ApnContext apnContext, String reason, Message onCompletedMsg) { 156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReason = reason; 158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mReason=" + mReason 165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1682563e7e1ec513121b980045571a245aa5390f1c5Wink Saville 169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ApnSetting mApnSetting; 170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ConnectionParams mConnectionParams; 171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DisconnectParams mDisconnectParams; 172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mDcFailCause; 173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private PhoneBase mPhone; 175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private LinkProperties mLinkProperties = new LinkProperties(); 176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mCreateTime; 177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mLastFailTime; 178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mLastFailCause; 179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String NULL_IP = "0.0.0.0"; 180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private Object mUserData; 181203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mRilRat = Integer.MAX_VALUE; 182203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mDataRegState = Integer.MAX_VALUE; 18362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkInfo mNetworkInfo; 18462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkAgent mNetworkAgent; 185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Package visible variables 187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mCid; 189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville List<ApnContext> mApnContexts = null; 190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville PendingIntent mReconnectIntent = null; 191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville RetryManager mRetryManager = new RetryManager(); 192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ***** Event codes for driving the state machine, package visible for Dcc 195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int BASE = Protocol.BASE_DATA_CONNECTION; 196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_CONNECT = BASE + 0; 197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_SETUP_DATA_CONNECTION_DONE = BASE + 1; 198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_GET_LAST_FAIL_DONE = BASE + 2; 199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DEACTIVATE_DONE = BASE + 3; 200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT = BASE + 4; 201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RIL_CONNECTED = BASE + 5; 202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT_ALL = BASE + 6; 203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DATA_STATE_CHANGED = BASE + 7; 204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_TEAR_DOWN_NOW = BASE + 8; 205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_LOST_CONNECTION = BASE + 9; 206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RETRY_CONNECTION = BASE + 10; 207203e588e3c42a81aa8a56f595119c181a63b12caWink Saville static final int EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED = BASE + 11; 20862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt static final int EVENT_DATA_CONNECTION_ROAM_ON = BASE + 12; 20962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt static final int EVENT_DATA_CONNECTION_ROAM_OFF = BASE + 13; 210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 21162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private static final int CMD_TO_STRING_COUNT = EVENT_DATA_CONNECTION_ROAM_OFF - BASE + 1; 212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; 213ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static { 214ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_CONNECT - BASE] = "EVENT_CONNECT"; 215ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_SETUP_DATA_CONNECTION_DONE - BASE] = 216ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "EVENT_SETUP_DATA_CONNECTION_DONE"; 217ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_GET_LAST_FAIL_DONE - BASE] = "EVENT_GET_LAST_FAIL_DONE"; 218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DEACTIVATE_DONE - BASE] = "EVENT_DEACTIVATE_DONE"; 219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT - BASE] = "EVENT_DISCONNECT"; 220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RIL_CONNECTED - BASE] = "EVENT_RIL_CONNECTED"; 221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT_ALL - BASE] = "EVENT_DISCONNECT_ALL"; 222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DATA_STATE_CHANGED - BASE] = "EVENT_DATA_STATE_CHANGED"; 223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_TEAR_DOWN_NOW - BASE] = "EVENT_TEAR_DOWN_NOW"; 224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_LOST_CONNECTION - BASE] = "EVENT_LOST_CONNECTION"; 225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RETRY_CONNECTION - BASE] = "EVENT_RETRY_CONNECTION"; 226203e588e3c42a81aa8a56f595119c181a63b12caWink Saville sCmdToString[EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED - BASE] = 227203e588e3c42a81aa8a56f595119c181a63b12caWink Saville "EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED"; 22862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_ROAM_ON - BASE] = "EVENT_DATA_CONNECTION_ROAM_ON"; 22962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_ROAM_OFF - BASE] = "EVENT_DATA_CONNECTION_ROAM_OFF"; 230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Convert cmd to string or null if unknown 232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static String cmdToString(int cmd) { 233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String value; 234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cmd -= BASE; 235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((cmd >= 0) && (cmd < sCmdToString.length)) { 236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = sCmdToString[cmd]; 237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 238454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville value = DcAsyncChannel.cmdToString(cmd + BASE); 239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (value == null) { 241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = "0x" + Integer.toHexString(cmd + BASE); 242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return value; 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 247cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Create the connection object 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 249cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param phone the Phone 250cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param id the connection id 251cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return DataConnection that was created. 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static DataConnection makeDataConnection(PhoneBase phone, int id, 254454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, 255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection dc = new DataConnection(phone, 257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DC-" + mInstanceNumber.incrementAndGet(), id, dct, failBringUpAll, dcc); 258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dc.start(); 259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) dc.log("Made " + dc.getName()); 260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return dc; 261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void dispose() { 264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("dispose: call quiteNow()"); 265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quitNow(); 266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* Getter functions */ 269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 270f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities getCopyNetworkCapabilities() { 27162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return makeNetworkCapabilities(); 272f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 273f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties getCopyLinkProperties() { 275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return new LinkProperties(mLinkProperties); 276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean getIsInactive() { 279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getCurrentState() == mInactiveState; 280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int getCid() { 283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mCid; 284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting getApnSetting() { 287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mApnSetting; 288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2909c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk void setLinkPropertiesHttpProxy(ProxyInfo proxy) { 291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties.setHttpProxy(proxy); 292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class UpdateLinkPropertyResult { 295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public DataCallResponse.SetupResult setupResult = DataCallResponse.SetupResult.SUCCESS; 296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties oldLp; 297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties newLp; 298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public UpdateLinkPropertyResult(LinkProperties curLp) { 299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville oldLp = curLp; 300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville newLp = curLp; 301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isIpv4Connected() { 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean ret = false; 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Collection <InetAddress> addresses = mLinkProperties.getAddresses(); 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (InetAddress addr: addresses) { 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (addr instanceof java.net.Inet4Address) { 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville java.net.Inet4Address i4addr = (java.net.Inet4Address) addr; 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!i4addr.isAnyLocalAddress() && !i4addr.isLinkLocalAddress() && 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !i4addr.isLoopbackAddress() && !i4addr.isMulticastAddress()) { 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = true; 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isIpv6Connected() { 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean ret = false; 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Collection <InetAddress> addresses = mLinkProperties.getAddresses(); 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (InetAddress addr: addresses) { 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (addr instanceof java.net.Inet6Address) { 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville java.net.Inet6Address i6addr = (java.net.Inet6Address) addr; 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!i6addr.isAnyLocalAddress() && !i6addr.isLinkLocalAddress() && 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !i6addr.isLoopbackAddress() && !i6addr.isMulticastAddress()) { 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = true; 331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult updateLinkProperty(DataCallResponse newState) { 339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties); 340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (newState == null) return result; 342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult setupResult; 344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp = new LinkProperties(); 345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.setupResult = setLinkProperties(newState, result.newLp); 348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result.setupResult != DataCallResponse.SetupResult.SUCCESS) { 349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("updateLinkProperty failed : " + result.setupResult); 350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // copy HTTP proxy as it is not part DataCallResponse. 353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp.setHttpProxy(mLinkProperties.getHttpProxy()); 354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 355e9701717e43cc5aacbcf624f77a53be92350662cw checkSetMtu(mApnSetting, result.newLp); 356e9701717e43cc5aacbcf624f77a53be92350662cw 35727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties = result.newLp; 35827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 35927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 36027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG && (! result.oldLp.equals(result.newLp))) { 362ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty old LP=" + result.oldLp); 363ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty new LP=" + result.newLp); 364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 365f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 366d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt if (result.newLp.equals(result.oldLp) == false && 367d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt mNetworkAgent != null) { 368d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 369d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt } 370d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt 371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 372ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 374e9701717e43cc5aacbcf624f77a53be92350662cw /** 375e9701717e43cc5aacbcf624f77a53be92350662cw * Read the MTU value from link properties where it can be set from network. In case 376e9701717e43cc5aacbcf624f77a53be92350662cw * not set by the network, set it again using the mtu szie value defined in the APN 377e9701717e43cc5aacbcf624f77a53be92350662cw * database for the connected APN 378e9701717e43cc5aacbcf624f77a53be92350662cw */ 379e9701717e43cc5aacbcf624f77a53be92350662cw private void checkSetMtu(ApnSetting apn, LinkProperties lp) { 380e9701717e43cc5aacbcf624f77a53be92350662cw if (lp == null) return; 381e9701717e43cc5aacbcf624f77a53be92350662cw 382e9701717e43cc5aacbcf624f77a53be92350662cw if (apn == null || lp == null) return; 383e9701717e43cc5aacbcf624f77a53be92350662cw 384e9701717e43cc5aacbcf624f77a53be92350662cw if (lp.getMtu() != PhoneConstants.UNSET_MTU) { 385e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by call response to: " + lp.getMtu()); 386e9701717e43cc5aacbcf624f77a53be92350662cw return; 387e9701717e43cc5aacbcf624f77a53be92350662cw } 388e9701717e43cc5aacbcf624f77a53be92350662cw 389e9701717e43cc5aacbcf624f77a53be92350662cw if (apn != null && apn.mtu != PhoneConstants.UNSET_MTU) { 390e9701717e43cc5aacbcf624f77a53be92350662cw lp.setMtu(apn.mtu); 391e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by APN to: " + apn.mtu); 392e9701717e43cc5aacbcf624f77a53be92350662cw return; 393e9701717e43cc5aacbcf624f77a53be92350662cw } 394e9701717e43cc5aacbcf624f77a53be92350662cw 395e9701717e43cc5aacbcf624f77a53be92350662cw int mtu = mPhone.getContext().getResources().getInteger( 396e9701717e43cc5aacbcf624f77a53be92350662cw com.android.internal.R.integer.config_mobile_mtu); 397e9701717e43cc5aacbcf624f77a53be92350662cw if (mtu != PhoneConstants.UNSET_MTU) { 398e9701717e43cc5aacbcf624f77a53be92350662cw lp.setMtu(mtu); 399e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by config resource to: " + mtu); 400e9701717e43cc5aacbcf624f77a53be92350662cw } 401e9701717e43cc5aacbcf624f77a53be92350662cw } 402e9701717e43cc5aacbcf624f77a53be92350662cw 403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Constructor (NOTE: uses dcc.getHandler() as its Handler) 404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataConnection(PhoneBase phone, String name, int id, 405454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, 406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville super(name, dcc.getHandler()); 408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogRecSize(300); 409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogOnlyTransitions(true); 410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DataConnection constructor E"); 411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = phone; 413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = dct; 414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = failBringUpAll; 415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = dcc; 416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mId = id; 417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = new DcRetryAlarmController(mPhone, this); 41962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 42062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mRilRat = ss.getRilDataRadioTechnology(); 421203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = mPhone.getServiceState().getDataRegState(); 42262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 42362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, 424aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran networkType, NETWORK_TYPE, TelephonyManager.getNetworkTypeName(networkType)); 42562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(ss.getRoaming()); 42662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setIsAvailable(true); 427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDefaultState); 429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mInactiveState, mDefaultState); 430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActivatingState, mDefaultState); 431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mRetryingState, mDefaultState); 432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActiveState, mDefaultState); 433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingState, mDefaultState); 434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingErrorCreatingConnection, mDefaultState); 435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setInitialState(mInactiveState); 436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = new ArrayList<ApnContext>(); 438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DataConnection constructor X"); 439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private String getRetryConfig(boolean forDefault) { 442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int nt = mPhone.getServiceState().getNetworkType(); 443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 4442cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Saville if (Build.IS_DEBUGGABLE) { 445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String config = SystemProperties.get("test.data_retry_config"); 446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (! TextUtils.isEmpty(config)) { 447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return config; 448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((nt == TelephonyManager.NETWORK_TYPE_CDMA) || 452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_1xRTT) || 453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_0) || 454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_A) || 455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_B) || 456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EHRPD)) { 457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // CDMA variant 458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.cdma.data_retry_config"); 459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Use GSM variant for all others. 461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (forDefault) { 462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.gsm.data_retry_config"); 463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.gsm.2nd_data_retry_config"); 465ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 466ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 468ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 469ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void configureRetry(boolean forDefault) { 470ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retryConfig = getRetryConfig(forDefault); 471ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(retryConfig)) { 473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (forDefault) { 474ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(DEFAULT_DATA_RETRY_CONFIG)) { 475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Should never happen, log an error and default to a simple linear sequence. 476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("configureRetry: Could not configure using " + 477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DEFAULT_DATA_RETRY_CONFIG=" + DEFAULT_DATA_RETRY_CONFIG); 478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.configure(5, 2000, 1000); 479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(SECONDARY_DATA_RETRY_CONFIG)) { 482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Should never happen, log an error and default to a simple sequence. 483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("configureRetry: Could note configure using " + 484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "SECONDARY_DATA_RETRY_CONFIG=" + SECONDARY_DATA_RETRY_CONFIG); 485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.configure(5, 2000, 1000); 486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("configureRetry: forDefault=" + forDefault + " mRetryManager=" + mRetryManager); 491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 495cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Begin setting up a data connection, calls setupDataCall 496cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * and the ConnectionParams will be returned with the 497cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj. 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 499cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param cp is the connection parameters 5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void onConnect(ConnectionParams cp) { 502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onConnect: carrier='" + mApnSetting.carrier 503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' APN='" + mApnSetting.apn 504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' proxy='" + mApnSetting.proxy + "' port='" + mApnSetting.port + "'"); 5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if we should fake an error. 507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDcTesterFailBringUpAll.getDcFailBringUp().mCounter > 0) { 508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = new DataCallResponse(); 509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.version = mPhone.mCi.getRilVersion(); 510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.status = mDcTesterFailBringUpAll.getDcFailBringUp().mFailCause.getErrorCode(); 511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.cid = 0; 512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.active = 0; 513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.type = ""; 514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.ifname = ""; 515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.addresses = new String[0]; 516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.dnses = new String[0]; 517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.gateways = new String[0]; 518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.suggestedRetryTime = 519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mSuggestedRetryTime; 520a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville response.pcscf = new String[0]; 521e9701717e43cc5aacbcf624f77a53be92350662cw response.mtu = PhoneConstants.UNSET_MTU; 522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg, response, null); 525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(msg); 526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onConnect: FailBringUpAll=" + mDcTesterFailBringUpAll.getDcFailBringUp() 528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " send error response=" + response); 529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mCounter -= 1; 531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return; 532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 53422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = -1; 53522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mLastFailTime = -1; 536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 538cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // msg.obj will be returned in AsyncResult.userObj; 539cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 540cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville msg.obj = cp; 5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int authType = mApnSetting.authType; 543cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (authType == -1) { 544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville authType = TextUtils.isEmpty(mApnSetting.user) ? RILConstants.SETUP_DATA_AUTH_NONE 545cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville : RILConstants.SETUP_DATA_AUTH_PAP_CHAP; 5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 548cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String protocol; 54922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPhone.getServiceState().getRoaming()) { 550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.roamingProtocol; 551cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.protocol; 5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 55522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.mCi.setupDataCall( 556203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Integer.toString(cp.mRilRat + 2), 557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Integer.toString(cp.mProfileId), 558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.apn, mApnSetting.user, mApnSetting.password, 559cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Integer.toString(authType), 560cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protocol, msg); 5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * TearDown the data connection when the deactivation is complete a Message with 565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * msg.what == EVENT_DEACTIVATE_DONE and msg.obj == AsyncResult with AsyncResult.obj 566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * containing the parameter o. 567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param o is the object returned in the AsyncResult.obj. 569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void tearDownData(Object o) { 571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int discReason = RILConstants.DEACTIVATE_REASON_NONE; 572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((o != null) && (o instanceof DisconnectParams)) { 573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams)o; 574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (TextUtils.equals(dp.mReason, Phone.REASON_RADIO_TURNED_OFF)) { 576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF; 577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (TextUtils.equals(dp.mReason, Phone.REASON_PDP_RESET)) { 578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET; 579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mPhone.mCi.getRadioState().isOn()) { 582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownData radio is on, call deactivateDataCall"); 583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, discReason, 584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o)); 585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately"); 587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = new AsyncResult(o, null, null); 588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, ar)); 589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) { 59362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(mNetworkInfo.getDetailedState(), reason, 59462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getExtraInfo()); 595f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt for (ApnContext apnContext : mApnContexts) { 596f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (apnContext == alreadySent) continue; 597f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (reason != null) apnContext.setReason(reason); 598f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt Message msg = mDct.obtainMessage(event, apnContext); 599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfConnected(String reason) { 605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason); 6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfDisconnectDcRetrying(String reason) { 609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DC_RETRYING, reason); 610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllDisconnectCompleted(DcFailCause cause) { 612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DONE, cause.toString()); 6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send the connectionCompletedMsg. 618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cp is the ConnectionParams 620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cause and if no error the cause is DcFailCause.NONE 621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param sendAll is true if all contexts are to be notified 622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyConnectCompleted(ConnectionParams cp, DcFailCause cause, boolean sendAll) { 624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp != null && cp.mOnCompletedMsg != null) { 627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message connectionCompletedMsg = cp.mOnCompletedMsg; 629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp.mOnCompletedMsg = null; 630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (connectionCompletedMsg.obj instanceof ApnContext) { 631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)connectionCompletedMsg.obj; 632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville long timeStamp = System.currentTimeMillis(); 635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.arg1 = mCid; 636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == DcFailCause.NONE) { 638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = timeStamp; 639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg); 640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = cause; 642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = timeStamp; 643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Return message with a Throwable exception to signify an error. 645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == null) cause = DcFailCause.UNKNOWN; 646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg, cause, 647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new Throwable(cause.toString())); 648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("notifyConnectCompleted at " + timeStamp + " cause=" + cause 651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " connectionCompletedMsg=" + msgToString(connectionCompletedMsg)); 652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.sendToTarget(); 655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR, 658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause.toString()); 659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send ar.userObj if its a message, which is should be back to originator. 664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param dp is the DisconnectParams. 666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) { 668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("NotifyDisconnectCompleted"); 669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String reason = null; 672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp != null && dp.mOnCompletedMsg != null) { 674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = dp.mOnCompletedMsg; 676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mOnCompletedMsg = null; 677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj instanceof ApnContext) { 678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)msg.obj; 679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = dp.mReason; 681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log(String.format("msg=%s msg.obj=%s", msg.toString(), 683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>"))); 684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (reason == null) { 690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = DcFailCause.UNKNOWN.toString(); 691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DISCONNECT_DONE, reason); 693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp); 695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Begin Members and methods owned by DataConnectionTracker but stored 700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * in a DataConnection because there is one per connection. 701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The id is owned by DataConnectionTracker. 706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private int mId; 708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Get the DataConnection ID 711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public int getDataConnectionId() { 713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mId; 714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * End members owned by DataConnectionTracker 719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 721ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 722ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 723ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Clear all settings called when entering mInactiveState. 724ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 725ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void clearSettings() { 726ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("clearSettings"); 727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = -1; 729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = -1; 730ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 731ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 732ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 733a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = new String[5]; 734a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 735ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = new LinkProperties(); 736ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 737ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 738ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = null; 739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 740ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Process setup completion. 743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param ar is the result 745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return SetupResult. 746ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 747ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult onSetupConnectionCompleted(AsyncResult ar) { 748ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = (DataCallResponse) ar.result; 749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result; 751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag != mTag) { 753ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 754ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted stale cp.tag=" + cp.mTag + ", mtag=" + mTag); 755ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 756ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_Stale; 757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (ar.exception != null) { 758ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception + 760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " response=" + response); 761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception instanceof CommandException 764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville && ((CommandException) (ar.exception)).getCommandError() 765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville == CommandException.Error.RADIO_NOT_AVAILABLE) { 766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_BadCommand; 767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.RADIO_NOT_AVAILABLE; 768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if ((response == null) || (response.version < 4)) { 769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_GetLastErrorFromRil; 770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (response.status != 0) { 775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onSetupConnectionCompleted received DataCallResponse: " + response); 779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = response.cid; 780a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 781a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = response.pcscf; 782a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 783ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = updateLinkProperty(response).setupResult; 784ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 785ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 786ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 788ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 789ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isDnsOk(String[] domainNameServers) { 790cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1]) 79122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && !mPhone.isDnsCheckDisabled()) { 792cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Work around a race condition where QMI does not fill in DNS: 793cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Deactivate PDP and let DataConnectionTracker retry. 794cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Do not apply the race condition workaround for MMS APN 795cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // if Proxy is an IP-address. 796cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Otherwise, the default APN will not be restored anymore. 797ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mApnSetting.types[0].equals(PhoneConstants.APN_TYPE_MMS) 798ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || !isIpAddress(mApnSetting.mmsProxy)) { 799cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log(String.format( 800cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s", 801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.types[0], PhoneConstants.APN_TYPE_MMS, mApnSetting.mmsProxy, 802ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville isIpAddress(mApnSetting.mmsProxy))); 803cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 804cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 805cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 806cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 8070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 80927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_GPRS = "4092,8760,48000,4096,8760,48000"; 81027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EDGE = "4093,26280,70800,4096,16384,70800"; 81127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_UMTS = "58254,349525,1048576,58254,349525,1048576"; 81227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EVDO = "4094,87380,262144,4096,16384,262144"; 81327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSDPA= "61167,367002,1101005,8738,52429,262114"; 81427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPA = "40778,244668,734003,16777,100663,301990"; 81527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_LTE = 81627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt "524288,1048576,2097152,262144,524288,1048576"; 81727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPAP= "122334,734003,2202010,32040,192239,576717"; 81827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 81927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private void updateTcpBufferSizes(int rilRat) { 82027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt String sizes = null; 8218fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String ratName = ServiceState.rilRadioTechnologyToString(rilRat).toLowerCase(Locale.ROOT); 8228fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // ServiceState gives slightly different names for EVDO tech ("evdo-rev.0" for ex) 8238fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // - patch it up: 8248fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0 || 8258fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A || 8268fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B) { 8278fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt ratName = "evdo"; 8288fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8298fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 8308fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // in the form: "ratname:rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max" 8318fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] configOverride = mPhone.getContext().getResources().getStringArray( 8328fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt com.android.internal.R.array.config_mobile_tcp_buffers); 8338fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt for (int i = 0; i < configOverride.length; i++) { 8348fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] split = configOverride[i].split(":"); 8358fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (ratName.equals(split[0]) && split.length == 2) { 8368fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = split[1]; 83727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt break; 8388fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8398fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8408fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 8418fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (sizes == null) { 8428fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // no override - use telephony defaults 8438fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // doing it this way allows device or carrier to just override the types they 8448fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // care about and inherit the defaults for the others. 8458fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt switch (rilRat) { 8468fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: 8478fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_GPRS; 8488fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8498fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: 8508fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EDGE; 8518fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8528fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: 8538fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_UMTS; 8548fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8558fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: 8568fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: 8578fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: 8588fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EVDO; 8598fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8608fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: 8618fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSDPA; 8628fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8638fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: 8648fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: 8658fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPA; 8668fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8678fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: 8688fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_LTE; 8698fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8708fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: 8718fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPAP; 8728fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8738fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt default: 8748fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // Leave empty - this will let ConnectivityService use the system default. 8758fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8768fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 87727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 87827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties.setTcpBufferSizes(sizes); 87927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 88027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 88162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkCapabilities makeNetworkCapabilities() { 88262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt NetworkCapabilities result = new NetworkCapabilities(); 88362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 88462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 88562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mApnSetting != null) { 88662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt for (String type : mApnSetting.types) { 88762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (type) { 888b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt case PhoneConstants.APN_TYPE_ALL: { 889fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 890fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 891fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 892fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 893fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 894fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 895fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 896b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt break; 897b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt } 89862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DEFAULT: { 899fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 90062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 90262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_MMS: { 903fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 90462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 90662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_SUPL: { 907fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 90862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DUN: { 911c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt ApnSetting securedDunApn = mDct.fetchDunApn(); 912c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt if (securedDunApn == null || securedDunApn.equals(mApnSetting)) { 913c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); 914c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt } 91562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 91662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_FOTA: { 918fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 91962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 92062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IMS: { 922fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 92362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 92462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_CBS: { 926fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 92762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 92862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IA: { 930fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 93162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 93262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 93462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93648579fcccf584fbddbff59eaae27d434316a4248Lorenzo Colitti ConnectivityManager.maybeMarkCapabilitiesRestricted(result); 93762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int up = 14; 93962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int down = 14; 94062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (mRilRat) { 94127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: up = 80; down = 80; break; 94227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: up = 59; down = 236; break; 94327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: up = 384; down = 384; break; 94427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A: // fall through 94527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B: up = 14; down = 14; break; 94627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: up = 153; down = 2457; break; 94727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: up = 1843; down = 3174; break; 94827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: up = 100; down = 100; break; 94927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: up = 2048; down = 14336; break; 95027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: up = 5898; down = 14336; break; 95127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: up = 5898; down = 14336; break; 95227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: up = 1843; down = 5017; break; 95327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: up = 51200; down = 102400; break; 95427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: up = 153; down = 2516; break; 95527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: up = 11264; down = 43008; break; 95662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 95762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 95862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkUpstreamBandwidthKbps(up); 95962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkDownstreamBandwidthKbps(down); 96062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return result; 96162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 96262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isIpAddress(String address) { 964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (address == null) return false; 965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return Patterns.IP_ADDRESS.matcher(address).matches(); 967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult setLinkProperties(DataCallResponse response, 970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp) { 971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if system property dns usable 972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean okToUseSystemPropertyDns = false; 973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String propertyPrefix = "net." + response.ifname + "."; 974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String dnsServers[] = new String[2]; 975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); 976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); 977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville okToUseSystemPropertyDns = isDnsOk(dnsServers); 978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return response.setLinkProperties(lp, okToUseSystemPropertyDns); 981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 9849a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * Initialize connection, this will fail if the 9859a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * apnSettings are not compatible. 9869a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * 9879a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @param cp the Connection paramemters 9889a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @return true if initialization was successful. 9899a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville */ 9909a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville private boolean initConnection(ConnectionParams cp) { 9919a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ApnContext apnContext = cp.mApnContext; 9929a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (mApnSetting == null) { 9939a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // Only change apn setting if it isn't set, it will 9949a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // only NOT be set only if we're in DcInactiveState. 9959a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnSetting = apnContext.getApnSetting(); 9969a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else if (mApnSetting.canHandleType(apnContext.getApnType())) { 9979a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // All is good. 9989a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 9999a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10009a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: incompatible apnSetting in ConnectionParams cp=" + cp 10019a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " dc=" + DataConnection.this); 10029a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10039a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return false; 10049a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10059a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mTag += 1; 10069a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams = cp; 10079a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams.mTag = mTag; 10089a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10099a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (!mApnContexts.contains(apnContext)) { 10109a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnContexts.add(apnContext); 10119a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10129a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville configureRetry(mApnSetting.canHandleType(PhoneConstants.APN_TYPE_DEFAULT)); 10139a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setRetryCount(0); 10149a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setCurMaxRetryCount(mConnectionParams.mInitialMaxRetry); 1015fcc57e87d1620ab7dc877d65e7e85dca77132054Wink Saville mRetryManager.setRetryForever(false); 10169a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10179a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10189a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: " 10199a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() 10209a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mApnList=" + mApnContexts 10219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mConnectionParams=" + mConnectionParams); 10229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return true; 10249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10259a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10269a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville /** 1027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The parent state for all other states. 1028ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1029ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDefaultState extends State { 1030ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: enter"); 1033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1034203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Register for DRS or RAT change 1035203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), 1036203e588e3c42a81aa8a56f595119c181a63b12caWink Saville DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); 1037203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 103862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().registerForRoamingOn(getHandler(), 103962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_ON, null); 104062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().registerForRoamingOff(getHandler(), 104162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null); 104262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Add ourselves to the list of data connections 1044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addDc(DataConnection.this); 1045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: exit"); 1049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 105046f190903e93c653b90b970c1a21159bb957575bWink Saville // Unregister for DRS or RAT change. 105146f190903e93c653b90b970c1a21159bb957575bWink Saville mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); 105246f190903e93c653b90b970c1a21159bb957575bWink Saville 105362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().unregisterForRoamingOn(getHandler()); 105462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().unregisterForRoamingOff(getHandler()); 105562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 105646f190903e93c653b90b970c1a21159bb957575bWink Saville // Remove ourselves from the DC lists 105746f190903e93c653b90b970c1a21159bb957575bWink Saville mDcController.removeDc(DataConnection.this); 1058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.disconnected(); 1061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = null; 1062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.dispose(); 1064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = null; 1065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = null; 1066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReconnectIntent = null; 1067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = null; 1068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 1069ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = null; 1070ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = null; 1071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = null; 1072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mUserData = null; 1073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = null; 1074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = null; 1075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal = HANDLED; 1080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefault msg=" + getWhatToString(msg.what) 1083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RefCount=" + mApnContexts.size()); 1084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 1087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("Disconnecting to previous connection mAc=" + mAc); 1089ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED); 1091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = new AsyncChannel(); 1093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.connected(null, getHandler(), msg.replyTo); 1094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected"); 1095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_SUCCESSFUL, mId, "hi"); 1097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 1101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("CMD_CHANNEL_DISCONNECTED"); 1102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quit(); 1103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1105454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_IS_INACTIVE: { 1106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean val = getIsInactive(); 1107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_IS_INACTIVE isInactive=" + val); 1108454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_IS_INACTIVE, val ? 1 : 0); 1109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1111454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_CID: { 1112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int cid = getCid(); 1113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_CID cid=" + cid); 1114454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_CID, cid); 1115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1117454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_APNSETTING: { 1118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting = getApnSetting(); 1119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_APNSETTING mApnSetting=" + apnSetting); 1120454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_APNSETTING, apnSetting); 1121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1123454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_LINK_PROPERTIES: { 1124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp = getCopyLinkProperties(); 1125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp); 1126454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_PROPERTIES, lp); 1127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1129454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: { 11309c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk ProxyInfo proxy = (ProxyInfo) msg.obj; 1131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy); 1132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLinkPropertiesHttpProxy(proxy); 1133454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY); 1134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1136f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt case DcAsyncChannel.REQ_GET_NETWORK_CAPABILITIES: { 1137f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities nc = getCopyNetworkCapabilities(); 1138f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (VDBG) log("REQ_GET_NETWORK_CAPABILITIES networkCapabilities" + nc); 1139f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_NETWORK_CAPABILITIES, nc); 1140f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt break; 1141f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 1142454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: msg.what=REQ_RESET"); 1144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); 1148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.UNKNOWN, false); 1150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT RefCount=" 1155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL RefCount=" 1163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_TEAR_DOWN_NOW: 1169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW"); 1170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, 0, null); 1171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: 1174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_LOST_CONNECTION" 1176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: 1182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_RETRY_CONNECTION" 1184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1189203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1190203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1191203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1192203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drsRatPair.first; 119327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt if (mRilRat != drsRatPair.second) { 119427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(drsRatPair.second); 119527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 1196203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = drsRatPair.second; 1197203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1198203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcDefaultState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1199203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " drs=" + mDataRegState 1200203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRilRat=" + mRilRat); 1201203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 120262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 120362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 120462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 120562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 120662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mNetworkAgent != null) { 120762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkCapabilities(makeNetworkCapabilities()); 120862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 120927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 121062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 121162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 121262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 121362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: 121462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 121562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 121662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 121762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: 121862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 1219203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1220203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState: shouldn't happen but ignore msg.what=" 1224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDefaultState mDefaultState = new DcDefaultState(); 1233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is inactive and expects a EVENT_CONNECT. 1236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcInactiveState extends State { 1238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed connecting 1239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(ConnectionParams cp, DcFailCause cause) { 1240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams cp,cause"); 1241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = cp; 1242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed disconnected 1247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DisconnectParams dp) { 1248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams dp"); 1249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts of the failure cause 1255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DcFailCause cause) { 1256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag += 1; 1264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: enter() mTag=" + mTag); 1265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != null) { 1267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyConnectCompleted +ALL failCause=" 1269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(mConnectionParams, mDcFailCause, true); 1272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams != null) { 1274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyDisconnectCompleted +ALL failCause=" 1276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(mDisconnectParams, true); 1279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams == null && mConnectionParams == null && mDcFailCause != null) { 1281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyAllDisconnectCompleted failCause=" 1283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllDisconnectCompleted(mDcFailCause); 1286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from cid mapping, before clearSettings 1289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville clearSettings(); 1292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1303454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset"); 1306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 13119a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcInactiveState: mag.what=EVENT_CONNECT"); 13129a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 13139a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 13149a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 13159a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 13169a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 13179a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 13189a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcInactiveState: msg.what=EVENT_CONNECT initConnection failed"); 13199a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 13209a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 13219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 1322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT"); 1328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL"); 1334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState nothandled msg.what=" + getWhatToString(msg.what)); 1341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcInactiveState mInactiveState = new DcInactiveState(); 1349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is retrying and expects a EVENT_RETRY_CONNECTION. 1352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcRetryingState extends State { 1354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1355ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1356203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if ((mConnectionParams.mRilRat != mRilRat) 1357203e588e3c42a81aa8a56f595119c181a63b12caWink Saville || (mDataRegState != ServiceState.STATE_IN_SERVICE)){ 1358203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // RAT has changed or we're not in service so don't even begin retrying. 1359203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1360203e588e3c42a81aa8a56f595119c181a63b12caWink Saville String s = "DcRetryingState: enter() not retrying rat changed" 1361203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + ", mConnectionParams.mRilRat=" + mConnectionParams.mRilRat 1362203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " != mRilRat:" + mRilRat 1363203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " transitionTo(mInactiveState)"; 1364203e588e3c42a81aa8a56f595119c181a63b12caWink Saville logAndAddLogRec(s); 1365203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1366203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1367203e588e3c42a81aa8a56f595119c181a63b12caWink Saville transitionTo(mInactiveState); 1368203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } else { 1369203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1370203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcRetryingState: enter() mTag=" + mTag 1371203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + ", call notifyAllOfDisconnectDcRetrying lostConnection"); 1372203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1374203e588e3c42a81aa8a56f595119c181a63b12caWink Saville notifyAllOfDisconnectDcRetrying(Phone.REASON_LOST_DATA_CONNECTION); 1375ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1376203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Remove ourselves from cid mapping 1377203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1378203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mCid = -1; 1379203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1386ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1387203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1388203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1389203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1390203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int drs = drsRatPair.first; 1391203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int rat = drsRatPair.second; 1392203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if ((rat == mRilRat) && (drs == mDataRegState)) { 1393203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1394203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcRetryingState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1395203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " strange no change in drs=" + drs 1396203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " rat=" + rat + " ignoring"); 1397203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1398203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } else { 139912fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao // have to retry connecting since no attach event will come 140012fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao if (mConnectionParams.mRetryWhenSSChange) { 140112fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao retVal = NOT_HANDLED; 140212fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao break; 140312fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao } 1404203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // We've lost the connection and we're retrying but DRS or RAT changed 1405203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // so we may never succeed, might as well give up. 1406203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1407203e588e3c42a81aa8a56f595119c181a63b12caWink Saville deferMessage(msg); 1408203e588e3c42a81aa8a56f595119c181a63b12caWink Saville transitionTo(mInactiveState); 1409203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1410203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1411203e588e3c42a81aa8a56f595119c181a63b12caWink Saville String s = "DcRetryingState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1412203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " giving up changed from " + mRilRat 1413203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " to rat=" + rat 1414203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " or drs changed from " + mDataRegState + " to drs=" + drs; 1415203e588e3c42a81aa8a56f595119c181a63b12caWink Saville logAndAddLogRec(s); 1416203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1417203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drs; 1418203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rat; 141962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt // TODO - pass the other type here too? 142062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 142162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 142262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 142362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 1424203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1425203e588e3c42a81aa8a56f595119c181a63b12caWink Saville retVal = HANDLED; 1426203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1427203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: { 1429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 == mTag) { 1430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.increaseRetryCount(); 1431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState EVENT_RETRY_CONNECTION" 1433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RetryCount=" + mRetryManager.getRetryCount() 1434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville onConnect(mConnectionParams); 1437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActivatingState); 1438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState stale EVENT_RETRY_CONNECTION" 1441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + msg.arg1 + " != mTag:" + mTag); 1442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1447454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: { 1448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState: msg.what=RSP_RESET, ignore we're already reset"); 1450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(mConnectionParams, 1452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.RESET_BY_FRAMEWORK); 1453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 14589a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 14609a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT" 14619a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() + " cp=" + cp 1462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 14649a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 14659a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 14669a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 14679a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 14689a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 14699a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT initConnection failed"); 14709a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 14719a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 14729a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 14739a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 1474ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.remove(dp.mApnContext) && mApnContexts.size() == 0) { 1481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT " + " RefCount=" 1483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size() + " dp=" + dp); 1484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(dp); 1486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 14889a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcRetryingState: msg.what=EVENT_DISCONNECT"); 1489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT/DISCONNECT_ALL " 1497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "RefCount=" + mApnContexts.size()); 1498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: { 1505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState nothandled msg.what=" + getWhatToString(msg.what)); 1507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcRetryingState mRetryingState = new DcRetryingState(); 1516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is activating a connection. 1519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActivatingState extends State { 1521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 1525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp; 1526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActivatingState: msg=" + msgToString(msg)); 1528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1529203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1531203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Activating can't process until we're done. 1532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_SETUP_DATA_CONNECTION_DONE: 1537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar); 1541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result != DataCallResponse.SetupResult.ERR_Stale) { 1542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:"+ mConnectionParams 1544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1547c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1548c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState onSetupConnectionCompleted result=" + result 1549c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1550c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (result) { 1552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case SUCCESS: 1553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // All is well 1554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActiveState); 1556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_BadCommand: 1558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Vendor ril rejected the command and didn't connect. 1559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_UnacceptableParameter: 1565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The addresses given from the RIL are bad 1566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(cp); 1567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingErrorCreatingConnection); 1568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_GetLastErrorFromRil: 1570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Request failed and this is an old RIL 1571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.getLastDataCallFailCause( 1572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp)); 1573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_RilError: 1575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delay = mDcRetryAlarmController.getSuggestedRetryTime( 1576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection.this, ar); 1577c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1578c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState: ERR_RilError " 1579c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " delay=" + delay 1580979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 1581979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result=" + result 1582979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result.isRestartRadioFail=" + 1583979786625e7ceacf4a545a25704ef8a15338a854Wink Saville result.mFailCause.isRestartRadioFail() 1584979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result.isPermanentFail=" + 1585979786625e7ceacf4a545a25704ef8a15338a854Wink Saville result.mFailCause.isPermanentFail()); 1586c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1587979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (result.mFailCause.isRestartRadioFail()) { 1588979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError restart radio"); 1589979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mDct.sendRestartRadio(); 1590979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1591979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1592979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (result.mFailCause.isPermanentFail()) { 1593979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError perm error"); 1594979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1595979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1596979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (delay >= 0) { 1597979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError retry"); 1598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, 1599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag, delay); 1600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1602979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError no retry"); 1603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_Stale: 1608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_SETUP_DATA_CONNECTION_DONE" 1609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville throw new RuntimeException("Unknown SetupResult, should not happen"); 1613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_GET_LAST_FAIL_DONE: 1618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:" + mConnectionParams 1623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause cause = DcFailCause.UNKNOWN; 1627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 1629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int rilFailCause = ((int[]) (ar.result))[0]; 1630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = DcFailCause.fromInt(rilFailCause); 16311db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (cause == DcFailCause.NONE) { 16321db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (DBG) { 16331db7da14111228a5079d2970d7d0ce34173000b5Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 16341db7da14111228a5079d2970d7d0ce34173000b5Wink Saville + " BAD: error was NONE, change to UNKNOWN"); 16351db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 16361db7da14111228a5079d2970d7d0ce34173000b5Wink Saville cause = DcFailCause.UNKNOWN; 16371db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 1638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int retryDelay = mRetryManager.getRetryTimer(); 1642c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1643c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 1644c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " cause=" + cause 1645c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " retryDelay=" + retryDelay 1646c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 1647c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1648c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1649979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (cause.isRestartRadioFail()) { 1650979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) { 1651979786625e7ceacf4a545a25704ef8a15338a854Wink Saville log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE" 1652979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " restart radio"); 1653979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } 1654979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mDct.sendRestartRadio(); 1655979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1656979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1657979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (cause.isPermanentFail()) { 1658979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE perm er"); 1659979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1660979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1661979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if ((retryDelay >= 0) && (mRetryManager.isRetryNeeded())) { 1662979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE retry"); 1663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retryDelay); 1665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1667979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE no retry"); 1668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_GET_LAST_FAIL_DONE" 1673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActivatingState not handled msg.what=" + 1682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville getWhatToString(msg.what) + " RefCount=" + mApnContexts.size()); 1683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActivatingState mActivatingState = new DcActivatingState(); 1691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is connected, expecting an EVENT_DISCONNECT. 1694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActiveState extends State { 1696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override public void enter() { 1697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: enter dc=" + DataConnection.this); 1698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.getRetryCount() != 0) { 1700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState: connected after retrying call notifyAllOfConnected"); 1701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.setRetryCount(0); 1702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If we were retrying there maybe more than one, otherwise they'll only be one. 1704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllOfConnected(Phone.REASON_CONNECTED); 1705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If the EVENT_CONNECT set the current max retry restore it here 1707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // if it didn't then this is effectively a NOP. 1708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.restoreCurMaxRetryCount(); 1709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addActiveDcByCid(DataConnection.this); 171062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 171162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, 171262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getReason(), null); 171362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setExtraInfo(mApnSetting.apn); 171427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 171562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(), 171662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt "DcNetworkAgent", mNetworkInfo, makeNetworkCapabilities(), mLinkProperties, 171762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 50); 1718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1721ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1722ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: exit dc=" + this); 172362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, 172462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getReason(), mNetworkInfo.getExtraInfo()); 172562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 172662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent = null; 1727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1730ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1731ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1732ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1733ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1734ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 1735ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1736c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1737c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this); 1738c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.contains(cp.mApnContext)) { 1740c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState ERROR already added apnContext=" + cp.mApnContext); 1741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.add(cp.mApnContext); 1743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_CONNECT RefCount=" 1745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1746ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1747ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1748ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.NONE, false); 1749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1753ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1754c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1755c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_DISCONNECT dp=" + dp 1756c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1757c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1758ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.contains(dp.mApnContext)) { 1759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" 1761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.size() == 1) { 1765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 1766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.remove(dp.mApnContext); 1773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState ERROR no such apnContext=" + dp.mApnContext 1777c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " in this dc=" + DataConnection.this); 1778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1783ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1784ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1785c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_DISCONNECT clearing apn contexts," 1786c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1788ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1789ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1790ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1791ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1792ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1793ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1794ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1795ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1796ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1797ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: { 1798c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1799c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_LOST_CONNECTION dc=" + DataConnection.this); 1800c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.isRetryNeeded()) { 1802ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // We're going to retry 1803ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delayMillis = mRetryManager.getRetryTimer(); 1804ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1805ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState EVENT_LOST_CONNECTION startRetryAlarm" 1806ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag + " delay=" + delayMillis + "ms"); 1807ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1808ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1809ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville delayMillis); 1810ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1811ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1812ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1813ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1814ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1815ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1816ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1817ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 181862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: { 181962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 182062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 182162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 182262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 182362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 182462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: { 182562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 182662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 182762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 182862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 182962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 1830ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1831ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1832ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState not handled msg.what=" + getWhatToString(msg.what)); 1833ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1834ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1835ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1836ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1837ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1838ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1839ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1840ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActiveState mActiveState = new DcActiveState(); 1841ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1842ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1843ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting. 1844ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1845ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectingState extends State { 1846ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1847ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1848ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1849ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1850ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1851ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1852ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " 1853ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1854ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1855ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1856ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1857ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1858ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1859ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount=" 1860ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1861ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1862ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) ar.userObj; 1863ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp.mTag == mTag) { 1864ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1865ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1866ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj); 1867ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1868ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1869ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectState stale EVENT_DEACTIVATE_DONE" 1870ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + dp.mTag + " mTag=" + mTag); 1871ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1872ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1873ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1874ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1875ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1876ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1877ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectingState not handled msg.what=" 1878ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1879ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1880ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1881ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1882ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1883ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1884ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1885ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1886ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectingState mDisconnectingState = new DcDisconnectingState(); 1887ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1888ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1889ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting after an creating a connection. 1890ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1891ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectionErrorCreatingConnection extends State { 1892ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1894ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1895ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1896ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1897ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1898ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1899ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 1900ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1901ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1902ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection" + 1903ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " msg.what=EVENT_DEACTIVATE_DONE"); 1904ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1905ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1906ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1907ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1908ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, 1909ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER); 1910ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1911ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1912ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1913ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection stale EVENT_DEACTIVATE_DONE" 1914ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + cp.mTag + ", mTag=" + mTag); 1915ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1916ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1918ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1919ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1920ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1921ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1922ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection not handled msg.what=" 1923ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1924ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1925ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1926ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1927ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1928ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1929ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1930ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1931ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection = 1932ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new DcDisconnectionErrorCreatingConnection(); 1933ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 193462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 193562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private class DcNetworkAgent extends NetworkAgent { 193662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt public DcNetworkAgent(Looper l, Context c, String TAG, NetworkInfo ni, 193762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt NetworkCapabilities nc, LinkProperties lp, int score) { 193862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt super(l, c, TAG, ni, nc, lp, score); 193962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 194062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 194162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt protected void unwanted() { 19421484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (mNetworkAgent != this) { 19431484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt log("unwanted found mNetworkAgent=" + mNetworkAgent + 19441484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt ", which isn't me. Aborting unwanted"); 19451484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt return; 19461484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt } 19474a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt // this can only happen if our exit has been called - we're already disconnected 19484a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt if (mApnContexts == null) return; 1949305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt for (ApnContext apnContext : mApnContexts) { 1950305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt Message msg = mDct.obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, apnContext); 1951305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DisconnectParams dp = new DisconnectParams(apnContext, apnContext.getReason(), msg); 1952305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DataConnection.this.sendMessage(DataConnection.this. 1953305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt obtainMessage(EVENT_DISCONNECT, dp)); 1954305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt } 195562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 195662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 195762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1958ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ******* "public" interface 1959ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1960ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1961ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used for testing purposes. 1962ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* package */ void tearDownNow() { 1964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownNow()"); 1965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_TEAR_DOWN_NOW)); 1966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return the string for msg.what as our info. 1970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected String getWhatToString(int what) { 1973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return cmdToString(what); 1974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String msgToString(Message msg) { 1977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retVal; 1978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg == null) { 1979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = "null"; 1980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville StringBuilder b = new StringBuilder(); 1982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("{what="); 1984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(cmdToString(msg.what)); 1985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" when="); 1987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis(), b); 1988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 != 0) { 1990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg1="); 1991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg1); 1992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg2 != 0) { 1995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg2="); 1996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg2); 1997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj != null) { 2000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" obj="); 2001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.obj); 2002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" target="); 2005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.getTarget()); 2006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" replyTo="); 2008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.replyTo); 2009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("}"); 2011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = b.toString(); 2013ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 2015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2017ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static void slog(String s) { 2018ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d("DC", s); 2019ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2020ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2021ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2022ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug 2023ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2024ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2026cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2027cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void log(String s) { 2028cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.d(getName(), s); 20290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug attribute 2033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2034ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2036ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logd(String s) { 2038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(getName(), s); 2039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 20400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with verbose attribute 2043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logv(String s) { 2048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.v(getName(), s); 2049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2050ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with info attribute 2053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logi(String s) { 2058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.i(getName(), s); 2059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with warning attribute 2063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logw(String s) { 2068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.w(getName(), s); 20690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s) { 2078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s); 2079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param e is a Throwable which logs additional information. 2086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s, Throwable e) { 2089ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s, e); 2090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Doesn't print mApnList of ApnContext's which would be recursive */ 2093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toStringSimple() { 2094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getName() + ": State=" + getCurrentState().getName() 2095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size() 2096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mCid=" + mCid + " mCreateTime=" + mCreateTime 2097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastastFailTime=" + mLastFailTime 2098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastFailCause=" + mLastFailCause 2099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag 2100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mRetryManager=" + mRetryManager 2101f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt + " mLinkProperties=" + mLinkProperties 210262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt + " linkCapabilities=" + makeNetworkCapabilities(); 2103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 2107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{" + toStringSimple() + " mApnContexts=" + mApnContexts + "}"; 2108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Dump the current state. 2112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param fd 2114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param pw 2115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param args 2116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 21170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 21180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 2119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.print("DataConnection "); 21200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 2121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts.size=" + mApnContexts.size()); 2122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts=" + mApnContexts); 2123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDataConnectionTracker=" + mDct); 2125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnSetting=" + mApnSetting); 2126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mTag=" + mTag); 2127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCid=" + mCid); 2128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mRetryManager=" + mRetryManager); 2129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mConnectionParams=" + mConnectionParams); 2130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDisconnectParams=" + mDisconnectParams); 2131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcFailCause=" + mDcFailCause); 2132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mPhone=" + mPhone); 2134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLinkProperties=" + mLinkProperties); 2136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2137203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mDataRegState=" + mDataRegState); 2138203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mRilRat=" + mRilRat); 213962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt pw.println(" mNetworkCapabilities=" + makeNetworkCapabilities()); 2140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime)); 2141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime)); 2142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailCause=" + mLastFailCause); 2143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mUserData=" + mUserData); 2145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mInstanceNumber=" + mInstanceNumber); 2146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mAc=" + mAc); 2147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcRetryAlarmController=" + mDcRetryAlarmController); 2148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 21490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2151