7a3f6e945d
Refactors TCP and UDP flow managers to enhance analyzer selection and flow binding accuracy, including O(1) UDP stream rebinding by 5-tuple. Introduces runtime stats tracking for engine and ruleset operations, exposing new APIs for granular performance and error metrics. Optimizes GeoMatcher with result caching and supports efficient geosite set matching, reducing redundant computation in ruleset expressions.
96 lines
2.7 KiB
Go
96 lines
2.7 KiB
Go
package engine
|
|
|
|
import (
|
|
"context"
|
|
"sync/atomic"
|
|
|
|
"git.difuse.io/Difuse/Mellaris/io"
|
|
"git.difuse.io/Difuse/Mellaris/ruleset"
|
|
)
|
|
|
|
// Engine is the main engine for Mellaris.
|
|
type Engine interface {
|
|
// UpdateRuleset updates the ruleset.
|
|
UpdateRuleset(ruleset.Ruleset) error
|
|
// Run runs the engine, until an error occurs or the context is cancelled.
|
|
Run(context.Context) error
|
|
// Stats returns a consistent snapshot of runtime counters.
|
|
Stats() Stats
|
|
}
|
|
|
|
type OverflowPolicy string
|
|
|
|
const (
|
|
OverflowPolicyAccept OverflowPolicy = "accept"
|
|
OverflowPolicyDrop OverflowPolicy = "drop"
|
|
OverflowPolicyBackpressure OverflowPolicy = "backpressure"
|
|
)
|
|
|
|
type AnalyzerSelectionMode string
|
|
|
|
const (
|
|
AnalyzerSelectionModeAlways AnalyzerSelectionMode = "always"
|
|
AnalyzerSelectionModeSignature AnalyzerSelectionMode = "signature"
|
|
)
|
|
|
|
type statsCounters struct {
|
|
OverflowEvents atomic.Uint64
|
|
OverflowAccepts atomic.Uint64
|
|
OverflowDrops atomic.Uint64
|
|
OverflowBackpressureEvents atomic.Uint64
|
|
|
|
AnalyzerSelectionsTotal atomic.Uint64
|
|
AnalyzerSelectionsPruned atomic.Uint64
|
|
|
|
UDPTupleLookups atomic.Uint64
|
|
UDPTupleHits atomic.Uint64
|
|
}
|
|
|
|
type Stats struct {
|
|
OverflowEvents uint64
|
|
OverflowAccepts uint64
|
|
OverflowDrops uint64
|
|
OverflowBackpressureEvents uint64
|
|
|
|
AnalyzerSelectionsTotal uint64
|
|
AnalyzerSelectionsPruned uint64
|
|
|
|
UDPTupleLookups uint64
|
|
UDPTupleHits uint64
|
|
}
|
|
|
|
// Config is the configuration for the engine.
|
|
type Config struct {
|
|
Logger Logger
|
|
IO io.PacketIO
|
|
Ruleset ruleset.Ruleset
|
|
|
|
Workers int // Number of workers. Zero or negative means auto (number of CPU cores).
|
|
WorkerQueueSize int
|
|
WorkerTCPMaxBufferedPagesTotal int
|
|
WorkerTCPMaxBufferedPagesPerConn int
|
|
WorkerUDPMaxStreams int
|
|
OverflowPolicy OverflowPolicy
|
|
AnalyzerSelectionMode AnalyzerSelectionMode
|
|
}
|
|
|
|
// Logger is the combined logging interface for the engine, workers and analyzers.
|
|
type Logger interface {
|
|
WorkerStart(id int)
|
|
WorkerStop(id int)
|
|
|
|
TCPStreamNew(workerID int, info ruleset.StreamInfo)
|
|
TCPStreamPropUpdate(info ruleset.StreamInfo, close bool)
|
|
TCPStreamAction(info ruleset.StreamInfo, action ruleset.Action, noMatch bool)
|
|
|
|
UDPStreamNew(workerID int, info ruleset.StreamInfo)
|
|
UDPStreamPropUpdate(info ruleset.StreamInfo, close bool)
|
|
UDPStreamAction(info ruleset.StreamInfo, action ruleset.Action, noMatch bool)
|
|
|
|
ModifyError(info ruleset.StreamInfo, err error)
|
|
|
|
AnalyzerDebugf(streamID int64, name string, format string, args ...interface{})
|
|
AnalyzerInfof(streamID int64, name string, format string, args ...interface{})
|
|
AnalyzerErrorf(streamID int64, name string, format string, args ...interface{})
|
|
}
|