@@ -11,17 +11,14 @@ import (
1111 "fmt"
1212 "math"
1313
14- "golang.org/x/net/bpf"
15-
16- "github.com/vishvananda/netns"
17-
1814 manager "github.com/DataDog/ebpf-manager"
15+ "github.com/vishvananda/netns"
1916
2017 "github.com/DataDog/datadog-agent/comp/core/telemetry"
2118 ddebpf "github.com/DataDog/datadog-agent/pkg/ebpf"
2219 "github.com/DataDog/datadog-agent/pkg/network/config"
2320 "github.com/DataDog/datadog-agent/pkg/network/ebpf/probes"
24- filterpkg "github.com/DataDog/datadog-agent/pkg/network/filter"
21+ "github.com/DataDog/datadog-agent/pkg/network/filter"
2522 "github.com/DataDog/datadog-agent/pkg/util/kernel"
2623 "github.com/DataDog/datadog-agent/pkg/util/log"
2724)
@@ -33,6 +30,26 @@ type dnsMonitor struct {
3330
3431// NewReverseDNS starts snooping on DNS traffic to allow IP -> domain reverse resolution
3532func NewReverseDNS (cfg * config.Config , _ telemetry.Component ) (ReverseDNS , error ) {
33+ // Create the RAW_SOCKET inside the root network namespace
34+ var (
35+ packetSrc * filter.AFPacketSource
36+ srcErr error
37+ ns netns.NsHandle
38+ )
39+ ns , err := cfg .GetRootNetNs ()
40+ if err != nil {
41+ return nil , err
42+ }
43+ defer ns .Close ()
44+
45+ err = kernel .WithNS (ns , func () error {
46+ packetSrc , srcErr = filter .NewAFPacketSource (4 << 20 ) // 4 MB total
47+ return srcErr
48+ })
49+ if err != nil {
50+ return nil , err
51+ }
52+
3653 currKernelVersion , err := kernel .HostVersion ()
3754 if err != nil {
3855 // if the platform couldn't be determined, treat it as new kernel case
@@ -42,12 +59,11 @@ func NewReverseDNS(cfg *config.Config, _ telemetry.Component) (ReverseDNS, error
4259 pre410Kernel := currKernelVersion < kernel .VersionCode (4 , 1 , 0 )
4360
4461 var p * ebpfProgram
45- var filter * manager.Probe
46- var bpfFilter []bpf.RawInstruction
47- if pre410Kernel {
48- bpfFilter , err = generateBPFFilter (cfg )
49- if err != nil {
62+ if pre410Kernel || cfg .EnableEbpfless {
63+ if bpfFilter , err := generateBPFFilter (cfg ); err != nil {
5064 return nil , fmt .Errorf ("error creating bpf classic filter: %w" , err )
65+ } else if err = packetSrc .SetBPF (bpfFilter ); err != nil {
66+ return nil , fmt .Errorf ("could not set BPF filter on packet source: %w" , err )
5167 }
5268 } else {
5369 p , err = newEBPFProgram (cfg )
@@ -59,35 +75,21 @@ func NewReverseDNS(cfg *config.Config, _ telemetry.Component) (ReverseDNS, error
5975 return nil , fmt .Errorf ("error initializing ebpf programs: %w" , err )
6076 }
6177
62- filter , _ = p .GetProbe (manager.ProbeIdentificationPair {EBPFFuncName : probes .SocketDNSFilter , UID : probeUID })
78+ filter , _ : = p .GetProbe (manager.ProbeIdentificationPair {EBPFFuncName : probes .SocketDNSFilter , UID : probeUID })
6379 if filter == nil {
6480 return nil , fmt .Errorf ("error retrieving socket filter" )
6581 }
66- }
6782
68- // Create the RAW_SOCKET inside the root network namespace
69- var (
70- packetSrc * filterpkg.AFPacketSource
71- srcErr error
72- ns netns.NsHandle
73- )
74- if ns , err = cfg .GetRootNetNs (); err != nil {
75- return nil , err
76- }
77- defer ns .Close ()
78-
79- err = kernel .WithNS (ns , func () error {
80- packetSrc , srcErr = filterpkg .NewPacketSource (filter , bpfFilter )
81- return srcErr
82- })
83- if err != nil {
84- return nil , err
83+ if err = packetSrc .SetEbpf (filter ); err != nil {
84+ return nil , fmt .Errorf ("could not set file descriptor for eBPF program: %w" , err )
85+ }
8586 }
8687
8788 snoop , err := newSocketFilterSnooper (cfg , packetSrc )
8889 if err != nil {
8990 return nil , err
9091 }
92+
9193 return & dnsMonitor {
9294 snoop ,
9395 p ,
0 commit comments