Merge "Refactor onSetupConnectionCompleted." into honeycomb-LTE

This commit is contained in:
John Wang
2011-04-07 12:44:14 -07:00
committed by Android (Google) Code Review
2 changed files with 179 additions and 154 deletions

View File

@@ -17,11 +17,26 @@
package com.android.internal.telephony; package com.android.internal.telephony;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkUtils;
import android.os.SystemProperties;
import android.util.Log;
import com.android.internal.telephony.DataConnection.FailCause;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
/** /**
* This is RIL_Data_Call_Response_v5 from ril.h * This is RIL_Data_Call_Response_v5 from ril.h
* TODO: Rename to DataCallResponse. * TODO: Rename to DataCallResponse.
*/ */
public class DataCallState { public class DataCallState {
private final boolean DBG = true;
private final String LOG_TAG = "GSM";
public int version = 0; public int version = 0;
public int status = 0; public int status = 0;
public int cid = 0; public int cid = 0;
@@ -32,6 +47,29 @@ public class DataCallState {
public String [] dnses = new String[0]; public String [] dnses = new String[0];
public String[] gateways = new String[0]; public String[] gateways = new String[0];
/**
* Class returned by onSetupConnectionCompleted.
*/
protected enum SetupResult {
SUCCESS,
ERR_BadCommand,
ERR_UnacceptableParameter,
ERR_GetLastErrorFromRil,
ERR_Stale,
ERR_RilError;
public FailCause mFailCause;
SetupResult() {
mFailCause = FailCause.fromInt(0);
}
@Override
public String toString() {
return name() + " SetupResult.mFailCause=" + mFailCause;
}
}
@Override @Override
public String toString() { public String toString() {
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
@@ -63,4 +101,127 @@ public class DataCallState {
sb.append("]}"); sb.append("]}");
return sb.toString(); return sb.toString();
} }
public SetupResult setLinkProperties(LinkProperties linkProperties,
boolean okToUseSystemPropertyDns) {
SetupResult result;
// Start with clean network properties and if we have
// a failure we'll clear again at the bottom of this code.
if (linkProperties == null)
linkProperties = new LinkProperties();
else
linkProperties.clear();
if (status == FailCause.NONE.getErrorCode()) {
String propertyPrefix = "net." + ifname + ".";
try {
// set interface name
linkProperties.setInterfaceName(ifname);
// set link addresses
if (addresses != null && addresses.length > 0) {
for (String addr : addresses) {
LinkAddress la;
int addrPrefixLen;
String [] ap = addr.split("/");
if (ap.length == 2) {
addr = ap[0];
addrPrefixLen = Integer.parseInt(ap[1]);
} else {
addrPrefixLen = 0;
}
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(addr);
} catch (IllegalArgumentException e) {
throw new UnknownHostException("Non-numeric ip addr=" + addr);
}
if (addrPrefixLen == 0) {
// Assume point to point
addrPrefixLen = (ia instanceof Inet4Address) ? 32 : 128;
}
if (DBG) Log.d(LOG_TAG, "addr/pl=" + addr + "/" + addrPrefixLen);
la = new LinkAddress(ia, addrPrefixLen);
linkProperties.addLinkAddress(la);
}
} else {
throw new UnknownHostException("no address for ifname=" + ifname);
}
// set dns servers
if (dnses != null && dnses.length > 0) {
for (String addr : dnses) {
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(addr);
} catch (IllegalArgumentException e) {
throw new UnknownHostException("Non-numeric dns addr=" + addr);
}
linkProperties.addDns(ia);
}
} else if (okToUseSystemPropertyDns){
String dnsServers[] = new String[2];
dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1");
dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2");
for (String dnsAddr : dnsServers) {
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(dnsAddr);
} catch (IllegalArgumentException e) {
throw new UnknownHostException("Non-numeric dns addr="
+ dnsAddr);
}
linkProperties.addDns(ia);
}
} else {
throw new UnknownHostException("Empty dns response and no system default dns");
}
// set gateways
if ((gateways == null) || (gateways.length == 0)) {
String sysGateways = SystemProperties.get(propertyPrefix + "gw");
if (sysGateways != null) {
gateways = sysGateways.split(" ");
} else {
gateways = new String[0];
}
}
for (String addr : gateways) {
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(addr);
} catch (IllegalArgumentException e) {
throw new UnknownHostException("Non-numeric gateway addr=" + addr);
}
linkProperties.addGateway(ia);
}
result = SetupResult.SUCCESS;
} catch (UnknownHostException e) {
Log.d(LOG_TAG, "onSetupCompleted: UnknownHostException " + e);
e.printStackTrace();
result = SetupResult.ERR_UnacceptableParameter;
}
} else {
if (version < 4) {
result = SetupResult.ERR_GetLastErrorFromRil;
} else {
result = SetupResult.ERR_RilError;
}
}
// An error occurred so clear properties
if (result != SetupResult.SUCCESS) {
if(DBG) Log.d(LOG_TAG,
"onSetupConnectionCompleted with an error, clearing LinkProperties");
linkProperties.clear();
}
return result;
}
} }

