diff options
10 files changed, 90 insertions, 250 deletions
diff --git a/core/java/android/net/NetworkProperties.java b/core/java/android/net/NetworkProperties.java index da2a2d4258b1..03c0a2eb5e85 100644 --- a/core/java/android/net/NetworkProperties.java +++ b/core/java/android/net/NetworkProperties.java @@ -99,19 +99,20 @@ public class NetworkProperties implements Parcelable { return 0; } + @Override public synchronized String toString() { String ifaceName = (mIface == null ? "" : "InterfaceName: " + mIface.getName() + " "); String ip = "IpAddresses: ["; - for (InetAddress addr : mAddresses) ip += addr.toString() + ","; + for (InetAddress addr : mAddresses) ip += addr.getHostAddress() + ","; ip += "] "; String dns = "DnsAddresses: ["; - for (InetAddress addr : mDnses) dns += addr.toString() + ","; + for (InetAddress addr : mDnses) dns += addr.getHostAddress() + ","; dns += "] "; String proxy = (mHttpProxy == null ? "" : "HttpProxy: " + mHttpProxy.toString() + " "); - String gateway = (mGateway == null ? "" : "Gateway: " + mGateway.toString() + " "); + String gateway = (mGateway == null ? "" : "Gateway: " + mGateway.getHostAddress() + " "); return ifaceName + ip + gateway + dns + proxy; } diff --git a/core/java/android/net/ProxyProperties.java b/core/java/android/net/ProxyProperties.java index 6828dd4fac63..207fb5134a85 100644 --- a/core/java/android/net/ProxyProperties.java +++ b/core/java/android/net/ProxyProperties.java @@ -57,6 +57,14 @@ public class ProxyProperties implements Parcelable { mExclusionList = exclusionList; } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(mProxy.getHostAddress()).append(":").append(mPort) + .append(" xl=").append(mExclusionList); + return sb.toString(); + } + /** * Implement the Parcelable interface * @hide diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java index 13c76e50fb0a..7e722cbeb51e 100644 --- a/telephony/java/com/android/internal/telephony/DataConnection.java +++ b/telephony/java/com/android/internal/telephony/DataConnection.java @@ -21,11 +21,17 @@ import com.android.internal.telephony.gsm.ApnSetting; import com.android.internal.util.HierarchicalState; import com.android.internal.util.HierarchicalStateMachine; +import android.net.NetworkProperties; import android.os.AsyncResult; import android.os.Message; import android.os.SystemProperties; import android.util.EventLog; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; + /** * {@hide} * @@ -255,10 +261,7 @@ public abstract class DataConnection extends HierarchicalStateMachine { protected int mTag; protected PhoneBase phone; protected int cid; - protected String interfaceName; - protected String ipAddress; - protected String gatewayAddress; - protected String[] dnsServers; + protected NetworkProperties mNetworkProperties = new NetworkProperties(); protected long createTime; protected long lastFailTime; protected FailCause lastFailCause; @@ -283,8 +286,6 @@ public abstract class DataConnection extends HierarchicalStateMachine { if (DBG) log("DataConnection constructor E"); this.phone = phone; this.cid = -1; - this.dnsServers = new String[2]; - clearSettings(); setDbg(false); @@ -377,11 +378,7 @@ public abstract class DataConnection extends HierarchicalStateMachine { this.lastFailTime = -1; this.lastFailCause = FailCause.NONE; - interfaceName = null; - ipAddress = null; - gatewayAddress = null; - dnsServers[0] = null; - dnsServers[1] = null; + mNetworkProperties.clear(); } /** @@ -416,37 +413,65 @@ public abstract class DataConnection extends HierarchicalStateMachine { // for (int i = 0; i < response.length; i++) { // log(" response[" + i + "]='" + response[i] + "'"); // } + + // Start with clean network properties and if we have + // a failure we'll clear again at the bottom of this code. + mNetworkProperties.clear(); if (response.length >= 2) { cid = Integer.parseInt(response[0]); - interfaceName = response[1]; - - String prefix = "net." + interfaceName + "."; - gatewayAddress = SystemProperties.get(prefix + "gw"); - dnsServers[0] = SystemProperties.get(prefix + "dns1"); - dnsServers[1] = SystemProperties.get(prefix + "dns2"); - - if (response.length > 2) { - ipAddress = response[2]; - - if (isDnsOk(dnsServers)) { - result = SetupResult.SUCCESS; - } else { - result = SetupResult.ERR_BadDns; + String interfaceName = response[1]; + result = SetupResult.SUCCESS; + + try { + String prefix = "net." + interfaceName + "."; + + mNetworkProperties.setInterface(NetworkInterface.getByName(interfaceName)); + + // TODO: Get gateway and dns via RIL interface not property? + String gatewayAddress = SystemProperties.get(prefix + "gw"); + mNetworkProperties.setGateway(InetAddress.getByName(gatewayAddress)); + + if (response.length > 2) { + String ipAddress = response[2]; + mNetworkProperties.addAddress(InetAddress.getByName(ipAddress)); + + // TODO: Get gateway and dns via RIL interface not property? + String dnsServers[] = new String[2]; + dnsServers[0] = SystemProperties.get(prefix + "dns1"); + dnsServers[1] = SystemProperties.get(prefix + "dns2"); + if (isDnsOk(dnsServers)) { + mNetworkProperties.addDns(InetAddress.getByName(dnsServers[0])); + mNetworkProperties.addDns(InetAddress.getByName(dnsServers[1])); + } else { + result = SetupResult.ERR_BadDns; + } } - } else { - result = SetupResult.SUCCESS; + } catch (UnknownHostException e1) { + log("onSetupCompleted: UnknowHostException " + e1); + e1.printStackTrace(); + result = SetupResult.ERR_Other; + } catch (SocketException e2) { + log("onSetupCompleted: SocketException " + e2); + e2.printStackTrace(); + result = SetupResult.ERR_Other; } } else { + log("onSetupCompleted: error; expected number of responses >= 2 was " + + response.length); result = SetupResult.ERR_Other; } + + // An error occurred so clear properties + if (result != SetupResult.SUCCESS) { + log("onSetupCompleted with an error clearing NetworkProperties"); + mNetworkProperties.clear(); + } } if (DBG) { log("DataConnection setup result='" + result + "' on cid=" + cid); if (result == SetupResult.SUCCESS) { - log("interface=" + interfaceName + " ipAddress=" + ipAddress - + " gateway=" + gatewayAddress + " DNS1=" + dnsServers[0] - + " DNS2=" + dnsServers[1]); + log("NetworkProperties: " + mNetworkProperties.toString()); } } return result; @@ -610,7 +635,16 @@ public abstract class DataConnection extends HierarchicalStateMachine { break; case ERR_BadDns: // Connection succeeded but DNS info is bad so disconnect - EventLog.writeEvent(EventLogTags.PDP_BAD_DNS_ADDRESS, dnsServers[0]); + StringBuilder dnsAddressesSb = new StringBuilder(); + for (InetAddress addr : mNetworkProperties.getDnses()) { + if (dnsAddressesSb.length() != 0) dnsAddressesSb.append(" "); + dnsAddressesSb.append(addr.toString()); + } + if (dnsAddressesSb.length() == 0) { + dnsAddressesSb.append("no-dns-addresses"); + } + EventLog.writeEvent(EventLogTags.PDP_BAD_DNS_ADDRESS, + dnsAddressesSb.toString()); tearDownData(cp); transitionTo(mDisconnectingBadDnsState); break; @@ -877,31 +911,10 @@ public abstract class DataConnection extends HierarchicalStateMachine { } /** - * @return the interface name as a string. - */ - public String getInterface() { - return interfaceName; - } - - /** - * @return the ip address as a string. - */ - public String getIpAddress() { - return ipAddress; - } - - /** - * @return the gateway address as a string. - */ - public String getGatewayAddress() { - return gatewayAddress; - } - - /** - * @return an array of associated DNS addresses. + * @return the connections NetworkProperties */ - public String[] getDnsServers() { - return dnsServers; + public NetworkProperties getNetworkProperties() { + return mNetworkProperties; } /** diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java index 06807c654218..14cb58474287 100644 --- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java @@ -21,18 +21,14 @@ import android.net.NetworkProperties; import android.os.AsyncResult; import android.os.Handler; import android.os.Message; -import android.os.RemoteException; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.text.TextUtils; import android.util.Log; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.UnknownHostException; import java.util.ArrayList; + /** * {@hide} * @@ -422,14 +418,6 @@ public abstract class DataConnectionTracker extends Handler { public abstract ArrayList<DataConnection> getAllDataConnections(); - protected abstract String getInterfaceName(String apnType); - - protected abstract String getIpAddress(String apnType); - - protected abstract String getGateway(String apnType); - - protected abstract String[] getDnsServers(String apnType); - protected abstract void setState(State s); protected NetworkProperties getNetworkProperties(String apnType) { @@ -685,43 +673,7 @@ public abstract class DataConnectionTracker extends Handler { } } - protected NetworkProperties makeNetworkProperties(DataConnection connection) { - NetworkProperties properties = new NetworkProperties(); - try { - properties.setInterface(NetworkInterface.getByName(connection.getInterface())); - } catch (SocketException e) { - Log.e(LOG_TAG, "SocketException creating NetworkInterface: " + e); - } catch (NullPointerException e) { - Log.e(LOG_TAG, "NPE trying to makeNetworkProperties: " + e); - } - - try { - properties.addAddress(InetAddress.getByName(connection.getIpAddress())); - } catch (UnknownHostException e) { - Log.e(LOG_TAG, "UnknownHostException setting IpAddress: " + e); - } catch (SecurityException e) { - Log.e(LOG_TAG, "SecurityException setting IpAddress: " + e); - } - - try { - properties.setGateway(InetAddress.getByName(connection.getGatewayAddress())); - } catch (UnknownHostException e) { - Log.e(LOG_TAG, "UnknownHostException setting GatewayAddress: " + e); - } catch (SecurityException e) { - Log.e(LOG_TAG, "SecurityException setting GatewayAddress: " + e); - } - - try { - String[] dnsStrings = connection.getDnsServers(); - for (int i = 0; i<dnsStrings.length; i++) { - properties.addDns(InetAddress.getByName(dnsStrings[i])); - } - } catch (UnknownHostException e) { - Log.e(LOG_TAG, "UnknownHostException setting DnsAddress: " + e); - } catch (SecurityException e) { - Log.e(LOG_TAG, "SecurityException setting DnsAddress: " + e); - } - // TODO - set Proxy info - return properties; + protected NetworkProperties getNetworkProperties(DataConnection connection) { + return connection.getNetworkProperties(); } } diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java index 784e87d5169d..109b4b9726f0 100644 --- a/telephony/java/com/android/internal/telephony/Phone.java +++ b/telephony/java/com/android/internal/telephony/Phone.java @@ -17,11 +17,9 @@ package com.android.internal.telephony; import android.content.Context; -import android.content.SharedPreferences; import android.net.NetworkProperties; import android.os.Handler; import android.os.Message; -import android.preference.PreferenceManager; import android.telephony.CellLocation; import android.telephony.PhoneStateListener; import android.telephony.ServiceState; @@ -29,7 +27,6 @@ import android.telephony.SignalStrength; import com.android.internal.telephony.DataConnection; import com.android.internal.telephony.gsm.NetworkInfo; -import com.android.internal.telephony.gsm.GsmDataConnection; import com.android.internal.telephony.test.SimulatedRadioControl; import java.util.List; @@ -1382,29 +1379,6 @@ public interface Phone { boolean isDataConnectivityPossible(); /** - * Returns the name of the network interface used by the specified APN type. - */ - String getInterfaceName(String apnType); - - /** - * Returns the IP address of the network interface used by the specified - * APN type. - */ - String getIpAddress(String apnType); - - /** - * Returns the gateway for the network interface used by the specified APN - * type. - */ - String getGateway(String apnType); - - /** - * Returns the DNS servers for the network interface used by the specified - * APN type. - */ - public String[] getDnsServers(String apnType); - - /** * Retrieves the unique device ID, e.g., IMEI for GSM phones and MEID for CDMA phones. */ String getDeviceId(); diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java index e5968a7d298e..27e1cb3f29f3 100644 --- a/telephony/java/com/android/internal/telephony/PhoneBase.java +++ b/telephony/java/com/android/internal/telephony/PhoneBase.java @@ -36,10 +36,8 @@ import android.text.TextUtils; import android.util.Log; import com.android.internal.R; -import com.android.internal.telephony.gsm.GsmDataConnection; import com.android.internal.telephony.test.SimulatedRadioControl; -import java.util.List; import java.util.Locale; @@ -932,26 +930,10 @@ public abstract class PhoneBase extends Handler implements Phone { logUnexpectedCdmaMethodCall("unsetOnEcbModeExitResponse"); } - public String getInterfaceName(String apnType) { - return mDataConnection.getInterfaceName(apnType); - } - - public String getIpAddress(String apnType) { - return mDataConnection.getIpAddress(apnType); - } - public boolean isDataConnectivityEnabled() { return mDataConnection.getDataEnabled(); } - public String getGateway(String apnType) { - return mDataConnection.getGateway(apnType); - } - - public String[] getDnsServers(String apnType) { - return mDataConnection.getDnsServers(apnType); - } - public String[] getActiveApnTypes() { return mDataConnection.getActiveApnTypes(); } diff --git a/telephony/java/com/android/internal/telephony/PhoneProxy.java b/telephony/java/com/android/internal/telephony/PhoneProxy.java index d84859cff40c..c10596d3cd1e 100644 --- a/telephony/java/com/android/internal/telephony/PhoneProxy.java +++ b/telephony/java/com/android/internal/telephony/PhoneProxy.java @@ -20,14 +20,11 @@ package com.android.internal.telephony; import android.app.ActivityManagerNative; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.net.NetworkProperties; import android.os.Handler; import android.os.Message; import android.os.SystemProperties; -import android.preference.PreferenceManager; import android.telephony.CellLocation; -import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.util.Log; @@ -35,7 +32,6 @@ import android.util.Log; import com.android.internal.telephony.cdma.CDMAPhone; import com.android.internal.telephony.gsm.GSMPhone; import com.android.internal.telephony.gsm.NetworkInfo; -import com.android.internal.telephony.gsm.GsmDataConnection; import com.android.internal.telephony.test.SimulatedRadioControl; import java.util.List; @@ -669,22 +665,6 @@ public class PhoneProxy extends Handler implements Phone { return mActivePhone.isDataConnectivityPossible(); } - public String getInterfaceName(String apnType) { - return mActivePhone.getInterfaceName(apnType); - } - - public String getIpAddress(String apnType) { - return mActivePhone.getIpAddress(apnType); - } - - public String getGateway(String apnType) { - return mActivePhone.getGateway(apnType); - } - - public String[] getDnsServers(String apnType) { - return mActivePhone.getDnsServers(apnType); - } - public String getDeviceId() { return mActivePhone.getDeviceId(); } diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java index 8a3af3be4104..c94cfa448564 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java @@ -23,14 +23,12 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; -import android.net.ConnectivityManager; import android.net.IConnectivityManager; import android.net.NetworkInfo; import android.net.TrafficStats; import android.net.wifi.WifiManager; import android.os.AsyncResult; import android.os.Message; -import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; @@ -50,10 +48,7 @@ import com.android.internal.telephony.DataConnectionTracker; import com.android.internal.telephony.EventLogTags; import com.android.internal.telephony.gsm.ApnSetting; import com.android.internal.telephony.Phone; -import com.android.internal.telephony.RetryManager; -import com.android.internal.telephony.ServiceStateTracker; -import java.net.NetworkInterface; import java.util.ArrayList; /** @@ -737,7 +732,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { } if (ar.exception == null) { - mNetworkProperties = makeNetworkProperties(mActiveDataConnection); + mNetworkProperties = getNetworkProperties(mActiveDataConnection); // everything is setup notifyDefaultData(reason); @@ -967,34 +962,6 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { } } - protected String getInterfaceName(String apnType) { - if (mActiveDataConnection != null) { - return mActiveDataConnection.getInterface(); - } - return null; - } - - protected String getIpAddress(String apnType) { - if (mActiveDataConnection != null) { - return mActiveDataConnection.getIpAddress(); - } - return null; - } - - protected String getGateway(String apnType) { - if (mActiveDataConnection != null) { - return mActiveDataConnection.getGatewayAddress(); - } - return null; - } - - protected String[] getDnsServers(String apnType) { - if (mActiveDataConnection != null) { - return mActiveDataConnection.getDnsServers(); - } - return null; - } - public ArrayList<DataConnection> getAllDataConnections() { return dataConnectionList; } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java index 09d46dd6e8b2..1572f09629cc 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java @@ -180,8 +180,8 @@ public class GsmDataConnection extends DataConnection { @Override protected boolean isDnsOk(String[] domainNameServers) { - if (NULL_IP.equals(dnsServers[0]) && NULL_IP.equals(dnsServers[1]) - && !((GSMPhone) phone).isDnsCheckDisabled()) { + if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1]) + && !((GSMPhone) phone).isDnsCheckDisabled()) { // Work around a race condition where QMI does not fill in DNS: // Deactivate PDP and let DataConnectionTracker retry. // Do not apply the race condition workaround for MMS APN @@ -189,6 +189,9 @@ public class GsmDataConnection extends DataConnection { // Otherwise, the default APN will not be restored anymore. if (!apn.types[0].equals(Phone.APN_TYPE_MMS) || !isIpAddress(apn.mmsProxy)) { + log(String.format( + "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s", + apn.types[0], Phone.APN_TYPE_MMS, apn.mmsProxy, isIpAddress(apn.mmsProxy))); return false; } } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index c76da80e5653..face581b41d7 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -27,17 +27,14 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.database.ContentObserver; import android.database.Cursor; -import android.net.ConnectivityManager; import android.net.IConnectivityManager; import android.net.NetworkInfo; -import android.net.NetworkProperties; import android.net.ProxyProperties; import android.net.TrafficStats; import android.net.Uri; import android.net.wifi.WifiManager; import android.os.AsyncResult; import android.os.Message; -import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; @@ -61,7 +58,6 @@ import com.android.internal.telephony.DataConnection.FailCause; import java.io.IOException; import java.net.InetAddress; -import java.net.NetworkInterface; import java.net.UnknownHostException; import java.util.ArrayList; @@ -612,42 +608,6 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return true; } - protected String getInterfaceName(String apnType) { - if (mActivePdp != null && - (apnType == null || - (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { - return mActivePdp.getInterface(); - } - return null; - } - - protected String getIpAddress(String apnType) { - if (mActivePdp != null && - (apnType == null || - (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { - return mActivePdp.getIpAddress(); - } - return null; - } - - public String getGateway(String apnType) { - if (mActivePdp != null && - (apnType == null || - (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { - return mActivePdp.getGatewayAddress(); - } - return null; - } - - protected String[] getDnsServers(String apnType) { - if (mActivePdp != null && - (apnType == null || - (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { - return mActivePdp.getDnsServers(); - } - return null; - } - private boolean pdpStatesHasCID (ArrayList<DataCallState> states, int cid) { for (int i = 0, s = states.size() ; i < s ; i++) { @@ -1138,7 +1098,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } if (ar.exception == null) { - mNetworkProperties = makeNetworkProperties(mActivePdp); + mNetworkProperties = getNetworkProperties(mActivePdp); ApnSetting apn = mActivePdp.getApn(); if (apn.proxy != null && apn.proxy.length() != 0) { |