Skip to content

Commit e205967

Browse files
committed
rpn: sort servers by health
1 parent 1ae93d9 commit e205967

1 file changed

Lines changed: 26 additions & 2 deletions

File tree

intra/ipn/warp/yegor.go

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ const (
100100

101101
wsbestloc = "/BestLocation"
102102

103-
maxPerRegionWgConfs = 4
103+
wsMinServerLinkSpeed = 1 // 1mbps
104+
wsMaxServerHealth = 100 // min is 0
105+
maxPerRegionWgConfs = 4
104106
)
105107

106108
// github.com/Windscribe/Android-App/blob/746d505dc69/base/src/main/java/com/windscribe/vpn/constants/NetworkErrorCodes.kt
@@ -1038,14 +1040,29 @@ func convertToRegionalWgConfs(id *WsWgCreds, reservation *WsWgConnectData, list
10381040
return nil, errWsNoServerList
10391041
}
10401042

1043+
tot := make(map[string]int)
10411044
out := make([]*RegionalWgConf, 0, len(list))
10421045
for _, server := range list {
10431046
if skipWsServer(server) {
10441047
continue
10451048
}
10461049

1050+
cc := server.CountryCode
10471051
port := wsRandomPort()
1048-
for _, group := range server.Groups {
1052+
sorted := core.Sort(server.Groups, func(a, b WsServerGroup) int {
1053+
ia, _ := strconv.ParseInt(a.LinkSpeed, 10, 64)
1054+
ib, _ := strconv.ParseInt(b.LinkSpeed, 10, 64)
1055+
la := min(int(ia), wsMinServerLinkSpeed) * (wsMaxServerHealth - a.Health)
1056+
lb := min(int(ib), wsMinServerLinkSpeed) * (wsMaxServerHealth - b.Health)
1057+
if la < lb { // ascending order by Health (lower is healthier)
1058+
return -1
1059+
} else if la > lb {
1060+
return 1
1061+
}
1062+
return 0
1063+
})
1064+
1065+
for _, group := range sorted {
10491066
servername := group.City + " (" + group.Nick + ")"
10501067
if len(group.WgPubKey) <= 0 || len(group.WgEndpoint) <= 0 {
10511068
continue // skip servers without wg
@@ -1054,6 +1071,12 @@ func convertToRegionalWgConfs(id *WsWgCreds, reservation *WsWgConnectData, list
10541071
log.W("ws: wgconfs: no nodes in %s (%s)", group.City, group.Nick)
10551072
continue // skip servers without nodes
10561073
}
1074+
if tot[cc] >= maxPerRegionWgConfs*2 {
1075+
log.D("ws: wgconfs: skip! %s (%s) has %d configs already",
1076+
cc, servername, tot[cc])
1077+
break // we have enough configs for this region
1078+
}
1079+
tot[cc] = tot[cc] + 1
10571080
out = append(out, &RegionalWgConf{
10581081
CC: server.CountryCode,
10591082
Name: servername,
@@ -1069,6 +1092,7 @@ func convertToRegionalWgConfs(id *WsWgCreds, reservation *WsWgConnectData, list
10691092
AllowedIPs: []string{gw4},
10701093
})
10711094
}
1095+
10721096
}
10731097

10741098
if len(out) <= 0 {

0 commit comments

Comments
 (0)