From e56b583ac5aca18c47a8010c99e0c6d7060306c0 Mon Sep 17 00:00:00 2001 From: manojks1999 <9743manoj@gmail.com> Date: Fri, 7 Feb 2025 01:02:53 +0530 Subject: [PATCH 1/4] Conntrack GC running in Retina default --- pkg/plugin/common/common_linux.go | 13 +++++++++++++ pkg/plugin/conntrack/conntrack_linux.go | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/pkg/plugin/common/common_linux.go b/pkg/plugin/common/common_linux.go index 92371f9c91..2f43d6dbe0 100644 --- a/pkg/plugin/common/common_linux.go +++ b/pkg/plugin/common/common_linux.go @@ -89,3 +89,16 @@ func NewPerfReader(l *log.ZapLogger, m *ebpf.Map, max, min int) (*perf.Reader, e } return nil, errors.New("failed to create perf reader") } + +// IsPluginEnabled checks if a given plugin is enabled in the config +func IsPluginEnabled(enabledPlugins []string, pluginName string) bool { + if enabledPlugins == nil { + return false + } + for _, plugin := range enabledPlugins { + if plugin == pluginName { + return true + } + } + return false +} diff --git a/pkg/plugin/conntrack/conntrack_linux.go b/pkg/plugin/conntrack/conntrack_linux.go index dc2fb0c449..a2ccd3bb0d 100644 --- a/pkg/plugin/conntrack/conntrack_linux.go +++ b/pkg/plugin/conntrack/conntrack_linux.go @@ -93,6 +93,12 @@ func GenerateDynamic(ctx context.Context, dynamicHeaderPath string, conntrackMet // Run starts the Conntrack garbage collection loop. func (ct *Conntrack) Run(ctx context.Context) error { + // Check if packetparser plugin is enabled + if !plugincommon.IsPluginEnabled(ct.cfg.EnabledPlugins, "packetparser") { + ct.l.Info("Skipping Conntrack GC loop as packetparser plugin is not enabled") + return nil + } + ticker := time.NewTicker(ct.gcFrequency) defer ticker.Stop() From ef030e1a917f577eae0cfc43980345bc4b3a1143 Mon Sep 17 00:00:00 2001 From: manojks1999 <9743manoj@gmail.com> Date: Sat, 8 Feb 2025 01:55:08 +0530 Subject: [PATCH 2/4] fix: Build fix --- pkg/managers/pluginmanager/pluginmanager.go | 2 +- pkg/plugin/conntrack/conntrack_linux.go | 23 ++++++++++----------- pkg/plugin/conntrack/types_linux.go | 4 ++++ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/pkg/managers/pluginmanager/pluginmanager.go b/pkg/managers/pluginmanager/pluginmanager.go index 15d133382f..0f0b8f0d14 100644 --- a/pkg/managers/pluginmanager/pluginmanager.go +++ b/pkg/managers/pluginmanager/pluginmanager.go @@ -138,7 +138,7 @@ func (p *PluginManager) Start(ctx context.Context) error { g, ctx := errgroup.WithContext(ctx) // run conntrack GC - ct, err := conntrack.New() + ct, err := conntrack.New(p.cfg) if err != nil { return errors.Wrap(err, "failed to get conntrack instance") } diff --git a/pkg/plugin/conntrack/conntrack_linux.go b/pkg/plugin/conntrack/conntrack_linux.go index a2ccd3bb0d..569b55d32b 100644 --- a/pkg/plugin/conntrack/conntrack_linux.go +++ b/pkg/plugin/conntrack/conntrack_linux.go @@ -14,6 +14,7 @@ import ( "github.com/cilium/ebpf" "github.com/cilium/ebpf/rlimit" "github.com/microsoft/retina/internal/ktime" + "github.com/microsoft/retina/pkg/config" "github.com/microsoft/retina/pkg/loader" "github.com/microsoft/retina/pkg/log" plugincommon "github.com/microsoft/retina/pkg/plugin/common" @@ -46,13 +47,8 @@ func Init() error { return nil } -// New returns a new Conntrack instance. -func New() (*Conntrack, error) { - ct := &Conntrack{ - l: log.Logger().Named("conntrack"), - gcFrequency: defaultGCFrequency, - } - +// New creates a new Conntrack instance +func New(cfg *config.Config) (*Conntrack, error) { objs := &conntrackObjects{} err := loadConntrackObjects(objs, &ebpf.CollectionOptions{ Maps: ebpf.MapOptions{ @@ -60,13 +56,16 @@ func New() (*Conntrack, error) { }, }) if err != nil { - ct.l.Error("loadConntrackObjects failed", zap.Error(err)) return nil, errors.Wrap(err, "failed to load conntrack objects") } - ct.objs = objs - // Get the conntrack map from the objects - ct.ctMap = objs.RetinaConntrack + ct := &Conntrack{ + l: log.Logger().Named("conntrack"), + gcFrequency: defaultGCFrequency, + objs: objs, + ctMap: objs.RetinaConntrack, + cfg: cfg, + } return ct, nil } @@ -94,7 +93,7 @@ func GenerateDynamic(ctx context.Context, dynamicHeaderPath string, conntrackMet // Run starts the Conntrack garbage collection loop. func (ct *Conntrack) Run(ctx context.Context) error { // Check if packetparser plugin is enabled - if !plugincommon.IsPluginEnabled(ct.cfg.EnabledPlugins, "packetparser") { + if !plugincommon.IsPluginEnabled(ct.cfg.EnabledPlugin, "packetparser") { ct.l.Info("Skipping Conntrack GC loop as packetparser plugin is not enabled") return nil } diff --git a/pkg/plugin/conntrack/types_linux.go b/pkg/plugin/conntrack/types_linux.go index 63fa7e90a9..c823f5f518 100644 --- a/pkg/plugin/conntrack/types_linux.go +++ b/pkg/plugin/conntrack/types_linux.go @@ -5,6 +5,7 @@ import ( "time" "github.com/cilium/ebpf" + "github.com/microsoft/retina/pkg/config" "github.com/microsoft/retina/pkg/log" ) @@ -15,11 +16,14 @@ const ( dynamicHeaderFileName = "dynamic.h" ) +// Conntrack represents the conntrack plugin type Conntrack struct { l *log.ZapLogger objs *conntrackObjects ctMap *ebpf.Map gcFrequency time.Duration + isRunning bool + cfg *config.Config } // Define TCP flag constants From 0c26b8bb016567f67e5fe687f93d8c47cb2e28df Mon Sep 17 00:00:00 2001 From: manojks1999 <9743manoj@gmail.com> Date: Sat, 8 Feb 2025 22:34:26 +0530 Subject: [PATCH 3/4] fix(circular dependency): bug fix --- pkg/managers/pluginmanager/pluginmanager.go | 3 ++- pkg/plugin/conntrack/conntrack_linux.go | 8 ++++++-- pkg/plugin/conntrack/types_linux.go | 1 - 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pkg/managers/pluginmanager/pluginmanager.go b/pkg/managers/pluginmanager/pluginmanager.go index 0f0b8f0d14..8fc02b4c60 100644 --- a/pkg/managers/pluginmanager/pluginmanager.go +++ b/pkg/managers/pluginmanager/pluginmanager.go @@ -138,10 +138,11 @@ func (p *PluginManager) Start(ctx context.Context) error { g, ctx := errgroup.WithContext(ctx) // run conntrack GC - ct, err := conntrack.New(p.cfg) + ct, err := conntrack.New() if err != nil { return errors.Wrap(err, "failed to get conntrack instance") } + ct.SetConfig(p.cfg) g.Go(func() error { return errors.Wrapf(ct.Run(ctx), "failed to run conntrack GC") }) diff --git a/pkg/plugin/conntrack/conntrack_linux.go b/pkg/plugin/conntrack/conntrack_linux.go index 569b55d32b..22c32bcaef 100644 --- a/pkg/plugin/conntrack/conntrack_linux.go +++ b/pkg/plugin/conntrack/conntrack_linux.go @@ -48,7 +48,7 @@ func Init() error { } // New creates a new Conntrack instance -func New(cfg *config.Config) (*Conntrack, error) { +func New() (*Conntrack, error) { objs := &conntrackObjects{} err := loadConntrackObjects(objs, &ebpf.CollectionOptions{ Maps: ebpf.MapOptions{ @@ -64,11 +64,15 @@ func New(cfg *config.Config) (*Conntrack, error) { gcFrequency: defaultGCFrequency, objs: objs, ctMap: objs.RetinaConntrack, - cfg: cfg, } return ct, nil } +// SetConfig sets the config after initialization +func (ct *Conntrack) SetConfig(cfg *config.Config) { + ct.cfg = cfg +} + // Build dynamic header path func BuildDynamicHeaderPath() string { // Get absolute path to this file during runtime. diff --git a/pkg/plugin/conntrack/types_linux.go b/pkg/plugin/conntrack/types_linux.go index c823f5f518..1d3fe8b7b6 100644 --- a/pkg/plugin/conntrack/types_linux.go +++ b/pkg/plugin/conntrack/types_linux.go @@ -22,7 +22,6 @@ type Conntrack struct { objs *conntrackObjects ctMap *ebpf.Map gcFrequency time.Duration - isRunning bool cfg *config.Config } From 924e8c5b4842aa4d3bff8f0bb998448e1f780b6d Mon Sep 17 00:00:00 2001 From: manojks1999 <9743manoj@gmail.com> Date: Mon, 10 Feb 2025 00:37:19 +0530 Subject: [PATCH 4/4] fix(windows): added dummy set method --- pkg/plugin/conntrack/conntrack_windows.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/plugin/conntrack/conntrack_windows.go b/pkg/plugin/conntrack/conntrack_windows.go index df674e2fd5..ebf4afaea5 100644 --- a/pkg/plugin/conntrack/conntrack_windows.go +++ b/pkg/plugin/conntrack/conntrack_windows.go @@ -2,6 +2,8 @@ package conntrack import ( "context" + + "github.com/microsoft/retina/pkg/config" ) type Conntrack struct{} @@ -15,3 +17,8 @@ func New() (*Conntrack, error) { func (c *Conntrack) Run(_ context.Context) error { return nil } + +// SetConfig sets the config after initialization +func (c *Conntrack) SetConfig(_ *config.Config) { + // No-op for Windows +}