-
Notifications
You must be signed in to change notification settings - Fork 11
/
direct_route.go
103 lines (84 loc) · 1.85 KB
/
direct_route.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package router
import (
"context"
"math"
"net"
"sync"
"time"
"github.com/my-network/ipvpn/helpers"
)
type DirectRoute struct {
locker sync.RWMutex
channelType ChannelType
peer *Peer
destination net.IP
lastLatencyMeasureTS time.Time
statistics PathStatistics
}
func newDirectRoute(peer *Peer, chType ChannelType, destination net.IP) *DirectRoute {
return &DirectRoute{
peer: peer,
channelType: chType,
destination: destination,
}
}
func (route *DirectRoute) lockDo(fn func()) {
route.locker.Lock()
defer route.locker.Unlock()
fn()
}
func (route *DirectRoute) rLockDo(fn func()) {
route.locker.RLock()
defer route.locker.RUnlock()
fn()
}
func (route *DirectRoute) MeasureLatency(ctx context.Context) {
if route == nil {
return
}
defer route.lockDo(func() {
route.lastLatencyMeasureTS = time.Now()
})
for i := 0; i < 2*inertiaFactor; i++ {
ctx, _ := context.WithTimeout(context.Background(), time.Second)
latency := helpers.MeasureLatency(ctx, route.destination, route.peer.router.logger)
route.statistics.Consider(latency, latency >= math.MaxInt64/4)
select {
case <-ctx.Done():
return
default:
}
}
}
func (route *DirectRoute) Latency() time.Duration {
if route == nil {
return 365 * 24 * time.Hour
}
return route.statistics.Latency()
}
func (route *DirectRoute) TimedOutFraction() float64 {
if route == nil {
return 1
}
return route.statistics.TimedOut()
}
func (route *DirectRoute) Destination() (result net.IP) {
if route == nil {
return nil
}
route.rLockDo(func() {
result = route.destination
})
return
}
func (route *DirectRoute) SetDestination(ip net.IP) {
route.lockDo(func() {
route.destination = ip
})
}
func (route *DirectRoute) ChannelType() ChannelType {
if route == nil {
return ChannelType_undefined
}
return route.channelType
}