Add call protocol, Rmux. Update AmneziaWG. Fixes and improvements

This commit is contained in:
Shtorm
2026-08-06 14:19:34 +03:00
parent 051e928b01
commit d6b9f693c4
89 changed files with 15671 additions and 132 deletions

View File

@@ -44,7 +44,13 @@ func NewTrafficLimiterManager(ctx context.Context, nodeManager CM.NodeManager, l
}
select {
case <-timer.C:
manager.mtx.Lock()
strategyManagers := make([]*TrafficLimiterStrategyManager, 0, len(manager.managers))
for _, strategyManager := range manager.managers {
strategyManagers = append(strategyManagers, strategyManager)
}
manager.mtx.Unlock()
for _, strategyManager := range strategyManagers {
strategyManager.mtx.Lock()
for _, limiter := range strategyManager.limiters {
err := limiter.UpdateRemainingTraffic()
@@ -154,9 +160,10 @@ func (i *TrafficLimiterStrategyManager) DeleteTrafficLimiter(username string) {
}
type TrafficLimiter struct {
manager CM.NodeManager
limiter CM.TrafficLimiter
new uint64
manager CM.NodeManager
limiter CM.TrafficLimiter
new uint64
reserved uint64
mtx sync.Mutex
}
@@ -165,34 +172,34 @@ func NewTrafficLimiter(manager CM.NodeManager, limiter CM.TrafficLimiter) *Traff
return &TrafficLimiter{manager: manager, limiter: limiter}
}
func (l *TrafficLimiter) Can(n uint64) error {
func (l *TrafficLimiter) Reserve(n uint64) (uint64, error) {
l.mtx.Lock()
defer l.mtx.Unlock()
if l.limiter.RawUsed == l.limiter.RawQuota {
return E.New("traffic limit exceeded")
used := l.limiter.RawUsed + l.reserved
if used >= l.limiter.RawQuota {
return 0, E.New("traffic limit exceeded")
}
if l.limiter.RawUsed+n > l.limiter.RawQuota {
l.new += l.limiter.RawQuota - l.limiter.RawUsed
l.limiter.RawUsed = l.limiter.RawQuota
return E.New("traffic limit exceeded")
remaining := l.limiter.RawQuota - used
if n > remaining {
l.reserved += remaining
return remaining, E.New("traffic limit exceeded")
}
return nil
l.reserved += n
return n, nil
}
func (l *TrafficLimiter) Add(n uint64) error {
func (l *TrafficLimiter) Commit(reserved uint64, n uint64) {
if reserved == 0 && n == 0 {
return
}
l.mtx.Lock()
defer l.mtx.Unlock()
if l.limiter.RawUsed == l.limiter.RawQuota {
return E.New("traffic limit exceeded")
}
if l.limiter.RawUsed+n > l.limiter.RawQuota {
l.new += l.limiter.RawQuota - l.limiter.RawUsed
l.limiter.RawUsed = l.limiter.RawQuota
return E.New("traffic limit exceeded")
if reserved > l.reserved {
reserved = l.reserved
}
l.reserved -= reserved
l.limiter.RawUsed += n
l.new += n
return nil
}
func (l *TrafficLimiter) UpdateRemainingTraffic() error {