Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 574d3c4b authored by John Wang's avatar John Wang Committed by Android (Google) Code Review
Browse files

Merge "Refactor onSetupConnectionCompleted." into honeycomb-LTE

parents 5d6f1167 d3ba7d5b
Loading
Loading
Loading
Loading
+161 −0
Original line number Diff line number Diff line
@@ -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;
    }
}

+18 −154
Original line number Diff line number Diff line
@@ -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()) {
            // 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;
    }

@@ -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;