Skip to content

Commit d68a9a2

Browse files
committed
token: use coll opts for setup
Signed-off-by: Andrej Svenke <anryko@nebius.com>
1 parent 6215fc5 commit d68a9a2

File tree

9 files changed

+74
-45
lines changed

9 files changed

+74
-45
lines changed

collection.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ import (
1919
"github.com/cilium/ebpf/internal/sys"
2020
)
2121

22+
type TokenOptions struct {
23+
Path string
24+
Enabled bool
25+
}
26+
2227
// CollectionOptions control loading a collection into the kernel.
2328
//
2429
// Maps and Programs are passed to NewMapWithOptions and NewProgramsWithOptions.
@@ -36,6 +41,8 @@ type CollectionOptions struct {
3641
// The given Maps are Clone()d before being used in the Collection, so the
3742
// caller can Close() them freely when they are no longer needed.
3843
MapReplacements map[string]*Map
44+
45+
Token TokenOptions
3946
}
4047

4148
// CollectionSpec describes a collection.
@@ -323,6 +330,7 @@ type collectionLoader struct {
323330
programs map[string]*Program
324331
vars map[string]*Variable
325332
types *btf.Cache
333+
token *sys.FD
326334
}
327335

328336
func newCollectionLoader(coll *CollectionSpec, opts *CollectionOptions) (*collectionLoader, error) {
@@ -341,13 +349,23 @@ func newCollectionLoader(coll *CollectionSpec, opts *CollectionOptions) (*collec
341349
return nil, fmt.Errorf("populating kallsyms caches: %w", err)
342350
}
343351

352+
var token *sys.FD
353+
var err error
354+
if opts.Token.Enabled {
355+
token, err = sys.BpffsGetTokenFD(opts.Token.Path)
356+
if err != nil {
357+
return nil, fmt.Errorf("getting bpf token for collection: %w", err)
358+
}
359+
}
360+
344361
return &collectionLoader{
345362
coll,
346363
opts,
347364
make(map[string]*Map),
348365
make(map[string]*Program),
349366
make(map[string]*Variable),
350367
btf.NewCache(),
368+
token,
351369
}, nil
352370
}
353371

@@ -426,7 +444,7 @@ func (cl *collectionLoader) loadMap(mapName string) (*Map, error) {
426444
return nil, fmt.Errorf("assembling contents of map %s: %w", mapName, err)
427445
}
428446

429-
m, err := newMapWithOptions(mapSpec, cl.opts.Maps, cl.types)
447+
m, err := newMapWithOptions(mapSpec, cl.opts.Maps, cl.types, cl.token)
430448
if err != nil {
431449
return nil, fmt.Errorf("map %s: %w", mapName, err)
432450
}
@@ -489,7 +507,7 @@ func (cl *collectionLoader) loadProgram(progName string) (*Program, error) {
489507
}
490508
}
491509

492-
prog, err := newProgramWithOptions(progSpec, cl.opts.Programs, cl.types)
510+
prog, err := newProgramWithOptions(progSpec, cl.opts.Programs, cl.types, cl.token)
493511
if err != nil {
494512
return nil, fmt.Errorf("program %s: %w", progName, err)
495513
}

