Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae7491e2 authored by Lucas Lin's avatar Lucas Lin Committed by Gerrit Code Review
Browse files

Merge changes Ib80f814f,Ic605e489

* changes:
  Use new API - getIpSecNetIdRange() in IpSecService
  Add a new API to get the network ID range of IPSec tunnel interface
parents 2dafdfb0 7d02c648
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ package android.net {

  public class ConnectivityManager {
    method @NonNull @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public java.util.List<android.net.NetworkStateSnapshot> getAllNetworkStateSnapshot();
    method @NonNull public static android.util.Range<java.lang.Integer> getIpSecNetIdRange();
    method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerSystemDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void requestBackgroundNetwork(@NonNull android.net.NetworkRequest, @NonNull android.os.Handler, @NonNull android.net.ConnectivityManager.NetworkCallback);
    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_TEST_NETWORKS, android.Manifest.permission.NETWORK_STACK}) public void simulateDataStall(int, long, @NonNull android.net.Network, @NonNull android.os.PersistableBundle);
+17 −0
Original line number Diff line number Diff line
@@ -5053,4 +5053,21 @@ public class ConnectivityManager {
            throw e.rethrowFromSystemServer();
        }
    }

    // The first network ID of IPSec tunnel interface.
    private static final int TUN_INTF_NETID_START = 0xFC00;
    // The network ID range of IPSec tunnel interface.
    private static final int TUN_INTF_NETID_RANGE = 0x0400;

    /**
     * Get the network ID range reserved for IPSec tunnel interfaces.
     *
     * @return A Range which indicates the network ID range of IPSec tunnel interface.
     * @hide
     */
    @SystemApi(client = MODULE_LIBRARIES)
    @NonNull
    public static Range<Integer> getIpSecNetIdRange() {
        return new Range(TUN_INTF_NETID_START, TUN_INTF_NETID_START + TUN_INTF_NETID_RANGE - 1);
    }
}
+9 −10
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import android.system.Os;
import android.system.OsConstants;
import android.text.TextUtils;
import android.util.Log;
import android.util.Range;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -756,13 +757,9 @@ public class IpSecService extends IIpSecService.Stub {
        }
    }

    // These values have been reserved in NetIdManager
    @VisibleForTesting static final int TUN_INTF_NETID_START = 0xFC00;

    public static final int TUN_INTF_NETID_RANGE = 0x0400;

    private final SparseBooleanArray mTunnelNetIds = new SparseBooleanArray();
    private int mNextTunnelNetIdIndex = 0;
    final Range<Integer> mNetIdRange = ConnectivityManager.getIpSecNetIdRange();
    private int mNextTunnelNetId = mNetIdRange.getLower();

    /**
     * Reserves a netId within the range of netIds allocated for IPsec tunnel interfaces
@@ -775,11 +772,13 @@ public class IpSecService extends IIpSecService.Stub {
     */
    @VisibleForTesting
    int reserveNetId() {
        final int range = mNetIdRange.getUpper() - mNetIdRange.getLower() + 1;
        synchronized (mTunnelNetIds) {
            for (int i = 0; i < TUN_INTF_NETID_RANGE; i++) {
                int index = mNextTunnelNetIdIndex;
                int netId = index + TUN_INTF_NETID_START;
                if (++mNextTunnelNetIdIndex >= TUN_INTF_NETID_RANGE) mNextTunnelNetIdIndex = 0;
            for (int i = 0; i < range; i++) {
                final int netId = mNextTunnelNetId;
                if (++mNextTunnelNetId > mNetIdRange.getUpper()) {
                    mNextTunnelNetId = mNetIdRange.getLower();
                }
                if (!mTunnelNetIds.get(netId)) {
                    mTunnelNetIds.put(netId, true);
                    return netId;
+2 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server;

import android.annotation.NonNull;
import android.net.ConnectivityManager;
import android.util.SparseBooleanArray;

import com.android.internal.annotations.GuardedBy;
@@ -31,7 +32,7 @@ public class NetIdManager {
    // Sequence number for Networks; keep in sync with system/netd/NetworkController.cpp
    public static final int MIN_NET_ID = 100; // some reserved marks
    // Top IDs reserved by IpSecService
    public static final int MAX_NET_ID = 65535 - IpSecService.TUN_INTF_NETID_RANGE;
    public static final int MAX_NET_ID = ConnectivityManager.getIpSecNetIdRange().getLower() - 1;

    @GuardedBy("mNetIdInUse")
    private final SparseBooleanArray mNetIdInUse = new SparseBooleanArray();
+6 −4
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.INetd;
import android.net.IpSecAlgorithm;
import android.net.IpSecConfig;
@@ -47,6 +48,7 @@ import android.os.Process;
import android.system.ErrnoException;
import android.system.Os;
import android.system.StructStat;
import android.util.Range;

import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -647,9 +649,9 @@ public class IpSecServiceTest {

    @Test
    public void testReserveNetId() {
        int start = mIpSecService.TUN_INTF_NETID_START;
        for (int i = 0; i < mIpSecService.TUN_INTF_NETID_RANGE; i++) {
            assertEquals(start + i, mIpSecService.reserveNetId());
        final Range<Integer> netIdRange = ConnectivityManager.getIpSecNetIdRange();
        for (int netId = netIdRange.getLower(); netId <= netIdRange.getUpper(); netId++) {
            assertEquals(netId, mIpSecService.reserveNetId());
        }

        // Check that resource exhaustion triggers an exception
@@ -661,7 +663,7 @@ public class IpSecServiceTest {

        // Now release one and try again
        int releasedNetId =
                mIpSecService.TUN_INTF_NETID_START + mIpSecService.TUN_INTF_NETID_RANGE / 2;
                netIdRange.getLower() + (netIdRange.getUpper() - netIdRange.getLower()) / 2;
        mIpSecService.releaseNetId(releasedNetId);
        assertEquals(releasedNetId, mIpSecService.reserveNetId());
    }