@@ -3,6 +3,8 @@ package main
33import (
44 "fmt"
55
6+ "bytes"
7+ "os"
68 "strconv"
79 "syscall"
810
@@ -50,6 +52,45 @@ 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+ const permUser = 0700
62+ var err error
63+ opts := ebpf.CollectionOptions {
64+ Programs : ebpf.ProgramOptions {
65+ LogSize : ebpf .DefaultVerifierLogSize * 32 ,
66+ },
67+ }
68+
69+ reader := bytes .NewReader (_TracerBytes )
70+ objs .specs , err = ebpf .LoadCollectionSpecFromReader (reader )
71+ if err != nil {
72+ return err
73+ }
74+
75+ consts := make (map [string ]interface {})
76+ for k , v := range bpfConstants {
77+ consts [k ] = v
78+ }
79+ err = objs .specs .RewriteConstants (consts )
80+ if err != nil {
81+ return err
82+ }
83+
84+ err = objs .specs .LoadAndAssign (& objs .bpfObjs , & opts )
85+ if err != nil {
86+ var ve * ebpf.VerifierError
87+ if errors .As (err , & ve ) {
88+ log .Error ().Msg (fmt .Sprintf ("Got verifier error: %+v" , ve ))
89+ }
90+ }
91+ return err
92+ }
93+
5394func (t * Tracer ) Init (
5495 chunksBufferSize int ,
5596 logBufferSize int ,
@@ -81,25 +122,34 @@ func (t *Tracer) Init(
81122
82123 log .Info ().Msg (fmt .Sprintf ("Detected Linux kernel version: %s cgroups version: %v" , kernelVersion , cgroupsVersion ))
83124
84- t .bpfObjects = tracerObjects {}
85125 // TODO: cilium/ebpf does not support .kconfig Therefore; for now, we load object files according to kernel version.
86126 if kernel .CompareKernelVersion (* kernelVersion , kernel.VersionInfo {Kernel : 4 , Major : 6 , Minor : 0 }) < 1 {
127+ t .bpfObjects = tracerObjects {}
87128 if err := loadTracer46Objects (& t .bpfObjects , nil ); err != nil {
88129 return errors .Wrap (err , 0 )
89130 }
90131 } else {
91- opts := ebpf.CollectionOptions {
92- Programs : ebpf.ProgramOptions {
93- LogSize : ebpf .DefaultVerifierLogSize * 32 ,
94- },
132+ var hostProcIno uint64
133+ fileInfo , err := os .Stat ("/hostproc/1/ns/pid" )
134+ if err != nil {
135+ // services like "apparmor" on EKS can reject access to system pid information
136+ log .Warn ().Err (err ).Msg ("Get host netns failed" )
137+ } else {
138+ hostProcIno = fileInfo .Sys ().(* syscall.Stat_t ).Ino
139+ log .Info ().Uint64 ("ns" , hostProcIno ).Msg (fmt .Sprintf ("Setting host ns" ))
95140 }
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 )
141+
142+ objs := & BpfObjectsImpl {}
143+
144+ bpfConsts := map [string ]uint64 {
145+ "TRACER_NS_INO" : hostProcIno ,
146+ }
147+ err = objs .loadBpfObjects (bpfConsts )
148+ if err != nil {
149+ log .Error ().Msg (fmt .Sprintf ("load bpf objects failed: %v" , err ))
150+ return err
102151 }
152+ t .bpfObjects = objs .bpfObjs
103153 }
104154
105155 t .syscallHooks = syscallHooks {}
0 commit comments