From e20eb9be2df2cb35bb8c697a47f09db0d3f55140 Mon Sep 17 00:00:00 2001 From: Josh Deprez Date: Sat, 13 Apr 2024 15:47:58 +1000 Subject: [PATCH] Advertise more routes --- peer.go | 8 +++++++- route.go | 27 ++++++++++++++++++++------- rtmp.go | 17 +++++++++++++++-- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/peer.go b/peer.go index 690e4f0..b995015 100644 --- a/peer.go +++ b/peer.go @@ -277,7 +277,13 @@ func (p *peer) handle(ctx context.Context) error { log.Printf("Learned about these networks: %v", pkt.Networks) for _, nt := range pkt.Networks { - upsertRoutes(ddp.Network(nt.RangeStart), ddp.Network(nt.RangeEnd), p, nt.Distance) + upsertRoutes( + nt.Extended, + ddp.Network(nt.RangeStart), + ddp.Network(nt.RangeEnd), + p, + nt.Distance, + ) } // TODO: track which networks we don't have zone info for, and diff --git a/route.go b/route.go index f0d9f52..081d767 100644 --- a/route.go +++ b/route.go @@ -11,14 +11,20 @@ import ( ) type route struct { - peer *peer - metric uint8 - last time.Time + extended bool + netStart ddp.Network + netEnd ddp.Network + peer *peer + metric uint8 + last time.Time } var ( routingTableMu sync.Mutex routingTable = make(map[ddp.Network][]*route) + + allRoutesMu sync.Mutex + allRoutes = make(map[*route]struct{}) ) func lookupRoute(network ddp.Network) *route { @@ -32,16 +38,23 @@ func lookupRoute(network ddp.Network) *route { return rs[0] } -func upsertRoutes(netStart, netEnd ddp.Network, peer *peer, metric uint8) error { +func upsertRoutes(extended bool, netStart, netEnd ddp.Network, peer *peer, metric uint8) error { if netStart > netEnd { return fmt.Errorf("invalid network range [%d, %d]", netStart, netEnd) } r := &route{ - peer: peer, - metric: metric, - last: time.Now(), + extended: extended, + netStart: netStart, + netEnd: netEnd, + peer: peer, + metric: metric, + last: time.Now(), } + allRoutesMu.Lock() + allRoutes[r] = struct{}{} + allRoutesMu.Unlock() + routingTableMu.Lock() defer routingTableMu.Unlock() for n := netStart; n <= netEnd; n++ { diff --git a/rtmp.go b/rtmp.go index b39ef6c..297f514 100644 --- a/rtmp.go +++ b/rtmp.go @@ -198,7 +198,7 @@ func (m *RTMPMachine) broadcastData(myAddr aarp.AddrPair) error { } func (m *RTMPMachine) dataPacket(myAddr ddp.Addr) *rtmp.DataPacket { - return &rtmp.DataPacket{ + p := &rtmp.DataPacket{ RouterAddr: myAddr, Extended: true, NetworkTuples: []rtmp.NetworkTuple{ @@ -213,5 +213,18 @@ func (m *RTMPMachine) dataPacket(myAddr ddp.Addr) *rtmp.DataPacket { }, }, } - // TODO: append more networks! implement a route table! + allRoutesMu.Lock() + defer allRoutesMu.Unlock() + for rt := range allRoutes { + if rt.peer == nil { + continue + } + p.NetworkTuples = append(p.NetworkTuples, rtmp.NetworkTuple{ + Extended: rt.extended, + RangeStart: rt.netStart, + RangeEnd: rt.netEnd, + Distance: rt.metric, + }) + } + return p }