Loading telephony/java/com/android/internal/telephony/DataCallState.java +161 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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; } } telephony/java/com/android/internal/telephony/DataConnection.java +18 −154 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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) { Loading @@ -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()) { // Check if system property dns usable boolean okToUseSystemPropertyDns = false; 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]; 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; } } okToUseSystemPropertyDns = isDnsOk(dnsServers); // 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; } Loading Loading @@ -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: Loading Loading @@ -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; Loading Loading
telephony/java/com/android/internal/telephony/DataCallState.java +161 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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; } }
telephony/java/com/android/internal/telephony/DataConnection.java +18 −154 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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) { Loading @@ -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()) { // Check if system property dns usable boolean okToUseSystemPropertyDns = false; 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]; 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; } } okToUseSystemPropertyDns = isDnsOk(dnsServers); // 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; } Loading Loading @@ -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: Loading Loading @@ -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; Loading