16346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim/*
26346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * Copyright (C) 2014 The Android Open Source Project
36346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim *
46346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * Licensed under the Apache License, Version 2.0 (the "License");
56346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * you may not use this file except in compliance with the License.
66346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * You may obtain a copy of the License at
76346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim *
86346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim *      http://www.apache.org/licenses/LICENSE-2.0
96346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim *
106346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * Unless required by applicable law or agreed to in writing, software
116346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * distributed under the License is distributed on an "AS IS" BASIS,
126346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * See the License for the specific language governing permissions and
146346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * limitations under the License.
156346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim */
166346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
176346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimpackage com.android.server.net;
186346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
196346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration;
206346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration.IpAssignment;
216346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration.ProxySettings;
226346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.LinkAddress;
236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.NetworkUtils;
246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.ProxyInfo;
256346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.RouteInfo;
260a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colittiimport android.net.StaticIpConfiguration;
276346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.util.Log;
286346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.util.SparseArray;
296346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
306346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport com.android.server.net.DelayedDiskWrite;
316346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport java.io.BufferedInputStream;
336346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport java.io.DataInputStream;
346346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport java.io.DataOutputStream;
356346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport java.io.EOFException;
366346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport java.io.FileInputStream;
376346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport java.io.IOException;
386346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport java.net.InetAddress;
390a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colittiimport java.net.Inet4Address;
406346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
416346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimpublic class IpConfigStore {
426346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    private static final String TAG = "IpConfigStore";
436346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    private static final boolean DBG = true;
446346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
456346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected final DelayedDiskWrite mWriter;
466346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
476346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /* IP and proxy configuration keys */
486346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String ID_KEY = "id";
496346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String IP_ASSIGNMENT_KEY = "ipAssignment";
506346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String LINK_ADDRESS_KEY = "linkAddress";
516346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String GATEWAY_KEY = "gateway";
526346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String DNS_KEY = "dns";
536346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String PROXY_SETTINGS_KEY = "proxySettings";
546346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String PROXY_HOST_KEY = "proxyHost";
556346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String PROXY_PORT_KEY = "proxyPort";
566346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String PROXY_PAC_FILE = "proxyPac";
576346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String EXCLUSION_LIST_KEY = "exclusionList";
586346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final String EOS = "eos";
596346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
606346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected static final int IPCONFIG_FILE_VERSION = 2;
616346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
626346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfigStore() {
636346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mWriter = new DelayedDiskWrite();
646346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
656346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
666346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    private boolean writeConfig(DataOutputStream out, int configKey,
670a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                IpConfiguration config) throws IOException {
686346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        boolean written = false;
696346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
706346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        try {
716346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            switch (config.ipAssignment) {
726346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                case STATIC:
736346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(IP_ASSIGNMENT_KEY);
746346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(config.ipAssignment.toString());
750a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                    StaticIpConfiguration staticIpConfiguration = config.staticIpConfiguration;
760a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                    if (staticIpConfiguration != null) {
770a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                        if (staticIpConfiguration.ipAddress != null) {
780a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            LinkAddress ipAddress = staticIpConfiguration.ipAddress;
790a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            out.writeUTF(LINK_ADDRESS_KEY);
800a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            out.writeUTF(ipAddress.getAddress().getHostAddress());
810a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            out.writeInt(ipAddress.getPrefixLength());
826346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        }
830a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                        if (staticIpConfiguration.gateway != null) {
840a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            out.writeUTF(GATEWAY_KEY);
850a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            out.writeInt(0);  // Default route.
860a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            out.writeInt(1);  // Have a gateway.
870a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            out.writeUTF(staticIpConfiguration.gateway.getHostAddress());
880a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                        }
890a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                        for (InetAddress inetAddr : staticIpConfiguration.dnsServers) {
900a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            out.writeUTF(DNS_KEY);
910a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            out.writeUTF(inetAddr.getHostAddress());
926346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        }
936346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    }
946346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    written = true;
956346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    break;
966346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                case DHCP:
976346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(IP_ASSIGNMENT_KEY);
986346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(config.ipAssignment.toString());
996346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    written = true;
1006346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    break;
1016346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                case UNASSIGNED:
1026346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                /* Ignore */
1036346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    break;
1046346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                default:
1056346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    loge("Ignore invalid ip assignment while writing");
1066346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    break;
1076346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            }
1086346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1096346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            switch (config.proxySettings) {
1106346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                case STATIC:
1110a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                    ProxyInfo proxyProperties = config.httpProxy;
1126346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    String exclusionList = proxyProperties.getExclusionListAsString();
1136346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(PROXY_SETTINGS_KEY);
1146346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(config.proxySettings.toString());
1156346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(PROXY_HOST_KEY);
1166346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(proxyProperties.getHost());
1176346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(PROXY_PORT_KEY);
1186346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeInt(proxyProperties.getPort());
11979adc958e5cd8daf7231ec042dfa367010d415f4Geoffrey Borggaard                    if (exclusionList != null) {
12079adc958e5cd8daf7231ec042dfa367010d415f4Geoffrey Borggaard                        out.writeUTF(EXCLUSION_LIST_KEY);
12179adc958e5cd8daf7231ec042dfa367010d415f4Geoffrey Borggaard                        out.writeUTF(exclusionList);
12279adc958e5cd8daf7231ec042dfa367010d415f4Geoffrey Borggaard                    }
1236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    written = true;
1246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    break;
1256346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                case PAC:
1260a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                    ProxyInfo proxyPacProperties = config.httpProxy;
1276346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(PROXY_SETTINGS_KEY);
1286346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(config.proxySettings.toString());
1296346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(PROXY_PAC_FILE);
1306346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(proxyPacProperties.getPacFileUrl().toString());
1316346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    written = true;
1326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    break;
1336346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                case NONE:
1346346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(PROXY_SETTINGS_KEY);
1356346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    out.writeUTF(config.proxySettings.toString());
1366346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    written = true;
1376346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    break;
1386346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                case UNASSIGNED:
1396346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    /* Ignore */
1406346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        break;
1416346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    default:
1426346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        loge("Ignore invalid proxy settings while writing");
1436346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        break;
1446346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            }
1456346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1466346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            if (written) {
1476346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                out.writeUTF(ID_KEY);
1486346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                out.writeInt(configKey);
1496346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            }
1506346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        } catch (NullPointerException e) {
1510a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti            loge("Failure in writing " + config + e);
1526346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        }
1536346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        out.writeUTF(EOS);
1546346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1556346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return written;
1566346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
1576346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1586346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void writeIpAndProxyConfigurations(String filePath,
1596346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                              final SparseArray<IpConfiguration> networks) {
1606346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mWriter.write(filePath, new DelayedDiskWrite.Writer() {
1616346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            public void onWriteCalled(DataOutputStream out) throws IOException{
1626346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                out.writeInt(IPCONFIG_FILE_VERSION);
1636346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                for(int i = 0; i < networks.size(); i++) {
1646346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    writeConfig(out, networks.keyAt(i), networks.valueAt(i));
1656346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                }
1666346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            }
1676346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        });
1686346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
1696346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1706346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public SparseArray<IpConfiguration> readIpAndProxyConfigurations(String filePath) {
1716346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        SparseArray<IpConfiguration> networks = new SparseArray<IpConfiguration>();
1726346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1736346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        DataInputStream in = null;
1746346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        try {
1756346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            in = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
1766346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1776346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            int version = in.readInt();
1786346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            if (version != 2 && version != 1) {
1796346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                loge("Bad version on IP configuration file, ignore read");
1806346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                return null;
1816346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            }
1826346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1836346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            while (true) {
1846346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                int id = -1;
1856346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                // Default is DHCP with no proxy
1866346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                IpAssignment ipAssignment = IpAssignment.DHCP;
1876346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                ProxySettings proxySettings = ProxySettings.NONE;
1880a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration();
1896346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                String proxyHost = null;
1906346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                String pacFileUrl = null;
1916346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                int proxyPort = -1;
1926346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                String exclusionList = null;
1936346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                String key;
1946346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1956346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                do {
1966346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    key = in.readUTF();
1976346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    try {
1986346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        if (key.equals(ID_KEY)) {
1996346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            id = in.readInt();
2006346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else if (key.equals(IP_ASSIGNMENT_KEY)) {
2016346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            ipAssignment = IpAssignment.valueOf(in.readUTF());
2026346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else if (key.equals(LINK_ADDRESS_KEY)) {
2036346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            LinkAddress linkAddr = new LinkAddress(
2046346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                    NetworkUtils.numericToInetAddress(in.readUTF()), in.readInt());
2050a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            if (linkAddr.getAddress() instanceof Inet4Address &&
2060a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                    staticIpConfiguration.ipAddress == null) {
2070a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                staticIpConfiguration.ipAddress = linkAddr;
2080a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            } else {
2090a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                loge("Non-IPv4 or duplicate address: " + linkAddr);
2100a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            }
2116346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else if (key.equals(GATEWAY_KEY)) {
2126346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            LinkAddress dest = null;
2136346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            InetAddress gateway = null;
2146346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            if (version == 1) {
2156346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                // only supported default gateways - leave the dest/prefix empty
2166346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                gateway = NetworkUtils.numericToInetAddress(in.readUTF());
2170a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                if (staticIpConfiguration.gateway == null) {
2180a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                    staticIpConfiguration.gateway = gateway;
2190a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                } else {
2200a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                    loge("Duplicate gateway: " + gateway.getHostAddress());
2210a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                }
2226346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            } else {
2236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                if (in.readInt() == 1) {
2246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                    dest = new LinkAddress(
2256346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                            NetworkUtils.numericToInetAddress(in.readUTF()),
2266346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                            in.readInt());
2276346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                }
2286346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                if (in.readInt() == 1) {
2296346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                    gateway = NetworkUtils.numericToInetAddress(in.readUTF());
2306346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                }
2310a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                RouteInfo route = new RouteInfo(dest, gateway);
2320a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                if (route.isIPv4Default() &&
2330a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                        staticIpConfiguration.gateway == null) {
2340a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                    staticIpConfiguration.gateway = gateway;
2350a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                } else {
2360a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                    loge("Non-IPv4 default or duplicate route: " + route);
2370a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                                }
2386346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            }
2396346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else if (key.equals(DNS_KEY)) {
2400a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            staticIpConfiguration.dnsServers.add(
2416346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                    NetworkUtils.numericToInetAddress(in.readUTF()));
2426346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else if (key.equals(PROXY_SETTINGS_KEY)) {
2436346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            proxySettings = ProxySettings.valueOf(in.readUTF());
2446346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else if (key.equals(PROXY_HOST_KEY)) {
2456346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            proxyHost = in.readUTF();
2466346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else if (key.equals(PROXY_PORT_KEY)) {
2476346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            proxyPort = in.readInt();
2486346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else if (key.equals(PROXY_PAC_FILE)) {
2496346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            pacFileUrl = in.readUTF();
2506346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else if (key.equals(EXCLUSION_LIST_KEY)) {
2516346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            exclusionList = in.readUTF();
2526346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else if (key.equals(EOS)) {
2536346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            break;
2546346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        } else {
2556346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            loge("Ignore unknown key " + key + "while reading");
2566346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        }
2576346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    } catch (IllegalArgumentException e) {
2586346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        loge("Ignore invalid address while reading" + e);
2596346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    }
2606346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                } while (true);
2616346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
2626346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                if (id != -1) {
2636346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    IpConfiguration config = new IpConfiguration();
2646346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    networks.put(id, config);
2656346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
2666346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    switch (ipAssignment) {
2676346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        case STATIC:
2680a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            config.staticIpConfiguration = staticIpConfiguration;
2690a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            config.ipAssignment = ipAssignment;
2700a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            break;
2716346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        case DHCP:
2726346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            config.ipAssignment = ipAssignment;
2736346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            break;
2746346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        case UNASSIGNED:
2756346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            loge("BUG: Found UNASSIGNED IP on file, use DHCP");
2766346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            config.ipAssignment = IpAssignment.DHCP;
2776346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            break;
2786346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        default:
2796346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            loge("Ignore invalid ip assignment while reading.");
2806346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            config.ipAssignment = IpAssignment.UNASSIGNED;
2816346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            break;
2826346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    }
2836346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
2846346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    switch (proxySettings) {
2856346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        case STATIC:
2860a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            ProxyInfo proxyInfo =
2876346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                                    new ProxyInfo(proxyHost, proxyPort, exclusionList);
2880a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            config.proxySettings = proxySettings;
2890a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            config.httpProxy = proxyInfo;
2906346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            break;
2916346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        case PAC:
2920a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            ProxyInfo proxyPacProperties = new ProxyInfo(pacFileUrl);
2936346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            config.proxySettings = proxySettings;
2940a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                            config.httpProxy = proxyPacProperties;
2956346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            break;
2966346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        case NONE:
2976346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            config.proxySettings = proxySettings;
2986346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            break;
2996346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        case UNASSIGNED:
3006346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            loge("BUG: Found UNASSIGNED proxy on file, use NONE");
3016346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            config.proxySettings = ProxySettings.NONE;
3026346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            break;
3036346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                        default:
3046346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            loge("Ignore invalid proxy settings while reading");
3056346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            config.proxySettings = ProxySettings.UNASSIGNED;
3066346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                            break;
3076346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    }
3086346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                } else {
3096346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    if (DBG) log("Missing id while parsing configuration");
3106346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                }
3116346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            }
3126346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        } catch (EOFException ignore) {
3136346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        } catch (IOException e) {
31456cf7c517e33df5f871f85c13a2e2315b20cb2edLorenzo Colitti            loge("Error parsing configuration: " + e);
3156346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        } finally {
3166346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            if (in != null) {
3176346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                try {
3186346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                    in.close();
3196346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                } catch (Exception e) {}
3206346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            }
3216346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        }
3226346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
3236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return networks;
3246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
3256346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
3266346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected void loge(String s) {
3276346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        Log.e(TAG, s);
3286346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
3296346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
3306346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    protected void log(String s) {
3316346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        Log.d(TAG, s);
3326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
3336346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim}
334