mirror of
https://github.com/KusakabeShi/EtherGuard-VPN.git
synced 2024-11-24 16:23:08 +01:00
DampingResistance to DampingFilterRadius
This commit is contained in:
parent
78322227ef
commit
cdb096b8e4
@ -372,7 +372,7 @@ func NewDevice(tapDevice tap.Device, id mtypes.Vertex, bind conn.Bind, logger *L
|
|||||||
device.Chan_SendRegisterStart = make(chan struct{}, 1<<5)
|
device.Chan_SendRegisterStart = make(chan struct{}, 1<<5)
|
||||||
device.Chan_HttpPostStart = make(chan struct{}, 1<<5)
|
device.Chan_HttpPostStart = make(chan struct{}, 1<<5)
|
||||||
device.LogLevel = econfig.LogLevel
|
device.LogLevel = econfig.LogLevel
|
||||||
device.SuperConfig.DampingResistance = device.EdgeConfig.DynamicRoute.DampingResistance
|
device.SuperConfig.DampingFilterRadius = device.EdgeConfig.DynamicRoute.DampingFilterRadius
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
100
device/peer.go
100
device/peer.go
@ -11,7 +11,9 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"math"
|
||||||
"net"
|
"net"
|
||||||
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
@ -155,6 +157,96 @@ func (et *endpoint_trylist) GetNextTry() (bool, string) {
|
|||||||
return FastTry, smallest.URL
|
return FastTry, smallest.URL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type filterwindow struct {
|
||||||
|
sync.RWMutex
|
||||||
|
device *Device
|
||||||
|
size int
|
||||||
|
element []float64
|
||||||
|
value float64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *filterwindow) Push(e float64) float64 {
|
||||||
|
f.Resize(f.device.SuperConfig.DampingFilterRadius*2 + 1)
|
||||||
|
f.Lock()
|
||||||
|
defer f.Unlock()
|
||||||
|
if f.size < 3 || e >= mtypes.Infinity {
|
||||||
|
f.value = e
|
||||||
|
return f.value
|
||||||
|
}
|
||||||
|
f.element = append(f.element, e)
|
||||||
|
if len(f.element) > f.size {
|
||||||
|
f.element = f.element[1:]
|
||||||
|
}
|
||||||
|
elemlen := len(f.element)
|
||||||
|
window := f.element
|
||||||
|
if elemlen%2 == 0 {
|
||||||
|
window = window[1:]
|
||||||
|
elemlen -= 1
|
||||||
|
}
|
||||||
|
if elemlen < 3 {
|
||||||
|
f.value = e
|
||||||
|
return f.value
|
||||||
|
}
|
||||||
|
pivot := ((elemlen + 1) / 2) - 1
|
||||||
|
left := window[:pivot+1]
|
||||||
|
right := window[pivot:]
|
||||||
|
lm := f.filter(left, 1)
|
||||||
|
rm := f.filter(right, 2)
|
||||||
|
pv := window[pivot]
|
||||||
|
ldiff := math.Abs(lm - pv)
|
||||||
|
rdiff := math.Abs(rm - pv)
|
||||||
|
if ldiff < rdiff {
|
||||||
|
f.value = lm
|
||||||
|
} else {
|
||||||
|
f.value = rm
|
||||||
|
}
|
||||||
|
return f.value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *filterwindow) filter(w []float64, lr int) float64 { // find the medium
|
||||||
|
elemlen := len(w)
|
||||||
|
if elemlen == 0 {
|
||||||
|
return mtypes.Infinity
|
||||||
|
}
|
||||||
|
if elemlen%2 == 0 {
|
||||||
|
switch lr {
|
||||||
|
case 1:
|
||||||
|
w = w[:len(w)-1]
|
||||||
|
case 2:
|
||||||
|
w = w[1:]
|
||||||
|
}
|
||||||
|
elemlen -= 1
|
||||||
|
}
|
||||||
|
if elemlen < 3 {
|
||||||
|
return w[0]
|
||||||
|
}
|
||||||
|
pivot := ((elemlen + 1) / 2) - 1
|
||||||
|
w2 := make([]float64, elemlen)
|
||||||
|
copy(w2, w)
|
||||||
|
sort.Float64s(w2)
|
||||||
|
return w2[pivot]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *filterwindow) Resize(s uint64) {
|
||||||
|
size := int(s)
|
||||||
|
f.Lock()
|
||||||
|
defer f.Unlock()
|
||||||
|
if f.size == size {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
f.size = size
|
||||||
|
elemlen := len(f.element)
|
||||||
|
if elemlen > f.size {
|
||||||
|
f.element = f.element[elemlen-size:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *filterwindow) GetVal() float64 {
|
||||||
|
f.RLock()
|
||||||
|
defer f.RUnlock()
|
||||||
|
return f.value
|
||||||
|
}
|
||||||
|
|
||||||
type Peer struct {
|
type Peer struct {
|
||||||
isRunning AtomicBool
|
isRunning AtomicBool
|
||||||
sync.RWMutex // Mostly protects endpoint, but is generally taken whenever we modify peer
|
sync.RWMutex // Mostly protects endpoint, but is generally taken whenever we modify peer
|
||||||
@ -166,8 +258,9 @@ type Peer struct {
|
|||||||
|
|
||||||
LastPacketReceivedAdd1Sec atomic.Value // *time.Time
|
LastPacketReceivedAdd1Sec atomic.Value // *time.Time
|
||||||
|
|
||||||
SingleWayLatency atomic.Value
|
SingleWayLatency filterwindow
|
||||||
stopping sync.WaitGroup // routines pending stop
|
|
||||||
|
stopping sync.WaitGroup // routines pending stop
|
||||||
|
|
||||||
ID mtypes.Vertex
|
ID mtypes.Vertex
|
||||||
AskedForNeighbor bool
|
AskedForNeighbor bool
|
||||||
@ -257,7 +350,8 @@ func (device *Device) NewPeer(pk NoisePublicKey, id mtypes.Vertex, isSuper bool,
|
|||||||
peer.cookieGenerator.Init(pk)
|
peer.cookieGenerator.Init(pk)
|
||||||
peer.device = device
|
peer.device = device
|
||||||
peer.endpoint_trylist = NewEndpoint_trylist(peer, mtypes.S2TD(device.EdgeConfig.DynamicRoute.PeerAliveTimeout))
|
peer.endpoint_trylist = NewEndpoint_trylist(peer, mtypes.S2TD(device.EdgeConfig.DynamicRoute.PeerAliveTimeout))
|
||||||
peer.SingleWayLatency.Store(mtypes.Infinity)
|
peer.SingleWayLatency.device = device
|
||||||
|
peer.SingleWayLatency.Push(mtypes.Infinity)
|
||||||
peer.queue.outbound = newAutodrainingOutboundQueue(device)
|
peer.queue.outbound = newAutodrainingOutboundQueue(device)
|
||||||
peer.queue.inbound = newAutodrainingInboundQueue(device)
|
peer.queue.inbound = newAutodrainingInboundQueue(device)
|
||||||
peer.queue.staged = make(chan *QueueOutboundElement, QueueStagedSize)
|
peer.queue.staged = make(chan *QueueOutboundElement, QueueStagedSize)
|
||||||
|
@ -324,13 +324,7 @@ func (device *Device) server_process_Pong(peer *Peer, content mtypes.PongMsg) er
|
|||||||
|
|
||||||
func (device *Device) process_ping(peer *Peer, content mtypes.PingMsg) error {
|
func (device *Device) process_ping(peer *Peer, content mtypes.PingMsg) error {
|
||||||
Timediff := device.graph.GetCurrentTime().Sub(content.Time).Seconds()
|
Timediff := device.graph.GetCurrentTime().Sub(content.Time).Seconds()
|
||||||
OldTimediff := peer.SingleWayLatency.Load().(float64)
|
NewTimediff := peer.SingleWayLatency.Push(Timediff)
|
||||||
NewTimediff := Timediff
|
|
||||||
if (OldTimediff < mtypes.Infinity) == (NewTimediff < mtypes.Infinity) {
|
|
||||||
DR := device.SuperConfig.DampingResistance
|
|
||||||
NewTimediff = OldTimediff*DR + Timediff*(1-DR)
|
|
||||||
}
|
|
||||||
peer.SingleWayLatency.Store(NewTimediff)
|
|
||||||
|
|
||||||
PongMSG := mtypes.PongMsg{
|
PongMSG := mtypes.PongMsg{
|
||||||
Src_nodeID: content.Src_nodeID,
|
Src_nodeID: content.Src_nodeID,
|
||||||
@ -627,9 +621,7 @@ func (device *Device) process_UpdateSuperParamsMsg(peer *Peer, State_hash string
|
|||||||
device.EdgeConfig.DynamicRoute.PeerAliveTimeout = SuperParams.PeerAliveTimeout
|
device.EdgeConfig.DynamicRoute.PeerAliveTimeout = SuperParams.PeerAliveTimeout
|
||||||
device.EdgeConfig.DynamicRoute.SendPingInterval = SuperParams.SendPingInterval
|
device.EdgeConfig.DynamicRoute.SendPingInterval = SuperParams.SendPingInterval
|
||||||
device.SuperConfig.HttpPostInterval = SuperParams.HttpPostInterval
|
device.SuperConfig.HttpPostInterval = SuperParams.HttpPostInterval
|
||||||
if SuperParams.DampingResistance > 0 && SuperParams.DampingResistance <= 1 {
|
device.SuperConfig.DampingFilterRadius = SuperParams.DampingFilterRadius
|
||||||
device.SuperConfig.DampingResistance = SuperParams.DampingResistance
|
|
||||||
}
|
|
||||||
device.Chan_SendPingStart <- struct{}{}
|
device.Chan_SendPingStart <- struct{}{}
|
||||||
device.Chan_HttpPostStart <- struct{}{}
|
device.Chan_HttpPostStart <- struct{}{}
|
||||||
if SuperParams.AdditionalCost >= 0 {
|
if SuperParams.AdditionalCost >= 0 {
|
||||||
@ -914,7 +906,7 @@ func (device *Device) RoutinePostPeerInfo(startchan <-chan struct{}) {
|
|||||||
RequestID: 0,
|
RequestID: 0,
|
||||||
Src_nodeID: id,
|
Src_nodeID: id,
|
||||||
Dst_nodeID: device.ID,
|
Dst_nodeID: device.ID,
|
||||||
Timediff: peer.SingleWayLatency.Load().(float64),
|
Timediff: peer.SingleWayLatency.GetVal(),
|
||||||
TimeToAlive: time.Since(*peer.LastPacketReceivedAdd1Sec.Load().(*time.Time)).Seconds() + device.EdgeConfig.DynamicRoute.PeerAliveTimeout,
|
TimeToAlive: time.Since(*peer.LastPacketReceivedAdd1Sec.Load().(*time.Time)).Seconds() + device.EdgeConfig.DynamicRoute.PeerAliveTimeout,
|
||||||
}
|
}
|
||||||
pongs = append(pongs, pong)
|
pongs = append(pongs, pong)
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 1000
|
AdditionalCost: 1000
|
||||||
DampingResistance: 0.95
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: false
|
SaveNewPeers: false
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 1000
|
AdditionalCost: 1000
|
||||||
DampingResistance: 0.95
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: false
|
SaveNewPeers: false
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 1000
|
AdditionalCost: 1000
|
||||||
DampingResistance: 0.95
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: false
|
SaveNewPeers: false
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 1000
|
AdditionalCost: 1000
|
||||||
DampingResistance: 0.95
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: false
|
SaveNewPeers: false
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 1000
|
AdditionalCost: 1000
|
||||||
DampingResistance: 0.95
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: false
|
SaveNewPeers: false
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 1000
|
AdditionalCost: 1000
|
||||||
DampingResistance: 0.95
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: false
|
SaveNewPeers: false
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 10
|
AdditionalCost: 10
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: true
|
SaveNewPeers: true
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 10
|
AdditionalCost: 10
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: true
|
SaveNewPeers: true
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 10
|
AdditionalCost: 10
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: true
|
SaveNewPeers: true
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 10
|
AdditionalCost: 10
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: true
|
SaveNewPeers: true
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 10
|
AdditionalCost: 10
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: true
|
SaveNewPeers: true
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 10
|
AdditionalCost: 10
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: true
|
SaveNewPeers: true
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: false
|
UseSuperNode: false
|
||||||
|
@ -33,7 +33,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 10
|
AdditionalCost: 10
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: true
|
SaveNewPeers: true
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: true
|
UseSuperNode: true
|
||||||
|
@ -33,7 +33,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 10
|
AdditionalCost: 10
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: true
|
SaveNewPeers: true
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: true
|
UseSuperNode: true
|
||||||
|
@ -33,7 +33,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 10
|
AdditionalCost: 10
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: true
|
SaveNewPeers: true
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: true
|
UseSuperNode: true
|
||||||
|
@ -10,7 +10,7 @@ RePushConfigInterval: 30
|
|||||||
HttpPostInterval: 50
|
HttpPostInterval: 50
|
||||||
PeerAliveTimeout: 70
|
PeerAliveTimeout: 70
|
||||||
SendPingInterval: 15
|
SendPingInterval: 15
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
LogLevel:
|
LogLevel:
|
||||||
LogLevel: error
|
LogLevel: error
|
||||||
LogTransit: false
|
LogTransit: false
|
||||||
|
@ -268,7 +268,7 @@ curl -X POST "http://127.0.0.1:3456/eg_net/eg_api/manage/peer/update?Password=pa
|
|||||||
```bash
|
```bash
|
||||||
curl -X POST "http://127.0.0.1:3456/eg_net/eg_api/manage/super/update?Password=passwd_updatesuper" \
|
curl -X POST "http://127.0.0.1:3456/eg_net/eg_api/manage/super/update?Password=passwd_updatesuper" \
|
||||||
-H "Content-Type: application/x-www-form-urlencoded" \
|
-H "Content-Type: application/x-www-form-urlencoded" \
|
||||||
-d "SendPingInterval=15&HttpPostInterval=60&PeerAliveTimeout=70&DampingResistance=0.9"
|
-d "SendPingInterval=15&HttpPostInterval=60&PeerAliveTimeout=70&DampingFilterRadius=3"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@ -311,7 +311,7 @@ StaticMode | Disable `Floyd-Warshall`, use `NextHopTable`in the
|
|||||||
ManualLatency | Set latency manually, ignore Edge reported latency.
|
ManualLatency | Set latency manually, ignore Edge reported latency.
|
||||||
JitterTolerance | Jitter tolerance, after receiving Pong, one 37ms and one 39ms will not trigger recalculation<br>Compared to last calculation
|
JitterTolerance | Jitter tolerance, after receiving Pong, one 37ms and one 39ms will not trigger recalculation<br>Compared to last calculation
|
||||||
JitterToleranceMultiplier | high ping allows more errors<br>https://www.desmos.com/calculator/raoti16r5n
|
JitterToleranceMultiplier | high ping allows more errors<br>https://www.desmos.com/calculator/raoti16r5n
|
||||||
DampingResistance | Damping resistance<br>`latency = latency_old * resistance + latency_in * (1-resistance)`
|
DampingFilterRadius | Windows radius for the low pass filter for latency damping prevention
|
||||||
TimeoutCheckInterval | The interval to check if there any `Pong` packet timed out, and recalculate the NhTable
|
TimeoutCheckInterval | The interval to check if there any `Pong` packet timed out, and recalculate the NhTable
|
||||||
RecalculateCoolDown | Floyd-Warshal is an O(n^3)time complexity algorithm<br>This option set a cooldown, and prevent it cost too many CPU<br>Connect/Disconnect event ignores this cooldown.
|
RecalculateCoolDown | Floyd-Warshal is an O(n^3)time complexity algorithm<br>This option set a cooldown, and prevent it cost too many CPU<br>Connect/Disconnect event ignores this cooldown.
|
||||||
|
|
||||||
|
@ -283,7 +283,7 @@ curl -X POST "http://127.0.0.1:3456/eg_net/eg_api/manage/peer/update?Password=pa
|
|||||||
```bash
|
```bash
|
||||||
curl -X POST "http://127.0.0.1:3456/eg_net/eg_api/manage/super/update?Password=passwd_updatesuper" \
|
curl -X POST "http://127.0.0.1:3456/eg_net/eg_api/manage/super/update?Password=passwd_updatesuper" \
|
||||||
-H "Content-Type: application/x-www-form-urlencoded" \
|
-H "Content-Type: application/x-www-form-urlencoded" \
|
||||||
-d "SendPingInterval=15&HttpPostInterval=60&PeerAliveTimeout=70&DampingResistance=0.9"
|
-d "SendPingInterval=15&HttpPostInterval=60&PeerAliveTimeout=70&DampingFilterRadius=3"
|
||||||
```
|
```
|
||||||
|
|
||||||
### SuperNode Config Parameter
|
### SuperNode Config Parameter
|
||||||
@ -324,7 +324,7 @@ StaticMode | 關閉`Floyd-Warshall`演算法,只使用設定
|
|||||||
ManualLatency | 手動設定延遲,不採用EdgeNode回報的延遲(單位: 毫秒)
|
ManualLatency | 手動設定延遲,不採用EdgeNode回報的延遲(單位: 毫秒)
|
||||||
JitterTolerance | 抖動容許誤差,收到Pong以後,一個37ms,一個39ms,不會觸發重新計算<br>比較對象是上次更新使用的值。如果37 37 41 43 .. 100 ,每次變動一點點,總變動量超過域值還是會更新
|
JitterTolerance | 抖動容許誤差,收到Pong以後,一個37ms,一個39ms,不會觸發重新計算<br>比較對象是上次更新使用的值。如果37 37 41 43 .. 100 ,每次變動一點點,總變動量超過域值還是會更新
|
||||||
JitterToleranceMultiplier | 抖動容許誤差的放大係數,高ping的話允許更多誤差<br>https://www.desmos.com/calculator/raoti16r5n
|
JitterToleranceMultiplier | 抖動容許誤差的放大係數,高ping的話允許更多誤差<br>https://www.desmos.com/calculator/raoti16r5n
|
||||||
DampingResistance | 防抖阻尼系數<br>`latency = latency_old * resistance + latency_in * (1-resistance)`
|
DampingFilterRadius | 防抖用低通濾波器的window半徑
|
||||||
TimeoutCheckInterval | 週期性檢查節點的連線狀況,是否斷線需要重新規劃線路
|
TimeoutCheckInterval | 週期性檢查節點的連線狀況,是否斷線需要重新規劃線路
|
||||||
RecalculateCoolDown | Floyd-Warshal是O(n^3)時間複雜度,不能太常算。<br>設個冷卻時間<br>有節點加入/斷線觸發的重新計算,無視這個CoolDown
|
RecalculateCoolDown | Floyd-Warshal是O(n^3)時間複雜度,不能太常算。<br>設個冷卻時間<br>有節點加入/斷線觸發的重新計算,無視這個CoolDown
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ DynamicRoute:
|
|||||||
ConnNextTry: 5
|
ConnNextTry: 5
|
||||||
DupCheckTimeout: 40
|
DupCheckTimeout: 40
|
||||||
AdditionalCost: 10
|
AdditionalCost: 10
|
||||||
DampingResistance: 0.9
|
DampingFilterRadius: 4
|
||||||
SaveNewPeers: true
|
SaveNewPeers: true
|
||||||
SuperNode:
|
SuperNode:
|
||||||
UseSuperNode: true
|
UseSuperNode: true
|
||||||
|
@ -60,7 +60,7 @@ func GetExampleEdgeConf(templatePath string, getDemo bool) (mtypes.EdgeConfig, e
|
|||||||
TimeoutCheckInterval: 20,
|
TimeoutCheckInterval: 20,
|
||||||
ConnNextTry: 5,
|
ConnNextTry: 5,
|
||||||
AdditionalCost: 10,
|
AdditionalCost: 10,
|
||||||
DampingResistance: 0.95,
|
DampingFilterRadius: 4,
|
||||||
SaveNewPeers: true,
|
SaveNewPeers: true,
|
||||||
SuperNode: mtypes.SuperInfo{
|
SuperNode: mtypes.SuperInfo{
|
||||||
UseSuperNode: true,
|
UseSuperNode: true,
|
||||||
@ -204,7 +204,7 @@ func GetExampleSuperConf(templatePath string, getDemo bool) (mtypes.SuperConfig,
|
|||||||
},
|
},
|
||||||
RePushConfigInterval: 30,
|
RePushConfigInterval: 30,
|
||||||
PeerAliveTimeout: 70,
|
PeerAliveTimeout: 70,
|
||||||
DampingResistance: 0.9,
|
DampingFilterRadius: 4,
|
||||||
HttpPostInterval: 50,
|
HttpPostInterval: 50,
|
||||||
SendPingInterval: 15,
|
SendPingInterval: 15,
|
||||||
ResetEndPointInterval: 600,
|
ResetEndPointInterval: 600,
|
||||||
|
@ -52,9 +52,6 @@ func Edge(configPath string, useUAPI bool, printExample bool, bindmode string) (
|
|||||||
if len(NodeName) > 32 {
|
if len(NodeName) > 32 {
|
||||||
return errors.New("Node name can't longer than 32 :" + NodeName)
|
return errors.New("Node name can't longer than 32 :" + NodeName)
|
||||||
}
|
}
|
||||||
if econfig.DynamicRoute.DampingResistance < 0 || econfig.DynamicRoute.DampingResistance >= 1 {
|
|
||||||
return fmt.Errorf("DampingResistance must in range [0,1) : %v", econfig.DynamicRoute.DampingResistance)
|
|
||||||
}
|
|
||||||
var logLevel int
|
var logLevel int
|
||||||
switch econfig.LogLevel.LogLevel {
|
switch econfig.LogLevel.LogLevel {
|
||||||
case "verbose", "debug":
|
case "verbose", "debug":
|
||||||
|
@ -255,11 +255,11 @@ func edge_get_superparams(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
// Do something
|
// Do something
|
||||||
SuperParams := mtypes.API_SuperParams{
|
SuperParams := mtypes.API_SuperParams{
|
||||||
SendPingInterval: httpobj.http_sconfig.SendPingInterval,
|
SendPingInterval: httpobj.http_sconfig.SendPingInterval,
|
||||||
HttpPostInterval: httpobj.http_sconfig.HttpPostInterval,
|
HttpPostInterval: httpobj.http_sconfig.HttpPostInterval,
|
||||||
PeerAliveTimeout: httpobj.http_sconfig.PeerAliveTimeout,
|
PeerAliveTimeout: httpobj.http_sconfig.PeerAliveTimeout,
|
||||||
AdditionalCost: httpobj.http_PeerID2Info[NodeID].AdditionalCost,
|
AdditionalCost: httpobj.http_PeerID2Info[NodeID].AdditionalCost,
|
||||||
DampingResistance: httpobj.http_sconfig.DampingResistance,
|
DampingFilterRadius: httpobj.http_sconfig.DampingFilterRadius,
|
||||||
}
|
}
|
||||||
SuperParamStr, _ := json.Marshal(SuperParams)
|
SuperParamStr, _ := json.Marshal(SuperParams)
|
||||||
httpobj.http_PeerState[PubKey].SuperParamStateClient.Store(State)
|
httpobj.http_PeerState[PubKey].SuperParamStateClient.Store(State)
|
||||||
@ -763,11 +763,11 @@ func manage_peerupdate(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
httpobj.http_PeerID2Info[toUpdate] = new_superpeerinfo
|
httpobj.http_PeerID2Info[toUpdate] = new_superpeerinfo
|
||||||
SuperParams := mtypes.API_SuperParams{
|
SuperParams := mtypes.API_SuperParams{
|
||||||
SendPingInterval: httpobj.http_sconfig.SendPingInterval,
|
SendPingInterval: httpobj.http_sconfig.SendPingInterval,
|
||||||
HttpPostInterval: httpobj.http_sconfig.HttpPostInterval,
|
HttpPostInterval: httpobj.http_sconfig.HttpPostInterval,
|
||||||
PeerAliveTimeout: httpobj.http_sconfig.PeerAliveTimeout,
|
PeerAliveTimeout: httpobj.http_sconfig.PeerAliveTimeout,
|
||||||
DampingResistance: httpobj.http_sconfig.DampingResistance,
|
DampingFilterRadius: httpobj.http_sconfig.DampingFilterRadius,
|
||||||
AdditionalCost: new_superpeerinfo.AdditionalCost,
|
AdditionalCost: new_superpeerinfo.AdditionalCost,
|
||||||
}
|
}
|
||||||
|
|
||||||
SuperParamStr, _ := json.Marshal(SuperParams)
|
SuperParamStr, _ := json.Marshal(SuperParams)
|
||||||
@ -815,7 +815,7 @@ func manage_superupdate(w http.ResponseWriter, r *http.Request) {
|
|||||||
sconfig_temp.PeerAliveTimeout = httpobj.http_sconfig.PeerAliveTimeout
|
sconfig_temp.PeerAliveTimeout = httpobj.http_sconfig.PeerAliveTimeout
|
||||||
sconfig_temp.SendPingInterval = httpobj.http_sconfig.SendPingInterval
|
sconfig_temp.SendPingInterval = httpobj.http_sconfig.SendPingInterval
|
||||||
sconfig_temp.HttpPostInterval = httpobj.http_sconfig.HttpPostInterval
|
sconfig_temp.HttpPostInterval = httpobj.http_sconfig.HttpPostInterval
|
||||||
sconfig_temp.DampingResistance = httpobj.http_sconfig.DampingResistance
|
sconfig_temp.DampingFilterRadius = httpobj.http_sconfig.DampingFilterRadius
|
||||||
|
|
||||||
PeerAliveTimeout, err := extractParamsFloat(r.Form, "PeerAliveTimeout", 64, nil)
|
PeerAliveTimeout, err := extractParamsFloat(r.Form, "PeerAliveTimeout", 64, nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@ -828,15 +828,10 @@ func manage_superupdate(w http.ResponseWriter, r *http.Request) {
|
|||||||
sconfig_temp.PeerAliveTimeout = PeerAliveTimeout
|
sconfig_temp.PeerAliveTimeout = PeerAliveTimeout
|
||||||
}
|
}
|
||||||
|
|
||||||
DampingResistance, err := extractParamsFloat(r.Form, "DampingResistance", 64, nil)
|
DampingFilterRadius, err := extractParamsUint(r.Form, "DampingFilterRadius", 64, nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if DampingResistance < 0 || DampingResistance >= 1 {
|
Updated_params["DampingFilterRadius"] = fmt.Sprintf("%v", DampingFilterRadius)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
sconfig_temp.DampingFilterRadius = DampingFilterRadius
|
||||||
w.Write([]byte(fmt.Sprintf("Paramater DampingResistance %v: Must in range [0,1)\n", DampingResistance)))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
Updated_params["DampingResistance"] = fmt.Sprintf("%v", DampingResistance)
|
|
||||||
sconfig_temp.DampingResistance = DampingResistance
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SendPingInterval, err := extractParamsFloat(r.Form, "SendPingInterval", 64, nil)
|
SendPingInterval, err := extractParamsFloat(r.Form, "SendPingInterval", 64, nil)
|
||||||
@ -869,14 +864,14 @@ func manage_superupdate(w http.ResponseWriter, r *http.Request) {
|
|||||||
httpobj.http_sconfig.PeerAliveTimeout = sconfig_temp.PeerAliveTimeout
|
httpobj.http_sconfig.PeerAliveTimeout = sconfig_temp.PeerAliveTimeout
|
||||||
httpobj.http_sconfig.SendPingInterval = sconfig_temp.SendPingInterval
|
httpobj.http_sconfig.SendPingInterval = sconfig_temp.SendPingInterval
|
||||||
httpobj.http_sconfig.HttpPostInterval = sconfig_temp.HttpPostInterval
|
httpobj.http_sconfig.HttpPostInterval = sconfig_temp.HttpPostInterval
|
||||||
httpobj.http_sconfig.DampingResistance = sconfig_temp.DampingResistance
|
httpobj.http_sconfig.DampingFilterRadius = sconfig_temp.DampingFilterRadius
|
||||||
|
|
||||||
SuperParams := mtypes.API_SuperParams{
|
SuperParams := mtypes.API_SuperParams{
|
||||||
SendPingInterval: httpobj.http_sconfig.SendPingInterval,
|
SendPingInterval: httpobj.http_sconfig.SendPingInterval,
|
||||||
HttpPostInterval: httpobj.http_sconfig.HttpPostInterval,
|
HttpPostInterval: httpobj.http_sconfig.HttpPostInterval,
|
||||||
PeerAliveTimeout: httpobj.http_sconfig.PeerAliveTimeout,
|
PeerAliveTimeout: httpobj.http_sconfig.PeerAliveTimeout,
|
||||||
DampingResistance: httpobj.http_sconfig.DampingResistance,
|
DampingFilterRadius: httpobj.http_sconfig.DampingFilterRadius,
|
||||||
AdditionalCost: 10,
|
AdditionalCost: 10,
|
||||||
}
|
}
|
||||||
httpobj.Lock()
|
httpobj.Lock()
|
||||||
defer httpobj.Unlock()
|
defer httpobj.Unlock()
|
||||||
|
@ -100,10 +100,6 @@ func Super(configPath string, useUAPI bool, printExample bool, bindmode string)
|
|||||||
if sconfig.RePushConfigInterval <= 0 {
|
if sconfig.RePushConfigInterval <= 0 {
|
||||||
return fmt.Errorf("RePushConfigInterval must > 0 : %v", sconfig.RePushConfigInterval)
|
return fmt.Errorf("RePushConfigInterval must > 0 : %v", sconfig.RePushConfigInterval)
|
||||||
}
|
}
|
||||||
if sconfig.DampingResistance < 0 || sconfig.DampingResistance >= 1 {
|
|
||||||
return fmt.Errorf("DampingResistance must in range [0,1) : %v", sconfig.DampingResistance)
|
|
||||||
}
|
|
||||||
|
|
||||||
var logLevel int
|
var logLevel int
|
||||||
switch sconfig.LogLevel.LogLevel {
|
switch sconfig.LogLevel.LogLevel {
|
||||||
case "verbose", "debug":
|
case "verbose", "debug":
|
||||||
|
@ -47,7 +47,7 @@ type SuperConfig struct {
|
|||||||
HttpPostInterval float64 `yaml:"HttpPostInterval"`
|
HttpPostInterval float64 `yaml:"HttpPostInterval"`
|
||||||
PeerAliveTimeout float64 `yaml:"PeerAliveTimeout"`
|
PeerAliveTimeout float64 `yaml:"PeerAliveTimeout"`
|
||||||
SendPingInterval float64 `yaml:"SendPingInterval"`
|
SendPingInterval float64 `yaml:"SendPingInterval"`
|
||||||
DampingResistance float64 `yaml:"DampingResistance"`
|
DampingFilterRadius uint64 `yaml:"DampingFilterRadius"`
|
||||||
LogLevel LoggerInfo `yaml:"LogLevel"`
|
LogLevel LoggerInfo `yaml:"LogLevel"`
|
||||||
Passwords Passwords `yaml:"Passwords"`
|
Passwords Passwords `yaml:"Passwords"`
|
||||||
GraphRecalculateSetting GraphRecalculateSetting `yaml:"GraphRecalculateSetting"`
|
GraphRecalculateSetting GraphRecalculateSetting `yaml:"GraphRecalculateSetting"`
|
||||||
@ -132,7 +132,7 @@ type DynamicRouteInfo struct {
|
|||||||
ConnNextTry float64 `yaml:"ConnNextTry"`
|
ConnNextTry float64 `yaml:"ConnNextTry"`
|
||||||
DupCheckTimeout float64 `yaml:"DupCheckTimeout"`
|
DupCheckTimeout float64 `yaml:"DupCheckTimeout"`
|
||||||
AdditionalCost float64 `yaml:"AdditionalCost"`
|
AdditionalCost float64 `yaml:"AdditionalCost"`
|
||||||
DampingResistance float64 `yaml:"DampingResistance"`
|
DampingFilterRadius uint64 `yaml:"DampingFilterRadius"`
|
||||||
SaveNewPeers bool `yaml:"SaveNewPeers"`
|
SaveNewPeers bool `yaml:"SaveNewPeers"`
|
||||||
SuperNode SuperInfo `yaml:"SuperNode"`
|
SuperNode SuperInfo `yaml:"SuperNode"`
|
||||||
P2P P2PInfo `yaml:"P2P"`
|
P2P P2PInfo `yaml:"P2P"`
|
||||||
@ -223,11 +223,11 @@ type API_Peerinfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type API_SuperParams struct {
|
type API_SuperParams struct {
|
||||||
SendPingInterval float64
|
SendPingInterval float64
|
||||||
HttpPostInterval float64
|
HttpPostInterval float64
|
||||||
PeerAliveTimeout float64
|
PeerAliveTimeout float64
|
||||||
DampingResistance float64
|
DampingFilterRadius uint64
|
||||||
AdditionalCost float64
|
AdditionalCost float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type StateHash struct {
|
type StateHash struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user