features/link.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ var haveBPFLinkUprobeMulti = internal.NewFeatureTest("bpf_link_uprobe_multi", fu
2727
},
2828
AttachType: ebpf.AttachTraceUprobeMulti,
2929
License: "MIT",
30-
})
30+
}, nil)
3131
if errors.Is(err, unix.E2BIG) {
3232
// Kernel doesn't support AttachType field.
3333
return ebpf.ErrNotSupported
@@ -77,7 +77,7 @@ var haveBPFLinkKprobeMulti = internal.NewFeatureTest("bpf_link_kprobe_multi", fu
7777
},
7878
AttachType: ebpf.AttachTraceKprobeMulti,
7979
License: "MIT",
80-
})
80+
}, nil)
8181
if errors.Is(err, unix.E2BIG) {
8282
// Kernel doesn't support AttachType field.
8383
return ebpf.ErrNotSupported
@@ -125,7 +125,7 @@ var haveBPFLinkKprobeSession = internal.NewFeatureTest("bpf_link_kprobe_session"
125125
},
126126
AttachType: ebpf.AttachTraceKprobeSession,
127127
License: "MIT",
128-
})
128+
}, nil)
129129
if errors.Is(err, unix.E2BIG) {
130130
// Kernel doesn't support AttachType field.
131131
return ebpf.ErrNotSupported

features/prog.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func probeProgram(spec *ebpf.ProgramSpec) error {
3030
}
3131
prog, err := ebpf.NewProgramWithOptions(spec, ebpf.ProgramOptions{
3232
LogDisabled: true,
33-
})
33+
}, nil)
3434
if err == nil {
3535
prog.Close()
3636
}
@@ -141,6 +141,7 @@ var haveProgramTypeMatrix = internal.FeatureMatrix[ebpf.ProgramType]{
141141
ebpf.ProgramOptions{
142142
LogDisabled: true,
143143
},
144+
nil,
144145
)
145146
if err != nil {
146147
return err
@@ -271,7 +272,7 @@ func haveProgramHelper(pt ebpf.ProgramType, helper asm.BuiltinFunc) error {
271272

272273
prog, err := ebpf.NewProgramWithOptions(spec, ebpf.ProgramOptions{
273274
LogLevel: 1,
274-
})
275+
}, nil)
275276
if err == nil {
276277
prog.Close()
277278
}

internal/sys/syscall_bpffs.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,18 @@ func MapCreateWithToken(attr *MapCreateAttr) (*FD, error) {
8686
}
8787

8888
// ProgLoadWithToken try to load prog, on permission issue try using bpf token.
89-
func ProgLoadWithToken(attr *ProgLoadAttr) (*FD, error) {
90-
fd, err := ProgLoad(attr)
91-
92-
// On permission error try privilege delegation using BPF Token.
93-
if errors.Is(err, unix.EPERM) {
94-
if tokenFD, tokenErr := BpffsGetTokenFD(""); tokenErr == nil {
95-
defer tokenFD.Close()
96-
attr.ProgTokenFd = int32(tokenFD.Int())
97-
attr.ProgFlags |= BPF_F_TOKEN_FD
98-
fd, err = ProgLoad(attr)
99-
}
100-
}
101-
102-
return fd, err
103-
}
89+
// func ProgLoadWithToken(attr *ProgLoadAttr) (*FD, error) {
90+
// fd, err := ProgLoad(attr)
91+
//
92+
// // On permission error try privilege delegation using BPF Token.
93+
// if errors.Is(err, unix.EPERM) {
94+
// if tokenFD, tokenErr := BpffsGetTokenFD(""); tokenErr == nil {
95+
// defer tokenFD.Close()
96+
// attr.ProgTokenFd = int32(tokenFD.Int())
97+
// attr.ProgFlags |= BPF_F_TOKEN_FD
98+
// fd, err = ProgLoad(attr)
99+
// }
100+
// }
101+
//
102+
// return fd, err
103+
// }

link/perf_event.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ var haveBPFLinkPerfEvent = internal.NewFeatureTest("bpf_link_perf_event", func()
313313
asm.Return(),
314314
},
315315
License: "MIT",
316-
})
316+
}, nil)
317317
if err != nil {
318318
return err
319319
}

link/syscalls.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var haveProgAttach = internal.NewFeatureTest("BPF_PROG_ATTACH", func() error {
2020
asm.Mov.Imm(asm.R0, 0),
2121
asm.Return(),
2222
},
23-
})
23+
}, nil)
2424
if err != nil {
2525
return internal.ErrNotSupported
2626
}
@@ -45,7 +45,7 @@ var haveProgAttachReplace = internal.NewFeatureTest("BPF_PROG_ATTACH atomic repl
4545
asm.Mov.Imm(asm.R0, 0),
4646
asm.Return(),
4747
},
48-
})
48+
}, nil)
4949

5050
if err != nil {
5151
return internal.ErrNotSupported
@@ -119,7 +119,7 @@ var haveTCX = internal.NewFeatureTest("tcx", func() error {
119119
asm.Mov.Imm(asm.R0, 0),
120120
asm.Return(),
121121
},
122-
})
122+
}, nil)
123123

