Merge "Refactor onSetupConnectionCompleted." into honeycomb-LTE
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user