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