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 19ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.app.PendingIntent; 2062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.content.Context; 2162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.ConnectivityManager; 22ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.net.LinkProperties; 2362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.NetworkAgent; 2496cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwaltimport android.net.NetworkCapabilities; 2562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.net.NetworkInfo; 26957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkeyimport android.net.NetworkMisc; 279c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monkimport android.net.ProxyInfo; 2826c3198e70345a70e5dfa8ee422c7c4e60916cbeLorenzo Colittiimport android.net.StringNetworkSpecifier; 29ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.AsyncResult; 3062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwaltimport android.os.Looper; 31ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.Message; 32ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.SystemClock; 33ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.SystemProperties; 34ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.Rlog; 35203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.telephony.ServiceState; 36ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.TelephonyManager; 37203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.text.TextUtils; 38203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.util.Pair; 39ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.util.Patterns; 40ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.util.TimeUtils; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 428e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.telephony.CallTracker; 438e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.telephony.CarrierSignalAgent; 448e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.telephony.CommandException; 458e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.telephony.DctConstants; 468e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.telephony.Phone; 478e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.telephony.PhoneConstants; 488e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.telephony.RILConstants; 498e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.telephony.RetryManager; 508e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.telephony.ServiceStateTracker; 518e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.telephony.TelephonyIntents; 528e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.util.AsyncChannel; 538e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.util.Protocol; 548e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.util.State; 558e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport com.android.internal.util.StateMachine; 568e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor; 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter; 5945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Savilleimport java.io.StringWriter; 60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.net.InetAddress; 618e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport java.util.ArrayList; 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.Collection; 63ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwaltimport java.util.HashMap; 648e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport java.util.Locale; 658e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport java.util.concurrent.atomic.AtomicInteger; 66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 69ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 70ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * DataConnection StateMachine. 71ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 72ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * This a class for representing a single data connection, with instances of this 73ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * class representing a connection via the cellular network. There may be multiple 74ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * data connections and all of them are managed by the <code>DataConnectionTracker</code>. 75ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 76ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * NOTE: All DataConnection objects must be running on the same looper, which is the default 77ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * as the coordinator has members which are used without synchronization. 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 793a5b9323f422134b68a92c36813001ec8bed2866Jack Yupublic class DataConnection extends StateMachine { 80ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean DBG = true; 81ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean VDBG = true; 82ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 83aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran private static final String NETWORK_TYPE = "MOBILE"; 84aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran 85ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The data connection controller 86ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcController mDcController; 87ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 88ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The Tester for failing all bringup's 89ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcTesterFailBringUpAll mDcTesterFailBringUpAll; 90ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 91ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static AtomicInteger mInstanceNumber = new AtomicInteger(0); 92ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private AsyncChannel mAc; 93ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 94ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The DCT that's talking to us, we only support one! 951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private DcTracker mDct = null; 96ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 97a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville protected String[] mPcscfAddr; 98a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 99ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving connecting parameters. 101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1023a5b9323f422134b68a92c36813001ec8bed2866Jack Yu public static class ConnectionParams { 103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mProfileId; 106203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int mRilRat; 107120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu final boolean mUnmeteredUseOnly; 108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 109ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt final int mConnectionGeneration; 110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 111120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu ConnectionParams(ApnContext apnContext, int profileId, int rilRadioTechnology, 112120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu boolean unmeteredUseOnly, Message onCompletedMsg, 113120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu int connectionGeneration) { 114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mProfileId = profileId; 116203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rilRadioTechnology; 117120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu mUnmeteredUseOnly = unmeteredUseOnly; 118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 119ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt mConnectionGeneration = connectionGeneration; 120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 1250e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu + " mProfileId=" + mProfileId 126203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRat=" + mRilRat 127120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu + " mUnmeteredUseOnly=" + mUnmeteredUseOnly 128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving disconnecting parameters. 134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 135e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu public static class DisconnectParams { 136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 137e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu public ApnContext mApnContext; 138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String mReason; 139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams(ApnContext apnContext, String reason, Message onCompletedMsg) { 142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReason = reason; 144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mReason=" + mReason 151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1542563e7e1ec513121b980045571a245aa5390f1c5Wink Saville 155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ApnSetting mApnSetting; 156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ConnectionParams mConnectionParams; 157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DisconnectParams mDisconnectParams; 158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mDcFailCause; 159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private Phone mPhone; 161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private LinkProperties mLinkProperties = new LinkProperties(); 162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mCreateTime; 163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mLastFailTime; 164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mLastFailCause; 165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String NULL_IP = "0.0.0.0"; 166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private Object mUserData; 167203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mRilRat = Integer.MAX_VALUE; 168203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mDataRegState = Integer.MAX_VALUE; 16962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkInfo mNetworkInfo; 17062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private NetworkAgent mNetworkAgent; 171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 1733a5b9323f422134b68a92c36813001ec8bed2866Jack Yu public int mCid; 1743a5b9323f422134b68a92c36813001ec8bed2866Jack Yu public HashMap<ApnContext, ConnectionParams> mApnContexts = null; 175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville PendingIntent mReconnectIntent = null; 176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ***** Event codes for driving the state machine, package visible for Dcc 179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int BASE = Protocol.BASE_DATA_CONNECTION; 180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_CONNECT = BASE + 0; 181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_SETUP_DATA_CONNECTION_DONE = BASE + 1; 182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_GET_LAST_FAIL_DONE = BASE + 2; 183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DEACTIVATE_DONE = BASE + 3; 184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT = BASE + 4; 185a56f405d3006b1d8378b5f7757a5613b75fa8fb4Adrian Salido static final int EVENT_RIL_CONNECTED = BASE + 5; 186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT_ALL = BASE + 6; 187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DATA_STATE_CHANGED = BASE + 7; 188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_TEAR_DOWN_NOW = BASE + 8; 189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_LOST_CONNECTION = BASE + 9; 190203e588e3c42a81aa8a56f595119c181a63b12caWink Saville static final int EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED = BASE + 11; 19162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt static final int EVENT_DATA_CONNECTION_ROAM_ON = BASE + 12; 19262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt static final int EVENT_DATA_CONNECTION_ROAM_OFF = BASE + 13; 19365bee39d7e417fb898c3948696d5d8a38046c449fenglu static final int EVENT_BW_REFRESH_RESPONSE = BASE + 14; 1946356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt static final int EVENT_DATA_CONNECTION_VOICE_CALL_STARTED = BASE + 15; 1956356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt static final int EVENT_DATA_CONNECTION_VOICE_CALL_ENDED = BASE + 16; 1966356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 1976356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt private static final int CMD_TO_STRING_COUNT = 1986356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt EVENT_DATA_CONNECTION_VOICE_CALL_ENDED - BASE + 1; 199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; 201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static { 202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_CONNECT - BASE] = "EVENT_CONNECT"; 203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_SETUP_DATA_CONNECTION_DONE - BASE] = 204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "EVENT_SETUP_DATA_CONNECTION_DONE"; 205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_GET_LAST_FAIL_DONE - BASE] = "EVENT_GET_LAST_FAIL_DONE"; 206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DEACTIVATE_DONE - BASE] = "EVENT_DEACTIVATE_DONE"; 207ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT - BASE] = "EVENT_DISCONNECT"; 208a56f405d3006b1d8378b5f7757a5613b75fa8fb4Adrian Salido sCmdToString[EVENT_RIL_CONNECTED - BASE] = "EVENT_RIL_CONNECTED"; 209ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT_ALL - BASE] = "EVENT_DISCONNECT_ALL"; 210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DATA_STATE_CHANGED - BASE] = "EVENT_DATA_STATE_CHANGED"; 211ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_TEAR_DOWN_NOW - BASE] = "EVENT_TEAR_DOWN_NOW"; 212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_LOST_CONNECTION - BASE] = "EVENT_LOST_CONNECTION"; 213203e588e3c42a81aa8a56f595119c181a63b12caWink Saville sCmdToString[EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED - BASE] = 214203e588e3c42a81aa8a56f595119c181a63b12caWink Saville "EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED"; 21562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_ROAM_ON - BASE] = "EVENT_DATA_CONNECTION_ROAM_ON"; 21662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_ROAM_OFF - BASE] = "EVENT_DATA_CONNECTION_ROAM_OFF"; 21765bee39d7e417fb898c3948696d5d8a38046c449fenglu sCmdToString[EVENT_BW_REFRESH_RESPONSE - BASE] = "EVENT_BW_REFRESH_RESPONSE"; 2186356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_VOICE_CALL_STARTED - BASE] = 2196356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt "EVENT_DATA_CONNECTION_VOICE_CALL_STARTED"; 2206356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt sCmdToString[EVENT_DATA_CONNECTION_VOICE_CALL_ENDED - BASE] = 2216356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt "EVENT_DATA_CONNECTION_VOICE_CALL_ENDED"; 222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Convert cmd to string or null if unknown 224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static String cmdToString(int cmd) { 225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String value; 226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cmd -= BASE; 227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((cmd >= 0) && (cmd < sCmdToString.length)) { 228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = sCmdToString[cmd]; 229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 230454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville value = DcAsyncChannel.cmdToString(cmd + BASE); 231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (value == null) { 233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = "0x" + Integer.toHexString(cmd + BASE); 234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return value; 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 239cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Create the connection object 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 241cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param phone the Phone 242cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param id the connection id 243cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return DataConnection that was created. 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 245e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu public static DataConnection makeDataConnection(Phone phone, int id, 2461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DcTracker dct, DcTesterFailBringUpAll failBringUpAll, 247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection dc = new DataConnection(phone, 249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DC-" + mInstanceNumber.incrementAndGet(), id, dct, failBringUpAll, dcc); 250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dc.start(); 251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) dc.log("Made " + dc.getName()); 252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return dc; 253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void dispose() { 256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("dispose: call quiteNow()"); 257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quitNow(); 258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* Getter functions */ 261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties getCopyLinkProperties() { 263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return new LinkProperties(mLinkProperties); 264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean getIsInactive() { 267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getCurrentState() == mInactiveState; 268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int getCid() { 271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mCid; 272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting getApnSetting() { 275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mApnSetting; 276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2789c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk void setLinkPropertiesHttpProxy(ProxyInfo proxy) { 279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties.setHttpProxy(proxy); 280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2823a5b9323f422134b68a92c36813001ec8bed2866Jack Yu public static class UpdateLinkPropertyResult { 283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public DataCallResponse.SetupResult setupResult = DataCallResponse.SetupResult.SUCCESS; 284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties oldLp; 285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties newLp; 286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public UpdateLinkPropertyResult(LinkProperties curLp) { 287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville oldLp = curLp; 288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville newLp = curLp; 289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isIpv4Connected() { 293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean ret = false; 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Collection <InetAddress> addresses = mLinkProperties.getAddresses(); 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (InetAddress addr: addresses) { 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (addr instanceof java.net.Inet4Address) { 298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville java.net.Inet4Address i4addr = (java.net.Inet4Address) addr; 299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!i4addr.isAnyLocalAddress() && !i4addr.isLinkLocalAddress() && 300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !i4addr.isLoopbackAddress() && !i4addr.isMulticastAddress()) { 301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = true; 302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isIpv6Connected() { 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean ret = false; 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Collection <InetAddress> addresses = mLinkProperties.getAddresses(); 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (InetAddress addr: addresses) { 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (addr instanceof java.net.Inet6Address) { 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville java.net.Inet6Address i6addr = (java.net.Inet6Address) addr; 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!i6addr.isAnyLocalAddress() && !i6addr.isLinkLocalAddress() && 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !i6addr.isLoopbackAddress() && !i6addr.isMulticastAddress()) { 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = true; 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3263a5b9323f422134b68a92c36813001ec8bed2866Jack Yu public UpdateLinkPropertyResult updateLinkProperty(DataCallResponse newState) { 327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties); 328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (newState == null) return result; 330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult setupResult; 332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp = new LinkProperties(); 333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.setupResult = setLinkProperties(newState, result.newLp); 336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result.setupResult != DataCallResponse.SetupResult.SUCCESS) { 337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("updateLinkProperty failed : " + result.setupResult); 338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // copy HTTP proxy as it is not part DataCallResponse. 341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp.setHttpProxy(mLinkProperties.getHttpProxy()); 342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 343e9701717e43cc5aacbcf624f77a53be92350662cw checkSetMtu(mApnSetting, result.newLp); 344e9701717e43cc5aacbcf624f77a53be92350662cw 34527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties = result.newLp; 34627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 34727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 34827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG && (! result.oldLp.equals(result.newLp))) { 350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty old LP=" + result.oldLp); 351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty new LP=" + result.newLp); 352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 353f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 354d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt if (result.newLp.equals(result.oldLp) == false && 355d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt mNetworkAgent != null) { 356d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 357d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt } 358d781fb47e89bb978bae989d96928851c1197c7d2Robert Greenwalt 359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 360ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 362e9701717e43cc5aacbcf624f77a53be92350662cw /** 363e9701717e43cc5aacbcf624f77a53be92350662cw * Read the MTU value from link properties where it can be set from network. In case 364e9701717e43cc5aacbcf624f77a53be92350662cw * not set by the network, set it again using the mtu szie value defined in the APN 365e9701717e43cc5aacbcf624f77a53be92350662cw * database for the connected APN 366e9701717e43cc5aacbcf624f77a53be92350662cw */ 367e9701717e43cc5aacbcf624f77a53be92350662cw private void checkSetMtu(ApnSetting apn, LinkProperties lp) { 368e9701717e43cc5aacbcf624f77a53be92350662cw if (lp == null) return; 369e9701717e43cc5aacbcf624f77a53be92350662cw 370e9701717e43cc5aacbcf624f77a53be92350662cw if (apn == null || lp == null) return; 371e9701717e43cc5aacbcf624f77a53be92350662cw 372e9701717e43cc5aacbcf624f77a53be92350662cw if (lp.getMtu() != PhoneConstants.UNSET_MTU) { 373e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by call response to: " + lp.getMtu()); 374e9701717e43cc5aacbcf624f77a53be92350662cw return; 375e9701717e43cc5aacbcf624f77a53be92350662cw } 376e9701717e43cc5aacbcf624f77a53be92350662cw 377e9701717e43cc5aacbcf624f77a53be92350662cw if (apn != null && apn.mtu != PhoneConstants.UNSET_MTU) { 378e9701717e43cc5aacbcf624f77a53be92350662cw lp.setMtu(apn.mtu); 379e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by APN to: " + apn.mtu); 380e9701717e43cc5aacbcf624f77a53be92350662cw return; 381e9701717e43cc5aacbcf624f77a53be92350662cw } 382e9701717e43cc5aacbcf624f77a53be92350662cw 383e9701717e43cc5aacbcf624f77a53be92350662cw int mtu = mPhone.getContext().getResources().getInteger( 384e9701717e43cc5aacbcf624f77a53be92350662cw com.android.internal.R.integer.config_mobile_mtu); 385e9701717e43cc5aacbcf624f77a53be92350662cw if (mtu != PhoneConstants.UNSET_MTU) { 386e9701717e43cc5aacbcf624f77a53be92350662cw lp.setMtu(mtu); 387e9701717e43cc5aacbcf624f77a53be92350662cw if (DBG) log("MTU set by config resource to: " + mtu); 388e9701717e43cc5aacbcf624f77a53be92350662cw } 389e9701717e43cc5aacbcf624f77a53be92350662cw } 390e9701717e43cc5aacbcf624f77a53be92350662cw 391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Constructor (NOTE: uses dcc.getHandler() as its Handler) 3921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private DataConnection(Phone phone, String name, int id, 3931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DcTracker dct, DcTesterFailBringUpAll failBringUpAll, 394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville super(name, dcc.getHandler()); 396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogRecSize(300); 397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogOnlyTransitions(true); 3989c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (DBG) log("DataConnection created"); 399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = phone; 401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = dct; 402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = failBringUpAll; 403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = dcc; 404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mId = id; 405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 40662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 40762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mRilRat = ss.getRilDataRadioTechnology(); 408203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = mPhone.getServiceState().getDataRegState(); 40962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 41062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, 411aaf87159f290c573863038a4feb990f509d29ba0Sreeram Ramachandran networkType, NETWORK_TYPE, TelephonyManager.getNetworkTypeName(networkType)); 412ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mNetworkInfo.setRoaming(ss.getDataRoaming()); 41362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setIsAvailable(true); 414a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu // The network should be by default metered until we find it has NET_CAPABILITY_NOT_METERED 415a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu // capability. 416a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu mNetworkInfo.setMetered(true); 417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDefaultState); 419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mInactiveState, mDefaultState); 420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActivatingState, mDefaultState); 421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActiveState, mDefaultState); 422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingState, mDefaultState); 423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingErrorCreatingConnection, mDefaultState); 424ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setInitialState(mInactiveState); 425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 426ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt mApnContexts = new HashMap<ApnContext, ConnectionParams>(); 427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 430cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Begin setting up a data connection, calls setupDataCall 431cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * and the ConnectionParams will be returned with the 432cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj. 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 434cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param cp is the connection parameters 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void onConnect(ConnectionParams cp) { 437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onConnect: carrier='" + mApnSetting.carrier 438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' APN='" + mApnSetting.apn 439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' proxy='" + mApnSetting.proxy + "' port='" + mApnSetting.port + "'"); 4402dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog("DataConnection.onConnect"); 4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if we should fake an error. 443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDcTesterFailBringUpAll.getDcFailBringUp().mCounter > 0) { 4448e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu DataCallResponse response = new DataCallResponse( 4458e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu mDcTesterFailBringUpAll.getDcFailBringUp().mFailCause.getErrorCode(), 4468e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu mDcTesterFailBringUpAll.getDcFailBringUp().mSuggestedRetryTime, 0, 0, "", "", 4478e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu "", "", "", "", PhoneConstants.UNSET_MTU); 448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg, response, null); 451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(msg); 452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onConnect: FailBringUpAll=" + mDcTesterFailBringUpAll.getDcFailBringUp() 454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " send error response=" + response); 455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mCounter -= 1; 457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return; 458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 46022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = -1; 46122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mLastFailTime = -1; 462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 464cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // msg.obj will be returned in AsyncResult.userObj; 465cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 466cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville msg.obj = cp; 4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4688e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu DataProfile dp = new DataProfile(mApnSetting, cp.mProfileId); 4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4708e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu mPhone.mCi.setupDataCall(cp.mRilRat, dp, 4718e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu mPhone.getServiceState().getDataRoamingFromRegistration(), 4728e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu mPhone.getDataRoamingEnabled(), msg); 4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * TearDown the data connection when the deactivation is complete a Message with 477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * msg.what == EVENT_DEACTIVATE_DONE and msg.obj == AsyncResult with AsyncResult.obj 478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * containing the parameter o. 479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param o is the object returned in the AsyncResult.obj. 481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void tearDownData(Object o) { 483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int discReason = RILConstants.DEACTIVATE_REASON_NONE; 4842dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt ApnContext apnContext = null; 485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((o != null) && (o instanceof DisconnectParams)) { 486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams)o; 4872dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext = dp.mApnContext; 488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (TextUtils.equals(dp.mReason, Phone.REASON_RADIO_TURNED_OFF)) { 489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF; 490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (TextUtils.equals(dp.mReason, Phone.REASON_PDP_RESET)) { 491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET; 492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4940e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh if (mPhone.mCi.getRadioState().isOn() 4950e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh || (mPhone.getServiceState().getRilDataRadioTechnology() 4960e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN )) { 4972dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "tearDownData radio is on, call deactivateDataCall"; 4982dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 4992dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (apnContext != null) apnContext.requestLog(str); 500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, discReason, 501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o)); 502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 5032dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately"; 5042dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 5052dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (apnContext != null) apnContext.requestLog(str); 506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = new AsyncResult(o, null, null); 507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, ar)); 508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) { 51262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(mNetworkInfo.getDetailedState(), reason, 51362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getExtraInfo()); 514ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt for (ConnectionParams cp : mApnContexts.values()) { 515ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt ApnContext apnContext = cp.mApnContext; 516f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (apnContext == alreadySent) continue; 517f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (reason != null) apnContext.setReason(reason); 518ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt Pair<ApnContext, Integer> pair = 519ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt new Pair<ApnContext, Integer>(apnContext, cp.mConnectionGeneration); 520ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt Message msg = mDct.obtainMessage(event, pair); 521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfConnected(String reason) { 527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason); 5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfDisconnectDcRetrying(String reason) { 531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DC_RETRYING, reason); 532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllDisconnectCompleted(DcFailCause cause) { 534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DONE, cause.toString()); 5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send the connectionCompletedMsg. 540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cp is the ConnectionParams 542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cause and if no error the cause is DcFailCause.NONE 543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param sendAll is true if all contexts are to be notified 544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyConnectCompleted(ConnectionParams cp, DcFailCause cause, boolean sendAll) { 546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 547ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp != null && cp.mOnCompletedMsg != null) { 549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message connectionCompletedMsg = cp.mOnCompletedMsg; 551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp.mOnCompletedMsg = null; 5527d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu alreadySent = cp.mApnContext; 553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville long timeStamp = System.currentTimeMillis(); 555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.arg1 = mCid; 556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == DcFailCause.NONE) { 558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = timeStamp; 559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg); 560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = cause; 562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = timeStamp; 563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Return message with a Throwable exception to signify an error. 565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == null) cause = DcFailCause.UNKNOWN; 566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg, cause, 567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new Throwable(cause.toString())); 568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("notifyConnectCompleted at " + timeStamp + " cause=" + cause 571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " connectionCompletedMsg=" + msgToString(connectionCompletedMsg)); 572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.sendToTarget(); 575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 5770e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu log("Send to all. " + alreadySent + " " + cause.toString()); 578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR, 579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause.toString()); 580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send ar.userObj if its a message, which is should be back to originator. 585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param dp is the DisconnectParams. 587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) { 589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("NotifyDisconnectCompleted"); 590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String reason = null; 593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp != null && dp.mOnCompletedMsg != null) { 595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = dp.mOnCompletedMsg; 597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mOnCompletedMsg = null; 598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj instanceof ApnContext) { 599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)msg.obj; 600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = dp.mReason; 602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log(String.format("msg=%s msg.obj=%s", msg.toString(), 604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>"))); 605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (reason == null) { 611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = DcFailCause.UNKNOWN.toString(); 612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DISCONNECT_DONE, reason); 614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp); 616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Begin Members and methods owned by DataConnectionTracker but stored 621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * in a DataConnection because there is one per connection. 622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The id is owned by DataConnectionTracker. 627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private int mId; 629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Get the DataConnection ID 632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public int getDataConnectionId() { 634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mId; 635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * End members owned by DataConnectionTracker 640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Clear all settings called when entering mInactiveState. 645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void clearSettings() { 647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("clearSettings"); 648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = -1; 650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = -1; 651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 654a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = new String[5]; 655a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = new LinkProperties(); 657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = null; 660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Process setup completion. 664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param ar is the result 666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return SetupResult. 667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult onSetupConnectionCompleted(AsyncResult ar) { 669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = (DataCallResponse) ar.result; 670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result; 672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag != mTag) { 674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted stale cp.tag=" + cp.mTag + ", mtag=" + mTag); 676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_Stale; 678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (ar.exception != null) { 679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception + 681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " response=" + response); 682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception instanceof CommandException 685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville && ((CommandException) (ar.exception)).getCommandError() 686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville == CommandException.Error.RADIO_NOT_AVAILABLE) { 687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_BadCommand; 688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.RADIO_NOT_AVAILABLE; 689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (response.status != 0) { 694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 6973a5b9323f422134b68a92c36813001ec8bed2866Jack Yu if (DBG) log("onSetupConnectionCompleted received successful DataCallResponse"); 698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = response.cid; 699a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 700a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPcscfAddr = response.pcscf; 701a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = updateLinkProperty(response).setupResult; 703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isDnsOk(String[] domainNameServers) { 709cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1]) 71022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && !mPhone.isDnsCheckDisabled()) { 711cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Work around a race condition where QMI does not fill in DNS: 712cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Deactivate PDP and let DataConnectionTracker retry. 713cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Do not apply the race condition workaround for MMS APN 714cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // if Proxy is an IP-address. 715cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Otherwise, the default APN will not be restored anymore. 716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mApnSetting.types[0].equals(PhoneConstants.APN_TYPE_MMS) 717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || !isIpAddress(mApnSetting.mmsProxy)) { 718cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log(String.format( 719cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s", 720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.types[0], PhoneConstants.APN_TYPE_MMS, mApnSetting.mmsProxy, 721ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville isIpAddress(mApnSetting.mmsProxy))); 722cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 723cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 724cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 725cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 7260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 72827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_GPRS = "4092,8760,48000,4096,8760,48000"; 72927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EDGE = "4093,26280,70800,4096,16384,70800"; 73027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_UMTS = "58254,349525,1048576,58254,349525,1048576"; 731d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao private static final String TCP_BUFFER_SIZES_1XRTT= "16384,32768,131072,4096,16384,102400"; 73227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_EVDO = "4094,87380,262144,4096,16384,262144"; 733d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao private static final String TCP_BUFFER_SIZES_EHRPD= "131072,262144,1048576,4096,16384,524288"; 73427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSDPA= "61167,367002,1101005,8738,52429,262114"; 73527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPA = "40778,244668,734003,16777,100663,301990"; 73627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_LTE = 73727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt "524288,1048576,2097152,262144,524288,1048576"; 73827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private static final String TCP_BUFFER_SIZES_HSPAP= "122334,734003,2202010,32040,192239,576717"; 73927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 74027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt private void updateTcpBufferSizes(int rilRat) { 74127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt String sizes = null; 7422f43e7848e6039b1f7541ef129fedad3b66947f0Robert Greenwalt if (rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA) { 7432f43e7848e6039b1f7541ef129fedad3b66947f0Robert Greenwalt // for now treat CA as LTE. Plan to surface the extra bandwith in a more 7442f43e7848e6039b1f7541ef129fedad3b66947f0Robert Greenwalt // precise manner which should affect buffer sizes 7452f43e7848e6039b1f7541ef129fedad3b66947f0Robert Greenwalt rilRat = ServiceState.RIL_RADIO_TECHNOLOGY_LTE; 7462f43e7848e6039b1f7541ef129fedad3b66947f0Robert Greenwalt } 7478fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String ratName = ServiceState.rilRadioTechnologyToString(rilRat).toLowerCase(Locale.ROOT); 7488fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // ServiceState gives slightly different names for EVDO tech ("evdo-rev.0" for ex) 7498fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // - patch it up: 7508fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0 || 7518fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A || 7528fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt rilRat == ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B) { 7538fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt ratName = "evdo"; 7548fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 7558fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 7568fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // in the form: "ratname:rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max" 7578fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] configOverride = mPhone.getContext().getResources().getStringArray( 7588fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt com.android.internal.R.array.config_mobile_tcp_buffers); 7598fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt for (int i = 0; i < configOverride.length; i++) { 7608fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt String[] split = configOverride[i].split(":"); 7618fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (ratName.equals(split[0]) && split.length == 2) { 7628fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = split[1]; 76327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt break; 7648fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 7658fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 7668fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt 7678fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt if (sizes == null) { 7688fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // no override - use telephony defaults 7698fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // doing it this way allows device or carrier to just override the types they 7708fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // care about and inherit the defaults for the others. 7718fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt switch (rilRat) { 7728fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: 7738fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_GPRS; 7748fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 7758fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: 7768fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EDGE; 7778fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 7788fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: 7798fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_UMTS; 7808fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 781d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: 782d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao sizes = TCP_BUFFER_SIZES_1XRTT; 783d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao break; 7848fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: 7858fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: 7868fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: 7878fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_EVDO; 7888fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 789d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: 790d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao sizes = TCP_BUFFER_SIZES_EHRPD; 791d98d019d2a23bc7a8f96e8388021e5c87b71f158Gordon Gao break; 7928fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: 7938fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSDPA; 7948fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 7958fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: 7968fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: 7978fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPA; 7988fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 7998fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: 800000f48b9c960010bf41cd22b8625b4ff16c2e719Ajay Nambi case ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA: 8018fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_LTE; 8028fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8038fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: 8048fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt sizes = TCP_BUFFER_SIZES_HSPAP; 8058fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8068fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt default: 8078fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt // Leave empty - this will let ConnectivityService use the system default. 8088fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt break; 8098fa68fc28795817ce90fdf2a09b859a2d8453ffbRobert Greenwalt } 81027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 81127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mLinkProperties.setTcpBufferSizes(sizes); 81227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 81327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt 814692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt /** 815692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * Indicates if when this connection was established we had a restricted/privileged 816692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * NetworkRequest and needed it to overcome data-enabled limitations. 817692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * 818692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * This gets set once per connection setup and is based on conditions at that time. 819692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * We could theoretically have dynamic capabilities but now is not a good time to 820ecb75ffc91e7036ae87c5f0488fa871d4e079922Jack Yu * experiment with that. 821692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * 822692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * This flag overrides the APN-based restriction capability, restricting the network 823692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * based on both having a NetworkRequest with restricted AND needing a restricted 824692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * bit to overcome user-disabled status. This allows us to handle the common case 825692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * of having both restricted requests and unrestricted requests for the same apn: 826692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * if conditions require a restricted network to overcome user-disabled then it must 827692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * be restricted, otherwise it is unrestricted (or restricted based on APN type). 828692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * 829692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * Because we're not supporting dynamic capabilities, if conditions change and we go from 830692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * data-enabled to not or vice-versa we will need to tear down networks to deal with it 831692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * at connection setup time with the new state. 832692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * 833692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * This supports a privileged app bringing up a network without general apps having access 834692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * to it when the network is otherwise unavailable (hipri). The first use case is 835692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * pre-paid SIM reprovisioning over internet, where the carrier insists on no traffic 836692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt * other than from the privileged carrier-app. 837692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt */ 838692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt private boolean mRestrictedNetworkOverride = false; 839692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt 840692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt // Should be called once when the call goes active to examine the state of things and 841692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt // declare the restriction override for the life of the connection 842692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt private void setNetworkRestriction() { 843692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt mRestrictedNetworkOverride = false; 844692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt // first, if we have no restricted requests, this override can stay FALSE: 845692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt boolean noRestrictedRequests = true; 846692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt for (ApnContext apnContext : mApnContexts.keySet()) { 847443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt noRestrictedRequests &= apnContext.hasNoRestrictedRequests(true /* exclude DUN */); 848692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt } 849692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt if (noRestrictedRequests) { 850692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt return; 851692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt } 852692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt 853692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt // Do we need a restricted network to satisfy the request? 854692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt // Is this network metered? If not, then don't add restricted 855692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt if (!mApnSetting.isMetered(mPhone.getContext(), mPhone.getSubId(), 856692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt mPhone.getServiceState().getDataRoaming())) { 857692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt return; 858692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt } 859692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt 860a8f5a859f8e4a15902d729af5d2edc9a9433ba41Jack Yu // Is data disabled? 861120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu mRestrictedNetworkOverride = !mDct.isDataEnabled(); 862692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt } 863692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt 8646289b21a3b9f0214a862878096384d8ce90a572cJack Yu NetworkCapabilities getNetworkCapabilities() { 86562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt NetworkCapabilities result = new NetworkCapabilities(); 86662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 86762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 86862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mApnSetting != null) { 86962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt for (String type : mApnSetting.types) { 870120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu if (!mRestrictedNetworkOverride 8715325b6786ca1092644cefc11b2991f1e8e5671a3Jack Yu && (mConnectionParams != null && mConnectionParams.mUnmeteredUseOnly) 8725325b6786ca1092644cefc11b2991f1e8e5671a3Jack Yu && ApnSetting.isMeteredApnType(type, 873120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu mPhone.getContext(), mPhone.getSubId(), 874120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu mPhone.getServiceState().getDataRoaming())) { 875120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu log("Dropped the metered " + type + " for the unmetered data call."); 876120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu continue; 877120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu } 87862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (type) { 879b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt case PhoneConstants.APN_TYPE_ALL: { 880fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 881fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 882fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 883fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 884fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 885fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 886fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 887b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt break; 888b372e78452b9432b51cda43f6264240b04d62dd4Robert Greenwalt } 88962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DEFAULT: { 890fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 89162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 89262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 89362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_MMS: { 894fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 89562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 89662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 89762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_SUPL: { 898fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL); 89962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 90162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_DUN: { 902c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt ApnSetting securedDunApn = mDct.fetchDunApn(); 903c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt if (securedDunApn == null || securedDunApn.equals(mApnSetting)) { 904c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); 905c149ab8bbbbf21b09b343878009d381bd4f2adf5Robert Greenwalt } 90662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 90762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 90862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_FOTA: { 909fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA); 91062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 91162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IMS: { 913fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS); 91462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 91562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 91662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_CBS: { 917fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS); 91862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 91962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 92062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case PhoneConstants.APN_TYPE_IA: { 921fd555a178c05e409917f22745743ed59402208e6Robert Greenwalt result.addCapability(NetworkCapabilities.NET_CAPABILITY_IA); 92262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 92362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 9244a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi case PhoneConstants.APN_TYPE_EMERGENCY: { 9254a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi result.addCapability(NetworkCapabilities.NET_CAPABILITY_EIMS); 9264a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi break; 9274a2acc7448e8ba4a91b8d48eef63198106b959ddAjay Nambi } 92862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 92962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 93062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 9318b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu 932120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu // Mark NOT_METERED in the following cases, 933120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu // 1. All APNs in APN settings are unmetered. 934120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu // 2. The non-restricted data and is intended for unmetered use only. 9355325b6786ca1092644cefc11b2991f1e8e5671a3Jack Yu if (((mConnectionParams != null && mConnectionParams.mUnmeteredUseOnly) 9365325b6786ca1092644cefc11b2991f1e8e5671a3Jack Yu && !mRestrictedNetworkOverride) 937120d52b890d9ec9993747a31b199694ba2c0b7a2Jack Yu || !mApnSetting.isMetered(mPhone.getContext(), mPhone.getSubId(), 9383d8c0f70a6fa7a53fda3c5d592de0ac3aa247e3cfionaxu mPhone.getServiceState().getDataRoaming())) { 9398b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); 940a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu mNetworkInfo.setMetered(false); 941a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu } else { 942a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); 943a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu mNetworkInfo.setMetered(true); 9448b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu } 9458b0a1cbd24977a1abbba79736cf9f481ced0703aJack Yu 946af171aa4dcf294bf2d1b9bed54ef9a6b0ec76361Paul Jensen result.maybeMarkCapabilitiesRestricted(); 94762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 948692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt if (mRestrictedNetworkOverride) { 949692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); 950443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt // don't use dun on restriction-overriden networks. 951443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt result.removeCapability(NetworkCapabilities.NET_CAPABILITY_DUN); 952692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt } 953692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt 95462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int up = 14; 95562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int down = 14; 95662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt switch (mRilRat) { 95727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: up = 80; down = 80; break; 95827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: up = 59; down = 236; break; 95927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: up = 384; down = 384; break; 96027176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A: // fall through 96127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B: up = 14; down = 14; break; 96227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: up = 153; down = 2457; break; 96327176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: up = 1843; down = 3174; break; 96427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: up = 100; down = 100; break; 96527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: up = 2048; down = 14336; break; 96627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: up = 5898; down = 14336; break; 96727176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: up = 5898; down = 14336; break; 96827176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: up = 1843; down = 5017; break; 96927176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: up = 51200; down = 102400; break; 970000f48b9c960010bf41cd22b8625b4ff16c2e719Ajay Nambi case ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA: up = 51200; down = 102400; break; 97127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: up = 153; down = 2516; break; 97227176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: up = 11264; down = 43008; break; 97362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt default: 97462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 97562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkUpstreamBandwidthKbps(up); 97662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt result.setLinkDownstreamBandwidthKbps(down); 977edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt 97826c3198e70345a70e5dfa8ee422c7c4e60916cbeLorenzo Colitti result.setNetworkSpecifier(new StringNetworkSpecifier(Integer.toString(mPhone.getSubId()))); 979edb419cf73826d033065919f63e4ffdd7d76db81Robert Greenwalt 98062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt return result; 98162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 98262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isIpAddress(String address) { 984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (address == null) return false; 985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return Patterns.IP_ADDRESS.matcher(address).matches(); 987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult setLinkProperties(DataCallResponse response, 990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp) { 991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if system property dns usable 992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean okToUseSystemPropertyDns = false; 993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String propertyPrefix = "net." + response.ifname + "."; 994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String dnsServers[] = new String[2]; 995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); 996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); 997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville okToUseSystemPropertyDns = isDnsOk(dnsServers); 998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 1000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return response.setLinkProperties(lp, okToUseSystemPropertyDns); 1001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 10049a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * Initialize connection, this will fail if the 10059a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * apnSettings are not compatible. 10069a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * 10070e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * @param cp the Connection parameters 10089a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @return true if initialization was successful. 10099a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville */ 10109a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville private boolean initConnection(ConnectionParams cp) { 10119a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ApnContext apnContext = cp.mApnContext; 10129a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (mApnSetting == null) { 10139a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // Only change apn setting if it isn't set, it will 10149a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // only NOT be set only if we're in DcInactiveState. 10159a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnSetting = apnContext.getApnSetting(); 1016bc1e44907073900212fb87da372174483525f3edJay Shrauner } 1017bc1e44907073900212fb87da372174483525f3edJay Shrauner if (mApnSetting == null || !mApnSetting.canHandleType(apnContext.getApnType())) { 10189a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10199a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: incompatible apnSetting in ConnectionParams cp=" + cp 10209a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " dc=" + DataConnection.this); 10219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return false; 10239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mTag += 1; 10259a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams = cp; 10269a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams.mTag = mTag; 10279a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10281a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt // always update the ConnectionParams with the latest or the 10291a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt // connectionGeneration gets stale 10301a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt mApnContexts.put(apnContext, cp); 10311a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt 10329a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10339a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: " 10349a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() 10359a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mApnList=" + mApnContexts 10369a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mConnectionParams=" + mConnectionParams); 10379a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10389a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return true; 10399a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10409a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 10419a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville /** 1042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The parent state for all other states. 1043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDefaultState extends State { 1045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: enter"); 1048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1049203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Register for DRS or RAT change 1050203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), 1051203e588e3c42a81aa8a56f595119c181a63b12caWink Saville DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); 1052203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1053ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().registerForDataRoamingOn(getHandler(), 105462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_ON, null); 1055ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().registerForDataRoamingOff(getHandler(), 105662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null); 105762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Add ourselves to the list of data connections 1059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addDc(DataConnection.this); 1060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: exit"); 1064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 106546f190903e93c653b90b970c1a21159bb957575bWink Saville // Unregister for DRS or RAT change. 106646f190903e93c653b90b970c1a21159bb957575bWink Saville mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); 106746f190903e93c653b90b970c1a21159bb957575bWink Saville 1068ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().unregisterForDataRoamingOn(getHandler()); 1069ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao mPhone.getServiceStateTracker().unregisterForDataRoamingOff(getHandler()); 107062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 107146f190903e93c653b90b970c1a21159bb957575bWink Saville // Remove ourselves from the DC lists 107246f190903e93c653b90b970c1a21159bb957575bWink Saville mDcController.removeDc(DataConnection.this); 1073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.disconnected(); 1076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = null; 1077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = null; 1079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReconnectIntent = null; 1080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = null; 1081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 1082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = null; 1083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = null; 1084ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = null; 1085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mUserData = null; 1086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = null; 1087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = null; 1088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1089ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal = HANDLED; 1093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefault msg=" + getWhatToString(msg.what) 1096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RefCount=" + mApnContexts.size()); 1097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 1100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 1101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("Disconnecting to previous connection mAc=" + mAc); 1102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED); 1104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = new AsyncChannel(); 1106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.connected(null, getHandler(), msg.replyTo); 1107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected"); 1108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 1109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_SUCCESSFUL, mId, "hi"); 1110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 111445eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville if (DBG) { 111545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcDefault: CMD_CHANNEL_DISCONNECTED before quiting call dump"); 111645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville dumpToLog(); 111745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 111845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 1119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quit(); 1120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1122454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_IS_INACTIVE: { 1123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean val = getIsInactive(); 1124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_IS_INACTIVE isInactive=" + val); 1125454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_IS_INACTIVE, val ? 1 : 0); 1126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1128454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_CID: { 1129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int cid = getCid(); 1130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_CID cid=" + cid); 1131454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_CID, cid); 1132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1134454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_APNSETTING: { 1135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting = getApnSetting(); 1136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_APNSETTING mApnSetting=" + apnSetting); 1137454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_APNSETTING, apnSetting); 1138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1140454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_LINK_PROPERTIES: { 1141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp = getCopyLinkProperties(); 1142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp); 1143454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_PROPERTIES, lp); 1144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1146454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: { 11479c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk ProxyInfo proxy = (ProxyInfo) msg.obj; 1148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy); 1149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLinkPropertiesHttpProxy(proxy); 1150454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY); 11511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mNetworkAgent != null) { 11521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNetworkAgent.sendLinkProperties(mLinkProperties); 11531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1156f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt case DcAsyncChannel.REQ_GET_NETWORK_CAPABILITIES: { 11576289b21a3b9f0214a862878096384d8ce90a572cJack Yu NetworkCapabilities nc = getNetworkCapabilities(); 1158f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (VDBG) log("REQ_GET_NETWORK_CAPABILITIES networkCapabilities" + nc); 1159f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_NETWORK_CAPABILITIES, nc); 1160f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt break; 1161f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 1162454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: msg.what=REQ_RESET"); 1164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); 1168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.UNKNOWN, false); 1170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT RefCount=" 1175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL RefCount=" 1183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_TEAR_DOWN_NOW: 1189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW"); 1190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, 0, null); 1191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: 1194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_LOST_CONNECTION" 1196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 1197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 1198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1200203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1201203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1202203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1203203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drsRatPair.first; 120427176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt if (mRilRat != drsRatPair.second) { 120527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(drsRatPair.second); 120627176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt } 1207203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = drsRatPair.second; 1208203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1209203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcDefaultState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1210203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " drs=" + mDataRegState 1211203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRilRat=" + mRilRat); 1212203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 121362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt ServiceState ss = mPhone.getServiceState(); 121462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt int networkType = ss.getDataNetworkType(); 121562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setSubtype(networkType, 121662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt TelephonyManager.getNetworkTypeName(networkType)); 121762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt if (mNetworkAgent != null) { 12186356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt updateNetworkInfoSuspendState(); 12196289b21a3b9f0214a862878096384d8ce90a572cJack Yu mNetworkAgent.sendNetworkCapabilities(getNetworkCapabilities()); 122062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 122127176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt mNetworkAgent.sendLinkProperties(mLinkProperties); 122262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 122362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 122462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 122562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: 122662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 122762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 122862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 122962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: 123062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 1231203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1232203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState: shouldn't happen but ignore msg.what=" 1236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 12446356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 12456356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt private boolean updateNetworkInfoSuspendState() { 12466356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final NetworkInfo.DetailedState oldState = mNetworkInfo.getDetailedState(); 12476356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 12486356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // this is only called when we are either connected or suspended. Decide which. 12496356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (mNetworkAgent == null) { 12506356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt Rlog.e(getName(), "Setting suspend state without a NetworkAgent"); 12516356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12526356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 12536356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // if we are not in-service change to SUSPENDED 12546356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final ServiceStateTracker sst = mPhone.getServiceStateTracker(); 12556356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (sst.getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) { 1256c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.SUSPENDED, null, 1257c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12586356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } else { 12596356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // check for voice call and concurrency issues 12606356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (sst.isConcurrentVoiceAndDataAllowed() == false) { 12616356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt final CallTracker ct = mPhone.getCallTracker(); 12626356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt if (ct.getState() != PhoneConstants.State.IDLE) { 1263c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.SUSPENDED, null, 1264c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12656356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt return (oldState != NetworkInfo.DetailedState.SUSPENDED); 12666356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12676356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 1268c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, 1269c9ddef3f0e72e76157b7b6b540b754d798fc5cccRobert Greenwalt mNetworkInfo.getExtraInfo()); 12706356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12716356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt return (oldState != mNetworkInfo.getDetailedState()); 12726356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 12736356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 1274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDefaultState mDefaultState = new DcDefaultState(); 1275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is inactive and expects a EVENT_CONNECT. 1278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcInactiveState extends State { 1280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed connecting 1281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(ConnectionParams cp, DcFailCause cause) { 12820e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (VDBG) log("DcInactiveState: setEnterNotificationParams cp,cause"); 1283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = cp; 1284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed disconnected 1289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DisconnectParams dp) { 12900e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (VDBG) log("DcInactiveState: setEnterNotificationParams dp"); 1291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts of the failure cause 1297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DcFailCause cause) { 1298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 1300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag += 1; 1306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: enter() mTag=" + mTag); 1307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != null) { 1309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyConnectCompleted +ALL failCause=" 1311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(mConnectionParams, mDcFailCause, true); 1314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams != null) { 1316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyDisconnectCompleted +ALL failCause=" 1318ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1319ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(mDisconnectParams, true); 1321ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams == null && mConnectionParams == null && mDcFailCause != null) { 1323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyAllDisconnectCompleted failCause=" 1325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 1326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllDisconnectCompleted(mDcFailCause); 1328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from cid mapping, before clearSettings 1331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville clearSettings(); 1334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1345454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset"); 1348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 13539a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcInactiveState: mag.what=EVENT_CONNECT"); 13549a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 13559a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 13569a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 13579a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 13589a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 13599a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 13609a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcInactiveState: msg.what=EVENT_CONNECT initConnection failed"); 13619a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 13629a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 13639a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 1364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1365ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1366ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1367ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1368ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1369ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT"); 1370ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1372ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1374ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1375ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL"); 1376ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState nothandled msg.what=" + getWhatToString(msg.what)); 1383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1386ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1387ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1388ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1389ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1390ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcInactiveState mInactiveState = new DcInactiveState(); 1391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is activating a connection. 1394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActivatingState extends State { 1396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1398ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 1400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp; 1401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActivatingState: msg=" + msgToString(msg)); 1403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1404203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1406203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Activating can't process until we're done. 1407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_SETUP_DATA_CONNECTION_DONE: 1412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar); 1416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result != DataCallResponse.SetupResult.ERR_Stale) { 1417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:"+ mConnectionParams 1419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1422c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1423c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState onSetupConnectionCompleted result=" + result 1424c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1425c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 14262dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) { 14272dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt cp.mApnContext.requestLog("onSetupConnectionCompleted result=" + result); 14282dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt } 1429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (result) { 1430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case SUCCESS: 1431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // All is well 1432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActiveState); 1434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_BadCommand: 1436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Vendor ril rejected the command and didn't connect. 1437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_UnacceptableParameter: 1443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The addresses given from the RIL are bad 1444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(cp); 1445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingErrorCreatingConnection); 1446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_RilError: 14480e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 14490e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // Retrieve the suggested retry delay from the modem and save it. 14500e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // If the modem want us to retry the current APN again, it will 14510e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // suggest a positive delay value (in milliseconds). Otherwise we'll get 14520e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // NO_SUGGESTED_RETRY_DELAY here. 14530e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu long delay = getSuggestedRetryDelay(ar); 14540e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu cp.mApnContext.setModemSuggestedDelay(delay); 14550e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 14562dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcActivatingState: ERR_RilError " 14572dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " delay=" + delay 14582dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result=" + result 14592dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + " result.isRestartRadioFail=" + 146031f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu result.mFailCause.isRestartRadioFail(mPhone.getContext(), 146131f84bf1a4f1c945f7ca4646095ef4717a261c98Jordan Liu mPhone.getSubId()) 1462ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu + " isPermanentFailure=" + 1463ccfe5ebaf81c1378e8dbe44e45df26b0dc462a21Jack Yu mDct.isPermanentFailure(result.mFailCause); 14642dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 14652dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog(str); 14660e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 14670e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // Save the cause. DcTracker.onDataSetupComplete will check this 14680e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // failure cause and determine if we need to retry this APN later 14690e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // or not. 14700e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 14710e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu transitionTo(mInactiveState); 1472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_Stale: 1474ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_SETUP_DATA_CONNECTION_DONE" 1475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville throw new RuntimeException("Unknown SetupResult, should not happen"); 1479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_GET_LAST_FAIL_DONE: 1484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:" + mConnectionParams 1489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause cause = DcFailCause.UNKNOWN; 1493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 1495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int rilFailCause = ((int[]) (ar.result))[0]; 1496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = DcFailCause.fromInt(rilFailCause); 14971db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (cause == DcFailCause.NONE) { 14981db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (DBG) { 14991db7da14111228a5079d2970d7d0ce34173000b5Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 15001db7da14111228a5079d2970d7d0ce34173000b5Wink Saville + " BAD: error was NONE, change to UNKNOWN"); 15011db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 15021db7da14111228a5079d2970d7d0ce34173000b5Wink Saville cause = DcFailCause.UNKNOWN; 15031db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 1504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1507c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1508c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 15090e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu + " cause=" + cause + " dc=" + DataConnection.this); 1510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 15110e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 15120e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mInactiveState.setEnterNotificationParams(cp, cause); 15130e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu transitionTo(mInactiveState); 1514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_GET_LAST_FAIL_DONE" 1516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActivatingState not handled msg.what=" + 1525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville getWhatToString(msg.what) + " RefCount=" + mApnContexts.size()); 1526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActivatingState mActivatingState = new DcActivatingState(); 1534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is connected, expecting an EVENT_DISCONNECT. 1537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActiveState extends State { 1539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override public void enter() { 1540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: enter dc=" + DataConnection.this); 1541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 15421fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt // verify and get updated information in case these things 15431fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt // are obsolete 15441fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt { 15451fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt ServiceState ss = mPhone.getServiceState(); 15461fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt final int networkType = ss.getDataNetworkType(); 15471fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt if (mNetworkInfo.getSubtype() != networkType) { 15481fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt log("DcActiveState with incorrect subtype (" + mNetworkInfo.getSubtype() + 15491fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt ", " + networkType + "), updating."); 15501fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt } 15511fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt mNetworkInfo.setSubtype(networkType, TelephonyManager.getNetworkTypeName(networkType)); 15521fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt final boolean roaming = ss.getDataRoaming(); 15531fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt if (roaming != mNetworkInfo.isRoaming()) { 15541fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt log("DcActiveState with incorrect roaming (" + mNetworkInfo.isRoaming() + 15551fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt ", " + roaming +"), updating."); 15561fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt } 15571fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt mNetworkInfo.setRoaming(roaming); 15581fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt } 15591fb93b5f57b92a2951a0ca2122ad17809b45675eRobert Greenwalt 15605488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan boolean createNetworkAgent = true; 15615488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan // If a disconnect is already pending, avoid notifying all of connected 15621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (hasMessages(EVENT_DISCONNECT) || 15631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasMessages(EVENT_DISCONNECT_ALL) || 15641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasDeferredMessages(EVENT_DISCONNECT) || 15651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu hasDeferredMessages(EVENT_DISCONNECT_ALL)) { 15665488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan log("DcActiveState: skipping notifyAllOfConnected()"); 15675488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan createNetworkAgent = false; 15685488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } else { 15695488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan // If we were retrying there maybe more than one, otherwise they'll only be one. 15705488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan notifyAllOfConnected(Phone.REASON_CONNECTED); 15715488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 15736356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().registerForVoiceCallStarted(getHandler(), 15746356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_STARTED, null); 15756356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().registerForVoiceCallEnded(getHandler(), 15766356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_ENDED, null); 15776356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 1578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If the EVENT_CONNECT set the current max retry restore it here 1579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // if it didn't then this is effectively a NOP. 1580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addActiveDcByCid(DataConnection.this); 158162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 158262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, 158362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.getReason(), null); 158462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setExtraInfo(mApnSetting.apn); 158527176514b825175a0f402fe7fc2eb4e281ce8bddRobert Greenwalt updateTcpBufferSizes(mRilRat); 1586957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey 1587957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey final NetworkMisc misc = new NetworkMisc(); 15884c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu final CarrierSignalAgent carrierSignalAgent = mPhone.getCarrierSignalAgent(); 15896a7fb078d1cacba7cf2e83b71242bb5c4c27c975fionaxu if (carrierSignalAgent.hasRegisteredReceivers(TelephonyIntents 15906a7fb078d1cacba7cf2e83b71242bb5c4c27c975fionaxu .ACTION_CARRIER_SIGNAL_REDIRECTED)) { 15914c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu // carrierSignal Receivers will place the carrier-specific provisioning notification 15924c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu misc.provisioningNotificationDisabled = true; 15934c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu } 1594957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey misc.subscriberId = mPhone.getSubscriberId(); 15955488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan 15965488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (createNetworkAgent) { 1597692640f429efa8e292c6261472b2c682e1079f8eRobert Greenwalt setNetworkRestriction(); 15985488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(), 15996289b21a3b9f0214a862878096384d8ce90a572cJack Yu "DcNetworkAgent", mNetworkInfo, getNetworkCapabilities(), mLinkProperties, 16005488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan 50, misc); 16015488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: exit dc=" + this); 160727b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra String reason = mNetworkInfo.getReason(); 160822ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang if(mDcController.isExecutingCarrierChange()) { 160922ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang reason = Phone.REASON_CARRIER_CHANGE; 161022ae2cc396de6231f06fbde617d79723092f17a5Feixiong Zhang } else if (mDisconnectParams != null && mDisconnectParams.mReason != null) { 161127b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason = mDisconnectParams.mReason; 161227b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra } else if (mDcFailCause != null) { 161327b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason = mDcFailCause.toString(); 161427b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra } 16156356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().unregisterForVoiceCallStarted(getHandler()); 16166356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mPhone.getCallTracker().unregisterForVoiceCallEnded(getHandler()); 16176356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt 161862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, 161927b15ba477b11994dc61f8b96c666e4f8302a09dVipin Sapra reason, mNetworkInfo.getExtraInfo()); 16205488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 16215488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 16225488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent = null; 16235488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 1624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 1632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 16333f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt // either add this new apn context to our set or 16343f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt // update the existing cp with the latest connection generation number 16353f545d699edbff59ac301f3a47ead0ea223323feRobert Greenwalt mApnContexts.put(cp.mApnContext, cp); 1636c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1637c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this); 1638c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.NONE, false); 1640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1645c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1646c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_DISCONNECT dp=" + dp 1647c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1648c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1649ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if (mApnContexts.containsKey(dp.mApnContext)) { 1650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" 1652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.size() == 1) { 1656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 1657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.remove(dp.mApnContext); 1664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState ERROR no such apnContext=" + dp.mApnContext 1668c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " in this dc=" + DataConnection.this); 1669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1676c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_DISCONNECT clearing apn contexts," 1677c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: { 1689c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1690c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_LOST_CONNECTION dc=" + DataConnection.this); 1691c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 16920e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 16930e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 16940e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu transitionTo(mInactiveState); 1695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 169862c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_ON: { 169962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(true); 17005488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 17015488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 17025488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 170362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 170462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 170562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 170662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt case EVENT_DATA_CONNECTION_ROAM_OFF: { 170762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt mNetworkInfo.setRoaming(false); 17085488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (mNetworkAgent != null) { 17095488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan mNetworkAgent.sendNetworkInfo(mNetworkInfo); 17105488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan } 171162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt retVal = HANDLED; 171262c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt break; 171362c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 171465bee39d7e417fb898c3948696d5d8a38046c449fenglu case EVENT_BW_REFRESH_RESPONSE: { 171565bee39d7e417fb898c3948696d5d8a38046c449fenglu AsyncResult ar = (AsyncResult)msg.obj; 171665bee39d7e417fb898c3948696d5d8a38046c449fenglu if (ar.exception != null) { 171765bee39d7e417fb898c3948696d5d8a38046c449fenglu log("EVENT_BW_REFRESH_RESPONSE: error ignoring, e=" + ar.exception); 171865bee39d7e417fb898c3948696d5d8a38046c449fenglu } else { 171965bee39d7e417fb898c3948696d5d8a38046c449fenglu final ArrayList<Integer> capInfo = (ArrayList<Integer>)ar.result; 172065bee39d7e417fb898c3948696d5d8a38046c449fenglu final int lceBwDownKbps = capInfo.get(0); 17216289b21a3b9f0214a862878096384d8ce90a572cJack Yu NetworkCapabilities nc = getNetworkCapabilities(); 172265bee39d7e417fb898c3948696d5d8a38046c449fenglu if (mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) { 172365bee39d7e417fb898c3948696d5d8a38046c449fenglu nc.setLinkDownstreamBandwidthKbps(lceBwDownKbps); 172465bee39d7e417fb898c3948696d5d8a38046c449fenglu if (mNetworkAgent != null) { 172565bee39d7e417fb898c3948696d5d8a38046c449fenglu mNetworkAgent.sendNetworkCapabilities(nc); 172665bee39d7e417fb898c3948696d5d8a38046c449fenglu } 172765bee39d7e417fb898c3948696d5d8a38046c449fenglu } 172865bee39d7e417fb898c3948696d5d8a38046c449fenglu } 17296356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt retVal = HANDLED; 17306356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt break; 17316356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 17326356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt case EVENT_DATA_CONNECTION_VOICE_CALL_STARTED: 17336356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt case EVENT_DATA_CONNECTION_VOICE_CALL_ENDED: { 17345488b8a7a799bc89427a262a52cba74c26918ec3Amit Mahajan if (updateNetworkInfoSuspendState() && mNetworkAgent != null) { 17356356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt // state changed 17366356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 17376356f18e1120be1b90f18dcd647054a751c52a36Robert Greenwalt } 173865bee39d7e417fb898c3948696d5d8a38046c449fenglu retVal = HANDLED; 173965bee39d7e417fb898c3948696d5d8a38046c449fenglu break; 174065bee39d7e417fb898c3948696d5d8a38046c449fenglu } 1741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState not handled msg.what=" + getWhatToString(msg.what)); 1744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1746ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1747ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1748ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActiveState mActiveState = new DcActiveState(); 1752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1753ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1754ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting. 1755ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1756ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectingState extends State { 1757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1758ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " 1764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) ar.userObj; 17722dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt 17732dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount=" 17742dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt + mApnContexts.size(); 17752dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 17762dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (dp.mApnContext != null) dp.mApnContext.requestLog(str); 17772dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt 1778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp.mTag == mTag) { 1779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj); 1782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1783ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1784ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectState stale EVENT_DEACTIVATE_DONE" 1785ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + dp.mTag + " mTag=" + mTag); 1786ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1788ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1789ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1790ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1791ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1792ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectingState not handled msg.what=" 1793ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1794ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1795ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1796ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1797ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1798ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1799ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1800ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectingState mDisconnectingState = new DcDisconnectingState(); 1802ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1803ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1804ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting after an creating a connection. 1805ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1806ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectionErrorCreatingConnection extends State { 1807ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1808ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1809ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1810ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1811ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1812ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1813ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1814ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 1815ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 18162dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "DcDisconnectionErrorCreatingConnection" + 18172dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt " msg.what=EVENT_DEACTIVATE_DONE"; 18182dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 18192dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (cp.mApnContext != null) cp.mApnContext.requestLog(str); 1820ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1821ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1822ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1823ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, 1824ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER); 1825ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1826ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1827ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1828ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection stale EVENT_DEACTIVATE_DONE" 1829ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + cp.mTag + ", mTag=" + mTag); 1830ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1831ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1832ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1833ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1834ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1835ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1836ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1837ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection not handled msg.what=" 1838ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1839ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1840ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1841ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1842ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1843ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1844ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1845ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1846ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection = 1847ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new DcDisconnectionErrorCreatingConnection(); 1848ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 184962c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 185062c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt private class DcNetworkAgent extends NetworkAgent { 185162c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt public DcNetworkAgent(Looper l, Context c, String TAG, NetworkInfo ni, 1852957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) { 1853957b01a07bfc7ffa29745b39970d930daf40f406Jeff Sharkey super(l, c, TAG, ni, nc, lp, score, misc); 185462c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 185562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 185645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 185762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt protected void unwanted() { 18581484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (mNetworkAgent != this) { 185945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcNetworkAgent: unwanted found mNetworkAgent=" + mNetworkAgent + 18601484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt ", which isn't me. Aborting unwanted"); 18611484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt return; 18621484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt } 18634a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt // this can only happen if our exit has been called - we're already disconnected 18644a4195a11b125e56e25117e92c4c92543b14a5cbRobert Greenwalt if (mApnContexts == null) return; 186537cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt for (ConnectionParams cp : mApnContexts.values()) { 186637cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt final ApnContext apnContext = cp.mApnContext; 186737cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt final Pair<ApnContext, Integer> pair = 186837cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt new Pair<ApnContext, Integer>(apnContext, cp.mConnectionGeneration); 186945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("DcNetworkAgent: [unwanted]: disconnect apnContext=" + apnContext); 187037cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt Message msg = mDct.obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, pair); 1871305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DisconnectParams dp = new DisconnectParams(apnContext, apnContext.getReason(), msg); 1872305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt DataConnection.this.sendMessage(DataConnection.this. 1873305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt obtainMessage(EVENT_DISCONNECT, dp)); 1874305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt } 187562c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 187665bee39d7e417fb898c3948696d5d8a38046c449fenglu 187765bee39d7e417fb898c3948696d5d8a38046c449fenglu @Override 187865bee39d7e417fb898c3948696d5d8a38046c449fenglu protected void pollLceData() { 187965bee39d7e417fb898c3948696d5d8a38046c449fenglu if(mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) { // active LCE service 188065bee39d7e417fb898c3948696d5d8a38046c449fenglu mPhone.mCi.pullLceData(DataConnection.this.obtainMessage(EVENT_BW_REFRESH_RESPONSE)); 188165bee39d7e417fb898c3948696d5d8a38046c449fenglu } 188265bee39d7e417fb898c3948696d5d8a38046c449fenglu } 1883a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu 1884a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu @Override 1885a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu protected void networkStatus(int status, String redirectUrl) { 1886a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu if(!TextUtils.isEmpty(redirectUrl)) { 1887a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu log("validation status: " + status + " with redirection URL: " + redirectUrl); 1888a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu /* its possible that we have multiple DataConnection with INTERNET_CAPABILITY 1889a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu all fail the validation with the same redirection url, send CMD back to DCTracker 1890a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu and let DcTracker to make the decision */ 1891a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu Message msg = mDct.obtainMessage(DctConstants.EVENT_REDIRECTION_DETECTED, 1892a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu redirectUrl); 1893a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu msg.sendToTarget(); 1894a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu } 1895a02b6fd88953d783c32e6d7f84b7eddbc0d1faf1fionaxu } 189662c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt } 189762c954a7a7c4199956c127fcb575ed9114d44491Robert Greenwalt 1898ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ******* "public" interface 1899ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1900ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1901ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used for testing purposes. 1902ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1903ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* package */ void tearDownNow() { 1904ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownNow()"); 1905ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_TEAR_DOWN_NOW)); 1906ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1907ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1908ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 19090e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * Using the result of the SETUP_DATA_CALL determine the retry delay. 19100e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * 19110e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * @param ar is the result from SETUP_DATA_CALL 19120e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * @return NO_SUGGESTED_RETRY_DELAY if no retry is needed otherwise the delay to the 19130e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * next SETUP_DATA_CALL 19140e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu */ 19150e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu private long getSuggestedRetryDelay(AsyncResult ar) { 19160e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 19170e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu DataCallResponse response = (DataCallResponse) ar.result; 19180e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 19190852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu /** According to ril.h 19200852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu * The value < 0 means no value is suggested 19210852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu * The value 0 means retry should be done ASAP. 19220852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu * The value of Integer.MAX_VALUE(0x7fffffff) means no retry. 19230852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu */ 19240852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu 19250852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu // The value < 0 means no value is suggested 19260852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu if (response.suggestedRetryTime < 0) { 19270e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (DBG) log("No suggested retry delay."); 19280e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return RetryManager.NO_SUGGESTED_RETRY_DELAY; 19290e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 19300852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu // The value of Integer.MAX_VALUE(0x7fffffff) means no retry. 19310852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu else if (response.suggestedRetryTime == Integer.MAX_VALUE) { 19320852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu if (DBG) log("Modem suggested not retrying."); 19330852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu return RetryManager.NO_RETRY; 19340852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu } 19350e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 19360e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // We need to cast it to long because the value returned from RIL is a 32-bit integer, 19370e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // but the time values used in AlarmManager are all 64-bit long. 19380e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return (long) response.suggestedRetryTime; 19390e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 19400e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 19410e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu /** 1942ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return the string for msg.what as our info. 1943ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1944ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1945ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected String getWhatToString(int what) { 1946ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return cmdToString(what); 1947ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1948ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1949ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String msgToString(Message msg) { 1950ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retVal; 1951ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg == null) { 1952ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = "null"; 1953ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1954ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville StringBuilder b = new StringBuilder(); 1955ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1956ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("{what="); 1957ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(cmdToString(msg.what)); 1958ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1959ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" when="); 1960ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis(), b); 1961ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1962ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 != 0) { 1963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg1="); 1964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg1); 1965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg2 != 0) { 1968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg2="); 1969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg2); 1970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj != null) { 1973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" obj="); 1974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.obj); 1975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" target="); 1978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.getTarget()); 1979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" replyTo="); 1981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.replyTo); 1982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("}"); 1984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = b.toString(); 1986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static void slog(String s) { 1991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d("DC", s); 1992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug 1996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1999cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2000cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void log(String s) { 2001cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.d(getName(), s); 20020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug attribute 2006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logd(String s) { 2011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(getName(), s); 2012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 20130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with verbose attribute 2016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2017ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2018ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2019ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2020ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logv(String s) { 2021ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.v(getName(), s); 2022ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2023ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2024ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with info attribute 2026ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2028ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2029ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2030ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logi(String s) { 2031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.i(getName(), s); 2032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2034ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with warning attribute 2036ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2040ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logw(String s) { 2041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.w(getName(), s); 20420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2050ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s) { 2051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s); 2052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 2056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 2058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param e is a Throwable which logs additional information. 2059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 2060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s, Throwable e) { 2062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s, e); 2063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Doesn't print mApnList of ApnContext's which would be recursive */ 2066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toStringSimple() { 2067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getName() + ": State=" + getCurrentState().getName() 2068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size() 2069ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mCid=" + mCid + " mCreateTime=" + mCreateTime 2070ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastastFailTime=" + mLastFailTime 2071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastFailCause=" + mLastFailCause 2072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag 2073f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt + " mLinkProperties=" + mLinkProperties 20746289b21a3b9f0214a862878096384d8ce90a572cJack Yu + " linkCapabilities=" + getNetworkCapabilities() 2075443b0ae99852b74898fa688f90dee303a80c1b89Robert Greenwalt + " mRestrictedNetworkOverride=" + mRestrictedNetworkOverride; 2076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 2079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 2080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{" + toStringSimple() + " mApnContexts=" + mApnContexts + "}"; 2081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 208345eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville private void dumpToLog() { 208445eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville dump(null, new PrintWriter(new StringWriter(0)) { 208545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 208645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville public void println(String s) { 208745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville DataConnection.this.logd(s); 208845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 208945eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 209045eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville @Override 209145eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville public void flush() { 209245eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 209345eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville }, null); 209445eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 209545eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville 2096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2097ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Dump the current state. 2098ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 2099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param fd 2100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param pw 2101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param args 2102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 21030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 21040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 2105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.print("DataConnection "); 21060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 2107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts.size=" + mApnContexts.size()); 2108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts=" + mApnContexts); 2109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDataConnectionTracker=" + mDct); 2111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnSetting=" + mApnSetting); 2112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mTag=" + mTag); 2113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCid=" + mCid); 2114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mConnectionParams=" + mConnectionParams); 2115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDisconnectParams=" + mDisconnectParams); 2116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcFailCause=" + mDcFailCause); 2117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mPhone=" + mPhone); 2119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLinkProperties=" + mLinkProperties); 2121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2122203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mDataRegState=" + mDataRegState); 2123203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mRilRat=" + mRilRat); 21246289b21a3b9f0214a862878096384d8ce90a572cJack Yu pw.println(" mNetworkCapabilities=" + getNetworkCapabilities()); 2125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime)); 2126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime)); 2127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailCause=" + mLastFailCause); 2128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 2129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mUserData=" + mUserData); 2130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mInstanceNumber=" + mInstanceNumber); 2131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mAc=" + mAc); 2132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 21330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 21350e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 2136