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