Merge "Refactor onSetupConnectionCompleted." into honeycomb-LTE
This commit is contained in:
@ -17,11 +17,26 @@
|
||||
|
||||
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
|
||||
* TODO: Rename to DataCallResponse.
|
||||
*/
|
||||
public class DataCallState {
|
||||
private final boolean DBG = true;
|
||||
private final String LOG_TAG = "GSM";
|
||||
|
||||
public int version = 0;
|
||||
public int status = 0;
|
||||
public int cid = 0;
|
||||
@ -32,6 +47,29 @@ public class DataCallState {
|
||||
public String [] dnses = 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
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
@ -63,4 +101,127 @@ public class DataCallState {
|
||||
sb.append("]}");
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -61,29 +61,6 @@ public abstract class DataConnection extends HierarchicalStateMachine {
|
||||
protected static Object mCountLock = new Object();
|
||||
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.
|
||||
*/
|
||||
@ -445,10 +422,10 @@ public abstract class DataConnection extends HierarchicalStateMachine {
|
||||
* @param ar is the result
|
||||
* @return SetupResult.
|
||||
*/
|
||||
private SetupResult onSetupConnectionCompleted(AsyncResult ar) {
|
||||
private DataCallState.SetupResult onSetupConnectionCompleted(AsyncResult ar) {
|
||||
DataCallState response = (DataCallState) ar.result;
|
||||
ConnectionParams cp = (ConnectionParams) ar.userObj;
|
||||
SetupResult result;
|
||||
DataCallState.SetupResult result;
|
||||
|
||||
if (ar.exception != null) {
|
||||
if (DBG) {
|
||||
@ -459,148 +436,35 @@ public abstract class DataConnection extends HierarchicalStateMachine {
|
||||
if (ar.exception instanceof CommandException
|
||||
&& ((CommandException) (ar.exception)).getCommandError()
|
||||
== CommandException.Error.RADIO_NOT_AVAILABLE) {
|
||||
result = SetupResult.ERR_BadCommand;
|
||||
result = DataCallState.SetupResult.ERR_BadCommand;
|
||||
result.mFailCause = FailCause.RADIO_NOT_AVAILABLE;
|
||||
} else if ((response == null) || (response.version < 4)) {
|
||||
result = SetupResult.ERR_GetLastErrorFromRil;
|
||||
result = DataCallState.SetupResult.ERR_GetLastErrorFromRil;
|
||||
} else {
|
||||
result = SetupResult.ERR_RilError;
|
||||
result = DataCallState.SetupResult.ERR_RilError;
|
||||
result.mFailCause = FailCause.fromInt(response.status);
|
||||
}
|
||||
} else if (cp.tag != mTag) {
|
||||
if (DBG) {
|
||||
log("BUG: onSetupConnectionCompleted is stale cp.tag=" + cp.tag + ", mtag=" + mTag);
|
||||
}
|
||||
result = SetupResult.ERR_Stale;
|
||||
result = DataCallState.SetupResult.ERR_Stale;
|
||||
} else {
|
||||
log("onSetupConnectionCompleted received DataCallState: " + response);
|
||||
|
||||
// Start with clean network properties and if we have
|
||||
// a failure we'll clear again at the bottom of this code.
|
||||
LinkProperties linkProperties = new LinkProperties();
|
||||
if (response.status == FailCause.NONE.getErrorCode()) {
|
||||
String propertyPrefix = "net." + response.ifname + ".";
|
||||
// Check if system property dns usable
|
||||
boolean okToUseSystemPropertyDns = false;
|
||||
String propertyPrefix = "net." + response.ifname + ".";
|
||||
String dnsServers[] = new String[2];
|
||||
dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1");
|
||||
dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2");
|
||||
okToUseSystemPropertyDns = isDnsOk(dnsServers);
|
||||
|
||||
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];
|
||||
dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1");
|
||||
dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2");
|
||||
if (isDnsOk(dnsServers)) {
|
||||
for (String dnsAddr : dnsServers) {
|
||||
InetAddress ia;
|
||||
try {
|
||||
ia = NetworkUtils.numericToInetAddress(dnsAddr);
|
||||
} 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;
|
||||
// set link properties based on data call response
|
||||
result = response.setLinkProperties(mLinkProperties,
|
||||
okToUseSystemPropertyDns);
|
||||
}
|
||||
|
||||
if (DBG) {
|
||||
log("onSetupConnectionCompleted: DataConnection setup result='"
|
||||
+ result + "' on cid=" + cid);
|
||||
if (result == SetupResult.SUCCESS) {
|
||||
log("onSetupConnectionCompleted: LinkProperties: " + mLinkProperties.toString());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -746,7 +610,7 @@ public abstract class DataConnection extends HierarchicalStateMachine {
|
||||
ar = (AsyncResult) msg.obj;
|
||||
cp = (ConnectionParams) ar.userObj;
|
||||
|
||||
SetupResult result = onSetupConnectionCompleted(ar);
|
||||
DataCallState.SetupResult result = onSetupConnectionCompleted(ar);
|
||||
if (DBG) log("DcActivatingState onSetupConnectionCompleted result=" + result);
|
||||
switch (result) {
|
||||
case SUCCESS:
|
||||
@ -780,7 +644,7 @@ public abstract class DataConnection extends HierarchicalStateMachine {
|
||||
// Request is stale, ignore.
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Unkown SetupResult, should not happen");
|
||||
throw new RuntimeException("Unknown SetupResult, should not happen");
|
||||
}
|
||||
retVal = true;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user