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