> A veth device advertises NETDEV_XDP_ACT_NDO_XMIT only if its peer has an > XDP program attached or GRO enabled, that is, only if the peer will have > NAPI to receive the frames. > > veth_set_features() updates the peer's flag when GRO is toggled, but > returns early if the device is down, and veth_open() only refreshes the > flags of the device being opened. Toggling GRO while the device is down > therefore leaves the peer's flag stale after the device comes up. > > If GRO was enabled while down, the device comes up with NAPI but the > peer does not advertise NDO_XMIT, and devmap rejects redirects to the > peer with -EOPNOTSUPP. If GRO was disabled while down, the device comes > up without NAPI but the peer still advertises NDO_XMIT, so redirects are > accepted and then dropped in veth_xdp_xmit() with -ENXIO. > > Commit 7a6102aa6df0 ("veth: Update XDP feature set when bringing up > device") made veth_open() refresh the device's own flags. Refresh the > peer's flags there too. The peer's flag depends on this device's XDP > program and GRO setting, not on whether the peer is up, so it is > correct to set it even if the peer is down. > > Fixes: 8267fc71abb2 ("veth: take into account peer device for NETDEV_XDP_ACT_NDO_XMIT xdp_features flag") > Signed-off-by: Tianyi Gao Acked-by: Lorenzo Bianconi > --- > drivers/net/veth.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/net/veth.c b/drivers/net/veth.c > index 71227d0389aa..643b97dc5245 100644 > --- a/drivers/net/veth.c > +++ b/drivers/net/veth.c > @@ -1415,6 +1415,7 @@ static int veth_open(struct net_device *dev) > } > > veth_set_xdp_features(dev); > + veth_set_xdp_features(peer); > > return 0; > } > -- > 2.55.0 >