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 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