DataConnection.java revision c149ab8bbbbf21b09b343878009d381bd4f2adf5
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 96ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The data connection controller 97ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcController mDcController; 98ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 99ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The Tester for failing all bringup's 100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcTesterFailBringUpAll mDcTesterFailBringUpAll; 101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static AtomicInteger mInstanceNumber = new AtomicInteger(0); 103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private AsyncChannel mAc; 104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Utilities for the DataConnection 106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcRetryAlarmController mDcRetryAlarmController; 107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The DCT that's talking to us, we only support one! 109454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private DcTrackerBase mDct = null; 110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville protected String[] mPcscfAddr; 112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving connecting parameters. 115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class ConnectionParams { 117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mInitialMaxRetry; 120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mProfileId; 121203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int mRilRat; 12212fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao boolean mRetryWhenSSChange; 123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams(ApnContext apnContext, int initialMaxRetry, int profileId, 12612fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao int rilRadioTechnology, boolean retryWhenSSChange, Message onCompletedMsg) { 127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInitialMaxRetry = initialMaxRetry; 129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mProfileId = profileId; 130203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rilRadioTechnology; 13112fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao mRetryWhenSSChange = retryWhenSSChange; 132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mInitialMaxRetry=" + mInitialMaxRetry + " mProfileId=" + mProfileId 139203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRat=" + mRilRat 140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving disconnecting parameters. 146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class DisconnectParams { 148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String mReason; 151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams(ApnContext apnContext, String reason, Message onCompletedMsg) { 154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReason = reason; 156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mReason=" + mReason 163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1662563e7e1ec513121b980045571a245aa5390f1c5Wink Saville 167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ApnSetting mApnSetting; 168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ConnectionParams mConnectionParams; 169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DisconnectParams mDisconnectParams; 170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mDcFailCause; 171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private PhoneBase mPhone; 173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private LinkProperties mLinkProperties = new LinkProperties(); 174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mCreateTime; 175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mLastFailTime; 176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mLastFailCause; 177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String NULL_IP = "0.0.0.0"; 178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private Object mUserData; 179203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mRilRat = Integer.MAX_VALUE; 180203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mDataRegState = Integer.MAX_VALUE; 18162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkInfo mNetworkInfo; 18262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkAgent mNetworkAgent; 183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Package visible variables 185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mCid; 187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville List<ApnContext> mApnContexts = null; 188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville PendingIntent mReconnectIntent = null; 189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville RetryManager mRetryManager = new RetryManager(); 190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ***** Event codes for driving the state machine, package visible for Dcc 193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int BASE = Protocol.BASE_DATA_CONNECTION; 194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_CONNECT = BASE + 0; 195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_SETUP_DATA_CONNECTION_DONE = BASE + 1; 196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_GET_LAST_FAIL_DONE = BASE + 2; 197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DEACTIVATE_DONE = BASE + 3; 198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT = BASE + 4; 199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RIL_CONNECTED = BASE + 5; 200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT_ALL = BASE + 6; 201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DATA_STATE_CHANGED = BASE + 7; 202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_TEAR_DOWN_NOW = BASE + 8; 203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_LOST_CONNECTION = BASE + 9; 204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RETRY_CONNECTION = BASE + 10; 205203e588e3c42a81aa8a56f595119c181a63b12caWink Saville static final int EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED = BASE + 11; 20662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt static final int EVENT_DATA_CONNECTION_ROAM_ON = BASE + 12; 20762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt static final int EVENT_DATA_CONNECTION_ROAM_OFF = BASE + 13; 208ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 20962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private static final int CMD_TO_STRING_COUNT = EVENT_DATA_CONNECTION_ROAM_OFF - BASE + 1; 210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; 211ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static { 212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_CONNECT - BASE] = "EVENT_CONNECT"; 213ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_SETUP_DATA_CONNECTION_DONE - BASE] = 214ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "EVENT_SETUP_DATA_CONNECTION_DONE"; 215ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_GET_LAST_FAIL_DONE - BASE] = "EVENT_GET_LAST_FAIL_DONE"; 216ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DEACTIVATE_DONE - BASE] = "EVENT_DEACTIVATE_DONE"; 217ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT - BASE] = "EVENT_DISCONNECT"; 218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RIL_CONNECTED - BASE] = "EVENT_RIL_CONNECTED"; 219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT_ALL - BASE] = "EVENT_DISCONNECT_ALL"; 220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DATA_STATE_CHANGED - BASE] = "EVENT_DATA_STATE_CHANGED"; 221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_TEAR_DOWN_NOW - BASE] = "EVENT_TEAR_DOWN_NOW"; 222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_LOST_CONNECTION - BASE] = "EVENT_LOST_CONNECTION"; 223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RETRY_CONNECTION - BASE] = "EVENT_RETRY_CONNECTION"; 224203e588e3c42a81aa8a56f595119c181a63b12caWink Saville sCmdToString[EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED - BASE] = 225203e588e3c42a81aa8a56f595119c181a63b12caWink Saville "EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED"; 22662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_ROAM_ON - BASE] = "EVENT_DATA_CONNECTION_ROAM_ON"; 22762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_ROAM_OFF - BASE] = "EVENT_DATA_CONNECTION_ROAM_OFF"; 228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Convert cmd to string or null if unknown 230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static String cmdToString(int cmd) { 231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String value; 232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cmd -= BASE; 233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((cmd >= 0) && (cmd < sCmdToString.length)) { 234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = sCmdToString[cmd]; 235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 236454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville value = DcAsyncChannel.cmdToString(cmd + BASE); 237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (value == null) { 239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = "0x" + Integer.toHexString(cmd + BASE); 240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return value; 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 245cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Create the connection object 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 247cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param phone the Phone 248cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param id the connection id 249cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return DataConnection that was created. 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static DataConnection makeDataConnection(PhoneBase phone, int id, 252454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, 253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection dc = new DataConnection(phone, 255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DC-" + mInstanceNumber.incrementAndGet(), id, dct, failBringUpAll, dcc); 256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dc.start(); 257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) dc.log("Made " + dc.getName()); 258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return dc; 259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void dispose() { 262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("dispose: call quiteNow()"); 263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quitNow(); 264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* Getter functions */ 267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 268f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities getCopyNetworkCapabilities() { 26962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return makeNetworkCapabilities(); 270f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 271f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties getCopyLinkProperties() { 273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return new LinkProperties(mLinkProperties); 274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean getIsInactive() { 277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getCurrentState() == mInactiveState; 278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int getCid() { 281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mCid; 282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting getApnSetting() { 285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mApnSetting; 286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2889c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk void setLinkPropertiesHttpProxy(ProxyInfo proxy) { 289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties.setHttpProxy(proxy); 290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class UpdateLinkPropertyResult { 293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public DataCallResponse.SetupResult setupResult = DataCallResponse.SetupResult.SUCCESS; 294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties oldLp; 295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties newLp; 296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public UpdateLinkPropertyResult(LinkProperties curLp) { 297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville oldLp = curLp; 298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville newLp = curLp; 299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isIpv4Connected() { 303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean ret = false; 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Collection <InetAddress> addresses = mLinkProperties.getAddresses(); 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (InetAddress addr: addresses) { 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (addr instanceof java.net.Inet4Address) { 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville java.net.Inet4Address i4addr = (java.net.Inet4Address) addr; 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!i4addr.isAnyLocalAddress() && !i4addr.isLinkLocalAddress() && 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !i4addr.isLoopbackAddress() && !i4addr.isMulticastAddress()) { 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = true; 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isIpv6Connected() { 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean ret = false; 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Collection <InetAddress> addresses = mLinkProperties.getAddresses(); 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (InetAddress addr: addresses) { 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (addr instanceof java.net.Inet6Address) { 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville java.net.Inet6Address i6addr = (java.net.Inet6Address) addr; 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!i6addr.isAnyLocalAddress() && !i6addr.isLinkLocalAddress() && 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !i6addr.isLoopbackAddress() && !i6addr.isMulticastAddress()) { 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = true; 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult updateLinkProperty(DataCallResponse newState) { 337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties); 338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (newState == null) return result; 340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult setupResult; 342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp = new LinkProperties(); 343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.setupResult = setLinkProperties(newState, result.newLp); 346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result.setupResult != DataCallResponse.SetupResult.SUCCESS) { 347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("updateLinkProperty failed : " + result.setupResult); 348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // copy HTTP proxy as it is not part DataCallResponse. 351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp.setHttpProxy(mLinkProperties.getHttpProxy()); 352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 353e9701717e43cc5aacbcf624f77a53be92350662cw checkSetMtu(mApnSetting, result.newLp); 354e9701717e43cc5aacbcf624f77a53be92350662cw 35527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties = result.newLp; 35627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 35727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 35827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG && (! result.oldLp.equals(result.newLp))) { 360ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty old LP=" + result.oldLp); 361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty new LP=" + result.newLp); 362ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 363f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 364d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt if (result.newLp.equals(result.oldLp) == false && 365d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt mNetworkAgent != null) { 366d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 367d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt } 368d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt 369ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 370ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 372e9701717e43cc5aacbcf624f77a53be92350662cw /** 373e9701717e43cc5aacbcf624f77a53be92350662cw * Read the MTU value from link properties where it can be set from network. In case 374e9701717e43cc5aacbcf624f77a53be92350662cw * not set by the network, set it again using the mtu szie value defined in the APN 375e9701717e43cc5aacbcf624f77a53be92350662cw * database for the connected APN 376e9701717e43cc5aacbcf624f77a53be92350662cw */ 377e9701717e43cc5aacbcf624f77a53be92350662cw private void checkSetMtu(ApnSetting apn, LinkProperties lp) { 378e9701717e43cc5aacbcf624f77a53be92350662cw if (lp == null) return; 379e9701717e43cc5aacbcf624f77a53be92350662cw 380e9701717e43cc5aacbcf624f77a53be92350662cw if (apn == null || lp == null) return; 381e9701717e43cc5aacbcf624f77a53be92350662cw 382e9701717e43cc5aacbcf624f77a53be92350662cw if (lp.getMtu() != PhoneConstants.UNSET_MTU) { 383e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by call response to: " + lp.getMtu()); 384e9701717e43cc5aacbcf624f77a53be92350662cw return; 385e9701717e43cc5aacbcf624f77a53be92350662cw } 386e9701717e43cc5aacbcf624f77a53be92350662cw 387e9701717e43cc5aacbcf624f77a53be92350662cw if (apn != null && apn.mtu != PhoneConstants.UNSET_MTU) { 388e9701717e43cc5aacbcf624f77a53be92350662cw lp.setMtu(apn.mtu); 389e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by APN to: " + apn.mtu); 390e9701717e43cc5aacbcf624f77a53be92350662cw return; 391e9701717e43cc5aacbcf624f77a53be92350662cw } 392e9701717e43cc5aacbcf624f77a53be92350662cw 393e9701717e43cc5aacbcf624f77a53be92350662cw int mtu = mPhone.getContext().getResources().getInteger( 394e9701717e43cc5aacbcf624f77a53be92350662cw com.android.internal.R.integer.config_mobile_mtu); 395e9701717e43cc5aacbcf624f77a53be92350662cw if (mtu != PhoneConstants.UNSET_MTU) { 396e9701717e43cc5aacbcf624f77a53be92350662cw lp.setMtu(mtu); 397e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by config resource to: " + mtu); 398e9701717e43cc5aacbcf624f77a53be92350662cw } 399e9701717e43cc5aacbcf624f77a53be92350662cw } 400e9701717e43cc5aacbcf624f77a53be92350662cw 401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Constructor (NOTE: uses dcc.getHandler() as its Handler) 402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataConnection(PhoneBase phone, String name, int id, 403454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, 404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville super(name, dcc.getHandler()); 406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogRecSize(300); 407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogOnlyTransitions(true); 408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DataConnection constructor E"); 409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = phone; 411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = dct; 412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = failBringUpAll; 413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = dcc; 414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mId = id; 415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = new DcRetryAlarmController(mPhone, this); 41762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 41862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mRilRat = ss.getRilDataRadioTechnology(); 419203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = mPhone.getServiceState().getDataRegState(); 42062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 42162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, 42262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt networkType, "Cellular", TelephonyManager.getNetworkTypeName(networkType)); 42362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(ss.getRoaming()); 42462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setIsAvailable(true); 425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDefaultState); 427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mInactiveState, mDefaultState); 428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActivatingState, mDefaultState); 429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mRetryingState, mDefaultState); 430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActiveState, mDefaultState); 431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingState, mDefaultState); 432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingErrorCreatingConnection, mDefaultState); 433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setInitialState(mInactiveState); 434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = new ArrayList<ApnContext>(); 436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DataConnection constructor X"); 437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private String getRetryConfig(boolean forDefault) { 440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int nt = mPhone.getServiceState().getNetworkType(); 441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 4422cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Saville if (Build.IS_DEBUGGABLE) { 443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String config = SystemProperties.get("test.data_retry_config"); 444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (! TextUtils.isEmpty(config)) { 445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return config; 446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((nt == TelephonyManager.NETWORK_TYPE_CDMA) || 450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_1xRTT) || 451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_0) || 452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_A) || 453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_B) || 454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EHRPD)) { 455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // CDMA variant 456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.cdma.data_retry_config"); 457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Use GSM variant for all others. 459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (forDefault) { 460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.gsm.data_retry_config"); 461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.gsm.2nd_data_retry_config"); 463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 465ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 466ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void configureRetry(boolean forDefault) { 468ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retryConfig = getRetryConfig(forDefault); 469ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 470ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(retryConfig)) { 471ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (forDefault) { 472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(DEFAULT_DATA_RETRY_CONFIG)) { 473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Should never happen, log an error and default to a simple linear sequence. 474ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("configureRetry: Could not configure using " + 475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DEFAULT_DATA_RETRY_CONFIG=" + DEFAULT_DATA_RETRY_CONFIG); 476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.configure(5, 2000, 1000); 477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(SECONDARY_DATA_RETRY_CONFIG)) { 480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Should never happen, log an error and default to a simple sequence. 481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("configureRetry: Could note configure using " + 482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "SECONDARY_DATA_RETRY_CONFIG=" + SECONDARY_DATA_RETRY_CONFIG); 483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.configure(5, 2000, 1000); 484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("configureRetry: forDefault=" + forDefault + " mRetryManager=" + mRetryManager); 489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 493cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Begin setting up a data connection, calls setupDataCall 494cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * and the ConnectionParams will be returned with the 495cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj. 4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 497cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param cp is the connection parameters 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void onConnect(ConnectionParams cp) { 500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onConnect: carrier='" + mApnSetting.carrier 501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' APN='" + mApnSetting.apn 502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' proxy='" + mApnSetting.proxy + "' port='" + mApnSetting.port + "'"); 5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if we should fake an error. 505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDcTesterFailBringUpAll.getDcFailBringUp().mCounter > 0) { 506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = new DataCallResponse(); 507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.version = mPhone.mCi.getRilVersion(); 508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.status = mDcTesterFailBringUpAll.getDcFailBringUp().mFailCause.getErrorCode(); 509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.cid = 0; 510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.active = 0; 511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.type = ""; 512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.ifname = ""; 513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.addresses = new String[0]; 514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.dnses = new String[0]; 515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.gateways = new String[0]; 516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.suggestedRetryTime = 517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mSuggestedRetryTime; 518a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville response.pcscf = new String[0]; 519e9701717e43cc5aacbcf624f77a53be92350662cw response.mtu = PhoneConstants.UNSET_MTU; 520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg, response, null); 523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(msg); 524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onConnect: FailBringUpAll=" + mDcTesterFailBringUpAll.getDcFailBringUp() 526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " send error response=" + response); 527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mCounter -= 1; 529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return; 530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 53222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = -1; 53322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mLastFailTime = -1; 534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 536cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // msg.obj will be returned in AsyncResult.userObj; 537cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 538cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville msg.obj = cp; 5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int authType = mApnSetting.authType; 541cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (authType == -1) { 542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville authType = TextUtils.isEmpty(mApnSetting.user) ? RILConstants.SETUP_DATA_AUTH_NONE 543cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville : RILConstants.SETUP_DATA_AUTH_PAP_CHAP; 5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 546cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String protocol; 54722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPhone.getServiceState().getRoaming()) { 548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.roamingProtocol; 549cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.protocol; 5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 55322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.mCi.setupDataCall( 554203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Integer.toString(cp.mRilRat + 2), 555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Integer.toString(cp.mProfileId), 556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.apn, mApnSetting.user, mApnSetting.password, 557cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Integer.toString(authType), 558cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protocol, msg); 5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * TearDown the data connection when the deactivation is complete a Message with 563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * msg.what == EVENT_DEACTIVATE_DONE and msg.obj == AsyncResult with AsyncResult.obj 564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * containing the parameter o. 565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param o is the object returned in the AsyncResult.obj. 567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void tearDownData(Object o) { 569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int discReason = RILConstants.DEACTIVATE_REASON_NONE; 570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((o != null) && (o instanceof DisconnectParams)) { 571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams)o; 572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (TextUtils.equals(dp.mReason, Phone.REASON_RADIO_TURNED_OFF)) { 574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF; 575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (TextUtils.equals(dp.mReason, Phone.REASON_PDP_RESET)) { 576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET; 577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mPhone.mCi.getRadioState().isOn()) { 580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownData radio is on, call deactivateDataCall"); 581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, discReason, 582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o)); 583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately"); 585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = new AsyncResult(o, null, null); 586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, ar)); 587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) { 59162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(mNetworkInfo.getDetailedState(), reason, 59262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getExtraInfo()); 593f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt for (ApnContext apnContext : mApnContexts) { 594f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (apnContext == alreadySent) continue; 595f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (reason != null) apnContext.setReason(reason); 596f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt Message msg = mDct.obtainMessage(event, apnContext); 597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfConnected(String reason) { 603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason); 6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfDisconnectDcRetrying(String reason) { 607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DC_RETRYING, reason); 608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllDisconnectCompleted(DcFailCause cause) { 610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DONE, cause.toString()); 6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send the connectionCompletedMsg. 616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cp is the ConnectionParams 618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cause and if no error the cause is DcFailCause.NONE 619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param sendAll is true if all contexts are to be notified 620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyConnectCompleted(ConnectionParams cp, DcFailCause cause, boolean sendAll) { 622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp != null && cp.mOnCompletedMsg != null) { 625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message connectionCompletedMsg = cp.mOnCompletedMsg; 627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp.mOnCompletedMsg = null; 628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (connectionCompletedMsg.obj instanceof ApnContext) { 629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)connectionCompletedMsg.obj; 630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville long timeStamp = System.currentTimeMillis(); 633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.arg1 = mCid; 634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == DcFailCause.NONE) { 636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = timeStamp; 637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg); 638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = cause; 640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = timeStamp; 641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Return message with a Throwable exception to signify an error. 643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == null) cause = DcFailCause.UNKNOWN; 644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg, cause, 645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new Throwable(cause.toString())); 646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("notifyConnectCompleted at " + timeStamp + " cause=" + cause 649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " connectionCompletedMsg=" + msgToString(connectionCompletedMsg)); 650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.sendToTarget(); 653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR, 656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause.toString()); 657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send ar.userObj if its a message, which is should be back to originator. 662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param dp is the DisconnectParams. 664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) { 666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("NotifyDisconnectCompleted"); 667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String reason = null; 670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp != null && dp.mOnCompletedMsg != null) { 672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = dp.mOnCompletedMsg; 674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mOnCompletedMsg = null; 675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj instanceof ApnContext) { 676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)msg.obj; 677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = dp.mReason; 679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log(String.format("msg=%s msg.obj=%s", msg.toString(), 681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>"))); 682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (reason == null) { 688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = DcFailCause.UNKNOWN.toString(); 689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DISCONNECT_DONE, reason); 691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp); 693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Begin Members and methods owned by DataConnectionTracker but stored 698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * in a DataConnection because there is one per connection. 699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The id is owned by DataConnectionTracker. 704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private int mId; 706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Get the DataConnection ID 709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public int getDataConnectionId() { 711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mId; 712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * End members owned by DataConnectionTracker 717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 721ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Clear all settings called when entering mInactiveState. 722ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 723ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void clearSettings() { 724ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("clearSettings"); 725ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 726ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = -1; 727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = -1; 728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 730ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 731a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = new String[5]; 732a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 733ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = new LinkProperties(); 734ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 735ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 736ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = null; 737ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 738ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 740ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Process setup completion. 741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param ar is the result 743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return SetupResult. 744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult onSetupConnectionCompleted(AsyncResult ar) { 746ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = (DataCallResponse) ar.result; 747ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 748ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result; 749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag != mTag) { 751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted stale cp.tag=" + cp.mTag + ", mtag=" + mTag); 753ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 754ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_Stale; 755ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (ar.exception != null) { 756ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception + 758ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " response=" + response); 759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception instanceof CommandException 762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville && ((CommandException) (ar.exception)).getCommandError() 763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville == CommandException.Error.RADIO_NOT_AVAILABLE) { 764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_BadCommand; 765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.RADIO_NOT_AVAILABLE; 766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if ((response == null) || (response.version < 4)) { 767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_GetLastErrorFromRil; 768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (response.status != 0) { 773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onSetupConnectionCompleted received DataCallResponse: " + response); 777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = response.cid; 778a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 779a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = response.pcscf; 780a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = updateLinkProperty(response).setupResult; 782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 783ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 784ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 785ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 786ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isDnsOk(String[] domainNameServers) { 788cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1]) 78922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && !mPhone.isDnsCheckDisabled()) { 790cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Work around a race condition where QMI does not fill in DNS: 791cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Deactivate PDP and let DataConnectionTracker retry. 792cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Do not apply the race condition workaround for MMS APN 793cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // if Proxy is an IP-address. 794cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Otherwise, the default APN will not be restored anymore. 795ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mApnSetting.types[0].equals(PhoneConstants.APN_TYPE_MMS) 796ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || !isIpAddress(mApnSetting.mmsProxy)) { 797cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log(String.format( 798cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s", 799ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.types[0], PhoneConstants.APN_TYPE_MMS, mApnSetting.mmsProxy, 800ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville isIpAddress(mApnSetting.mmsProxy))); 801cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 802cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 803cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 804cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 80727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_GPRS = "4092,8760,48000,4096,8760,48000"; 80827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EDGE = "4093,26280,70800,4096,16384,70800"; 80927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_UMTS = "58254,349525,1048576,58254,349525,1048576"; 81027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EVDO = "4094,87380,262144,4096,16384,262144"; 81127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSDPA= "61167,367002,1101005,8738,52429,262114"; 81227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPA = "40778,244668,734003,16777,100663,301990"; 81327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_LTE = 81427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt "524288,1048576,2097152,262144,524288,1048576"; 81527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPAP= "122334,734003,2202010,32040,192239,576717"; 81627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 81727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private void updateTcpBufferSizes(int rilRat) { 81827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt String sizes = null; 8198fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String ratName = ServiceState.rilRadioTechnologyToString(rilRat).toLowerCase(Locale.ROOT); 8208fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // ServiceState gives slightly different names for EVDO tech ("evdo-rev.0" for ex) 8218fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // - patch it up: 8228fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0 || 8238fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A || 8248fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B) { 8258fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt ratName = "evdo"; 8268fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8278fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 8288fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // in the form: "ratname:rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max" 8298fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] configOverride = mPhone.getContext().getResources().getStringArray( 8308fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt com.android.internal.R.array.config_mobile_tcp_buffers); 8318fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt for (int i = 0; i < configOverride.length; i++) { 8328fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] split = configOverride[i].split(":"); 8338fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (ratName.equals(split[0]) && split.length == 2) { 8348fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = split[1]; 83527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt break; 8368fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8378fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 8388fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 8398fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (sizes == null) { 8408fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // no override - use telephony defaults 8418fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // doing it this way allows device or carrier to just override the types they 8428fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // care about and inherit the defaults for the others. 8438fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt switch (rilRat) { 8448fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: 8458fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_GPRS; 8468fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8478fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: 8488fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EDGE; 8498fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8508fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: 8518fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_UMTS; 8528fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8538fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: 8548fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: 8558fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: 8568fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EVDO; 8578fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8588fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: 8598fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSDPA; 8608fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8618fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: 8628fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: 8638fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPA; 8648fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8658fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: 8668fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_LTE; 8678fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8688fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: 8698fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPAP; 8708fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8718fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt default: 8728fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // Leave empty - this will let ConnectivityService use the system default. 8738fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8748fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 87527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 87627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties.setTcpBufferSizes(sizes); 87727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 87827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 87962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkCapabilities makeNetworkCapabilities() { 88062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt NetworkCapabilities result = new NetworkCapabilities(); 88162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 88262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 88362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mApnSetting != null) { 88462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt for (String type : mApnSetting.types) { 88562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (type) { 886b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt case PhoneConstants.APN_TYPE_ALL: { 887fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 888fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 889fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 890fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 891fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 892fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 893fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 894b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt break; 895b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt } 89662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DEFAULT: { 897fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 89862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 89962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 90062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_MMS: { 901fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 90262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 90462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_SUPL: { 905fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 90662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 90862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DUN: { 909c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt ApnSetting securedDunApn = mDct.fetchDunApn(); 910c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt if (securedDunApn == null || securedDunApn.equals(mApnSetting)) { 911c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); 912c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt } 91362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 91462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_FOTA: { 916fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 91762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 91862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IMS: { 920fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 92162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 92262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_CBS: { 924fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 92562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 92662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IA: { 928fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 92962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 93062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 93262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93448579fcccf584fbddbff59eaae27d434316a4248Lorenzo Colitti ConnectivityManager.maybeMarkCapabilitiesRestricted(result); 93562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int up = 14; 93762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int down = 14; 93862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (mRilRat) { 93927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: up = 80; down = 80; break; 94027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: up = 59; down = 236; break; 94127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: up = 384; down = 384; break; 94227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A: // fall through 94327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B: up = 14; down = 14; break; 94427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: up = 153; down = 2457; break; 94527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: up = 1843; down = 3174; break; 94627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: up = 100; down = 100; break; 94727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: up = 2048; down = 14336; break; 94827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: up = 5898; down = 14336; break; 94927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: up = 5898; down = 14336; break; 95027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: up = 1843; down = 5017; break; 95127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: up = 51200; down = 102400; break; 95227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: up = 153; down = 2516; break; 95327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: up = 11264; down = 43008; break; 95462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 95562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 95662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkUpstreamBandwidthKbps(up); 95762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkDownstreamBandwidthKbps(down); 95862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return result; 95962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 96062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 961ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isIpAddress(String address) { 962ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (address == null) return false; 963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return Patterns.IP_ADDRESS.matcher(address).matches(); 965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult setLinkProperties(DataCallResponse response, 968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp) { 969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if system property dns usable 970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean okToUseSystemPropertyDns = false; 971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String propertyPrefix = "net." + response.ifname + "."; 972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String dnsServers[] = new String[2]; 973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); 974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); 975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville okToUseSystemPropertyDns = isDnsOk(dnsServers); 976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return response.setLinkProperties(lp, okToUseSystemPropertyDns); 979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 9829a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * Initialize connection, this will fail if the 9839a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * apnSettings are not compatible. 9849a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * 9859a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @param cp the Connection paramemters 9869a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @return true if initialization was successful. 9879a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville */ 9889a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville private boolean initConnection(ConnectionParams cp) { 9899a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ApnContext apnContext = cp.mApnContext; 9909a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (mApnSetting == null) { 9919a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // Only change apn setting if it isn't set, it will 9929a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // only NOT be set only if we're in DcInactiveState. 9939a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnSetting = apnContext.getApnSetting(); 9949a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else if (mApnSetting.canHandleType(apnContext.getApnType())) { 9959a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // All is good. 9969a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 9979a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 9989a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: incompatible apnSetting in ConnectionParams cp=" + cp 9999a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " dc=" + DataConnection.this); 10009a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10019a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return false; 10029a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10039a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mTag += 1; 10049a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams = cp; 10059a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams.mTag = mTag; 10069a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10079a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (!mApnContexts.contains(apnContext)) { 10089a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnContexts.add(apnContext); 10099a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10109a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville configureRetry(mApnSetting.canHandleType(PhoneConstants.APN_TYPE_DEFAULT)); 10119a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setRetryCount(0); 10129a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setCurMaxRetryCount(mConnectionParams.mInitialMaxRetry); 1013fcc57e87d1620ab7dc877d65e7e85dca77132054Wink Saville mRetryManager.setRetryForever(false); 10149a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10159a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10169a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: " 10179a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() 10189a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mApnList=" + mApnContexts 10199a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mConnectionParams=" + mConnectionParams); 10209a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return true; 10229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville /** 1025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The parent state for all other states. 1026ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDefaultState extends State { 1028ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1029ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1030ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: enter"); 1031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1032203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Register for DRS or RAT change 1033203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), 1034203e588e3c42a81aa8a56f595119c181a63b12caWink Saville DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); 1035203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 103662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().registerForRoamingOn(getHandler(), 103762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_ON, null); 103862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().registerForRoamingOff(getHandler(), 103962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null); 104062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Add ourselves to the list of data connections 1042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addDc(DataConnection.this); 1043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: exit"); 1047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 104846f190903e93c653b90b970c1a21159bb957575bWink Saville // Unregister for DRS or RAT change. 104946f190903e93c653b90b970c1a21159bb957575bWink Saville mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); 105046f190903e93c653b90b970c1a21159bb957575bWink Saville 105162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().unregisterForRoamingOn(getHandler()); 105262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mPhone.getServiceStateTracker().unregisterForRoamingOff(getHandler()); 105362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 105446f190903e93c653b90b970c1a21159bb957575bWink Saville // Remove ourselves from the DC lists 105546f190903e93c653b90b970c1a21159bb957575bWink Saville mDcController.removeDc(DataConnection.this); 1056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.disconnected(); 1059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = null; 1060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.dispose(); 1062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = null; 1063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = null; 1064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReconnectIntent = null; 1065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = null; 1066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 1067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = null; 1068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = null; 1069ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = null; 1070ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mUserData = null; 1071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = null; 1072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = null; 1073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal = HANDLED; 1078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefault msg=" + getWhatToString(msg.what) 1081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RefCount=" + mApnContexts.size()); 1082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 1085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("Disconnecting to previous connection mAc=" + mAc); 1087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED); 1089ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = new AsyncChannel(); 1091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.connected(null, getHandler(), msg.replyTo); 1092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected"); 1093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_SUCCESSFUL, mId, "hi"); 1095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 1099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("CMD_CHANNEL_DISCONNECTED"); 1100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quit(); 1101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1103454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_IS_INACTIVE: { 1104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean val = getIsInactive(); 1105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_IS_INACTIVE isInactive=" + val); 1106454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_IS_INACTIVE, val ? 1 : 0); 1107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1109454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_CID: { 1110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int cid = getCid(); 1111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_CID cid=" + cid); 1112454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_CID, cid); 1113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1115454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_APNSETTING: { 1116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting = getApnSetting(); 1117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_APNSETTING mApnSetting=" + apnSetting); 1118454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_APNSETTING, apnSetting); 1119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1121454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_LINK_PROPERTIES: { 1122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp = getCopyLinkProperties(); 1123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp); 1124454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_PROPERTIES, lp); 1125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1127454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: { 11289c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk ProxyInfo proxy = (ProxyInfo) msg.obj; 1129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy); 1130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLinkPropertiesHttpProxy(proxy); 1131454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY); 1132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1134f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt case DcAsyncChannel.REQ_GET_NETWORK_CAPABILITIES: { 1135f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities nc = getCopyNetworkCapabilities(); 1136f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (VDBG) log("REQ_GET_NETWORK_CAPABILITIES networkCapabilities" + nc); 1137f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_NETWORK_CAPABILITIES, nc); 1138f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt break; 1139f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 1140454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: msg.what=REQ_RESET"); 1142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); 1146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.UNKNOWN, false); 1148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT RefCount=" 1153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL RefCount=" 1161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_TEAR_DOWN_NOW: 1167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW"); 1168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, 0, null); 1169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: 1172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_LOST_CONNECTION" 1174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: 1180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_RETRY_CONNECTION" 1182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1187203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1188203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1189203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1190203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drsRatPair.first; 119127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt if (mRilRat != drsRatPair.second) { 119227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(drsRatPair.second); 119327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 1194203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = drsRatPair.second; 1195203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1196203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcDefaultState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1197203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " drs=" + mDataRegState 1198203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRilRat=" + mRilRat); 1199203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 120062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 120162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 120262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 120362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 120462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mNetworkAgent != null) { 120562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkCapabilities(makeNetworkCapabilities()); 120662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 120727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 120862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 120962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 121062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 121162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: 121262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 121362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 121462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 121562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: 121662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 1217203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1218203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState: shouldn't happen but ignore msg.what=" 1222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDefaultState mDefaultState = new DcDefaultState(); 1231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is inactive and expects a EVENT_CONNECT. 1234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcInactiveState extends State { 1236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed connecting 1237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(ConnectionParams cp, DcFailCause cause) { 1238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams cp,cause"); 1239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = cp; 1240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed disconnected 1245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DisconnectParams dp) { 1246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams dp"); 1247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts of the failure cause 1253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DcFailCause cause) { 1254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag += 1; 1262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: enter() mTag=" + mTag); 1263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != null) { 1265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyConnectCompleted +ALL failCause=" 1267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(mConnectionParams, mDcFailCause, true); 1270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams != null) { 1272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyDisconnectCompleted +ALL failCause=" 1274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(mDisconnectParams, true); 1277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams == null && mConnectionParams == null && mDcFailCause != null) { 1279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyAllDisconnectCompleted failCause=" 1281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllDisconnectCompleted(mDcFailCause); 1284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from cid mapping, before clearSettings 1287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville clearSettings(); 1290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1301454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset"); 1304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 13099a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcInactiveState: mag.what=EVENT_CONNECT"); 13109a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 13119a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 13129a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 13139a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 13149a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 13159a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 13169a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcInactiveState: msg.what=EVENT_CONNECT initConnection failed"); 13179a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 13189a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 13199a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 1320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1321ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT"); 1326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL"); 1332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState nothandled msg.what=" + getWhatToString(msg.what)); 1339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcInactiveState mInactiveState = new DcInactiveState(); 1347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is retrying and expects a EVENT_RETRY_CONNECTION. 1350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcRetryingState extends State { 1352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1354203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if ((mConnectionParams.mRilRat != mRilRat) 1355203e588e3c42a81aa8a56f595119c181a63b12caWink Saville || (mDataRegState != ServiceState.STATE_IN_SERVICE)){ 1356203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // RAT has changed or we're not in service so don't even begin retrying. 1357203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1358203e588e3c42a81aa8a56f595119c181a63b12caWink Saville String s = "DcRetryingState: enter() not retrying rat changed" 1359203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + ", mConnectionParams.mRilRat=" + mConnectionParams.mRilRat 1360203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " != mRilRat:" + mRilRat 1361203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " transitionTo(mInactiveState)"; 1362203e588e3c42a81aa8a56f595119c181a63b12caWink Saville logAndAddLogRec(s); 1363203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1364203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1365203e588e3c42a81aa8a56f595119c181a63b12caWink Saville transitionTo(mInactiveState); 1366203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } else { 1367203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1368203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcRetryingState: enter() mTag=" + mTag 1369203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + ", call notifyAllOfDisconnectDcRetrying lostConnection"); 1370203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1372203e588e3c42a81aa8a56f595119c181a63b12caWink Saville notifyAllOfDisconnectDcRetrying(Phone.REASON_LOST_DATA_CONNECTION); 1373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1374203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Remove ourselves from cid mapping 1375203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1376203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mCid = -1; 1377203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1385203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1386203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1387203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1388203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int drs = drsRatPair.first; 1389203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int rat = drsRatPair.second; 1390203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if ((rat == mRilRat) && (drs == mDataRegState)) { 1391203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1392203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcRetryingState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1393203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " strange no change in drs=" + drs 1394203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " rat=" + rat + " ignoring"); 1395203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1396203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } else { 139712fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao // have to retry connecting since no attach event will come 139812fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao if (mConnectionParams.mRetryWhenSSChange) { 139912fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao retVal = NOT_HANDLED; 140012fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao break; 140112fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao } 1402203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // We've lost the connection and we're retrying but DRS or RAT changed 1403203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // so we may never succeed, might as well give up. 1404203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1405203e588e3c42a81aa8a56f595119c181a63b12caWink Saville deferMessage(msg); 1406203e588e3c42a81aa8a56f595119c181a63b12caWink Saville transitionTo(mInactiveState); 1407203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1408203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1409203e588e3c42a81aa8a56f595119c181a63b12caWink Saville String s = "DcRetryingState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1410203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " giving up changed from " + mRilRat 1411203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " to rat=" + rat 1412203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " or drs changed from " + mDataRegState + " to drs=" + drs; 1413203e588e3c42a81aa8a56f595119c181a63b12caWink Saville logAndAddLogRec(s); 1414203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1415203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drs; 1416203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rat; 141762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt // TODO - pass the other type here too? 141862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 141962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 142062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 142162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 1422203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1423203e588e3c42a81aa8a56f595119c181a63b12caWink Saville retVal = HANDLED; 1424203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1425203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: { 1427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 == mTag) { 1428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.increaseRetryCount(); 1429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState EVENT_RETRY_CONNECTION" 1431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RetryCount=" + mRetryManager.getRetryCount() 1432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville onConnect(mConnectionParams); 1435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActivatingState); 1436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState stale EVENT_RETRY_CONNECTION" 1439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + msg.arg1 + " != mTag:" + mTag); 1440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1445454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: { 1446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState: msg.what=RSP_RESET, ignore we're already reset"); 1448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(mConnectionParams, 1450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.RESET_BY_FRAMEWORK); 1451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 14569a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 14589a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT" 14599a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() + " cp=" + cp 1460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 14629a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 14639a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 14649a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 14659a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 14669a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 14679a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT initConnection failed"); 14689a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 14699a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 14709a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 14719a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 1472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1474ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.remove(dp.mApnContext) && mApnContexts.size() == 0) { 1479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT " + " RefCount=" 1481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size() + " dp=" + dp); 1482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(dp); 1484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 14869a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcRetryingState: msg.what=EVENT_DISCONNECT"); 1487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT/DISCONNECT_ALL " 1495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "RefCount=" + mApnContexts.size()); 1496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: { 1503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState nothandled msg.what=" + getWhatToString(msg.what)); 1505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcRetryingState mRetryingState = new DcRetryingState(); 1514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is activating a connection. 1517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActivatingState extends State { 1519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 1523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp; 1524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActivatingState: msg=" + msgToString(msg)); 1526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1527203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1529203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Activating can't process until we're done. 1530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_SETUP_DATA_CONNECTION_DONE: 1535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar); 1539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result != DataCallResponse.SetupResult.ERR_Stale) { 1540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:"+ mConnectionParams 1542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1545c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1546c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState onSetupConnectionCompleted result=" + result 1547c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1548c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (result) { 1550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case SUCCESS: 1551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // All is well 1552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActiveState); 1554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_BadCommand: 1556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Vendor ril rejected the command and didn't connect. 1557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_UnacceptableParameter: 1563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The addresses given from the RIL are bad 1564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(cp); 1565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingErrorCreatingConnection); 1566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_GetLastErrorFromRil: 1568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Request failed and this is an old RIL 1569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.getLastDataCallFailCause( 1570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp)); 1571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_RilError: 1573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delay = mDcRetryAlarmController.getSuggestedRetryTime( 1574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection.this, ar); 1575c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1576c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState: ERR_RilError " 1577c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " delay=" + delay 1578979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 1579979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result=" + result 1580979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result.isRestartRadioFail=" + 1581979786625e7ceacf4a545a25704ef8a15338a854Wink Saville result.mFailCause.isRestartRadioFail() 1582979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result.isPermanentFail=" + 1583979786625e7ceacf4a545a25704ef8a15338a854Wink Saville result.mFailCause.isPermanentFail()); 1584c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1585979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (result.mFailCause.isRestartRadioFail()) { 1586979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError restart radio"); 1587979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mDct.sendRestartRadio(); 1588979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1589979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1590979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (result.mFailCause.isPermanentFail()) { 1591979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError perm error"); 1592979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1593979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1594979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (delay >= 0) { 1595979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError retry"); 1596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, 1597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag, delay); 1598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1600979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError no retry"); 1601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_Stale: 1606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_SETUP_DATA_CONNECTION_DONE" 1607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville throw new RuntimeException("Unknown SetupResult, should not happen"); 1611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_GET_LAST_FAIL_DONE: 1616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:" + mConnectionParams 1621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause cause = DcFailCause.UNKNOWN; 1625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 1627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int rilFailCause = ((int[]) (ar.result))[0]; 1628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = DcFailCause.fromInt(rilFailCause); 16291db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (cause == DcFailCause.NONE) { 16301db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (DBG) { 16311db7da14111228a5079d2970d7d0ce34173000b5Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 16321db7da14111228a5079d2970d7d0ce34173000b5Wink Saville + " BAD: error was NONE, change to UNKNOWN"); 16331db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 16341db7da14111228a5079d2970d7d0ce34173000b5Wink Saville cause = DcFailCause.UNKNOWN; 16351db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 1636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int retryDelay = mRetryManager.getRetryTimer(); 1640c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1641c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 1642c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " cause=" + cause 1643c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " retryDelay=" + retryDelay 1644c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 1645c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1646c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1647979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (cause.isRestartRadioFail()) { 1648979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) { 1649979786625e7ceacf4a545a25704ef8a15338a854Wink Saville log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE" 1650979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " restart radio"); 1651979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } 1652979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mDct.sendRestartRadio(); 1653979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1654979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1655979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (cause.isPermanentFail()) { 1656979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE perm er"); 1657979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1658979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1659979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if ((retryDelay >= 0) && (mRetryManager.isRetryNeeded())) { 1660979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE retry"); 1661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retryDelay); 1663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1665979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE no retry"); 1666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_GET_LAST_FAIL_DONE" 1671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActivatingState not handled msg.what=" + 1680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville getWhatToString(msg.what) + " RefCount=" + mApnContexts.size()); 1681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActivatingState mActivatingState = new DcActivatingState(); 1689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is connected, expecting an EVENT_DISCONNECT. 1692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActiveState extends State { 1694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override public void enter() { 1695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: enter dc=" + DataConnection.this); 1696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.getRetryCount() != 0) { 1698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState: connected after retrying call notifyAllOfConnected"); 1699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.setRetryCount(0); 1700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If we were retrying there maybe more than one, otherwise they'll only be one. 1702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllOfConnected(Phone.REASON_CONNECTED); 1703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If the EVENT_CONNECT set the current max retry restore it here 1705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // if it didn't then this is effectively a NOP. 1706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.restoreCurMaxRetryCount(); 1707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addActiveDcByCid(DataConnection.this); 170862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 170962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, 171062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getReason(), null); 171162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setExtraInfo(mApnSetting.apn); 171227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 171362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(), 171462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt "DcNetworkAgent", mNetworkInfo, makeNetworkCapabilities(), mLinkProperties, 171562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 50); 1716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: exit dc=" + this); 172162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, 172262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getReason(), mNetworkInfo.getExtraInfo()); 172362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 172462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent = null; 1725ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1726ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1730ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1731ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1732ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 1733ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1734c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1735c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this); 1736c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1737ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.contains(cp.mApnContext)) { 1738c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState ERROR already added apnContext=" + cp.mApnContext); 1739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1740ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.add(cp.mApnContext); 1741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_CONNECT RefCount=" 1743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1746ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.NONE, false); 1747ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1748ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1752c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1753c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_DISCONNECT dp=" + dp 1754c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1755c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1756ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.contains(dp.mApnContext)) { 1757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1758ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" 1759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.size() == 1) { 1763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 1764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.remove(dp.mApnContext); 1771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState ERROR no such apnContext=" + dp.mApnContext 1775c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " in this dc=" + DataConnection.this); 1776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1783c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_DISCONNECT clearing apn contexts," 1784c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1785ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1786ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1788ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1789ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1790ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1791ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1792ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1793ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1794ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1795ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: { 1796c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1797c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_LOST_CONNECTION dc=" + DataConnection.this); 1798c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1799ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.isRetryNeeded()) { 1800ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // We're going to retry 1801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delayMillis = mRetryManager.getRetryTimer(); 1802ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1803ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState EVENT_LOST_CONNECTION startRetryAlarm" 1804ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag + " delay=" + delayMillis + "ms"); 1805ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1806ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1807ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville delayMillis); 1808ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1809ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1810ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1811ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1812ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1813ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1814ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1815ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 181662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: { 181762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 181862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 181962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 182062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 182162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 182262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: { 182362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 182462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 182562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 182662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 182762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 1828ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1829ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1830ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState not handled msg.what=" + getWhatToString(msg.what)); 1831ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1832ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1833ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1834ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1835ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1836ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1837ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1838ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActiveState mActiveState = new DcActiveState(); 1839ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1840ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1841ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting. 1842ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1843ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectingState extends State { 1844ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1845ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1846ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1847ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1848ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1849ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1850ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " 1851ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1852ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1853ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1854ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1855ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1856ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1857ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount=" 1858ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1859ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1860ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) ar.userObj; 1861ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp.mTag == mTag) { 1862ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1863ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1864ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj); 1865ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1866ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1867ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectState stale EVENT_DEACTIVATE_DONE" 1868ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + dp.mTag + " mTag=" + mTag); 1869ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1870ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1871ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1872ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1873ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1874ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1875ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectingState not handled msg.what=" 1876ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1877ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1878ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1879ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1880ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1881ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1882ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1883ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1884ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectingState mDisconnectingState = new DcDisconnectingState(); 1885ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1886ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1887ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting after an creating a connection. 1888ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1889ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectionErrorCreatingConnection extends State { 1890ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1891ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1892ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1894ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1895ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1896ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1897ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 1898ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1899ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1900ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection" + 1901ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " msg.what=EVENT_DEACTIVATE_DONE"); 1902ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1903ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1904ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1905ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1906ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, 1907ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER); 1908ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1909ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1910ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1911ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection stale EVENT_DEACTIVATE_DONE" 1912ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + cp.mTag + ", mTag=" + mTag); 1913ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1914ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1915ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1916ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1918ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1919ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1920ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection not handled msg.what=" 1921ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1922ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1923ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1924ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1925ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1926ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1927ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1928ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1929ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection = 1930ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new DcDisconnectionErrorCreatingConnection(); 1931ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 193262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 193362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private class DcNetworkAgent extends NetworkAgent { 193462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt public DcNetworkAgent(Looper l, Context c, String TAG, NetworkInfo ni, 193562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt NetworkCapabilities nc, LinkProperties lp, int score) { 193662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt super(l, c, TAG, ni, nc, lp, score); 193762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 193862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 193962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt protected void unwanted() { 19404a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt // this can only happen if our exit has been called - we're already disconnected 19414a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt if (mApnContexts == null) return; 19424a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt 1943305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt for (ApnContext apnContext : mApnContexts) { 1944305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt Message msg = mDct.obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, apnContext); 1945305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DisconnectParams dp = new DisconnectParams(apnContext, apnContext.getReason(), msg); 1946305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DataConnection.this.sendMessage(DataConnection.this. 1947305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt obtainMessage(EVENT_DISCONNECT, dp)); 1948305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt } 194962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 195062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 195162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1952ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ******* "public" interface 1953ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1954ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1955ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used for testing purposes. 1956ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1957ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* package */ void tearDownNow() { 1958ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownNow()"); 1959ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_TEAR_DOWN_NOW)); 1960ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1961ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1962ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return the string for msg.what as our info. 1964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected String getWhatToString(int what) { 1967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return cmdToString(what); 1968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String msgToString(Message msg) { 1971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retVal; 1972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg == null) { 1973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = "null"; 1974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville StringBuilder b = new StringBuilder(); 1976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("{what="); 1978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(cmdToString(msg.what)); 1979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" when="); 1981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis(), b); 1982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 != 0) { 1984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg1="); 1985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg1); 1986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg2 != 0) { 1989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg2="); 1990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg2); 1991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj != null) { 1994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" obj="); 1995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.obj); 1996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" target="); 1999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.getTarget()); 2000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" replyTo="); 2002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.replyTo); 2003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("}"); 2005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = b.toString(); 2007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 2009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static void slog(String s) { 2012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d("DC", s); 2013ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug 2017ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2018ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2019ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2020cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2021cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void log(String s) { 2022cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.d(getName(), s); 20230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2026ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug attribute 2027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2028ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2029ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2030ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logd(String s) { 2032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(getName(), s); 2033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 20340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2036ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with verbose attribute 2037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2040ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logv(String s) { 2042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.v(getName(), s); 2043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with info attribute 2047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2050ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logi(String s) { 2052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.i(getName(), s); 2053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with warning attribute 2057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logw(String s) { 2062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.w(getName(), s); 20630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2069ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2070ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s) { 2072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s); 2073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param e is a Throwable which logs additional information. 2080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s, Throwable e) { 2083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s, e); 2084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Doesn't print mApnList of ApnContext's which would be recursive */ 2087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toStringSimple() { 2088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getName() + ": State=" + getCurrentState().getName() 2089ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size() 2090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mCid=" + mCid + " mCreateTime=" + mCreateTime 2091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastastFailTime=" + mLastFailTime 2092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastFailCause=" + mLastFailCause 2093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag 2094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mRetryManager=" + mRetryManager 2095f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt + " mLinkProperties=" + mLinkProperties 209662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt + " linkCapabilities=" + makeNetworkCapabilities(); 2097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 2101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{" + toStringSimple() + " mApnContexts=" + mApnContexts + "}"; 2102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Dump the current state. 2106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param fd 2108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param pw 2109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param args 2110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 21110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 21120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 2113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.print("DataConnection "); 21140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 2115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts.size=" + mApnContexts.size()); 2116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts=" + mApnContexts); 2117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDataConnectionTracker=" + mDct); 2119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnSetting=" + mApnSetting); 2120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mTag=" + mTag); 2121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCid=" + mCid); 2122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mRetryManager=" + mRetryManager); 2123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mConnectionParams=" + mConnectionParams); 2124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDisconnectParams=" + mDisconnectParams); 2125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcFailCause=" + mDcFailCause); 2126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mPhone=" + mPhone); 2128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLinkProperties=" + mLinkProperties); 2130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2131203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mDataRegState=" + mDataRegState); 2132203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mRilRat=" + mRilRat); 213362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt pw.println(" mNetworkCapabilities=" + makeNetworkCapabilities()); 2134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime)); 2135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime)); 2136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailCause=" + mLastFailCause); 2137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mUserData=" + mUserData); 2139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mInstanceNumber=" + mInstanceNumber); 2140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mAc=" + mAc); 2141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcRetryAlarmController=" + mDcRetryAlarmController); 2142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 21430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2145