124124
if err != nil {
125125
return internal.ErrNotSupported
@@ -154,7 +154,7 @@ var haveNetkit = internal.NewFeatureTest("netkit", func() error {
154154
asm.Mov.Imm(asm.R0, 0),
155155
asm.Return(),
156156
},
157-
})
157+
}, nil)
158158

159159
if err != nil {
160160
return internal.ErrNotSupported

linker.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ func resolveKconfigReferences(insns asm.Instructions) (_ *Map, err error) {
461461
return nil, err
462462
}
463463

464-
kconfig, err := NewMap(cpy)
464+
kconfig, err := NewMap(cpy, nil)
465465
if err != nil {
466466
return nil, err
467467
}

map.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -361,8 +361,8 @@ func newMapFromFD(fd *sys.FD) (*Map, error) {
361361
// NewMap creates a new Map.
362362
//
363363
// It's equivalent to calling NewMapWithOptions with default options.
364-
func NewMap(spec *MapSpec) (*Map, error) {
365-
return NewMapWithOptions(spec, MapOptions{})
364+
func NewMap(spec *MapSpec, token *sys.FD) (*Map, error) {
365+
return NewMapWithOptions(spec, MapOptions{}, token)
366366
}
367367

368368
// NewMapWithOptions creates a new Map.
@@ -375,8 +375,8 @@ func NewMap(spec *MapSpec) (*Map, error) {
375375
// by calling rlimit.RemoveMemlock() prior to calling NewMapWithOptions.
376376
//
377377
// May return an error wrapping ErrMapIncompatible.
378-
func NewMapWithOptions(spec *MapSpec, opts MapOptions) (*Map, error) {
379-
m, err := newMapWithOptions(spec, opts, btf.NewCache())
378+
func NewMapWithOptions(spec *MapSpec, opts MapOptions, token *sys.FD) (*Map, error) {
379+
m, err := newMapWithOptions(spec, opts, btf.NewCache(), token)
380380
if err != nil {
381381
return nil, fmt.Errorf("creating map: %w", err)
382382
}
@@ -389,7 +389,7 @@ func NewMapWithOptions(spec *MapSpec, opts MapOptions) (*Map, error) {
389389
return m, nil
390390
}
391391

392-
func newMapWithOptions(spec *MapSpec, opts MapOptions, c *btf.Cache) (_ *Map, err error) {
392+
func newMapWithOptions(spec *MapSpec, opts MapOptions, c *btf.Cache, token *sys.FD) (_ *Map, err error) {
393393
closeOnError := func(c io.Closer) {
394394
if err != nil {
395395
c.Close()
@@ -439,7 +439,7 @@ func newMapWithOptions(spec *MapSpec, opts MapOptions, c *btf.Cache) (_ *Map, er
439439
return nil, errors.New("inner maps cannot be pinned")
440440
}
441441

442-
template, err := spec.InnerMap.createMap(nil, c)
442+
template, err := spec.InnerMap.createMap(nil, c, token)
443443
if err != nil {
444444
return nil, fmt.Errorf("inner map: %w", err)
445445
}
@@ -451,7 +451,7 @@ func newMapWithOptions(spec *MapSpec, opts MapOptions, c *btf.Cache) (_ *Map, er
451451
innerFd = template.fd
452452
}
453453

454-
m, err := spec.createMap(innerFd, c)
454+
m, err := spec.createMap(innerFd, c, token)
455455
if err != nil {
456456
return nil, err
457457
}
@@ -546,7 +546,7 @@ func (m *Map) memorySize() (int, error) {
546546

547547
// createMap validates the spec's properties and creates the map in the kernel
548548
// using the given opts. It does not populate or freeze the map.
549-
func (spec *MapSpec) createMap(inner *sys.FD, c *btf.Cache) (_ *Map, err error) {
549+
func (spec *MapSpec) createMap(inner *sys.FD, c *btf.Cache, token *sys.FD) (_ *Map, err error) {
550550
closeOnError := func(closer io.Closer) {
551551
if err != nil {
552552
closer.Close()
@@ -584,6 +584,11 @@ func (spec *MapSpec) createMap(inner *sys.FD, c *btf.Cache) (_ *Map, err error)
584584
MapExtra: spec.MapExtra,
585585
}
586586

587+
if token != nil {
588+
attr.MapTokenFd = int32(token.Int())
589+
attr.MapFlags |= sys.BPF_F_TOKEN_FD
590+
}
591+
587592
if inner != nil {
588593
attr.InnerMapFd = inner.Uint()
589594
}
@@ -640,7 +645,7 @@ func (spec *MapSpec) createMap(inner *sys.FD, c *btf.Cache) (_ *Map, err error)
640645
}
641646
}
642647

643-
fd, err := sys.MapCreateWithToken(&attr)
648+
fd, err := sys.MapCreate(&attr)
644649

645650
// Some map types don't support BTF k/v in earlier kernel versions.
646651
// Remove BTF metadata and retry map creation.

prog.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,8 @@ type Program struct {
222222
//
223223
// Returns a [VerifierError] containing the full verifier log if the program is
224224
// rejected by the kernel.
225-
func NewProgram(spec *ProgramSpec) (*Program, error) {
226-
return NewProgramWithOptions(spec, ProgramOptions{})
225+
func NewProgram(spec *ProgramSpec, token *sys.FD) (*Program, error) {
226+
return NewProgramWithOptions(spec, ProgramOptions{}, token)
227227
}
228228

229229
// NewProgramWithOptions creates a new Program.
@@ -233,12 +233,12 @@ func NewProgram(spec *ProgramSpec) (*Program, error) {
233233
//
234234
// Returns a [VerifierError] containing the full verifier log if the program is
235235
// rejected by the kernel.
236-
func NewProgramWithOptions(spec *ProgramSpec, opts ProgramOptions) (*Program, error) {
236+
func NewProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, token *sys.FD) (*Program, error) {
237237
if spec == nil {
238238
return nil, errors.New("can't load a program from a nil spec")
239239
}
240240

241-
prog, err := newProgramWithOptions(spec, opts, btf.NewCache())
241+
prog, err := newProgramWithOptions(spec, opts, btf.NewCache(), token)
242242
if errors.Is(err, asm.ErrUnsatisfiedMapReference) {
243243
return nil, fmt.Errorf("cannot load program without loading its whole collection: %w", err)
244244
}
@@ -254,7 +254,7 @@ var (
254254
kfuncBadCall = []byte(fmt.Sprintf("invalid func unknown#%d\n", kfuncCallPoisonBase))
255255
)
256256

257-
func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache) (*Program, error) {
257+
func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache, token *sys.FD) (*Program, error) {
258258
if len(spec.Instructions) == 0 {
259259
return nil, errors.New("instructions cannot be empty")
260260
}
@@ -295,6 +295,11 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
295295
KernVersion: kv,
296296
}
297297

298+
if token != nil {
299+
attr.ProgTokenFd = int32(token.Int())
300+
attr.ProgFlags |= sys.BPF_F_TOKEN_FD
301+
}
302+
298303
insns := make(asm.Instructions, len(spec.Instructions))
299304
copy(insns, spec.Instructions)
300305

@@ -441,7 +446,7 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
441446
var fd *sys.FD
442447
if opts.LogDisabled {
443448
// Loading with logging disabled should never retry.
444-
fd, err = sys.ProgLoadWithToken(attr)
449+
fd, err = sys.ProgLoad(attr)
445450
if err == nil {
446451
return &Program{"", fd, spec.Name, "", spec.Type}, nil
447452
}
@@ -461,7 +466,7 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
461466
attr.LogBuf = sys.SlicePointer(logBuf)
462467
}
463468

464-
fd, err = sys.ProgLoadWithToken(attr)
469+
fd, err = sys.ProgLoad(attr)
465470
if err == nil {
466471
return &Program{unix.ByteSliceToString(logBuf), fd, spec.Name, "", spec.Type}, nil
467472
}
@@ -842,7 +847,7 @@ var haveProgRun = internal.NewFeatureTest("BPF_PROG_RUN", func() error {
842847
asm.Return(),
843848
},
844849
License: "MIT",
845-
})
850+
}, nil)
846851
if err != nil {
847852
// This may be because we lack sufficient permissions, etc.
848853
return err

0 commit comments

Comments
 (0)