DataConnection.java revision edb419cf73826d033065919f63e4ffdd7d76db81
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"; 812d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao private static final String TCP_BUFFER_SIZES_1XRTT= "16384,32768,131072,4096,16384,102400"; 81327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EVDO = "4094,87380,262144,4096,16384,262144"; 814d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao private static final String TCP_BUFFER_SIZES_EHRPD= "131072,262144,1048576,4096,16384,524288"; 81527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSDPA= "61167,367002,1101005,8738,52429,262114"; 81627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPA = "40778,244668,734003,16777,100663,301990"; 81727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_LTE = 81827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt "524288,1048576,2097152,262144,524288,1048576"; 81927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPAP= "122334,734003,2202010,32040,192239,576717"; 82027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 82127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private void updateTcpBufferSizes(int rilRat) { 82227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt String sizes = null; 8238fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String ratName = ServiceState.rilRadioTechnologyToString(rilRat).toLowerCase(Locale.ROOT); 8248fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // ServiceState gives slightly different names for EVDO tech ("evdo-rev.0" for ex) 8258fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // - patch it up: 8268fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0 || 8278fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A || 8288fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B) { 8298fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt ratName = "evdo"; 8308fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8318fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 8328fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // in the form: "ratname:rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max" 8338fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] configOverride = mPhone.getContext().getResources().getStringArray( 8348fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt com.android.internal.R.array.config_mobile_tcp_buffers); 8358fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt for (int i = 0; i < configOverride.length; i++) { 8368fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] split = configOverride[i].split(":"); 8378fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (ratName.equals(split[0]) && split.length == 2) { 8388fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = split[1]; 83927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt break; 8408fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8418fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8428fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 8438fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (sizes == null) { 8448fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // no override - use telephony defaults 8458fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // doing it this way allows device or carrier to just override the types they 8468fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // care about and inherit the defaults for the others. 8478fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt switch (rilRat) { 8488fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: 8498fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_GPRS; 8508fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8518fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: 8528fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EDGE; 8538fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8548fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: 8558fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_UMTS; 8568fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 857d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: 858d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao sizes = TCP_BUFFER_SIZES_1XRTT; 859d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao break; 8608fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: 8618fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: 8628fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: 8638fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EVDO; 8648fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 865d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: 866d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao sizes = TCP_BUFFER_SIZES_EHRPD; 867d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao break; 8688fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: 8698fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSDPA; 8708fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8718fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: 8728fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: 8738fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPA; 8748fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8758fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: 8768fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_LTE; 8778fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8788fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: 8798fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPAP; 8808fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8818fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt default: 8828fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // Leave empty - this will let ConnectivityService use the system default. 8838fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8848fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 88527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 88627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties.setTcpBufferSizes(sizes); 88727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 88827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 88962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkCapabilities makeNetworkCapabilities() { 89062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt NetworkCapabilities result = new NetworkCapabilities(); 89162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 89262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 89362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mApnSetting != null) { 89462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt for (String type : mApnSetting.types) { 89562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (type) { 896b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt case PhoneConstants.APN_TYPE_ALL: { 897fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 898fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 899fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 900fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 901fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 902fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 903fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 904b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt break; 905b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt } 90662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DEFAULT: { 907fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 90862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_MMS: { 911fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 91262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 91362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_SUPL: { 915fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 91662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 91762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DUN: { 919c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt ApnSetting securedDunApn = mDct.fetchDunApn(); 920c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt if (securedDunApn == null || securedDunApn.equals(mApnSetting)) { 921c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); 922c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt } 92362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 92462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_FOTA: { 926fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 92762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 92862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IMS: { 930fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 93162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 93262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_CBS: { 934fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 93562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 93662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IA: { 938fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 93962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 94062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 94162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 94262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 94362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 94448579fcccf584fbddbff59eaae27d434316a4248Lorenzo Colitti ConnectivityManager.maybeMarkCapabilitiesRestricted(result); 94562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 94662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int up = 14; 94762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int down = 14; 94862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (mRilRat) { 94927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: up = 80; down = 80; break; 95027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: up = 59; down = 236; break; 95127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: up = 384; down = 384; break; 95227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A: // fall through 95327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B: up = 14; down = 14; break; 95427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: up = 153; down = 2457; break; 95527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: up = 1843; down = 3174; break; 95627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: up = 100; down = 100; break; 95727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: up = 2048; down = 14336; break; 95827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: up = 5898; down = 14336; break; 95927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: up = 5898; down = 14336; break; 96027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: up = 1843; down = 5017; break; 96127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: up = 51200; down = 102400; break; 96227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: up = 153; down = 2516; break; 96327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: up = 11264; down = 43008; break; 96462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 96562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 96662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkUpstreamBandwidthKbps(up); 96762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkDownstreamBandwidthKbps(down); 968edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt 969edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt result.setNetworkSpecifier(Integer.toString(mPhone.getSubId())); 970edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt 97162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return result; 97262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 97362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isIpAddress(String address) { 975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (address == null) return false; 976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return Patterns.IP_ADDRESS.matcher(address).matches(); 978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult setLinkProperties(DataCallResponse response, 981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp) { 982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if system property dns usable 983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean okToUseSystemPropertyDns = false; 984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String propertyPrefix = "net." + response.ifname + "."; 985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String dnsServers[] = new String[2]; 986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); 987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); 988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville okToUseSystemPropertyDns = isDnsOk(dnsServers); 989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return response.setLinkProperties(lp, okToUseSystemPropertyDns); 992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 9959a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * Initialize connection, this will fail if the 9969a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * apnSettings are not compatible. 9979a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * 9989a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @param cp the Connection paramemters 9999a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @return true if initialization was successful. 10009a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville */ 10019a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville private boolean initConnection(ConnectionParams cp) { 10029a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ApnContext apnContext = cp.mApnContext; 10039a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (mApnSetting == null) { 10049a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // Only change apn setting if it isn't set, it will 10059a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // only NOT be set only if we're in DcInactiveState. 10069a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnSetting = apnContext.getApnSetting(); 1007bc1e44907073900212fb87da372174483525f3edJay Shrauner } 1008bc1e44907073900212fb87da372174483525f3edJay Shrauner if (mApnSetting == null || !mApnSetting.canHandleType(apnContext.getApnType())) { 10099a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10109a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: incompatible apnSetting in ConnectionParams cp=" + cp 10119a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " dc=" + DataConnection.this); 10129a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10139a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return false; 10149a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10159a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mTag += 1; 10169a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams = cp; 10179a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams.mTag = mTag; 10189a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10199a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (!mApnContexts.contains(apnContext)) { 10209a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnContexts.add(apnContext); 10219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville configureRetry(mApnSetting.canHandleType(PhoneConstants.APN_TYPE_DEFAULT)); 10239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setRetryCount(0); 10249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setCurMaxRetryCount(mConnectionParams.mInitialMaxRetry); 1025fcc57e87d1620ab7dc877d65e7e85dca77132054Wink Saville mRetryManager.setRetryForever(false); 10269a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10279a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10289a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: " 10299a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() 10309a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mApnList=" + mApnContexts 10319a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mConnectionParams=" + mConnectionParams); 10329a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10339a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return true; 10349a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10359a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10369a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville /** 1037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The parent state for all other states. 1038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDefaultState extends State { 1040ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: enter"); 1043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1044203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Register for DRS or RAT change 1045203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), 1046203e588e3c42a81aa8a56f595119c181a63b12caWink Saville DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); 1047203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 104862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().registerForRoamingOn(getHandler(), 104962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_ON, null); 105062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().registerForRoamingOff(getHandler(), 105162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null); 105262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Add ourselves to the list of data connections 1054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addDc(DataConnection.this); 1055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: exit"); 1059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 106046f190903e93c653b90b970c1a21159bb957575bWink Saville // Unregister for DRS or RAT change. 106146f190903e93c653b90b970c1a21159bb957575bWink Saville mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); 106246f190903e93c653b90b970c1a21159bb957575bWink Saville 106362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().unregisterForRoamingOn(getHandler()); 106462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().unregisterForRoamingOff(getHandler()); 106562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 106646f190903e93c653b90b970c1a21159bb957575bWink Saville // Remove ourselves from the DC lists 106746f190903e93c653b90b970c1a21159bb957575bWink Saville mDcController.removeDc(DataConnection.this); 1068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1069ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1070ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.disconnected(); 1071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = null; 1072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.dispose(); 1074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = null; 1075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = null; 1076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReconnectIntent = null; 1077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = null; 1078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 1079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = null; 1080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = null; 1081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = null; 1082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mUserData = null; 1083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = null; 1084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = null; 1085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1089ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal = HANDLED; 1090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefault msg=" + getWhatToString(msg.what) 1093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RefCount=" + mApnContexts.size()); 1094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 1097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("Disconnecting to previous connection mAc=" + mAc); 1099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED); 1101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = new AsyncChannel(); 1103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.connected(null, getHandler(), msg.replyTo); 1104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected"); 1105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_SUCCESSFUL, mId, "hi"); 1107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 1111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("CMD_CHANNEL_DISCONNECTED"); 1112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quit(); 1113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1115454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_IS_INACTIVE: { 1116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean val = getIsInactive(); 1117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_IS_INACTIVE isInactive=" + val); 1118454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_IS_INACTIVE, val ? 1 : 0); 1119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1121454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_CID: { 1122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int cid = getCid(); 1123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_CID cid=" + cid); 1124454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_CID, cid); 1125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1127454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_APNSETTING: { 1128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting = getApnSetting(); 1129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_APNSETTING mApnSetting=" + apnSetting); 1130454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_APNSETTING, apnSetting); 1131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1133454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_LINK_PROPERTIES: { 1134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp = getCopyLinkProperties(); 1135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp); 1136454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_PROPERTIES, lp); 1137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1139454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: { 11409c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk ProxyInfo proxy = (ProxyInfo) msg.obj; 1141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy); 1142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLinkPropertiesHttpProxy(proxy); 1143454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY); 1144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1146f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt case DcAsyncChannel.REQ_GET_NETWORK_CAPABILITIES: { 1147f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities nc = getCopyNetworkCapabilities(); 1148f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (VDBG) log("REQ_GET_NETWORK_CAPABILITIES networkCapabilities" + nc); 1149f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_NETWORK_CAPABILITIES, nc); 1150f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt break; 1151f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 1152454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: msg.what=REQ_RESET"); 1154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); 1158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.UNKNOWN, false); 1160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT RefCount=" 1165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL RefCount=" 1173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_TEAR_DOWN_NOW: 1179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW"); 1180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, 0, null); 1181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: 1184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_LOST_CONNECTION" 1186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: 1192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_RETRY_CONNECTION" 1194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1199203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1200203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1201203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1202203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drsRatPair.first; 120327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt if (mRilRat != drsRatPair.second) { 120427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(drsRatPair.second); 120527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 1206203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = drsRatPair.second; 1207203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1208203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcDefaultState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1209203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " drs=" + mDataRegState 1210203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRilRat=" + mRilRat); 1211203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 121262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 121362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 121462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 121562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 121662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mNetworkAgent != null) { 121762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkCapabilities(makeNetworkCapabilities()); 121862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 121927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 122062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 122162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 122262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 122362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: 122462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 122562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 122662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 122762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: 122862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 1229203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1230203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState: shouldn't happen but ignore msg.what=" 1234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDefaultState mDefaultState = new DcDefaultState(); 1243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is inactive and expects a EVENT_CONNECT. 1246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcInactiveState extends State { 1248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed connecting 1249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(ConnectionParams cp, DcFailCause cause) { 1250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams cp,cause"); 1251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = cp; 1252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed disconnected 1257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DisconnectParams dp) { 1258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams dp"); 1259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts of the failure cause 1265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DcFailCause cause) { 1266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag += 1; 1274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: enter() mTag=" + mTag); 1275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != null) { 1277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyConnectCompleted +ALL failCause=" 1279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(mConnectionParams, mDcFailCause, true); 1282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams != null) { 1284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyDisconnectCompleted +ALL failCause=" 1286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(mDisconnectParams, true); 1289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams == null && mConnectionParams == null && mDcFailCause != null) { 1291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyAllDisconnectCompleted failCause=" 1293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllDisconnectCompleted(mDcFailCause); 1296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from cid mapping, before clearSettings 1299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville clearSettings(); 1302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1313454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset"); 1316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1318ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1319ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 13219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcInactiveState: mag.what=EVENT_CONNECT"); 13229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 13239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 13249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 13259a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 13269a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 13279a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 13289a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcInactiveState: msg.what=EVENT_CONNECT initConnection failed"); 13299a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 13309a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 13319a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 1332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT"); 1338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL"); 1344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState nothandled msg.what=" + getWhatToString(msg.what)); 1351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1355ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1356ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1357ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1358ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcInactiveState mInactiveState = new DcInactiveState(); 1359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1360ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is retrying and expects a EVENT_RETRY_CONNECTION. 1362ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1363ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcRetryingState extends State { 1364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1365ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1366203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if ((mConnectionParams.mRilRat != mRilRat) 1367203e588e3c42a81aa8a56f595119c181a63b12caWink Saville || (mDataRegState != ServiceState.STATE_IN_SERVICE)){ 1368203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // RAT has changed or we're not in service so don't even begin retrying. 1369203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1370203e588e3c42a81aa8a56f595119c181a63b12caWink Saville String s = "DcRetryingState: enter() not retrying rat changed" 1371203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + ", mConnectionParams.mRilRat=" + mConnectionParams.mRilRat 1372203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " != mRilRat:" + mRilRat 1373203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " transitionTo(mInactiveState)"; 1374203e588e3c42a81aa8a56f595119c181a63b12caWink Saville logAndAddLogRec(s); 1375203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1376203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1377203e588e3c42a81aa8a56f595119c181a63b12caWink Saville transitionTo(mInactiveState); 1378203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } else { 1379203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1380203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcRetryingState: enter() mTag=" + mTag 1381203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + ", call notifyAllOfDisconnectDcRetrying lostConnection"); 1382203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1384203e588e3c42a81aa8a56f595119c181a63b12caWink Saville notifyAllOfDisconnectDcRetrying(Phone.REASON_LOST_DATA_CONNECTION); 1385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1386203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Remove ourselves from cid mapping 1387203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1388203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mCid = -1; 1389203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1390ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1397203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1398203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1399203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1400203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int drs = drsRatPair.first; 1401203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int rat = drsRatPair.second; 1402203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if ((rat == mRilRat) && (drs == mDataRegState)) { 1403203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1404203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcRetryingState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1405203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " strange no change in drs=" + drs 1406203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " rat=" + rat + " ignoring"); 1407203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1408203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } else { 140912fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao // have to retry connecting since no attach event will come 141012fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao if (mConnectionParams.mRetryWhenSSChange) { 141112fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao retVal = NOT_HANDLED; 141212fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao break; 141312fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao } 1414203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // We've lost the connection and we're retrying but DRS or RAT changed 1415203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // so we may never succeed, might as well give up. 1416203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1417203e588e3c42a81aa8a56f595119c181a63b12caWink Saville deferMessage(msg); 1418203e588e3c42a81aa8a56f595119c181a63b12caWink Saville transitionTo(mInactiveState); 1419203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1420203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1421203e588e3c42a81aa8a56f595119c181a63b12caWink Saville String s = "DcRetryingState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1422203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " giving up changed from " + mRilRat 1423203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " to rat=" + rat 1424203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " or drs changed from " + mDataRegState + " to drs=" + drs; 1425203e588e3c42a81aa8a56f595119c181a63b12caWink Saville logAndAddLogRec(s); 1426203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1427203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drs; 1428203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rat; 142962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt // TODO - pass the other type here too? 143062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 143162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 143262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 143362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 1434203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1435203e588e3c42a81aa8a56f595119c181a63b12caWink Saville retVal = HANDLED; 1436203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1437203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: { 1439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 == mTag) { 1440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.increaseRetryCount(); 1441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState EVENT_RETRY_CONNECTION" 1443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RetryCount=" + mRetryManager.getRetryCount() 1444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville onConnect(mConnectionParams); 1447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActivatingState); 1448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState stale EVENT_RETRY_CONNECTION" 1451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + msg.arg1 + " != mTag:" + mTag); 1452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1457454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: { 1458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState: msg.what=RSP_RESET, ignore we're already reset"); 1460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(mConnectionParams, 1462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.RESET_BY_FRAMEWORK); 1463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1465ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1466ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 14689a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1469ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 14709a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT" 14719a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() + " cp=" + cp 1472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 14749a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 14759a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 14769a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 14779a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 14789a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 14799a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT initConnection failed"); 14809a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 14819a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 14829a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 14839a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 1484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.remove(dp.mApnContext) && mApnContexts.size() == 0) { 1491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT " + " RefCount=" 1493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size() + " dp=" + dp); 1494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(dp); 1496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 14989a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcRetryingState: msg.what=EVENT_DISCONNECT"); 1499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT/DISCONNECT_ALL " 1507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "RefCount=" + mApnContexts.size()); 1508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: { 1515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState nothandled msg.what=" + getWhatToString(msg.what)); 1517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcRetryingState mRetryingState = new DcRetryingState(); 1526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is activating a connection. 1529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActivatingState extends State { 1531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 1535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp; 1536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActivatingState: msg=" + msgToString(msg)); 1538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1539203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1541203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Activating can't process until we're done. 1542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_SETUP_DATA_CONNECTION_DONE: 1547ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar); 1551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result != DataCallResponse.SetupResult.ERR_Stale) { 1552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:"+ mConnectionParams 1554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1557c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1558c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState onSetupConnectionCompleted result=" + result 1559c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1560c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (result) { 1562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case SUCCESS: 1563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // All is well 1564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActiveState); 1566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_BadCommand: 1568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Vendor ril rejected the command and didn't connect. 1569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_UnacceptableParameter: 1575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The addresses given from the RIL are bad 1576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(cp); 1577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingErrorCreatingConnection); 1578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_GetLastErrorFromRil: 1580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Request failed and this is an old RIL 1581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.getLastDataCallFailCause( 1582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp)); 1583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_RilError: 1585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delay = mDcRetryAlarmController.getSuggestedRetryTime( 1586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection.this, ar); 1587c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1588c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState: ERR_RilError " 1589c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " delay=" + delay 1590979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 1591979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result=" + result 1592979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result.isRestartRadioFail=" + 1593796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan result.mFailCause.isRestartRadioFail() 1594979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result.isPermanentFail=" + 1595796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan mDct.isPermanentFail(result.mFailCause)); 1596c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1597979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (result.mFailCause.isRestartRadioFail()) { 1598979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError restart radio"); 1599979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mDct.sendRestartRadio(); 1600979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1601979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1602796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan } else if (mDct.isPermanentFail(result.mFailCause)) { 1603979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError perm error"); 1604979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1605979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1606979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (delay >= 0) { 1607979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError retry"); 1608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, 1609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag, delay); 1610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1612979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError no retry"); 1613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_Stale: 1618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_SETUP_DATA_CONNECTION_DONE" 1619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville throw new RuntimeException("Unknown SetupResult, should not happen"); 1623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_GET_LAST_FAIL_DONE: 1628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:" + mConnectionParams 1633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause cause = DcFailCause.UNKNOWN; 1637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 1639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int rilFailCause = ((int[]) (ar.result))[0]; 1640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = DcFailCause.fromInt(rilFailCause); 16411db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (cause == DcFailCause.NONE) { 16421db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (DBG) { 16431db7da14111228a5079d2970d7d0ce34173000b5Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 16441db7da14111228a5079d2970d7d0ce34173000b5Wink Saville + " BAD: error was NONE, change to UNKNOWN"); 16451db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 16461db7da14111228a5079d2970d7d0ce34173000b5Wink Saville cause = DcFailCause.UNKNOWN; 16471db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 1648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int retryDelay = mRetryManager.getRetryTimer(); 1652c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1653c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 1654c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " cause=" + cause 1655c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " retryDelay=" + retryDelay 1656c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 1657c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1658c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1659979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (cause.isRestartRadioFail()) { 1660979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) { 1661979786625e7ceacf4a545a25704ef8a15338a854Wink Saville log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE" 1662979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " restart radio"); 1663979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } 1664979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mDct.sendRestartRadio(); 1665979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1666979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1667796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan } else if (mDct.isPermanentFail(cause)) { 1668979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE perm er"); 1669979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1670979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1671979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if ((retryDelay >= 0) && (mRetryManager.isRetryNeeded())) { 1672979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE retry"); 1673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retryDelay); 1675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1677979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE no retry"); 1678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_GET_LAST_FAIL_DONE" 1683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActivatingState not handled msg.what=" + 1692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville getWhatToString(msg.what) + " RefCount=" + mApnContexts.size()); 1693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActivatingState mActivatingState = new DcActivatingState(); 1701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is connected, expecting an EVENT_DISCONNECT. 1704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActiveState extends State { 1706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override public void enter() { 1707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: enter dc=" + DataConnection.this); 1708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.getRetryCount() != 0) { 1710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState: connected after retrying call notifyAllOfConnected"); 1711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.setRetryCount(0); 1712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If we were retrying there maybe more than one, otherwise they'll only be one. 1714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllOfConnected(Phone.REASON_CONNECTED); 1715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If the EVENT_CONNECT set the current max retry restore it here 1717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // if it didn't then this is effectively a NOP. 1718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.restoreCurMaxRetryCount(); 1719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addActiveDcByCid(DataConnection.this); 172062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 172162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, 172262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getReason(), null); 172362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setExtraInfo(mApnSetting.apn); 172427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 172562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(), 172662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt "DcNetworkAgent", mNetworkInfo, makeNetworkCapabilities(), mLinkProperties, 172762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 50); 1728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1730ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1731ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1732ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: exit dc=" + this); 173362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, 173462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getReason(), mNetworkInfo.getExtraInfo()); 173562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 173662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent = null; 1737ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1738ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1740ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 1745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1746c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1747c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this); 1748c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.contains(cp.mApnContext)) { 1750c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState ERROR already added apnContext=" + cp.mApnContext); 1751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.add(cp.mApnContext); 1753ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1754ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_CONNECT RefCount=" 1755ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1756ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1758ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.NONE, false); 1759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1764c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1765c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_DISCONNECT dp=" + dp 1766c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1767c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.contains(dp.mApnContext)) { 1769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" 1771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.size() == 1) { 1775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 1776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.remove(dp.mApnContext); 1783ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1784ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1785ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1786ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState ERROR no such apnContext=" + dp.mApnContext 1787c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " in this dc=" + DataConnection.this); 1788ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1789ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1790ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1791ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1792ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1793ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1794ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1795c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_DISCONNECT clearing apn contexts," 1796c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1797ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1798ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1799ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1800ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1802ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1803ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1804ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1805ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1806ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1807ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: { 1808c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1809c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_LOST_CONNECTION dc=" + DataConnection.this); 1810c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1811ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.isRetryNeeded()) { 1812ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // We're going to retry 1813ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delayMillis = mRetryManager.getRetryTimer(); 1814ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1815ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState EVENT_LOST_CONNECTION startRetryAlarm" 1816ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag + " delay=" + delayMillis + "ms"); 1817ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1818ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1819ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville delayMillis); 1820ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1821ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1822ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1823ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1824ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1825ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1826ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1827ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 182862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: { 182962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 183062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 183162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 183262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 183362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 183462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: { 183562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 183662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 183762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 183862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 183962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 1840ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1841ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1842ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState not handled msg.what=" + getWhatToString(msg.what)); 1843ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1844ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1845ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1846ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1847ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1848ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1849ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1850ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActiveState mActiveState = new DcActiveState(); 1851ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1852ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1853ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting. 1854ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1855ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectingState extends State { 1856ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1857ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1858ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1859ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1860ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1861ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1862ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " 1863ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1864ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1865ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1866ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1867ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1868ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1869ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount=" 1870ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1871ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1872ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) ar.userObj; 1873ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp.mTag == mTag) { 1874ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1875ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1876ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj); 1877ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1878ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1879ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectState stale EVENT_DEACTIVATE_DONE" 1880ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + dp.mTag + " mTag=" + mTag); 1881ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1882ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1883ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1884ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1885ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1886ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1887ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectingState not handled msg.what=" 1888ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1889ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1890ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1891ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1892ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1894ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1895ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1896ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectingState mDisconnectingState = new DcDisconnectingState(); 1897ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1898ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1899ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting after an creating a connection. 1900ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1901ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectionErrorCreatingConnection extends State { 1902ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1903ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1904ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1905ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1906ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1907ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1908ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1909ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 1910ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1911ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1912ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection" + 1913ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " msg.what=EVENT_DEACTIVATE_DONE"); 1914ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1915ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1916ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1918ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, 1919ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER); 1920ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1921ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1922ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1923ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection stale EVENT_DEACTIVATE_DONE" 1924ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + cp.mTag + ", mTag=" + mTag); 1925ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1926ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1927ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1928ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1929ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1930ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1931ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1932ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection not handled msg.what=" 1933ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1934ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1935ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1936ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1937ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1938ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1939ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1940ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1941ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection = 1942ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new DcDisconnectionErrorCreatingConnection(); 1943ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 194462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 194562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private class DcNetworkAgent extends NetworkAgent { 194662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt public DcNetworkAgent(Looper l, Context c, String TAG, NetworkInfo ni, 194762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt NetworkCapabilities nc, LinkProperties lp, int score) { 194862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt super(l, c, TAG, ni, nc, lp, score); 194962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 195062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 195162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt protected void unwanted() { 19521484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (mNetworkAgent != this) { 19531484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt log("unwanted found mNetworkAgent=" + mNetworkAgent + 19541484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt ", which isn't me. Aborting unwanted"); 19551484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt return; 19561484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt } 19574a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt // this can only happen if our exit has been called - we're already disconnected 19584a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt if (mApnContexts == null) return; 1959305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt for (ApnContext apnContext : mApnContexts) { 1960305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt Message msg = mDct.obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, apnContext); 1961305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DisconnectParams dp = new DisconnectParams(apnContext, apnContext.getReason(), msg); 1962305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DataConnection.this.sendMessage(DataConnection.this. 1963305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt obtainMessage(EVENT_DISCONNECT, dp)); 1964305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt } 196562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 196662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 196762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ******* "public" interface 1969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used for testing purposes. 1972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* package */ void tearDownNow() { 1974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownNow()"); 1975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_TEAR_DOWN_NOW)); 1976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return the string for msg.what as our info. 1980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected String getWhatToString(int what) { 1983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return cmdToString(what); 1984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String msgToString(Message msg) { 1987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retVal; 1988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg == null) { 1989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = "null"; 1990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville StringBuilder b = new StringBuilder(); 1992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("{what="); 1994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(cmdToString(msg.what)); 1995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" when="); 1997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis(), b); 1998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 != 0) { 2000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg1="); 2001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg1); 2002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg2 != 0) { 2005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg2="); 2006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg2); 2007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj != null) { 2010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" obj="); 2011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.obj); 2012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2013ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" target="); 2015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.getTarget()); 2016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2017ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" replyTo="); 2018ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.replyTo); 2019ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2020ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("}"); 2021ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2022ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = b.toString(); 2023ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2024ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 2025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2026ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static void slog(String s) { 2028ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d("DC", s); 2029ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2030ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug 2033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2034ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2036cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2037cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void log(String s) { 2038cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.d(getName(), s); 20390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug attribute 2043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logd(String s) { 2048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(getName(), s); 2049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 20500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with verbose attribute 2053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logv(String s) { 2058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.v(getName(), s); 2059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with info attribute 2063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logi(String s) { 2068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.i(getName(), s); 2069ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2070ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with warning attribute 2073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logw(String s) { 2078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.w(getName(), s); 20790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s) { 2088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s); 2089ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param e is a Throwable which logs additional information. 2096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s, Throwable e) { 2099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s, e); 2100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Doesn't print mApnList of ApnContext's which would be recursive */ 2103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toStringSimple() { 2104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getName() + ": State=" + getCurrentState().getName() 2105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size() 2106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mCid=" + mCid + " mCreateTime=" + mCreateTime 2107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastastFailTime=" + mLastFailTime 2108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastFailCause=" + mLastFailCause 2109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag 2110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mRetryManager=" + mRetryManager 2111f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt + " mLinkProperties=" + mLinkProperties 211262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt + " linkCapabilities=" + makeNetworkCapabilities(); 2113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 2117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{" + toStringSimple() + " mApnContexts=" + mApnContexts + "}"; 2118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Dump the current state. 2122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param fd 2124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param pw 2125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param args 2126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 21270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 21280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 2129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.print("DataConnection "); 21300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 2131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts.size=" + mApnContexts.size()); 2132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts=" + mApnContexts); 2133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDataConnectionTracker=" + mDct); 2135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnSetting=" + mApnSetting); 2136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mTag=" + mTag); 2137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCid=" + mCid); 2138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mRetryManager=" + mRetryManager); 2139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mConnectionParams=" + mConnectionParams); 2140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDisconnectParams=" + mDisconnectParams); 2141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcFailCause=" + mDcFailCause); 2142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mPhone=" + mPhone); 2144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLinkProperties=" + mLinkProperties); 2146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2147203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mDataRegState=" + mDataRegState); 2148203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mRilRat=" + mRilRat); 214962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt pw.println(" mNetworkCapabilities=" + makeNetworkCapabilities()); 2150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime)); 2151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime)); 2152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailCause=" + mLastFailCause); 2153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mUserData=" + mUserData); 2155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mInstanceNumber=" + mInstanceNumber); 2156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mAc=" + mAc); 2157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcRetryAlarmController=" + mDcRetryAlarmController); 2158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 21590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2161