10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2009 Qualcomm Innovation Center, Inc.  All Rights Reserved.
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2009 The Android Open Source Project
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepackage com.android.internal.telephony.dataconnection;
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkAddress;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkProperties;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.NetworkUtils;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.RouteInfo;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
2599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
27e9701717e43cc5aacbcf624f77a53be92350662cwimport com.android.internal.telephony.PhoneConstants;
28ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.dataconnection.DcFailCause;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.net.Inet4Address;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.net.InetAddress;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.net.UnknownHostException;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This is RIL_Data_Call_Response_v5 from ril.h
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
37ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepublic class DataCallResponse {
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final boolean DBG = true;
39ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private final String LOG_TAG = "DataCallResponse";
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int version = 0;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int status = 0;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int cid = 0;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int active = 0;
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String type = "";
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String ifname = "";
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String [] addresses = new String[0];
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String [] dnses = new String[0];
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String[] gateways = new String[0];
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int suggestedRetryTime = -1;
51a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public String [] pcscf = new String[0];
52e9701717e43cc5aacbcf624f77a53be92350662cw    public int mtu = PhoneConstants.UNSET_MTU;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Class returned by onSetupConnectionCompleted.
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public enum SetupResult {
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SUCCESS,
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ERR_BadCommand,
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ERR_UnacceptableParameter,
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ERR_GetLastErrorFromRil,
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ERR_Stale,
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ERR_RilError;
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
65ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public DcFailCause mFailCause;
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SetupResult() {
68ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mFailCause = DcFailCause.fromInt(0);
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public String toString() {
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return name() + "  SetupResult.mFailCause=" + mFailCause;
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String toString() {
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        StringBuffer sb = new StringBuffer();
80ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sb.append("DataCallResponse: {")
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville           .append("version=").append(version)
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville           .append(" status=").append(status)
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville           .append(" retry=").append(suggestedRetryTime)
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville           .append(" cid=").append(cid)
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville           .append(" active=").append(active)
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville           .append(" type=").append(type)
87e9701717e43cc5aacbcf624f77a53be92350662cw           .append(" ifname=").append(ifname)
88e9701717e43cc5aacbcf624f77a53be92350662cw           .append(" mtu=").append(mtu)
89e9701717e43cc5aacbcf624f77a53be92350662cw           .append(" addresses=[");
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (String addr : addresses) {
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sb.append(addr);
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sb.append(",");
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (addresses.length > 0) sb.deleteCharAt(sb.length()-1);
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sb.append("] dnses=[");
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (String addr : dnses) {
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sb.append(addr);
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sb.append(",");
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (dnses.length > 0) sb.deleteCharAt(sb.length()-1);
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sb.append("] gateways=[");
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (String addr : gateways) {
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sb.append(addr);
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sb.append(",");
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (gateways.length > 0) sb.deleteCharAt(sb.length()-1);
107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        sb.append("] pcscf=[");
108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (String addr : pcscf) {
109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            sb.append(addr);
110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            sb.append(",");
111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (pcscf.length > 0) sb.deleteCharAt(sb.length()-1);
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sb.append("]}");
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return sb.toString();
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SetupResult setLinkProperties(LinkProperties linkProperties,
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean okToUseSystemPropertyDns) {
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SetupResult result;
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Start with clean network properties and if we have
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // a failure we'll clear again at the bottom of this code.
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (linkProperties == null)
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            linkProperties = new LinkProperties();
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        else
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            linkProperties.clear();
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (status == DcFailCause.NONE.getErrorCode()) {
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String propertyPrefix = "net." + ifname + ".";
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // set interface name
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                linkProperties.setInterfaceName(ifname);
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // set link addresses
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (addresses != null && addresses.length > 0) {
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    for (String addr : addresses) {
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        addr = addr.trim();
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (addr.isEmpty()) continue;
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        LinkAddress la;
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        int addrPrefixLen;
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        String [] ap = addr.split("/");
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (ap.length == 2) {
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            addr = ap[0];
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            addrPrefixLen = Integer.parseInt(ap[1]);
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        } else {
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            addrPrefixLen = 0;
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        InetAddress ia;
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        try {
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            ia = NetworkUtils.numericToInetAddress(addr);
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        } catch (IllegalArgumentException e) {
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            throw new UnknownHostException("Non-numeric ip addr=" + addr);
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (! ia.isAnyLocalAddress()) {
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            if (addrPrefixLen == 0) {
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                // Assume point to point
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                addrPrefixLen = (ia instanceof Inet4Address) ? 32 : 128;
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            }
16199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                            if (DBG) Rlog.d(LOG_TAG, "addr/pl=" + addr + "/" + addrPrefixLen);
1624698f5cc8dcf0f31a03c64f90e5faa1b4ffed5fcJack Yu                            try {
1634698f5cc8dcf0f31a03c64f90e5faa1b4ffed5fcJack Yu                                la = new LinkAddress(ia, addrPrefixLen);
1644698f5cc8dcf0f31a03c64f90e5faa1b4ffed5fcJack Yu                            } catch (IllegalArgumentException e) {
1654698f5cc8dcf0f31a03c64f90e5faa1b4ffed5fcJack Yu                                throw new UnknownHostException("Bad parameter for LinkAddress, ia="
1664698f5cc8dcf0f31a03c64f90e5faa1b4ffed5fcJack Yu                                        + ia.getHostAddress() + "/" + addrPrefixLen);
1674698f5cc8dcf0f31a03c64f90e5faa1b4ffed5fcJack Yu                            }
1684698f5cc8dcf0f31a03c64f90e5faa1b4ffed5fcJack Yu
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            linkProperties.addLinkAddress(la);
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    throw new UnknownHostException("no address for ifname=" + ifname);
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // set dns servers
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (dnses != null && dnses.length > 0) {
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    for (String addr : dnses) {
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        addr = addr.trim();
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (addr.isEmpty()) continue;
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        InetAddress ia;
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        try {
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            ia = NetworkUtils.numericToInetAddress(addr);
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        } catch (IllegalArgumentException e) {
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            throw new UnknownHostException("Non-numeric dns addr=" + addr);
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (! ia.isAnyLocalAddress()) {
188d68ea30947e9b6cd0d7aa8da23d2373a03310e2bRobert Greenwalt                            linkProperties.addDnsServer(ia);
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else if (okToUseSystemPropertyDns){
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    String dnsServers[] = new String[2];
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1");
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2");
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    for (String dnsAddr : dnsServers) {
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        dnsAddr = dnsAddr.trim();
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (dnsAddr.isEmpty()) continue;
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        InetAddress ia;
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        try {
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            ia = NetworkUtils.numericToInetAddress(dnsAddr);
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        } catch (IllegalArgumentException e) {
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            throw new UnknownHostException("Non-numeric dns addr=" + dnsAddr);
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (! ia.isAnyLocalAddress()) {
205d68ea30947e9b6cd0d7aa8da23d2373a03310e2bRobert Greenwalt                            linkProperties.addDnsServer(ia);
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    throw new UnknownHostException("Empty dns response and no system default dns");
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // set gateways
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if ((gateways == null) || (gateways.length == 0)) {
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    String sysGateways = SystemProperties.get(propertyPrefix + "gw");
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (sysGateways != null) {
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        gateways = sysGateways.split(" ");
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        gateways = new String[0];
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                for (String addr : gateways) {
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    addr = addr.trim();
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (addr.isEmpty()) continue;
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    InetAddress ia;
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    try {
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        ia = NetworkUtils.numericToInetAddress(addr);
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } catch (IllegalArgumentException e) {
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        throw new UnknownHostException("Non-numeric gateway addr=" + addr);
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
230ebc8af719102a64a2ae17cc2a836e23e2dbc3838Lorenzo Colitti                    // Allow 0.0.0.0 or :: as a gateway; this indicates a point-to-point interface.
231ebc8af719102a64a2ae17cc2a836e23e2dbc3838Lorenzo Colitti                    linkProperties.addRoute(new RouteInfo(ia));
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
234e9701717e43cc5aacbcf624f77a53be92350662cw                // set interface MTU
235e9701717e43cc5aacbcf624f77a53be92350662cw                // this may clobber the setting read from the APN db, but that's ok
236e9701717e43cc5aacbcf624f77a53be92350662cw                linkProperties.setMtu(mtu);
237e9701717e43cc5aacbcf624f77a53be92350662cw
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = SetupResult.SUCCESS;
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (UnknownHostException e) {
24099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(LOG_TAG, "setLinkProperties: UnknownHostException " + e);
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                e.printStackTrace();
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = SetupResult.ERR_UnacceptableParameter;
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (version < 4) {
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = SetupResult.ERR_GetLastErrorFromRil;
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = SetupResult.ERR_RilError;
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // An error occurred so clear properties
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (result != SetupResult.SUCCESS) {
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if(DBG) {
25599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(LOG_TAG, "setLinkProperties: error clearing LinkProperties " +
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        "status=" + status + " result=" + result);
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            linkProperties.clear();
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return result;
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
264