blob: 6ab3322cd955d7525f42e14ca3fe0e2ab9854145 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.car.networking.railway;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.EthernetManager;
import android.net.EthernetNetworkManagementException;
import android.net.EthernetNetworkSpecifier;
import android.net.EthernetNetworkUpdateRequest;
import android.net.IpConfiguration;
import android.net.LinkAddress;
import android.net.NetworkCapabilities;
import android.net.StaticIpConfiguration;
import android.os.OutcomeReceiver;
import androidx.annotation.Nullable;
import com.google.common.base.Strings;
import java.util.ArrayList;
import java.util.List;
public final class ConfigurationUpdater {
private final Context mApplicationContext;
private final EthernetManager mEthernetManager;
private final OutcomeReceiver<String, EthernetNetworkManagementException> mCallback;
public ConfigurationUpdater(Context applicationContext,
OutcomeReceiver<String, EthernetNetworkManagementException> callback) {
mApplicationContext = applicationContext;
mEthernetManager = applicationContext.getSystemService(EthernetManager.class);
mCallback = callback;
}
public void updateNetworkConfiguration(String packageNames,
String ipConfigurationText,
String networkCapabilitiesText,
String interfaceName)
throws IllegalArgumentException, PackageManager.NameNotFoundException {
EthernetNetworkUpdateRequest request = new EthernetNetworkUpdateRequest.Builder()
.setIpConfiguration(getIpConfiguration(ipConfigurationText))
.setNetworkCapabilities(getCapabilities(
interfaceName, networkCapabilitiesText, packageNames))
.build();
mEthernetManager.updateConfiguration(interfaceName, request,
mApplicationContext.getMainExecutor(), mCallback);
}
@Nullable
private IpConfiguration getIpConfiguration(String ipConfigurationText) {
return Strings.isNullOrEmpty(ipConfigurationText) ? null :
new IpConfiguration.Builder()
.setStaticIpConfiguration(new StaticIpConfiguration.Builder()
.setIpAddress(new LinkAddress(ipConfigurationText)).build())
.build();
}
@Nullable
private NetworkCapabilities getCapabilities(String iface, String networkCapabilitiesText,
String packageNames) throws PackageManager.NameNotFoundException {
// TODO: Allow for setting package names without capabilities. In this case, the existing
// capabilities should be used.
if (Strings.isNullOrEmpty(networkCapabilitiesText)) {
return null;
}
NetworkCapabilities.Builder networkCapabilitiesBuilder =
NetworkCapabilities.Builder.withoutDefaultCapabilities()
.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
.setNetworkSpecifier(new EthernetNetworkSpecifier(iface));
for (int capability : getCapabilitiesList(networkCapabilitiesText)) {
networkCapabilitiesBuilder.addCapability(capability);
}
if (!Strings.isNullOrEmpty(packageNames)) {
networkCapabilitiesBuilder.setAllowedUids(
UidToPackageNameConverter.convertToUids(mApplicationContext, packageNames));
}
return networkCapabilitiesBuilder.build();
}
private static List<Integer> getCapabilitiesList(String capabilitiesText)
throws NumberFormatException {
List<Integer> capabilitiesList = new ArrayList<>();
String[] capabilitiesTextArray = capabilitiesText.split(",");
for (String capabilityText : capabilitiesTextArray) {
capabilitiesList.add(Integer.valueOf(capabilityText));
}
return capabilitiesList;
}
}