remove BpfInterfaceMapUpdater async update functionality

This is no longer needed due to being done synchronously via nativeRegisterIface()

Test: TreeHugger
  atest libnetworkstats_test
  atest NetworkStackIntegrationTests:android.net.NetworkStatsIntegrationTest
  atest FrameworksNetTests:android.net.connectivity.com.android.server.net.BpfInterfaceMapUpdaterTest
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I9c0c79d23657fb5cb5296fb918f76f1fc896baa1
This commit is contained in:
Maciej Żenczykowski 2024-01-24 16:43:09 -08:00
commit 8035dbc881
4 changed files with 8 additions and 130 deletions

View file

@ -46,20 +46,14 @@ public class BpfInterfaceMapUpdater {
private static final String IFACE_INDEX_NAME_MAP_PATH =
"/sys/fs/bpf/netd_shared/map_netd_iface_index_name_map";
private final IBpfMap<S32, InterfaceMapValue> mIndexToIfaceBpfMap;
private final INetd mNetd;
private final Handler mHandler;
private final Dependencies mDeps;
public BpfInterfaceMapUpdater(Context ctx, Handler handler) {
this(ctx, handler, new Dependencies());
public BpfInterfaceMapUpdater() {
this(new Dependencies());
}
@VisibleForTesting
public BpfInterfaceMapUpdater(Context ctx, Handler handler, Dependencies deps) {
mDeps = deps;
public BpfInterfaceMapUpdater(Dependencies deps) {
mIndexToIfaceBpfMap = deps.getInterfaceMap();
mNetd = deps.getINetd(ctx);
mHandler = handler;
}
/**
@ -77,70 +71,6 @@ public class BpfInterfaceMapUpdater {
return null;
}
}
/** Get InterfaceParams for giving interface name. */
public InterfaceParams getInterfaceParams(String ifaceName) {
return InterfaceParams.getByName(ifaceName);
}
/** Get INetd binder object. */
public INetd getINetd(Context ctx) {
return INetd.Stub.asInterface((IBinder) ctx.getSystemService(Context.NETD_SERVICE));
}
}
/**
* Start listening interface update event.
* Query current interface names before listening.
*/
public void start() {
mHandler.post(() -> {
if (mIndexToIfaceBpfMap == null) {
Log.wtf(TAG, "Fail to start: Null bpf map");
return;
}
try {
// TODO: use a NetlinkMonitor and listen for RTM_NEWLINK messages instead.
mNetd.registerUnsolicitedEventListener(new InterfaceChangeObserver());
} catch (RemoteException e) {
Log.wtf(TAG, "Unable to register netd UnsolicitedEventListener, " + e);
}
final String[] ifaces;
try {
// TODO: use a netlink dump to get the current interface list.
ifaces = mNetd.interfaceGetList();
} catch (RemoteException | ServiceSpecificException e) {
Log.wtf(TAG, "Unable to query interface names by netd, " + e);
return;
}
for (String ifaceName : ifaces) {
addInterface(ifaceName);
}
});
}
private void addInterface(String ifaceName) {
final InterfaceParams iface = mDeps.getInterfaceParams(ifaceName);
if (iface == null) {
Log.e(TAG, "Unable to get InterfaceParams for " + ifaceName);
return;
}
try {
mIndexToIfaceBpfMap.updateEntry(new S32(iface.index), new InterfaceMapValue(ifaceName));
} catch (ErrnoException e) {
Log.e(TAG, "Unable to update entry for " + ifaceName + ", " + e);
}
}
private class InterfaceChangeObserver extends BaseNetdUnsolicitedEventListener {
@Override
public void onInterfaceAdded(String ifName) {
mHandler.post(() -> addInterface(ifName));
}
}
/** get interface name by interface index from bpf map */

View file

@ -628,8 +628,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
mContentObserver = mDeps.makeContentObserver(mHandler, mSettings,
mNetworkStatsSubscriptionsMonitor);
mLocationPermissionChecker = mDeps.makeLocationPermissionChecker(mContext);
mInterfaceMapUpdater = mDeps.makeBpfInterfaceMapUpdater(mContext, mHandler);
mInterfaceMapUpdater.start();
mInterfaceMapUpdater = mDeps.makeBpfInterfaceMapUpdater();
mUidCounterSetMap = mDeps.getUidCounterSetMap();
mCookieTagMap = mDeps.getCookieTagMap();
mStatsMapA = mDeps.getStatsMapA();
@ -800,9 +799,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
/** Create BpfInterfaceMapUpdater to update bpf interface map. */
@NonNull
public BpfInterfaceMapUpdater makeBpfInterfaceMapUpdater(
@NonNull Context ctx, @NonNull Handler handler) {
return new BpfInterfaceMapUpdater(ctx, handler);
public BpfInterfaceMapUpdater makeBpfInterfaceMapUpdater() {
return new BpfInterfaceMapUpdater();
}
/** Get counter sets map for each UID. */

View file

@ -66,71 +66,22 @@ public final class BpfInterfaceMapUpdaterTest {
private static final String TEST_INTERFACE_NAME = "test1";
private static final String TEST_INTERFACE_NAME2 = "test2";
private final TestLooper mLooper = new TestLooper();
private BaseNetdUnsolicitedEventListener mListener;
private BpfInterfaceMapUpdater mUpdater;
private IBpfMap<S32, InterfaceMapValue> mBpfMap =
spy(new TestBpfMap<>(S32.class, InterfaceMapValue.class));
@Mock private INetd mNetd;
@Mock private Context mContext;
private class TestDependencies extends BpfInterfaceMapUpdater.Dependencies {
@Override
public IBpfMap<S32, InterfaceMapValue> getInterfaceMap() {
return mBpfMap;
}
@Override
public InterfaceParams getInterfaceParams(String ifaceName) {
if (ifaceName.equals(TEST_INTERFACE_NAME)) {
return new InterfaceParams(TEST_INTERFACE_NAME, TEST_INDEX,
MacAddress.ALL_ZEROS_ADDRESS);
} else if (ifaceName.equals(TEST_INTERFACE_NAME2)) {
return new InterfaceParams(TEST_INTERFACE_NAME2, TEST_INDEX2,
MacAddress.ALL_ZEROS_ADDRESS);
}
return null;
}
@Override
public INetd getINetd(Context ctx) {
return mNetd;
}
}
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(mNetd.interfaceGetList()).thenReturn(new String[] {TEST_INTERFACE_NAME});
mUpdater = new BpfInterfaceMapUpdater(mContext, new Handler(mLooper.getLooper()),
new TestDependencies());
}
private void verifyStartUpdater() throws Exception {
mUpdater.start();
mLooper.dispatchAll();
final ArgumentCaptor<BaseNetdUnsolicitedEventListener> listenerCaptor =
ArgumentCaptor.forClass(BaseNetdUnsolicitedEventListener.class);
verify(mNetd).registerUnsolicitedEventListener(listenerCaptor.capture());
mListener = listenerCaptor.getValue();
verify(mBpfMap).updateEntry(eq(new S32(TEST_INDEX)),
eq(new InterfaceMapValue(TEST_INTERFACE_NAME)));
}
@Test
public void testUpdateInterfaceMap() throws Exception {
verifyStartUpdater();
mListener.onInterfaceAdded(TEST_INTERFACE_NAME2);
mLooper.dispatchAll();
verify(mBpfMap).updateEntry(eq(new S32(TEST_INDEX2)),
eq(new InterfaceMapValue(TEST_INTERFACE_NAME2)));
// Check that when onInterfaceRemoved is called, nothing happens.
mListener.onInterfaceRemoved(TEST_INTERFACE_NAME);
mLooper.dispatchAll();
verifyNoMoreInteractions(mBpfMap);
mUpdater = new BpfInterfaceMapUpdater(new TestDependencies());
}
@Test

View file

@ -519,8 +519,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
}
@Override
public BpfInterfaceMapUpdater makeBpfInterfaceMapUpdater(
@NonNull Context ctx, @NonNull Handler handler) {
public BpfInterfaceMapUpdater makeBpfInterfaceMapUpdater() {
return mBpfInterfaceMapUpdater;
}