@@ -3,6 +3,8 @@ package main
33import (
44 "fmt"
55
6+ "bytes"
7+ "os"
68 "strconv"
79 "syscall"
810
@@ -50,6 +52,44 @@ type pidOffset struct {
5052 offset uint64
5153}
5254
55+ type BpfObjectsImpl struct {
56+ bpfObjs tracerObjects
57+ specs * ebpf.CollectionSpec
58+ }
59+
60+ func (objs * BpfObjectsImpl ) loadBpfObjects (bpfConstants map [string ]uint64 ) error {
61+ var err error
62+ opts := ebpf.CollectionOptions {
63+ Programs : ebpf.ProgramOptions {
64+ LogSize : ebpf .DefaultVerifierLogSize * 32 ,
65+ },
66+ }
67+
68+ reader := bytes .NewReader (_TracerBytes )
69+ objs .specs , err = ebpf .LoadCollectionSpecFromReader (reader )
70+ if err != nil {
71+ return err
72+ }
73+
74+ consts := make (map [string ]interface {})
75+ for k , v := range bpfConstants {
76+ consts [k ] = v
77+ }
78+ err = objs .specs .RewriteConstants (consts )
79+ if err != nil {
80+ return err
81+ }
82+
83+ err = objs .specs .LoadAndAssign (& objs .bpfObjs , & opts )
84+ if err != nil {
85+ var ve * ebpf.VerifierError
86+ if errors .As (err , & ve ) {
87+ log .Error ().Msg (fmt .Sprintf ("Got verifier error: %+v" , ve ))
88+ }
89+ }
90+ return err
91+ }
92+
5393func (t * Tracer ) Init (
5494 chunksBufferSize int ,
5595 logBufferSize int ,
@@ -81,25 +121,34 @@ func (t *Tracer) Init(
81121
82122 log .Info ().Msg (fmt .Sprintf ("Detected Linux kernel version: %s cgroups version: %v" , kernelVersion , cgroupsVersion ))
83123
84- t .bpfObjects = tracerObjects {}
85124 // TODO: cilium/ebpf does not support .kconfig Therefore; for now, we load object files according to kernel version.
86125 if kernel .CompareKernelVersion (* kernelVersion , kernel.VersionInfo {Kernel : 4 , Major : 6 , Minor : 0 }) < 1 {
126+ t .bpfObjects = tracerObjects {}
87127 if err := loadTracer46Objects (& t .bpfObjects , nil ); err != nil {
88128 return errors .Wrap (err , 0 )
89129 }
90130 } else {
91- opts := ebpf.CollectionOptions {
92- Programs : ebpf.ProgramOptions {
93- LogSize : ebpf .DefaultVerifierLogSize * 32 ,
94- },
131+ var hostProcIno uint64
132+ fileInfo , err := os .Stat ("/hostproc/1/ns/pid" )
133+ if err != nil {
134+ // services like "apparmor" on EKS can reject access to system pid information
135+ log .Warn ().Err (err ).Msg ("Get host netns failed" )
136+ } else {
137+ hostProcIno = fileInfo .Sys ().(* syscall.Stat_t ).Ino
138+ log .Info ().Uint64 ("ns" , hostProcIno ).Msg ("Setting host ns" )
95139 }
96- if err := loadTracerObjects (& t .bpfObjects , & opts ); err != nil {
97- var ve * ebpf.VerifierError
98- if errors .As (err , & ve ) {
99- log .Error ().Msg (fmt .Sprintf ("Got verifier error: %+v" , ve ))
100- }
101- return errors .Wrap (err , 0 )
140+
141+ objs := & BpfObjectsImpl {}
142+
143+ bpfConsts := map [string ]uint64 {
144+ "TRACER_NS_INO" : hostProcIno ,
145+ }
146+ err = objs .loadBpfObjects (bpfConsts )
147+ if err != nil {
148+ log .Error ().Msg (fmt .Sprintf ("load bpf objects failed: %v" , err ))
149+ return err
102150 }
151+ t .bpfObjects = objs .bpfObjs
103152 }
104153
105154 t .syscallHooks = syscallHooks {}
0 commit comments