@@ -13,6 +13,7 @@ import (
13
13
"errors"
14
14
"fmt"
15
15
"net"
16
+ "os"
16
17
"sync"
17
18
"time"
18
19
"unsafe"
@@ -27,6 +28,7 @@ import (
27
28
"github.com/DataDog/datadog-agent/pkg/network/netlink"
28
29
"github.com/DataDog/datadog-agent/pkg/process/util"
29
30
"github.com/DataDog/datadog-agent/pkg/telemetry"
31
+ "github.com/DataDog/datadog-agent/pkg/util/kernel"
30
32
"github.com/DataDog/datadog-agent/pkg/util/log"
31
33
)
32
34
@@ -106,28 +108,18 @@ type ciliumLoadBalancerConntracker struct {
106
108
107
109
func newCiliumLoadBalancerConntracker (cfg * config.Config ) (netlink.Conntracker , error ) {
108
110
if ! cfg .EnableCiliumLBConntracker {
109
- return netlink . NewNoOpConntracker () , nil
111
+ return nil , nil
110
112
}
111
113
112
- ctTCP , err := ebpf .LoadPinnedMap ("/sys/fs/bpf/tc/globals/cilium_ct4_global" , & ebpf.LoadPinOptions {
113
- ReadOnly : true ,
114
- })
114
+ ctTCP , ctUDP , backends , err := loadMaps ()
115
115
if err != nil {
116
- return nil , fmt .Errorf ("error loading pinned ct TCP map: %w" , err )
117
- }
116
+ // special case where we couldn't find at least one map
117
+ if os .IsNotExist (err ) {
118
+ log .Info ("not loading cilium conntracker since cilium maps are not present" )
119
+ return nil , nil
120
+ }
118
121
119
- ctUDP , err := ebpf .LoadPinnedMap ("/sys/fs/bpf/tc/globals/cilium_ct_any4_global" , & ebpf.LoadPinOptions {
120
- ReadOnly : true ,
121
- })
122
- if err != nil {
123
- return nil , fmt .Errorf ("error loading pinned ct UDP map: %w" , err )
124
- }
125
-
126
- backends , err := ebpf .LoadPinnedMap ("/sys/fs/bpf/tc/globals/cilium_lb4_backends_v3" , & ebpf.LoadPinOptions {
127
- ReadOnly : true ,
128
- })
129
- if err != nil {
130
- return nil , fmt .Errorf ("error loading pinned backends map: %w" , err )
122
+ return nil , err
131
123
}
132
124
133
125
clb := & ciliumLoadBalancerConntracker {
@@ -161,6 +153,50 @@ func newCiliumLoadBalancerConntracker(cfg *config.Config) (netlink.Conntracker,
161
153
return clb , nil
162
154
}
163
155
156
+ func loadMaps () (ctTCP , ctUDP , backends * ebpf.Map , err error ) {
157
+ defer func () {
158
+ if err != nil {
159
+ ctTCP .Close ()
160
+ ctUDP .Close ()
161
+ backends .Close ()
162
+ }
163
+ }()
164
+
165
+ ctTCP , err = loadMap (kernel .HostSys ("/fs/bpf/tc/globals/cilium_ct4_global" ))
166
+ if ctTCP == nil {
167
+ return nil , nil , nil , err
168
+ }
169
+
170
+ ctUDP , err = loadMap (kernel .HostSys ("/fs/bpf/tc/globals/cilium_ct_any4_global" ))
171
+ if ctUDP == nil {
172
+ return nil , nil , nil , err
173
+ }
174
+
175
+ backends , err = loadMap (kernel .HostSys ("/fs/bpf/tc/globals/cilium_lb4_backends_v3" ))
176
+ if backends == nil {
177
+ return nil , nil , nil , err
178
+ }
179
+
180
+ return ctTCP , ctUDP , backends , nil
181
+ }
182
+
183
+ func loadMap (path string ) (m * ebpf.Map , err error ) {
184
+ // check if the path exists first, since the errors returned
185
+ // from LoadPinnedMap are not consistent if it doesn't
186
+ if _ , err = os .Stat (path ); err != nil {
187
+ return nil , err
188
+ }
189
+
190
+ m , err = ebpf .LoadPinnedMap (path , & ebpf.LoadPinOptions {
191
+ ReadOnly : true ,
192
+ })
193
+ if err != nil {
194
+ return nil , fmt .Errorf ("error loading pinned cilium map at %s: %w" , path , err )
195
+ }
196
+
197
+ return m , nil
198
+ }
199
+
164
200
func ntohs (n uint16 ) uint16 {
165
201
return binary .BigEndian .Uint16 ([]byte {byte (n ), byte (n >> 8 )})
166
202
}
@@ -290,6 +326,7 @@ func (clb *ciliumLoadBalancerConntracker) Close() {
290
326
clb .stop <- struct {}{}
291
327
<- clb .stop
292
328
clb .ctTCP .Map ().Close ()
329
+ clb .ctUDP .Map ().Close ()
293
330
clb .backends .Map ().Close ()
294
331
})
295
332
}
0 commit comments