Creating interface name to index tracking for Bpf Maps.

Adding mechanism to track interaface name to interface index, this map
would be used by BpfNetMaps for storing interface index.

Bug: 400681214
Test: atest ConnectivityCoverageTests:android.net.connectivity.com.android.server.connectivity.InterfaceTrackerTest
Test: atest ConnectivityCoverageTests:android.net.connectivity.com.android.server.BpfNetMapsTest
Change-Id: I2a65cac908d9c4d10714e3fe26be20322d4a1db3
This commit is contained in:
Sarup Dalwani 2025-03-05 15:43:22 +00:00
commit 53ecd95072

View file

@ -365,6 +365,7 @@ import com.android.server.connectivity.DnsManager;
import com.android.server.connectivity.DnsManager.PrivateDnsValidationUpdate;
import com.android.server.connectivity.DscpPolicyTracker;
import com.android.server.connectivity.FullScore;
import com.android.server.connectivity.InterfaceTracker;
import com.android.server.connectivity.InvalidTagException;
import com.android.server.connectivity.KeepaliveResourceUtil;
import com.android.server.connectivity.KeepaliveTracker;
@ -577,6 +578,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private final NetworkStatsManager mStatsManager;
private final NetworkPolicyManager mPolicyManager;
private final BpfNetMaps mBpfNetMaps;
private final InterfaceTracker mInterfaceTracker;
/**
* TestNetworkService (lazily) created upon first usage. Locked to prevent creation of multiple
@ -1662,8 +1664,17 @@ public class ConnectivityService extends IConnectivityManager.Stub {
* @param netd a netd binder
* @return BpfNetMaps implementation.
*/
public BpfNetMaps getBpfNetMaps(Context context, INetd netd) {
return new BpfNetMaps(context, netd);
public BpfNetMaps getBpfNetMaps(Context context, INetd netd,
InterfaceTracker interfaceTracker) {
return new BpfNetMaps(context, netd, interfaceTracker);
}
/**
* Get the InterfaceTracker implementation to use in ConnectivityService.
* @return InterfaceTracker implementation.
*/
public InterfaceTracker getInterfaceTracker(Context context) {
return new InterfaceTracker(context);
}
/**
@ -1886,7 +1897,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mWakeUpMask = mask;
mNetd = netd;
mBpfNetMaps = mDeps.getBpfNetMaps(mContext, netd);
mInterfaceTracker = mDeps.getInterfaceTracker(mContext);
mBpfNetMaps = mDeps.getBpfNetMaps(mContext, netd, mInterfaceTracker);
mHandlerThread = mDeps.makeHandlerThread("ConnectivityServiceThread");
mPermissionMonitorDeps = mPermDeps;
mPermissionMonitor =
@ -9605,8 +9617,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
updateIngressToVpnAddressFiltering(newLp, oldLp, networkAgent);
updateLocalNetworkAddresses(newLp, oldLp);
updateMtu(newLp, oldLp);
// TODO - figure out what to do for clat
// for (LinkProperties lp : newLp.getStackedLinks()) {
@ -9769,16 +9779,23 @@ public class ConnectivityService extends IConnectivityManager.Stub {
wakeupModifyInterface(iface, nai, true);
mDeps.reportNetworkInterfaceForTransports(mContext, iface,
nai.networkCapabilities.getTransportTypes());
mInterfaceTracker.addInterface(iface);
} catch (Exception e) {
logw("Exception adding interface: " + e);
}
}
}
// The local network addresses needs to be updated before interfaces are removed because
// modifying bpf map local_net_access requires mapping interface name to index.
updateLocalNetworkAddresses(newLp, oldLp);
for (final String iface : interfaceDiff.removed) {
try {
if (DBG) log("Removing iface " + iface + " from network " + netId);
wakeupModifyInterface(iface, nai, false);
mRoutingCoordinatorService.removeInterfaceFromNetwork(netId, iface);
mInterfaceTracker.removeInterface(iface);
} catch (Exception e) {
loge("Exception removing interface: " + e);
}