120c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti/* 220c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * Copyright (C) 2014 The Android Open Source Project 320c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * 420c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * Licensed under the Apache License, Version 2.0 (the "License"); 520c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * you may not use this file except in compliance with the License. 620c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * You may obtain a copy of the License at 720c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * 820c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * http://www.apache.org/licenses/LICENSE-2.0 920c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * 1020c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * Unless required by applicable law or agreed to in writing, software 1120c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * distributed under the License is distributed on an "AS IS" BASIS, 1220c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * See the License for the specific language governing permissions and 1420c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * limitations under the License. 1520c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti */ 1620c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 1720c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colittipackage com.android.server.ethernet; 1820c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 1927d7591acfc99be7909a0007b2ae8a04152c167bPavel Maltsevimport android.annotation.Nullable; 2020c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colittiimport android.net.IpConfiguration; 2120c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colittiimport android.os.Environment; 22caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsevimport android.util.ArrayMap; 2320c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 2420c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colittiimport com.android.server.net.IpConfigStore; 2520c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 2620c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 2720c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti/** 2820c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti * This class provides an API to store and manage Ethernet network configuration. 2920c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti */ 30caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsevpublic class EthernetConfigStore { 3120c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti private static final String ipConfigFile = Environment.getDataDirectory() + 3220c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti "/misc/ethernet/ipconfig.txt"; 3320c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 34caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev private IpConfigStore mStore = new IpConfigStore(); 35caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev private ArrayMap<String, IpConfiguration> mIpConfigurations; 36caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev private IpConfiguration mIpConfigurationForDefaultInterface; 37caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev private final Object mSync = new Object(); 38caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev 3920c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti public EthernetConfigStore() { 40caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev mIpConfigurations = new ArrayMap<>(0); 4120c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti } 4220c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 43caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev public void read() { 44caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev synchronized (mSync) { 45caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev ArrayMap<String, IpConfiguration> configs = 46caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev IpConfigStore.readIpConfigurations(ipConfigFile); 47caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev 48caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev // This configuration may exist in old file versions when there was only a single active 49caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev // Ethernet interface. 50caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev if (configs.containsKey("0")) { 51caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev mIpConfigurationForDefaultInterface = configs.remove("0"); 52caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev } 5320c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 54caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev mIpConfigurations = configs; 5520c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti } 56caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev } 57caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev 58caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev public void write(String iface, IpConfiguration config) { 59caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev boolean modified; 6020c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 61caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev synchronized (mSync) { 62caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev if (config == null) { 63caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev modified = mIpConfigurations.remove(iface) != null; 64caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev } else { 65caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev IpConfiguration oldConfig = mIpConfigurations.put(iface, config); 66caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev modified = !config.equals(oldConfig); 67caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev } 68caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev 69caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev if (modified) { 70caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev mStore.writeIpConfigurations(ipConfigFile, mIpConfigurations); 71caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev } 7220c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti } 73caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev } 7420c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 75caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev public ArrayMap<String, IpConfiguration> getIpConfigurations() { 76caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev synchronized (mSync) { 77caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev return new ArrayMap<>(mIpConfigurations); 78caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev } 7920c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti } 8020c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti 8127d7591acfc99be7909a0007b2ae8a04152c167bPavel Maltsev @Nullable 82caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev public IpConfiguration getIpConfigurationForDefaultInterface() { 83caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev synchronized (mSync) { 8427d7591acfc99be7909a0007b2ae8a04152c167bPavel Maltsev return mIpConfigurationForDefaultInterface == null 8527d7591acfc99be7909a0007b2ae8a04152c167bPavel Maltsev ? null : new IpConfiguration(mIpConfigurationForDefaultInterface); 86caf5246eb0ad453bc1a1707ce69fab3502b7dccbPavel Maltsev } 8720c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti } 8820c1c99c4351abd8bb3d6e8f966fcf3b6de0e5b0Lorenzo Colitti} 89