Skip to content

Commit 62f4856

Browse files
viktor-kurchenkojulianwiedmann
authored andcommitted
loader: retry with xdp frags
The commit adds retry logic in case the XDP program loading failed with the `invalid argument` error. The error might indicate that the network interface is configured with a jumbo MTU, so we can retry loading after setting the `BPF_F_XDP_HAS_FRAGS` flag and hope that the NIC driver is XDP Fragment aware. Signed-off-by: viktor-kurchenko <viktor.kurchenko@isovalent.com>
1 parent 657975d commit 62f4856

1 file changed

Lines changed: 18 additions & 0 deletions

File tree

pkg/datapath/loader/xdp.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,24 @@ func compileAndLoadXDPProg(ctx context.Context, logger *slog.Logger, lnc *datapa
154154

155155
cfg.EnableExtendedIPProtocols = option.Config.EnableExtendedIPProtocols
156156

157+
if err := loadAssignAttach(logger, xdpDev, xdpMode, iface, spec, cfg); err != nil {
158+
// Usually, a jumbo MTU causes the invalid argument error, e.g.:
159+
// "create link: invalid argument" or "update link: invalid argument"
160+
if !errors.Is(err, unix.EINVAL) {
161+
return err
162+
}
163+
164+
// The following retry might be helpful if the NIC driver is XDP Fragment aware
165+
logger.Error("loading eBPF program failed, setting XDP frags and retrying", logfields.Error, err)
166+
for _, prog := range spec.Programs {
167+
prog.Flags |= unix.BPF_F_XDP_HAS_FRAGS
168+
}
169+
return loadAssignAttach(logger, xdpDev, xdpMode, iface, spec, cfg)
170+
}
171+
return nil
172+
}
173+
174+
func loadAssignAttach(logger *slog.Logger, xdpDev string, xdpMode xdp.Mode, iface netlink.Link, spec *ebpf.CollectionSpec, cfg *config.BPFXDP) error {
157175
var obj xdpObjects
158176
commit, err := bpf.LoadAndAssign(logger, &obj, spec, &bpf.CollectionOptions{
159177
Constants: cfg,

0 commit comments

Comments
 (0)