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
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony.gsm;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Patterns;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.DataConnection;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.DataConnectionTracker;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneBase;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneConstants;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.RILConstants;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.RetryManager;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class GsmDataConnection extends DataConnection {
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String LOG_TAG = "GSM";
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Instance Variables
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int mProfileId = RILConstants.DATA_PROFILE_DEFAULT;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Constructor
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private GsmDataConnection(PhoneBase phone, String name, int id, RetryManager rm,
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            DataConnectionTracker dct) {
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super(phone, name, id, rm, dct);
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Create the connection object
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param phone the Phone
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param id the connection id
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param rm the RetryManager
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return GsmDataConnection that was created.
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static GsmDataConnection makeDataConnection(PhoneBase phone, int id, RetryManager rm,
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            DataConnectionTracker dct) {
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        GsmDataConnection gsmDc = new GsmDataConnection(phone,
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "GsmDC-" + mCount.incrementAndGet(), id, rm, dct);
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        gsmDc.start();
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) gsmDc.log("Made " + gsmDc.getName());
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return gsmDc;
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Begin setting up a data connection, calls setupDataCall
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * and the ConnectionParams will be returned with the
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj.
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param cp is the connection parameters
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void onConnect(ConnectionParams cp) {
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApn = cp.apn;
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("Connecting to carrier: '" + mApn.carrier
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + "' APN: '" + mApn.apn
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + "' proxy: '" + mApn.proxy + "' port: '" + mApn.port);
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        createTime = -1;
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        lastFailTime = -1;
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        lastFailCause = FailCause.NONE;
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // msg.obj will be returned in AsyncResult.userObj;
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp);
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        msg.obj = cp;
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int authType = mApn.authType;
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (authType == -1) {
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            authType = TextUtils.isEmpty(mApn.user) ? RILConstants.SETUP_DATA_AUTH_NONE
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    : RILConstants.SETUP_DATA_AUTH_PAP_CHAP;
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String protocol;
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (phone.getServiceState().getRoaming()) {
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            protocol = mApn.roamingProtocol;
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            protocol = mApn.protocol;
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        phone.mCM.setupDataCall(
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Integer.toString(getRilRadioTechnology(RILConstants.SETUP_DATA_TECH_GSM)),
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Integer.toString(mProfileId),
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mApn.apn, mApn.user, mApn.password,
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Integer.toString(authType),
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                protocol, msg);
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setProfileId(int profileId) {
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mProfileId = profileId;
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getProfileId() {
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mProfileId;
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String toString() {
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "{" + getName() + ": State=" + getCurrentState().getName() +
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " apnSetting=" + mApn + " apnList= " + mApnList + " RefCount=" + mRefCount +
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " cid=" + cid + " create=" + createTime + " lastFail=" + lastFailTime +
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " lastFailCause=" + lastFailCause + "}";
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected boolean isDnsOk(String[] domainNameServers) {
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1])
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && !phone.isDnsCheckDisabled()) {
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Work around a race condition where QMI does not fill in DNS:
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Deactivate PDP and let DataConnectionTracker retry.
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Do not apply the race condition workaround for MMS APN
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // if Proxy is an IP-address.
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Otherwise, the default APN will not be restored anymore.
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (!mApn.types[0].equals(PhoneConstants.APN_TYPE_MMS)
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                || !isIpAddress(mApn.mmsProxy)) {
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log(String.format(
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s",
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mApn.types[0], PhoneConstants.APN_TYPE_MMS, mApn.mmsProxy,
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        isIpAddress(mApn.mmsProxy)));
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return false;
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void log(String s) {
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.d(LOG_TAG, "[" + getName() + "] " + s);
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean isIpAddress(String address) {
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (address == null) return false;
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return Patterns.IP_ADDRESS.matcher(address).matches();
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println("GsmDataConnection extends:");
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.dump(fd, pw, args);
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mProfileId=" + mProfileId);
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
166