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:
parent
d3d144f54d
commit
8035dbc881
4 changed files with 8 additions and 130 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -519,8 +519,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
|
|||
}
|
||||
|
||||
@Override
|
||||
public BpfInterfaceMapUpdater makeBpfInterfaceMapUpdater(
|
||||
@NonNull Context ctx, @NonNull Handler handler) {
|
||||
public BpfInterfaceMapUpdater makeBpfInterfaceMapUpdater() {
|
||||
return mBpfInterfaceMapUpdater;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue