After commit c8a36f1945b2 ("bpf: xdp: Fix XDP mode when no mode flags specified"), the mode is automatically set to XDP_MODE_DRV if the driver implements the .ndo_bpf function. However, for drivers like bonding, which only support native XDP for specific modes, this may result in an "unsupported" response. In such cases, let's fall back to SKB mode if the user did not explicitly request DRV mode. Fixes: c8a36f1945b2 ("bpf: xdp: Fix XDP mode when no mode flags specified") Reported-by: Liang Li <liali@xxxxxxxxxx> Closes: https://issues.redhat.com/browse/RHEL-62339 Signed-off-by: Hangbin Liu <liuhangbin@xxxxxxxxx> --- net/core/dev.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/net/core/dev.c b/net/core/dev.c index ea5fbcd133ae..e32069d81cd7 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -9579,6 +9579,7 @@ static int dev_xdp_attach(struct net_device *dev, struct netlink_ext_ack *extack /* don't call drivers if the effective program didn't change */ if (new_prog != cur_prog) { +reinstall: bpf_op = dev_xdp_bpf_op(dev, mode); if (!bpf_op) { NL_SET_ERR_MSG(extack, "Underlying driver does not support XDP in native mode"); @@ -9586,8 +9587,17 @@ static int dev_xdp_attach(struct net_device *dev, struct netlink_ext_ack *extack } err = dev_xdp_install(dev, mode, bpf_op, extack, flags, new_prog); - if (err) + if (err) { + /* The driver returns not supported even .ndo_bpf + * implemented, fall back to SKB mode. + */ + if (err == -EOPNOTSUPP && mode == XDP_MODE_DRV && + !(flags & XDP_FLAGS_DRV_MODE)) { + mode = XDP_MODE_SKB; + goto reinstall; + } return err; + } } if (link) -- 2.46.0