65 lines
1.8 KiB
Go
65 lines
1.8 KiB
Go
package autonatv2
|
|
|
|
import "time"
|
|
|
|
// autoNATSettings is used to configure AutoNAT
|
|
type autoNATSettings struct {
|
|
allowPrivateAddrs bool
|
|
serverRPM int
|
|
serverPerPeerRPM int
|
|
serverDialDataRPM int
|
|
dataRequestPolicy dataRequestPolicyFunc
|
|
now func() time.Time
|
|
amplificatonAttackPreventionDialWait time.Duration
|
|
metricsTracer MetricsTracer
|
|
}
|
|
|
|
func defaultSettings() *autoNATSettings {
|
|
return &autoNATSettings{
|
|
allowPrivateAddrs: false,
|
|
serverRPM: 60, // 1 every second
|
|
serverPerPeerRPM: 12, // 1 every 5 seconds
|
|
serverDialDataRPM: 12, // 1 every 5 seconds
|
|
dataRequestPolicy: amplificationAttackPrevention,
|
|
amplificatonAttackPreventionDialWait: 3 * time.Second,
|
|
now: time.Now,
|
|
}
|
|
}
|
|
|
|
type AutoNATOption func(s *autoNATSettings) error
|
|
|
|
func WithServerRateLimit(rpm, perPeerRPM, dialDataRPM int) AutoNATOption {
|
|
return func(s *autoNATSettings) error {
|
|
s.serverRPM = rpm
|
|
s.serverPerPeerRPM = perPeerRPM
|
|
s.serverDialDataRPM = dialDataRPM
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func WithMetricsTracer(m MetricsTracer) AutoNATOption {
|
|
return func(s *autoNATSettings) error {
|
|
s.metricsTracer = m
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func withDataRequestPolicy(drp dataRequestPolicyFunc) AutoNATOption {
|
|
return func(s *autoNATSettings) error {
|
|
s.dataRequestPolicy = drp
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func allowPrivateAddrs(s *autoNATSettings) error {
|
|
s.allowPrivateAddrs = true
|
|
return nil
|
|
}
|
|
|
|
func withAmplificationAttackPreventionDialWait(d time.Duration) AutoNATOption {
|
|
return func(s *autoNATSettings) error {
|
|
s.amplificatonAttackPreventionDialWait = d
|
|
return nil
|
|
}
|
|
}
|