jrouter/route.go

68 lines
1.2 KiB
Go
Raw Normal View History

2024-04-12 16:14:27 +10:00
package main
import (
"cmp"
"fmt"
"slices"
"sync"
"time"
"github.com/sfiera/multitalk/pkg/ddp"
)
type route struct {
2024-04-13 15:47:58 +10:00
extended bool
netStart ddp.Network
netEnd ddp.Network
peer *peer
metric uint8
last time.Time
2024-04-12 16:14:27 +10:00
}
var (
routingTableMu sync.Mutex
routingTable = make(map[ddp.Network][]*route)
2024-04-13 15:47:58 +10:00
allRoutesMu sync.Mutex
allRoutes = make(map[*route]struct{})
2024-04-12 16:14:27 +10:00
)
func lookupRoute(network ddp.Network) *route {
routingTableMu.Lock()
defer routingTableMu.Unlock()
rs := routingTable[network]
if len(rs) == 0 {
return nil
}
return rs[0]
}
2024-04-13 15:47:58 +10:00
func upsertRoutes(extended bool, netStart, netEnd ddp.Network, peer *peer, metric uint8) error {
2024-04-12 16:14:27 +10:00
if netStart > netEnd {
return fmt.Errorf("invalid network range [%d, %d]", netStart, netEnd)
}
r := &route{
2024-04-13 15:47:58 +10:00
extended: extended,
netStart: netStart,
netEnd: netEnd,
peer: peer,
metric: metric,
last: time.Now(),
2024-04-12 16:14:27 +10:00
}
2024-04-13 15:47:58 +10:00
allRoutesMu.Lock()
allRoutes[r] = struct{}{}
allRoutesMu.Unlock()
2024-04-12 16:14:27 +10:00
routingTableMu.Lock()
defer routingTableMu.Unlock()
for n := netStart; n <= netEnd; n++ {
routingTable[n] = append(routingTable[n], r)
slices.SortFunc(routingTable[n], func(r, s *route) int {
return cmp.Compare(r.metric, s.metric)
})
}
return nil
}