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