Keep Vehicle internal network always up

Bug: 171801262
Test: Boot with and without overlay set and check ifconfig
Change-Id: I1fd332caf3e09924abcfec9c2c137363be7873e4
This commit is contained in:
Tomasz Wasilczyk
2020-12-14 13:42:51 -08:00
parent 479e613095
commit 54605b8501
2 changed files with 51 additions and 11 deletions

View File

@@ -171,6 +171,7 @@ public final class NetworkCapabilities implements Parcelable {
NET_CAPABILITY_PARTIAL_CONNECTIVITY, NET_CAPABILITY_PARTIAL_CONNECTIVITY,
NET_CAPABILITY_TEMPORARILY_NOT_METERED, NET_CAPABILITY_TEMPORARILY_NOT_METERED,
NET_CAPABILITY_OEM_PRIVATE, NET_CAPABILITY_OEM_PRIVATE,
NET_CAPABILITY_VEHICLE_INTERNAL,
}) })
public @interface NetCapability { } public @interface NetCapability { }
@@ -357,8 +358,17 @@ public final class NetworkCapabilities implements Parcelable {
@SystemApi @SystemApi
public static final int NET_CAPABILITY_OEM_PRIVATE = 26; public static final int NET_CAPABILITY_OEM_PRIVATE = 26;
/**
* Indicates this is an internal vehicle network, meant to communicate with other
* automotive systems.
*
* @hide
*/
@SystemApi
public static final int NET_CAPABILITY_VEHICLE_INTERNAL = 27;
private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS; private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS;
private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_OEM_PRIVATE; private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_VEHICLE_INTERNAL;
/** /**
* Network capabilities that are expected to be mutable, i.e., can change while a particular * Network capabilities that are expected to be mutable, i.e., can change while a particular
@@ -401,15 +411,16 @@ public final class NetworkCapabilities implements Parcelable {
*/ */
@VisibleForTesting @VisibleForTesting
/* package */ static final long RESTRICTED_CAPABILITIES = /* package */ static final long RESTRICTED_CAPABILITIES =
(1 << NET_CAPABILITY_CBS) | (1 << NET_CAPABILITY_CBS)
(1 << NET_CAPABILITY_DUN) | | (1 << NET_CAPABILITY_DUN)
(1 << NET_CAPABILITY_EIMS) | | (1 << NET_CAPABILITY_EIMS)
(1 << NET_CAPABILITY_FOTA) | | (1 << NET_CAPABILITY_FOTA)
(1 << NET_CAPABILITY_IA) | | (1 << NET_CAPABILITY_IA)
(1 << NET_CAPABILITY_IMS) | | (1 << NET_CAPABILITY_IMS)
(1 << NET_CAPABILITY_RCS) | | (1 << NET_CAPABILITY_MCX)
(1 << NET_CAPABILITY_XCAP) | | (1 << NET_CAPABILITY_RCS)
(1 << NET_CAPABILITY_MCX); | (1 << NET_CAPABILITY_VEHICLE_INTERNAL)
| (1 << NET_CAPABILITY_XCAP);
/** /**
* Capabilities that force network to be restricted. * Capabilities that force network to be restricted.
@@ -1939,6 +1950,7 @@ public final class NetworkCapabilities implements Parcelable {
case NET_CAPABILITY_PARTIAL_CONNECTIVITY: return "PARTIAL_CONNECTIVITY"; case NET_CAPABILITY_PARTIAL_CONNECTIVITY: return "PARTIAL_CONNECTIVITY";
case NET_CAPABILITY_TEMPORARILY_NOT_METERED: return "TEMPORARILY_NOT_METERED"; case NET_CAPABILITY_TEMPORARILY_NOT_METERED: return "TEMPORARILY_NOT_METERED";
case NET_CAPABILITY_OEM_PRIVATE: return "OEM_PRIVATE"; case NET_CAPABILITY_OEM_PRIVATE: return "OEM_PRIVATE";
case NET_CAPABILITY_VEHICLE_INTERNAL: return "NET_CAPABILITY_VEHICLE_INTERNAL";
default: return Integer.toString(capability); default: return Integer.toString(capability);
} }
} }

View File

@@ -62,6 +62,7 @@ import static android.system.OsConstants.IPPROTO_UDP;
import static java.util.Map.Entry; import static java.util.Map.Entry;
import android.Manifest; import android.Manifest;
import android.annotation.BoolRes;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.AppOpsManager; import android.app.AppOpsManager;
@@ -986,6 +987,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
mDefaultWifiRequest = createDefaultInternetRequestForTransport( mDefaultWifiRequest = createDefaultInternetRequestForTransport(
NetworkCapabilities.TRANSPORT_WIFI, NetworkRequest.Type.BACKGROUND_REQUEST); NetworkCapabilities.TRANSPORT_WIFI, NetworkRequest.Type.BACKGROUND_REQUEST);
mDefaultVehicleRequest = createAlwaysOnRequestForCapability(
NetworkCapabilities.NET_CAPABILITY_VEHICLE_INTERNAL,
NetworkRequest.Type.BACKGROUND_REQUEST);
mHandlerThread = mDeps.makeHandlerThread(); mHandlerThread = mDeps.makeHandlerThread();
mHandlerThread.start(); mHandlerThread.start();
mHandler = new InternalHandler(mHandlerThread.getLooper()); mHandler = new InternalHandler(mHandlerThread.getLooper());
@@ -1192,6 +1197,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId(), type); return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId(), type);
} }
private NetworkRequest createAlwaysOnRequestForCapability(int capability,
NetworkRequest.Type type) {
final NetworkCapabilities netCap = new NetworkCapabilities();
netCap.clearAll();
netCap.addCapability(capability);
netCap.setRequestorUidAndPackageName(Process.myUid(), mContext.getPackageName());
return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId(), type);
}
// Used only for testing. // Used only for testing.
// TODO: Delete this and either: // TODO: Delete this and either:
// 1. Give FakeSettingsProvider the ability to send settings change notifications (requires // 1. Give FakeSettingsProvider the ability to send settings change notifications (requires
@@ -1209,10 +1223,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
mHandler.sendEmptyMessage(EVENT_PRIVATE_DNS_SETTINGS_CHANGED); mHandler.sendEmptyMessage(EVENT_PRIVATE_DNS_SETTINGS_CHANGED);
} }
private void handleAlwaysOnNetworkRequest(NetworkRequest networkRequest, @BoolRes int id) {
final boolean enable = mContext.getResources().getBoolean(id);
handleAlwaysOnNetworkRequest(networkRequest, enable);
}
private void handleAlwaysOnNetworkRequest( private void handleAlwaysOnNetworkRequest(
NetworkRequest networkRequest, String settingName, boolean defaultValue) { NetworkRequest networkRequest, String settingName, boolean defaultValue) {
final boolean enable = toBool(Settings.Global.getInt( final boolean enable = toBool(Settings.Global.getInt(
mContext.getContentResolver(), settingName, encodeBool(defaultValue))); mContext.getContentResolver(), settingName, encodeBool(defaultValue)));
handleAlwaysOnNetworkRequest(networkRequest, enable);
}
private void handleAlwaysOnNetworkRequest(NetworkRequest networkRequest, boolean enable) {
final boolean isEnabled = (mNetworkRequests.get(networkRequest) != null); final boolean isEnabled = (mNetworkRequests.get(networkRequest) != null);
if (enable == isEnabled) { if (enable == isEnabled) {
return; // Nothing to do. return; // Nothing to do.
@@ -1232,6 +1255,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
mDefaultMobileDataRequest, Settings.Global.MOBILE_DATA_ALWAYS_ON, true); mDefaultMobileDataRequest, Settings.Global.MOBILE_DATA_ALWAYS_ON, true);
handleAlwaysOnNetworkRequest(mDefaultWifiRequest, Settings.Global.WIFI_ALWAYS_REQUESTED, handleAlwaysOnNetworkRequest(mDefaultWifiRequest, Settings.Global.WIFI_ALWAYS_REQUESTED,
false); false);
handleAlwaysOnNetworkRequest(mDefaultVehicleRequest,
com.android.internal.R.bool.config_vehicleInternalNetworkAlwaysRequested);
} }
private void registerSettingsCallbacks() { private void registerSettingsCallbacks() {
@@ -6011,6 +6036,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
// priority networks like ethernet are active. // priority networks like ethernet are active.
private final NetworkRequest mDefaultWifiRequest; private final NetworkRequest mDefaultWifiRequest;
// Request used to optionally keep vehicle internal network always active
private final NetworkRequest mDefaultVehicleRequest;
private NetworkAgentInfo getDefaultNetwork() { private NetworkAgentInfo getDefaultNetwork() {
return mDefaultNetworkNai; return mDefaultNetworkNai;
} }