Refactor ApfFilter: Replace ReceiveThread with Handler
Updated ApfFilter to utilize Handler instead of the custom
ReceiveThread.
Test: TH
Change-Id: Ia517c2de5d946f22559be7316792cbe07ed9b961
diff --git a/src/android/net/apf/ApfFilter.java b/src/android/net/apf/ApfFilter.java
index c3dc9ac..c3ccd5f 100644
--- a/src/android/net/apf/ApfFilter.java
+++ b/src/android/net/apf/ApfFilter.java
@@ -106,6 +106,7 @@
import static android.system.OsConstants.IPPROTO_TCP;
import static android.system.OsConstants.IPPROTO_UDP;
import static android.system.OsConstants.SOCK_CLOEXEC;
+import static android.system.OsConstants.SOCK_NONBLOCK;
import static android.system.OsConstants.SOCK_RAW;
import static com.android.net.module.util.NetworkStackConstants.ETHER_ADDR_LEN;
@@ -138,6 +139,7 @@
import android.net.apf.ApfCounterTracker.Counter;
import android.net.apf.BaseApfGenerator.IllegalInstructionException;
import android.net.ip.IpClient.IpClientCallbacksWrapper;
+import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemClock;
import android.stats.connectivity.NetworkQuirkEvent;
@@ -158,14 +160,13 @@
import com.android.net.module.util.CollectionUtils;
import com.android.net.module.util.ConnectivityUtils;
import com.android.net.module.util.InterfaceParams;
-import com.android.net.module.util.SocketUtils;
+import com.android.net.module.util.PacketReader;
import com.android.networkstack.metrics.ApfSessionInfoMetrics;
import com.android.networkstack.metrics.IpClientRaInfoMetrics;
import com.android.networkstack.metrics.NetworkQuirkMetrics;
import com.android.networkstack.util.NetworkStackUtils;
import java.io.FileDescriptor;
-import java.io.IOException;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
@@ -186,16 +187,8 @@
* listens for IPv6 ICMPv6 router advertisements (RAs) and generates APF programs to
* filter out redundant duplicate ones.
* <p>
- * Threading model:
- * A collection of RAs we've received is kept in mRas. Generating APF programs uses mRas to
- * know what RAs to filter for, thus generating APF programs is dependent on mRas.
- * mRas can be accessed by multiple threads:
- * - ReceiveThread, which listens for RAs and adds them to mRas, and generates APF programs.
- * - callers of:
- * - setMulticastFilter(), which can cause an APF program to be generated.
- * - dump(), which dumps mRas among other things.
- * - shutdown(), which clears mRas.
- * So access to mRas is synchronized.
+ * Threading model: this class is not thread-safe and can only be accessed from IpClient's
+ * handler thread.
*
* @hide
*/
@@ -217,37 +210,30 @@
public boolean shouldHandleNdOffload;
}
- // Thread to listen for RAs.
- @VisibleForTesting
- public class ReceiveThread extends Thread {
- private final byte[] mPacket = new byte[1514];
- private final FileDescriptor mSocket;
- private volatile boolean mStopped;
+ private class RaPacketReader extends PacketReader {
+ private static final int RECEIVE_BUFFER_SIZE = 1514;
+ private final int mIfIndex;
- public ReceiveThread(FileDescriptor socket) {
- mSocket = socket;
- }
-
- public void halt() {
- mStopped = true;
- // Interrupts the read() call the thread is blocked in.
- SocketUtils.closeSocketQuietly(mSocket);
+ RaPacketReader(Handler handler, int ifIndex) {
+ super(handler, RECEIVE_BUFFER_SIZE);
+ mIfIndex = ifIndex;
}
@Override
- public void run() {
- log("begin monitoring");
- while (!mStopped) {
- try {
- int length = Os.read(mSocket, mPacket, 0, mPacket.length);
- processRa(mPacket, length);
- } catch (IOException|ErrnoException e) {
- if (!mStopped) {
- Log.e(TAG, "Read error", e);
- }
- }
- }
+ protected FileDescriptor createFd() {
+ return mDependencies.createPacketReaderSocket(mIfIndex);
+ }
+
+ @Override
+ protected void handlePacket(byte[] recvbuf, int length) {
+ processRa(recvbuf, length);
+ }
+
+ // override for public access.
+ @Override
+ public boolean isRunning() {
+ return super.isRunning();
}
}
@@ -267,8 +253,8 @@
@VisibleForTesting
@NonNull
public final byte[] mHardwareAddress;
- @VisibleForTesting
- public ReceiveThread mReceiveThread;
+ private final RaPacketReader mRaPacketReader;
+ private final Handler mHandler;
@GuardedBy("this")
private long mUniqueCounter;
@GuardedBy("this")
@@ -344,6 +330,8 @@
|| isDeviceLightIdleModeChangedAction(intent)) {
final boolean deviceIdle = powerManager.isDeviceIdleMode()
|| isDeviceLightIdleMode(powerManager);
+ // TODO: do a handler post here to make sure the setDozeMode is called on the
+ // handler thread.
setDozeMode(deviceIdle);
}
}
@@ -375,16 +363,18 @@
private final Dependencies mDependencies;
- public ApfFilter(Context context, ApfConfiguration config, InterfaceParams ifParams,
- IpClientCallbacksWrapper ipClientCallback, NetworkQuirkMetrics networkQuirkMetrics) {
- this(context, config, ifParams, ipClientCallback, networkQuirkMetrics,
+ public ApfFilter(Handler handler, Context context, ApfConfiguration config,
+ InterfaceParams ifParams, IpClientCallbacksWrapper ipClientCallback,
+ NetworkQuirkMetrics networkQuirkMetrics) {
+ this(handler, context, config, ifParams, ipClientCallback, networkQuirkMetrics,
new Dependencies(context));
}
@VisibleForTesting
- public ApfFilter(Context context, ApfConfiguration config, InterfaceParams ifParams,
- IpClientCallbacksWrapper ipClientCallback, NetworkQuirkMetrics networkQuirkMetrics,
- Dependencies dependencies) {
+ public ApfFilter(Handler handler, Context context, ApfConfiguration config,
+ InterfaceParams ifParams, IpClientCallbacksWrapper ipClientCallback,
+ NetworkQuirkMetrics networkQuirkMetrics, Dependencies dependencies) {
+ mHandler = handler;
mApfVersionSupported = config.apfVersionSupported;
mApfRamSize = config.apfRamSize;
mInstallableProgramSizeClamp = config.installableProgramSizeClamp;
@@ -442,19 +432,15 @@
// Install basic filters
installNewProgramLocked();
}
- FileDescriptor socket = mDependencies.createRaReaderSocket(mInterfaceParams.index);
- if (socket != null) {
- mReceiveThread = new ReceiveThread(socket);
- mReceiveThread.start();
+
+ mRaPacketReader = new RaPacketReader(mHandler, mInterfaceParams.index);
+ // The class constructor must be called from the IpClient's handler thread
+ if (!mRaPacketReader.start()) {
+ Log.wtf(TAG, "Failed to start RaPacketReader");
}
// Listen for doze-mode transition changes to enable/disable the IPv6 multicast filter.
mDependencies.addDeviceIdleReceiver(mDeviceIdleReceiver);
-
- mDependencies.onApfFilterCreated(this);
- if (mReceiveThread != null) {
- mDependencies.onThreadCreated(mReceiveThread);
- }
}
/**
@@ -471,10 +457,10 @@
* Create a socket to read RAs.
*/
@Nullable
- public FileDescriptor createRaReaderSocket(int ifIndex) {
+ public FileDescriptor createPacketReaderSocket(int ifIndex) {
FileDescriptor socket;
try {
- socket = Os.socket(AF_PACKET, SOCK_RAW | SOCK_CLOEXEC, 0);
+ socket = Os.socket(AF_PACKET, SOCK_RAW | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
NetworkStackUtils.attachRaFilter(socket);
SocketAddress addr = makePacketSocketAddress(ETH_P_IPV6, ifIndex);
Os.bind(socket, addr);
@@ -2532,7 +2518,7 @@
* Create an {@link ApfFilter} if {@code apfCapabilities} indicates support for packet
* filtering using APF programs.
*/
- public static ApfFilter maybeCreate(Context context, ApfConfiguration config,
+ public static ApfFilter maybeCreate(Handler handler, Context context, ApfConfiguration config,
InterfaceParams ifParams, IpClientCallbacksWrapper ipClientCallback,
NetworkQuirkMetrics networkQuirkMetrics) {
if (context == null || config == null || ifParams == null) return null;
@@ -2544,7 +2530,8 @@
return null;
}
- return new ApfFilter(context, config, ifParams, ipClientCallback, networkQuirkMetrics);
+ return new ApfFilter(handler, context, config, ifParams, ipClientCallback,
+ networkQuirkMetrics);
}
private synchronized void collectAndSendMetrics() {
@@ -2579,11 +2566,8 @@
public synchronized void shutdown() {
collectAndSendMetrics();
- if (mReceiveThread != null) {
- log("shutting down");
- mReceiveThread.halt(); // Also closes socket.
- mReceiveThread = null;
- }
+ // The shutdown() must be called from the IpClient's handler thread
+ mRaPacketReader.stop();
mRas.clear();
mDependencies.removeBroadcastReceiver(mDeviceIdleReceiver);
}
@@ -2742,12 +2726,12 @@
}
public synchronized void dump(IndentingPrintWriter pw) {
+ // TODO: use HandlerUtils.runWithScissors() to dump APF on the handler thread.
pw.println(String.format(
"Capabilities: { apfVersionSupported: %d, maximumApfProgramSize: %d }",
mApfVersionSupported, mApfRamSize));
pw.println("InstallableProgramSizeClamp: " + mInstallableProgramSizeClamp);
pw.println("Filter update status: " + (mIsRunning ? "RUNNING" : "PAUSED"));
- pw.println("Receive thread: " + (mReceiveThread != null ? "RUNNING" : "STOPPED"));
pw.println("Multicast: " + (mMulticastFilter ? "DROP" : "ALLOW"));
pw.println("Minimum RDNSS lifetime: " + mMinRdnssLifetimeSec);
pw.println("Interface MAC address: " + MacAddress.fromBytes(mHardwareAddress));
diff --git a/src/android/net/ip/IpClient.java b/src/android/net/ip/IpClient.java
index 9bc13bd..fae4b5c 100644
--- a/src/android/net/ip/IpClient.java
+++ b/src/android/net/ip/IpClient.java
@@ -922,12 +922,13 @@
* APF programs.
* @see ApfFilter#maybeCreate
*/
- public AndroidPacketFilter maybeCreateApfFilter(Context context,
+ public AndroidPacketFilter maybeCreateApfFilter(Handler handler, Context context,
ApfFilter.ApfConfiguration config, InterfaceParams ifParams,
IpClientCallbacksWrapper cb, NetworkQuirkMetrics networkQuirkMetrics,
boolean useNewApfFilter) {
if (useNewApfFilter) {
- return ApfFilter.maybeCreate(context, config, ifParams, cb, networkQuirkMetrics);
+ return ApfFilter.maybeCreate(handler, context, config, ifParams, cb,
+ networkQuirkMetrics);
} else {
return LegacyApfFilter.maybeCreate(context, config, ifParams, cb,
networkQuirkMetrics);
@@ -2647,8 +2648,8 @@
apfConfig.shouldHandleNdOffload = mApfShouldHandleNdOffload;
apfConfig.minMetricsSessionDurationMs = mApfCounterPollingIntervalMs;
apfConfig.hasClatInterface = mHasSeenClatInterface;
- return mDependencies.maybeCreateApfFilter(mContext, apfConfig, mInterfaceParams,
- mCallback, mNetworkQuirkMetrics, mUseNewApfFilter);
+ return mDependencies.maybeCreateApfFilter(getHandler(), mContext, apfConfig,
+ mInterfaceParams, mCallback, mNetworkQuirkMetrics, mUseNewApfFilter);
}
private boolean handleUpdateApfCapabilities(@NonNull final ApfCapabilities apfCapabilities) {
diff --git a/tests/unit/src/android/net/apf/ApfFilterTest.kt b/tests/unit/src/android/net/apf/ApfFilterTest.kt
index 0aed28f..928eff0 100644
--- a/tests/unit/src/android/net/apf/ApfFilterTest.kt
+++ b/tests/unit/src/android/net/apf/ApfFilterTest.kt
@@ -29,9 +29,9 @@
import android.net.apf.ApfCounterTracker.Counter.DROPPED_GARP_REPLY
import android.net.apf.ApfCounterTracker.Counter.DROPPED_IPV4_BROADCAST_ADDR
import android.net.apf.ApfCounterTracker.Counter.DROPPED_IPV4_BROADCAST_NET
+import android.net.apf.ApfCounterTracker.Counter.DROPPED_IPV4_L2_BROADCAST
import android.net.apf.ApfCounterTracker.Counter.DROPPED_IPV4_MULTICAST
import android.net.apf.ApfCounterTracker.Counter.DROPPED_IPV4_NON_DHCP4
-import android.net.apf.ApfCounterTracker.Counter.DROPPED_IPV4_L2_BROADCAST
import android.net.apf.ApfCounterTracker.Counter.DROPPED_IPV6_MULTICAST_NA
import android.net.apf.ApfCounterTracker.Counter.DROPPED_IPV6_NON_ICMP_MULTICAST
import android.net.apf.ApfCounterTracker.Counter.DROPPED_IPV6_NS_INVALID
@@ -53,14 +53,20 @@
import android.net.apf.ApfCounterTracker.Counter.PASSED_IPV6_UNICAST_NON_ICMP
import android.net.apf.ApfCounterTracker.Counter.PASSED_MLD
import android.net.apf.ApfFilter.Dependencies
+import android.net.apf.ApfTestHelpers.Companion.TIMEOUT_MS
import android.net.apf.ApfTestHelpers.Companion.consumeInstalledProgram
import android.net.apf.ApfTestHelpers.Companion.verifyProgramRun
import android.net.apf.BaseApfGenerator.APF_VERSION_3
import android.net.apf.BaseApfGenerator.APF_VERSION_6
import android.net.ip.IpClient.IpClientCallbacksWrapper
import android.os.Build
+import android.os.Handler
+import android.os.HandlerThread
import android.os.SystemClock
+import android.system.Os
+import android.system.OsConstants.AF_UNIX
import android.system.OsConstants.IFA_F_TENTATIVE
+import android.system.OsConstants.SOCK_STREAM
import androidx.test.filters.SmallTest
import com.android.internal.annotations.GuardedBy
import com.android.net.module.util.HexDump
@@ -81,10 +87,13 @@
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
import com.android.testutils.DevSdkIgnoreRunner
import com.android.testutils.quitResources
+import com.android.testutils.waitForIdle
+import java.io.FileDescriptor
import java.net.Inet6Address
import java.net.InetAddress
import kotlin.test.assertContentEquals
import kotlin.test.assertEquals
+import libcore.io.IoUtils
import org.junit.After
import org.junit.Before
import org.junit.Rule
@@ -92,6 +101,7 @@
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.doAnswer
@@ -111,6 +121,7 @@
class ApfFilterTest {
companion object {
private const val THREAD_QUIT_MAX_RETRY_COUNT = 3
+ private const val TAG = "ApfFilterTest"
}
@get:Rule
@@ -177,6 +188,10 @@
intArrayOf(0x33, 0x33, 0xff, 0xbb, 0xcc, 0xdd).map { it.toByte() }.toByteArray(),
)
+ private val handlerThread = HandlerThread("$TAG handler thread").apply { start() }
+ private val handler = Handler(handlerThread.looper)
+ private var writerSocket = FileDescriptor()
+
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
@@ -194,6 +209,9 @@
}
}.`when`(dependencies).onApfFilterCreated(any())
doReturn(SystemClock.elapsedRealtime()).`when`(dependencies).elapsedRealtime()
+ val readSocket = FileDescriptor()
+ Os.socketpair(AF_UNIX, SOCK_STREAM, 0, writerSocket, readSocket)
+ doReturn(readSocket).`when`(dependencies).createPacketReaderSocket(anyInt())
}
private fun shutdownApfFilters() {
@@ -204,7 +222,7 @@
return@quitResources ret
}
}, { apf: AndroidPacketFilter ->
- apf.shutdown()
+ handler.post { apf.shutdown() }
})
synchronized(mApfFilterCreated) {
@@ -218,9 +236,13 @@
@After
fun tearDown() {
+ IoUtils.closeQuietly(writerSocket)
shutdownApfFilters()
+ handler.waitForIdle(TIMEOUT_MS)
Mockito.framework().clearInlineMocks()
ApfJniUtils.resetTransmittedPacketMemory()
+ handlerThread.quitSafely()
+ handlerThread.join()
}
private fun getDefaultConfig(apfVersion: Int = APF_VERSION_6): ApfFilter.ApfConfiguration {
@@ -237,16 +259,22 @@
}
private fun getApfFilter(
- apfCfg: ApfFilter.ApfConfiguration = getDefaultConfig(APF_VERSION_6)
+ apfCfg: ApfFilter.ApfConfiguration = getDefaultConfig(APF_VERSION_6)
): ApfFilter {
- return ApfFilter(
- context,
- apfCfg,
- ifParams,
- ipClientCallback,
- metrics,
- dependencies
- )
+ lateinit var apfFilter: ApfFilter
+ handler.post {
+ apfFilter = ApfFilter(
+ handler,
+ context,
+ apfCfg,
+ ifParams,
+ ipClientCallback,
+ metrics,
+ dependencies
+ )
+ }
+ handlerThread.waitForIdle(TIMEOUT_MS)
+ return apfFilter
}
private fun doTestEtherTypeAllowListFilter(apfFilter: ApfFilter) {
diff --git a/tests/unit/src/android/net/apf/ApfTest.java b/tests/unit/src/android/net/apf/ApfTest.java
index 3db7a7f..59bc498 100644
--- a/tests/unit/src/android/net/apf/ApfTest.java
+++ b/tests/unit/src/android/net/apf/ApfTest.java
@@ -17,6 +17,7 @@
package android.net.apf;
import static android.net.apf.ApfCounterTracker.Counter.getCounterEnumFromOffset;
+import static android.net.apf.ApfTestHelpers.TIMEOUT_MS;
import static android.net.apf.ApfTestHelpers.consumeInstalledProgram;
import static android.net.apf.ApfTestHelpers.DROP;
import static android.net.apf.ApfTestHelpers.MIN_PKT_SIZE;
@@ -80,6 +81,8 @@
import android.net.ip.IpClient;
import android.net.metrics.IpConnectivityLog;
import android.os.Build;
+import android.os.Handler;
+import android.os.HandlerThread;
import android.os.PowerManager;
import android.os.SystemClock;
import android.stats.connectivity.NetworkQuirkEvent;
@@ -109,6 +112,7 @@
import com.android.testutils.ConcurrentUtils;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRunner;
+import com.android.testutils.HandlerUtils;
import libcore.io.IoUtils;
import libcore.io.Streams;
@@ -130,6 +134,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.Inet6Address;
@@ -142,6 +147,7 @@
import java.util.List;
import java.util.Map;
import java.util.Random;
+import java.util.concurrent.atomic.AtomicReference;
/**
* Tests for APF program generator and interpreter.
@@ -178,10 +184,9 @@
@Mock private IpClient.IpClientCallbacksWrapper mIpClientCb;
@GuardedBy("mApfFilterCreated")
private final ArrayList<AndroidPacketFilter> mApfFilterCreated = new ArrayList<>();
- @GuardedBy("mThreadsToBeCleared")
- private final ArrayList<Thread> mThreadsToBeCleared = new ArrayList<>();
-
private FileDescriptor mWriteSocket;
+ private HandlerThread mHandlerThread;
+ private Handler mHandler;
private long mCurrentTimeMs;
@Before
@@ -190,39 +195,22 @@
doReturn(mPowerManager).when(mContext).getSystemService(PowerManager.class);
doReturn(mApfSessionInfoMetrics).when(mDependencies).getApfSessionInfoMetrics();
doReturn(mIpClientRaInfoMetrics).when(mDependencies).getIpClientRaInfoMetrics();
+ FileDescriptor readSocket = new FileDescriptor();
+ mWriteSocket = new FileDescriptor();
+ Os.socketpair(AF_UNIX, SOCK_STREAM, 0, mWriteSocket, readSocket);
+ doReturn(readSocket).when(mDependencies).createPacketReaderSocket(anyInt());
+ mCurrentTimeMs = SystemClock.elapsedRealtime();
+ doReturn(mCurrentTimeMs).when(mDependencies).elapsedRealtime();
+ doReturn(true).when(mIpClientCb).installPacketFilter(any());
doAnswer((invocation) -> {
synchronized (mApfFilterCreated) {
mApfFilterCreated.add(invocation.getArgument(0));
}
return null;
}).when(mDependencies).onApfFilterCreated(any());
- doAnswer((invocation) -> {
- synchronized (mThreadsToBeCleared) {
- mThreadsToBeCleared.add(invocation.getArgument(0));
- }
- return null;
- }).when(mDependencies).onThreadCreated(any());
- FileDescriptor readSocket = new FileDescriptor();
- mWriteSocket = new FileDescriptor();
- Os.socketpair(AF_UNIX, SOCK_STREAM, 0, mWriteSocket, readSocket);
- doReturn(readSocket).when(mDependencies).createRaReaderSocket(anyInt());
- mCurrentTimeMs = SystemClock.elapsedRealtime();
- doReturn(mCurrentTimeMs).when(mDependencies).elapsedRealtime();
- doReturn(true).when(mIpClientCb).installPacketFilter(any());
- }
-
- private void quitThreads() throws Exception {
- ConcurrentUtils.quitThreads(
- THREAD_QUIT_MAX_RETRY_COUNT,
- false /* interrupt */,
- TIMEOUT_MS,
- () -> {
- synchronized (mThreadsToBeCleared) {
- final ArrayList<Thread> ret = new ArrayList<>(mThreadsToBeCleared);
- mThreadsToBeCleared.clear();
- return ret;
- }
- });
+ mHandlerThread = new HandlerThread("ApfTestThread");
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
}
private void shutdownApfFilters() throws Exception {
@@ -233,26 +221,22 @@
mApfFilterCreated.clear();
return ret;
}
- }, (apf) -> {
- apf.shutdown();
- });
+ }, (apf) -> mHandler.post(apf::shutdown));
synchronized (mApfFilterCreated) {
assertEquals("ApfFilters did not fully shutdown.",
0, mApfFilterCreated.size());
}
- // It's necessary to wait until all ReceiveThreads have finished running because
- // clearInlineMocks clears all Mock objects, including some privilege frameworks
- // required by logStats, at the end of ReceiveThread#run.
- quitThreads();
}
@After
public void tearDown() throws Exception {
+ IoUtils.closeQuietly(mWriteSocket);
shutdownApfFilters();
+ HandlerUtils.waitForIdle(mHandler, TIMEOUT_MS);
// Clear mocks to prevent from stubs holding instances and cause memory leaks.
Mockito.framework().clearInlineMocks();
- IoUtils.closeQuietly(mWriteSocket);
- mWriteSocket = null;
+ mHandlerThread.quitSafely();
+ mHandlerThread.join();
}
private static final String TAG = "ApfTest";
@@ -267,7 +251,6 @@
private static final int MIN_RDNSS_LIFETIME_SEC = 0;
private static final int MIN_METRICS_SESSION_DURATIONS_MS = 300_000;
- private static final int TIMEOUT_MS = 1000;
private static final int NO_CALLBACK_TIMEOUT_MS = 500;
private static final int THREAD_QUIT_MAX_RETRY_COUNT = 3;
@@ -1035,10 +1018,19 @@
}
private void pretendPacketReceived(byte[] packet)
- throws IOException, ErrnoException {
+ throws InterruptedIOException, ErrnoException {
Os.write(mWriteSocket, packet, 0, packet.length);
}
+ private ApfFilter getApfFilter(ApfFilter.ApfConfiguration config) {
+ AtomicReference<ApfFilter> apfFilter = new AtomicReference<>();
+ mHandler.post(() ->
+ apfFilter.set(new ApfFilter(mHandler, mContext, config, TEST_PARAMS,
+ mIpClientCb, mNetworkQuirkMetrics, mDependencies)));
+ HandlerUtils.waitForIdle(mHandler, TIMEOUT_MS);
+ return apfFilter.get();
+ }
+
/**
* Generate APF program, run pcap file though APF filter, then check all the packets in the file
* should be dropped.
@@ -1056,8 +1048,7 @@
config.apfRamSize = 1700;
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS,
- mIpClientCb, mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 2 /* installCnt */);
apfFilter.setLinkProperties(lp);
byte[] program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
@@ -1232,8 +1223,7 @@
ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS,
- mIpClientCb, mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
apfFilter.setLinkProperties(lp);
@@ -1288,8 +1278,7 @@
@Test
public void testApfFilterIPv6() throws Exception {
ApfConfiguration config = getDefaultConfig();
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ ApfFilter apfFilter = getApfFilter(config);
byte[] program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Verify empty IPv6 packet is passed
@@ -1702,8 +1691,7 @@
ApfConfiguration config = getDefaultConfig();
config.ieee802_3Filter = DROP_802_3_FRAMES;
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
apfFilter.setLinkProperties(lp);
@@ -1762,10 +1750,9 @@
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
clearInvocations(mIpClientCb);
- apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter2 = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
- apfFilter.setLinkProperties(lp);
+ apfFilter2.setLinkProperties(lp);
program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
assertDrop(program, mcastv4packet.array());
assertDrop(program, mcastv6packet.array());
@@ -1790,8 +1777,7 @@
private void doTestApfFilterMulticastPingWhileDozing(boolean isLightDozing) throws Exception {
final ApfConfiguration configuration = getDefaultConfig();
- final ApfFilter apfFilter = new ApfFilter(mContext, configuration, TEST_PARAMS,
- mIpClientCb, mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(configuration);
byte[] program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
final ArgumentCaptor<BroadcastReceiver> receiverCaptor =
ArgumentCaptor.forClass(BroadcastReceiver.class);
@@ -1847,8 +1833,7 @@
@DevSdkIgnoreRule.IgnoreAfter(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
public void testApfFilter802_3() throws Exception {
ApfConfiguration config = getDefaultConfig();
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ ApfFilter apfFilter = getApfFilter(config);
byte[] program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Verify empty packet of 100 zero bytes is passed
@@ -1866,8 +1851,7 @@
// Now turn on the filter
config.ieee802_3Filter = DROP_802_3_FRAMES;
- apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ apfFilter = getApfFilter(config);
program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Verify that IEEE802.3 frame is dropped
@@ -1892,8 +1876,7 @@
final int[] ipv4Ipv6BlackList = {ETH_P_IP, ETH_P_IPV6};
ApfConfiguration config = getDefaultConfig();
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ ApfFilter apfFilter = getApfFilter(config);
byte[] program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Verify empty packet of 100 zero bytes is passed
@@ -1911,8 +1894,7 @@
// Now add IPv4 to the black list
config.ethTypeBlackList = ipv4BlackList;
- apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ apfFilter = getApfFilter(config);
program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Verify that IPv4 frame will be dropped
@@ -1925,8 +1907,7 @@
// Now let us have both IPv4 and IPv6 in the black list
config.ethTypeBlackList = ipv4Ipv6BlackList;
- apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ apfFilter = getApfFilter(config);
program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Verify that IPv4 frame will be dropped
@@ -1964,8 +1945,7 @@
ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ ApfFilter apfFilter = getApfFilter(config);
byte[] program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Verify initially ARP request filter is off, and GARP filter is on.
@@ -2027,8 +2007,7 @@
final ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
byte[] program;
final int srcPort = 12345;
@@ -2218,8 +2197,7 @@
final ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
byte[] program;
final int srcPort = 1024;
@@ -2467,8 +2445,7 @@
@Test
public void testRaToString() throws Exception {
ApfConfiguration config = getDefaultConfig();
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ ApfFilter apfFilter = getApfFilter(config);
byte[] packet = buildLargeRa();
ApfFilter.Ra ra = apfFilter.new Ra(packet, packet.length);
@@ -2541,8 +2518,7 @@
ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ ApfFilter apfFilter = getApfFilter(config);
byte[] program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
final int ROUTER_LIFETIME = 1000;
@@ -2626,8 +2602,7 @@
final ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
byte[] program = consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
final int RA_REACHABLE_TIME = 1800;
final int RA_RETRANSMISSION_TIMER = 1234;
@@ -2667,8 +2642,7 @@
final ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
final int routerLifetime = 1000;
@@ -2740,8 +2714,7 @@
ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ ApfFilter apfFilter = getApfFilter(config);
for (int i = 0; i < 1000; i++) {
byte[] packet = new byte[r.nextInt(maxRandomPacketSize + 1)];
r.nextBytes(packet);
@@ -2761,8 +2734,7 @@
ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ ApfFilter apfFilter = getApfFilter(config);
for (int i = 0; i < 1000; i++) {
byte[] packet = new byte[r.nextInt(maxRandomPacketSize + 1)];
r.nextBytes(packet);
@@ -2776,8 +2748,7 @@
@Test
public void testMatchedRaUpdatesLifetime() throws Exception {
- final ApfFilter apfFilter = new ApfFilter(mContext, getDefaultConfig(), TEST_PARAMS,
- mIpClientCb, mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(getDefaultConfig());
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Create an RA and build an APF program
@@ -2801,8 +2772,7 @@
// configure accept_ra_min_lft
final ApfConfiguration config = getDefaultConfig();
config.acceptRaMinLft = 180;
- ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Template packet:
// Frame 1: 150 bytes on wire (1200 bits), 150 bytes captured (1200 bits)
@@ -2866,8 +2836,7 @@
// configure accept_ra_min_lft
final ApfConfiguration config = getDefaultConfig();
config.acceptRaMinLft = 180;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Create an initial RA and build an APF program
@@ -2895,8 +2864,7 @@
// configure accept_ra_min_lft
final ApfConfiguration config = getDefaultConfig();
config.acceptRaMinLft = 180;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Create an initial RA and build an APF program
@@ -2931,8 +2899,7 @@
// configure accept_ra_min_lft
final ApfConfiguration config = getDefaultConfig();
config.acceptRaMinLft = 180;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Create an initial RA and build an APF program
@@ -2960,8 +2927,7 @@
// configure accept_ra_min_lft
final ApfConfiguration config = getDefaultConfig();
config.acceptRaMinLft = 180;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Create an initial RA and build an APF program
@@ -2997,8 +2963,7 @@
// configure accept_ra_min_lft
final ApfConfiguration config = getDefaultConfig();
config.acceptRaMinLft = 180;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Create an initial RA and build an APF program
@@ -3030,8 +2995,7 @@
// configure accept_ra_min_lft
final ApfConfiguration config = getDefaultConfig();
config.acceptRaMinLft = 180;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Create an initial RA and build an APF program
@@ -3069,8 +3033,7 @@
// configure accept_ra_min_lft
final ApfConfiguration config = getDefaultConfig();
config.acceptRaMinLft = 180;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
// Create an initial RA and build an APF program
@@ -3142,8 +3105,8 @@
public void testInstallPacketFilterFailure() throws Exception {
doReturn(false).when(mIpClientCb).installPacketFilter(any());
final ApfConfiguration config = getDefaultConfig();
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
+
verify(mNetworkQuirkMetrics).setEvent(NetworkQuirkEvent.QE_APF_INSTALL_FAILURE);
verify(mNetworkQuirkMetrics).statsWrite();
reset(mNetworkQuirkMetrics);
@@ -3160,8 +3123,7 @@
final ApfConfiguration config = getDefaultConfig();
config.apfVersionSupported = 2;
config.apfRamSize = 512;
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
final byte[] ra = buildLargeRa();
pretendPacketReceived(ra);
@@ -3174,8 +3136,7 @@
@Test
public void testGenerateApfProgramException() throws Exception {
final ApfConfiguration config = getDefaultConfig();
- ApfFilter apfFilter = spy(new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies));
+ ApfFilter apfFilter = spy(getApfFilter(config));
synchronized (apfFilter) {
when(apfFilter.emitPrologueLocked()).thenThrow(new IllegalStateException("test"));
apfFilter.installNewProgramLocked();
@@ -3192,8 +3153,7 @@
final long startTimeMs = 12345;
final long durationTimeMs = config.minMetricsSessionDurationMs;
doReturn(startTimeMs).when(mDependencies).elapsedRealtime();
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
byte[] program = consumeInstalledProgram(mIpClientCb, 2 /* installCnt */);
int maxProgramSize = 0;
int numProgramUpdated = 0;
@@ -3238,7 +3198,9 @@
// Write metrics data to statsd pipeline when shutdown.
doReturn(startTimeMs + durationTimeMs).when(mDependencies).elapsedRealtime();
- apfFilter.shutdown();
+ mHandler.post(apfFilter::shutdown);
+ IoUtils.closeQuietly(mWriteSocket);
+ HandlerUtils.waitForIdle(mHandler, TIMEOUT_MS);
verify(mApfSessionInfoMetrics).setVersion(4);
verify(mApfSessionInfoMetrics).setMemorySize(4096);
@@ -3270,8 +3232,7 @@
final long startTimeMs = 12345;
final long durationTimeMs = config.minMetricsSessionDurationMs;
doReturn(startTimeMs).when(mDependencies).elapsedRealtime();
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
consumeInstalledProgram(mIpClientCb, 1 /* installCnt */);
final int routerLifetime = 1000;
@@ -3327,7 +3288,9 @@
// Write metrics data to statsd pipeline when shutdown.
doReturn(startTimeMs + durationTimeMs).when(mDependencies).elapsedRealtime();
- apfFilter.shutdown();
+ mHandler.post(apfFilter::shutdown);
+ IoUtils.closeQuietly(mWriteSocket);
+ HandlerUtils.waitForIdle(mHandler, TIMEOUT_MS);
// Verify each metric fields in IpClientRaInfoMetrics.
verify(mIpClientRaInfoMetrics).setMaxNumberOfDistinctRas(6);
@@ -3348,20 +3311,20 @@
// Verify no metrics data written to statsd for duration less than durationTimeMs.
doReturn(startTimeMs).when(mDependencies).elapsedRealtime();
- final ApfFilter apfFilter = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter = getApfFilter(config);
doReturn(startTimeMs + durationTimeMs - 1).when(mDependencies).elapsedRealtime();
- apfFilter.shutdown();
+ mHandler.post(apfFilter::shutdown);
+ HandlerUtils.waitForIdle(mHandler, TIMEOUT_MS);
verify(mApfSessionInfoMetrics, never()).statsWrite();
verify(mIpClientRaInfoMetrics, never()).statsWrite();
// Verify metrics data written to statsd for duration greater than or equal to
// durationTimeMs.
doReturn(startTimeMs).when(mDependencies).elapsedRealtime();
- final ApfFilter apfFilter2 = new ApfFilter(mContext, config, TEST_PARAMS, mIpClientCb,
- mNetworkQuirkMetrics, mDependencies);
+ final ApfFilter apfFilter2 = getApfFilter(config);
doReturn(startTimeMs + durationTimeMs).when(mDependencies).elapsedRealtime();
- apfFilter2.shutdown();
+ mHandler.post(apfFilter2::shutdown);
+ HandlerUtils.waitForIdle(mHandler, TIMEOUT_MS);
verify(mApfSessionInfoMetrics).statsWrite();
verify(mIpClientRaInfoMetrics).statsWrite();
}
diff --git a/tests/unit/src/android/net/ip/IpClientTest.java b/tests/unit/src/android/net/ip/IpClientTest.java
index 71f7ebf..0df8a31 100644
--- a/tests/unit/src/android/net/ip/IpClientTest.java
+++ b/tests/unit/src/android/net/ip/IpClientTest.java
@@ -850,10 +850,10 @@
ApfConfiguration.class);
if (isApfSupported) {
verify(mDependencies, timeout(TEST_TIMEOUT_MS)).maybeCreateApfFilter(
- any(), configCaptor.capture(), any(), any(), any(), anyBoolean());
+ any(), any(), configCaptor.capture(), any(), any(), any(), anyBoolean());
} else {
verify(mDependencies, never()).maybeCreateApfFilter(
- any(), configCaptor.capture(), any(), any(), any(), anyBoolean());
+ any(), any(), configCaptor.capture(), any(), any(), any(), anyBoolean());
}
return isApfSupported ? configCaptor.getValue() : null;
@@ -922,7 +922,7 @@
final ArgumentCaptor<ApfConfiguration> configCaptor = ArgumentCaptor.forClass(
ApfConfiguration.class);
verify(mDependencies, timeout(TEST_TIMEOUT_MS)).maybeCreateApfFilter(
- any(), configCaptor.capture(), any(), any(), any(), anyBoolean());
+ any(), any(), configCaptor.capture(), any(), any(), any(), anyBoolean());
final ApfConfiguration actual = configCaptor.getValue();
assertNotNull(actual);
assertEquals(SdkLevel.isAtLeastS() ? 4 : 3, actual.apfVersionSupported);
@@ -957,7 +957,7 @@
ipc.updateApfCapabilities(newApfCapabilities);
HandlerUtils.waitForIdle(ipc.getHandler(), TEST_TIMEOUT_MS);
verify(mDependencies, never()).maybeCreateApfFilter(any(), any(), any(), any(), any(),
- anyBoolean());
+ any(), anyBoolean());
verifyShutdown(ipc);
}
@@ -973,15 +973,15 @@
ipc.updateApfCapabilities(null /* apfCapabilities */);
HandlerUtils.waitForIdle(ipc.getHandler(), TEST_TIMEOUT_MS);
verify(mDependencies, never()).maybeCreateApfFilter(any(), any(), any(), any(), any(),
- anyBoolean());
+ any(), anyBoolean());
verifyShutdown(ipc);
}
@Test
@IgnoreUpTo(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
public void testVendorNdOffloadDisabledWhenApfV6Supported() throws Exception {
- when(mDependencies.maybeCreateApfFilter(any(), any(), any(), any(), any(), anyBoolean()))
- .thenReturn(mApfFilter);
+ when(mDependencies.maybeCreateApfFilter(any(), any(), any(), any(), any(), any(),
+ anyBoolean())).thenReturn(mApfFilter);
when(mApfFilter.supportNdOffload()).thenReturn(true);
final IpClient ipc = makeIpClient(TEST_IFNAME);
ProvisioningConfiguration config = new ProvisioningConfiguration.Builder()
@@ -1006,8 +1006,8 @@
@Test
@IgnoreUpTo(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
public void testVendorNdOffloadEnabledWhenApfV6NotSupported() throws Exception {
- when(mDependencies.maybeCreateApfFilter(any(), any(), any(), any(), any(), anyBoolean()))
- .thenReturn(mApfFilter);
+ when(mDependencies.maybeCreateApfFilter(any(), any(), any(), any(), any(), any(),
+ anyBoolean())).thenReturn(mApfFilter);
when(mApfFilter.supportNdOffload()).thenReturn(false);
final IpClient ipc = makeIpClient(TEST_IFNAME);
ProvisioningConfiguration config = new ProvisioningConfiguration.Builder()
@@ -1030,8 +1030,8 @@
@Test
@IgnoreUpTo(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
public void testVendorNdOffloadDisabledWhenApfCapabilitiesUpdated() throws Exception {
- when(mDependencies.maybeCreateApfFilter(any(), any(), any(), any(), any(), anyBoolean()))
- .thenReturn(mApfFilter);
+ when(mDependencies.maybeCreateApfFilter(any(), any(), any(), any(), any(), any(),
+ anyBoolean())).thenReturn(mApfFilter);
when(mApfFilter.supportNdOffload()).thenReturn(true);
final IpClient ipc = makeIpClient(TEST_IFNAME);
ProvisioningConfiguration config = new ProvisioningConfiguration.Builder()
@@ -1053,8 +1053,8 @@
@Test
public void testLinkPropertiesUpdate_callSetLinkPropertiesOnApfFilter() throws Exception {
- when(mDependencies.maybeCreateApfFilter(any(), any(), any(), any(), any(), anyBoolean()))
- .thenReturn(mApfFilter);
+ when(mDependencies.maybeCreateApfFilter(any(), any(), any(), any(), any(), any(),
+ anyBoolean())).thenReturn(mApfFilter);
final IpClient ipc = makeIpClient(TEST_IFNAME);
verifyApfFilterCreatedOnStart(ipc, true /* isApfSupported */);
onInterfaceAddressUpdated(