ruleset: try to fix reloader

This commit is contained in:
2026-02-12 13:27:53 +05:30
parent a8f8b43f3e
commit beaaddad2b
3 changed files with 194 additions and 12 deletions

View File

@@ -60,9 +60,7 @@ func (f *udpStreamFactory) New(ipFlow, udpFlow gopacket.Flow, udp *layers.UDP, u
Props: make(analyzer.CombinedPropMap),
}
f.Logger.UDPStreamNew(f.WorkerID, info)
f.RulesetMutex.RLock()
rs := f.Ruleset
f.RulesetMutex.RUnlock()
rs := f.currentRuleset()
ans := analyzersToUDPAnalyzers(rs.Analyzers(info))
// Create entries for each analyzer
entries := make([]*udpStreamEntry, 0, len(ans))
@@ -87,7 +85,7 @@ func (f *udpStreamFactory) New(ipFlow, udpFlow gopacket.Flow, udp *layers.UDP, u
info: info,
virgin: true,
logger: f.Logger,
ruleset: rs,
rulesetSource: f.currentRuleset,
activeEntries: entries,
}
}
@@ -99,6 +97,12 @@ func (f *udpStreamFactory) UpdateRuleset(r ruleset.Ruleset) error {
return nil
}
func (f *udpStreamFactory) currentRuleset() ruleset.Ruleset {
f.RulesetMutex.RLock()
defer f.RulesetMutex.RUnlock()
return f.Ruleset
}
type udpStreamManager struct {
factory *udpStreamFactory
streams *lru.Cache[uint32, *udpStreamValue]
@@ -186,7 +190,7 @@ type udpStream struct {
info ruleset.StreamInfo
virgin bool // true if no packets have been processed
logger Logger
ruleset ruleset.Ruleset
rulesetSource func() ruleset.Ruleset
activeEntries []*udpStreamEntry
doneEntries []*udpStreamEntry
lastVerdict udpVerdict
@@ -229,7 +233,10 @@ func (s *udpStream) Feed(udp *layers.UDP, rev bool, uc *udpContext) {
s.virgin = false
s.logger.UDPStreamPropUpdate(s.info, false)
// Match properties against ruleset
result := s.ruleset.Match(s.info)
result := ruleset.MatchResult{Action: ruleset.ActionMaybe}
if rs := s.currentRuleset(); rs != nil {
result = rs.Match(s.info)
}
action := result.Action
if action == ruleset.ActionModify {
// Call the modifier instance
@@ -266,6 +273,13 @@ func (s *udpStream) Feed(udp *layers.UDP, rev bool, uc *udpContext) {
}
}
func (s *udpStream) currentRuleset() ruleset.Ruleset {
if s.rulesetSource == nil {
return nil
}
return s.rulesetSource()
}
func (s *udpStream) Close() {
s.closeActiveEntries()
}