Add tether BPF offload config to device config and resource
The tether bpf offload can be enabled by resource config and
device config. The device config has higher priority and it
could override this config which is set by resource config.
Bug: 149997301
Test: -build, flash, boot
-atest TetheringConfigurationTest
Original-Change: https://android-review.googlesource.com/1276007
Use device option to control BPF offload features
If BPF offload device config is not enabled:
- Does not add/remove offload forwarding rules through disabling IP
neighbor monitor.
- Does not apply the RA MTU reduction.
Bug: 149997301
Test: atest IpServerTest
Original-Change: https://android-review.googlesource.com/1284578
Merged-In: I2d6f80f0229f580c4b16243a064e889a6c37f77a
Change-Id: I2d6f80f0229f580c4b16243a064e889a6c37f77a
This commit is contained in:
@@ -227,6 +227,7 @@ public class IpServer extends StateMachine {
|
||||
private final int mInterfaceType;
|
||||
private final LinkProperties mLinkProperties;
|
||||
private final boolean mUsingLegacyDhcp;
|
||||
private final boolean mUsingBpfOffload;
|
||||
|
||||
private final Dependencies mDeps;
|
||||
|
||||
@@ -304,7 +305,8 @@ public class IpServer extends StateMachine {
|
||||
|
||||
public IpServer(
|
||||
String ifaceName, Looper looper, int interfaceType, SharedLog log,
|
||||
INetd netd, Callback callback, boolean usingLegacyDhcp, Dependencies deps) {
|
||||
INetd netd, Callback callback, boolean usingLegacyDhcp, boolean usingBpfOffload,
|
||||
Dependencies deps) {
|
||||
super(ifaceName, looper);
|
||||
mLog = log.forSubComponent(ifaceName);
|
||||
mNetd = netd;
|
||||
@@ -314,6 +316,7 @@ public class IpServer extends StateMachine {
|
||||
mInterfaceType = interfaceType;
|
||||
mLinkProperties = new LinkProperties();
|
||||
mUsingLegacyDhcp = usingLegacyDhcp;
|
||||
mUsingBpfOffload = usingBpfOffload;
|
||||
mDeps = deps;
|
||||
resetLinkProperties();
|
||||
mLastError = TetheringManager.TETHER_ERROR_NO_ERROR;
|
||||
@@ -321,8 +324,15 @@ public class IpServer extends StateMachine {
|
||||
|
||||
mIpNeighborMonitor = mDeps.getIpNeighborMonitor(getHandler(), mLog,
|
||||
new MyNeighborEventConsumer());
|
||||
if (!mIpNeighborMonitor.start()) {
|
||||
mLog.e("Failed to create IpNeighborMonitor on " + mIfaceName);
|
||||
|
||||
// IP neighbor monitor monitors the neighbor event for adding/removing offload
|
||||
// forwarding rules per client. If BPF offload is not supported, don't start listening
|
||||
// neighbor events. See updateIpv6ForwardingRules, addIpv6ForwardingRule,
|
||||
// removeIpv6ForwardingRule.
|
||||
if (mUsingBpfOffload) {
|
||||
if (!mIpNeighborMonitor.start()) {
|
||||
mLog.e("Failed to create IpNeighborMonitor on " + mIfaceName);
|
||||
}
|
||||
}
|
||||
|
||||
mInitialState = new InitialState();
|
||||
@@ -715,12 +725,12 @@ public class IpServer extends StateMachine {
|
||||
final String upstreamIface = v6only.getInterfaceName();
|
||||
|
||||
params = new RaParams();
|
||||
// We advertise an mtu lower by 16, which is the closest multiple of 8 >= 14,
|
||||
// the ethernet header size. This makes kernel ebpf tethering offload happy.
|
||||
// This hack should be reverted once we have the kernel fixed up.
|
||||
// When BPF offload is enabled, we advertise an mtu lower by 16, which is the closest
|
||||
// multiple of 8 >= 14, the ethernet header size. This makes kernel ebpf tethering
|
||||
// offload happy. This hack should be reverted once we have the kernel fixed up.
|
||||
// Note: this will automatically clamp to at least 1280 (ipv6 minimum mtu)
|
||||
// see RouterAdvertisementDaemon.java putMtu()
|
||||
params.mtu = v6only.getMtu() - 16;
|
||||
params.mtu = mUsingBpfOffload ? v6only.getMtu() - 16 : v6only.getMtu();
|
||||
params.hasDefaultRoute = v6only.hasIpv6DefaultRoute();
|
||||
|
||||
if (params.hasDefaultRoute) params.hopLimit = getHopLimit(upstreamIface);
|
||||
@@ -844,6 +854,11 @@ public class IpServer extends StateMachine {
|
||||
}
|
||||
|
||||
private void addIpv6ForwardingRule(Ipv6ForwardingRule rule) {
|
||||
// Theoretically, we don't need this check because IP neighbor monitor doesn't start if BPF
|
||||
// offload is disabled. Add this check just in case.
|
||||
// TODO: Perhaps remove this protection check.
|
||||
if (!mUsingBpfOffload) return;
|
||||
|
||||
try {
|
||||
mNetd.tetherOffloadRuleAdd(rule.toTetherOffloadRuleParcel());
|
||||
mIpv6ForwardingRules.put(rule.address, rule);
|
||||
@@ -853,6 +868,11 @@ public class IpServer extends StateMachine {
|
||||
}
|
||||
|
||||
private void removeIpv6ForwardingRule(Ipv6ForwardingRule rule, boolean removeFromMap) {
|
||||
// Theoretically, we don't need this check because IP neighbor monitor doesn't start if BPF
|
||||
// offload is disabled. Add this check just in case.
|
||||
// TODO: Perhaps remove this protection check.
|
||||
if (!mUsingBpfOffload) return;
|
||||
|
||||
try {
|
||||
mNetd.tetherOffloadRuleRemove(rule.toTetherOffloadRuleParcel());
|
||||
if (removeFromMap) {
|
||||
|
||||
Reference in New Issue
Block a user