View File

@@ -61,29 +61,6 @@ public abstract class DataConnection extends HierarchicalStateMachine {
protected static Object mCountLock = new Object(); protected static Object mCountLock = new Object();
protected static int mCount; protected static int mCount;
/**
* Class returned by onSetupConnectionCompleted.
*/
protected enum SetupResult {
SUCCESS,
ERR_BadCommand,
ERR_UnacceptableParameter,
ERR_GetLastErrorFromRil,
ERR_Stale,
ERR_RilError;
public FailCause mFailCause;
SetupResult() {
mFailCause = FailCause.fromInt(0);
}
@Override
public String toString() {
return name() + " SetupResult.mFailCause=" + mFailCause;
}
}
/** /**
* Used internally for saving connecting parameters. * Used internally for saving connecting parameters.
*/ */
@@ -445,10 +422,10 @@ public abstract class DataConnection extends HierarchicalStateMachine {
* @param ar is the result * @param ar is the result
* @return SetupResult. * @return SetupResult.
*/ */
private SetupResult onSetupConnectionCompleted(AsyncResult ar) { private DataCallState.SetupResult onSetupConnectionCompleted(AsyncResult ar) {
DataCallState response = (DataCallState) ar.result; DataCallState response = (DataCallState) ar.result;
ConnectionParams cp = (ConnectionParams) ar.userObj; ConnectionParams cp = (ConnectionParams) ar.userObj;
SetupResult result; DataCallState.SetupResult result;
if (ar.exception != null) { if (ar.exception != null) {
if (DBG) { if (DBG) {
@@ -459,148 +436,35 @@ public abstract class DataConnection extends HierarchicalStateMachine {
if (ar.exception instanceof CommandException if (ar.exception instanceof CommandException
&& ((CommandException) (ar.exception)).getCommandError() && ((CommandException) (ar.exception)).getCommandError()
== CommandException.Error.RADIO_NOT_AVAILABLE) { == CommandException.Error.RADIO_NOT_AVAILABLE) {
result = SetupResult.ERR_BadCommand; result = DataCallState.SetupResult.ERR_BadCommand;
result.mFailCause = FailCause.RADIO_NOT_AVAILABLE; result.mFailCause = FailCause.RADIO_NOT_AVAILABLE;
} else if ((response == null) || (response.version < 4)) { } else if ((response == null) || (response.version < 4)) {
result = SetupResult.ERR_GetLastErrorFromRil; result = DataCallState.SetupResult.ERR_GetLastErrorFromRil;
} else { } else {
result = SetupResult.ERR_RilError; result = DataCallState.SetupResult.ERR_RilError;
result.mFailCause = FailCause.fromInt(response.status); result.mFailCause = FailCause.fromInt(response.status);
} }
} else if (cp.tag != mTag) { } else if (cp.tag != mTag) {
if (DBG) { if (DBG) {
log("BUG: onSetupConnectionCompleted is stale cp.tag=" + cp.tag + ", mtag=" + mTag); log("BUG: onSetupConnectionCompleted is stale cp.tag=" + cp.tag + ", mtag=" + mTag);
} }
result = SetupResult.ERR_Stale; result = DataCallState.SetupResult.ERR_Stale;
} else { } else {
log("onSetupConnectionCompleted received DataCallState: " + response); log("onSetupConnectionCompleted received DataCallState: " + response);
// Start with clean network properties and if we have // Check if system property dns usable
// a failure we'll clear again at the bottom of this code. boolean okToUseSystemPropertyDns = false;
LinkProperties linkProperties = new LinkProperties();
if (response.status == FailCause.NONE.getErrorCode()) {
String propertyPrefix = "net." + response.ifname + "."; String propertyPrefix = "net." + response.ifname + ".";
try {
cid = response.cid;
linkProperties.setInterfaceName(response.ifname);
if (response.addresses != null && response.addresses.length > 0) {
for (String addr : response.addresses) {
LinkAddress la;
int addrPrefixLen;
String [] ap = addr.split("/");
if (ap.length == 2) {
addr = ap[0];
addrPrefixLen = Integer.parseInt(ap[1]);
} else {
addrPrefixLen = 0;
}
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(addr);
} catch (IllegalArgumentException e) {
EventLogTags.writeBadIpAddress(addr);
throw new UnknownHostException("Non-numeric ip addr=" + addr);
}
if (addrPrefixLen == 0) {
// Assume point to point
addrPrefixLen = (ia instanceof Inet4Address) ? 32 : 128;
}
if (DBG) log("addr/pl=" + addr + "/" + addrPrefixLen);
la = new LinkAddress(ia, addrPrefixLen);
linkProperties.addLinkAddress(la);
}
} else {
EventLogTags.writeBadIpAddress("no address for ifname=" + response.ifname);
throw new UnknownHostException("no address for ifname=" + response.ifname);
}
if (response.dnses != null && response.dnses.length > 0) {
for (String addr : response.dnses) {
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(addr);
} catch (IllegalArgumentException e) {
EventLogTags.writePdpBadDnsAddress("dns=" + addr);
throw new UnknownHostException("Non-numeric dns addr=" + addr);
}
linkProperties.addDns(ia);
}
result = SetupResult.SUCCESS;
} else {
String dnsServers[] = new String[2]; String dnsServers[] = new String[2];
dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1");
dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2");
if (isDnsOk(dnsServers)) { okToUseSystemPropertyDns = isDnsOk(dnsServers);
for (String dnsAddr : dnsServers) {
InetAddress ia; // set link properties based on data call response
try { result = response.setLinkProperties(mLinkProperties,
ia = NetworkUtils.numericToInetAddress(dnsAddr); okToUseSystemPropertyDns);
} catch (IllegalArgumentException e) {
EventLogTags.writePdpBadDnsAddress("dnsAddr=" + dnsAddr);
throw new UnknownHostException("Non-numeric dns addr="
+ dnsAddr);
}
linkProperties.addDns(ia);
}
result = SetupResult.SUCCESS;
} else {
StringBuilder sb = new StringBuilder();
for (String dnsAddr : dnsServers) {
sb.append(dnsAddr);
sb.append(" ");
}
EventLogTags.writePdpBadDnsAddress("Unacceptable dns addresses=" + sb);
throw new UnknownHostException("Unacceptable dns addresses=" + sb);
}
}
if ((response.gateways == null) || (response.gateways.length == 0)) {
String gateways = SystemProperties.get(propertyPrefix + "gw");
if (gateways != null) {
response.gateways = gateways.split(" ");
} else {
response.gateways = new String[0];
}
}
for (String addr : response.gateways) {
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(addr);
} catch (IllegalArgumentException e) {
EventLogTags.writePdpBadDnsAddress("gateway=" + addr);
throw new UnknownHostException("Non-numeric gateway addr=" + addr);
}
linkProperties.addGateway(ia);
}
result = SetupResult.SUCCESS;
} catch (UnknownHostException e) {
log("onSetupCompleted: UnknownHostException " + e);
e.printStackTrace();
result = SetupResult.ERR_UnacceptableParameter;
}
} else {
if (response.version < 4) {
result = SetupResult.ERR_GetLastErrorFromRil;
} else {
result = SetupResult.ERR_RilError;
}
} }
// An error occurred so clear properties
if (result != SetupResult.SUCCESS) {
log("onSetupConnectionCompleted with an error, clearing LinkProperties");
linkProperties.clear();
}
mLinkProperties = linkProperties;
}
if (DBG) {
log("onSetupConnectionCompleted: DataConnection setup result='"
+ result + "' on cid=" + cid);
if (result == SetupResult.SUCCESS) {
log("onSetupConnectionCompleted: LinkProperties: " + mLinkProperties.toString());
}
}
return result; return result;
} }
@@ -746,7 +610,7 @@ public abstract class DataConnection extends HierarchicalStateMachine {
ar = (AsyncResult) msg.obj; ar = (AsyncResult) msg.obj;
cp = (ConnectionParams) ar.userObj; cp = (ConnectionParams) ar.userObj;
SetupResult result = onSetupConnectionCompleted(ar); DataCallState.SetupResult result = onSetupConnectionCompleted(ar);
if (DBG) log("DcActivatingState onSetupConnectionCompleted result=" + result); if (DBG) log("DcActivatingState onSetupConnectionCompleted result=" + result);
switch (result) { switch (result) {
case SUCCESS: case SUCCESS:
@@ -780,7 +644,7 @@ public abstract class DataConnection extends HierarchicalStateMachine {
// Request is stale, ignore. // Request is stale, ignore.
break; break;
default: default:
throw new RuntimeException("Unkown SetupResult, should not happen"); throw new RuntimeException("Unknown SetupResult, should not happen");
} }
retVal = true; retVal = true;
break; break;