diff --git a/main.go b/main.go index 0896ecc2dff80c5ee68cd8abc7c28c5e2923e744..7c5bd7f1ba15450a5679688079307d3e0428e626 100644 --- a/main.go +++ b/main.go @@ -79,7 +79,7 @@ func main() { go func() { for { - fmt.Print(rib.Print()) + fmt.Printf("LocRIB count: %d\n", rib.Count()) time.Sleep(time.Second * 10) } }() diff --git a/protocols/bgp/server/update_helper.go b/protocols/bgp/server/update_helper.go index f0435a808797fb9079809d381c514f4e4cf35b82..c45181803ee3c5c54f777cfbb66e7d3ad6831d53 100644 --- a/protocols/bgp/server/update_helper.go +++ b/protocols/bgp/server/update_helper.go @@ -82,7 +82,6 @@ func serializeAndSendUpdate(out io.Writer, update serializeAbleUpdate, opt *pack return nil } - fmt.Printf("Sending Update: %v\n", updateBytes) _, err = out.Write(updateBytes) if err != nil { return fmt.Errorf("Failed sending Update: %v", err) diff --git a/routingtable/adjRIBOut/adj_rib_out.go b/routingtable/adjRIBOut/adj_rib_out.go index b667ac7778ac50b544274970490b7acb4ffffab2..19b44b8bd2595cc550a960ace7c9c00f1fdab21a 100644 --- a/routingtable/adjRIBOut/adj_rib_out.go +++ b/routingtable/adjRIBOut/adj_rib_out.go @@ -72,12 +72,10 @@ func (a *AdjRIBOut) AddPath(pfx bnet.Prefix, p *route.Path) error { a.removePathsFromClients(pfx, oldPaths) } - fmt.Printf("Adding path: %s\n", p.Print()) pathID, err := a.pathIDManager.addPath(p) if err != nil { return fmt.Errorf("Unable to get path ID: %v", err) } - fmt.Printf("New path ID: %d\n", pathID) p.BGPPath.PathIdentifier = pathID a.rt.AddPath(pfx, p) diff --git a/routingtable/locRIB/loc_rib.go b/routingtable/locRIB/loc_rib.go index ff5750c34d226080bea079968becdec410d2704e..fd8fd0720d416f401513636c259f651e4aab15fc 100644 --- a/routingtable/locRIB/loc_rib.go +++ b/routingtable/locRIB/loc_rib.go @@ -27,6 +27,14 @@ func New() *LocRIB { return a } +//Count routes from the LocRIP +func (a *LocRIB) Count() uint64 { + a.mu.RLock() + defer a.mu.RUnlock() + + return uint64(len(a.rt.Dump())) +} + // UpdateNewClient sends current state to a new client func (a *LocRIB) UpdateNewClient(client routingtable.RouteTableClient) error { a.mu.RLock() diff --git a/routingtable/table.go b/routingtable/table.go index fce8a4f1a26ac25ca5b124ec2b17810c698fe3ec..9ccb10161cde2c6f1424c0fbce851a0d1bda19dc 100644 --- a/routingtable/table.go +++ b/routingtable/table.go @@ -2,6 +2,7 @@ package routingtable import ( "sync" + "sync/atomic" "github.com/bio-routing/bio-rd/net" "github.com/bio-routing/bio-rd/route" @@ -9,8 +10,9 @@ import ( // RoutingTable is a binary trie that stores prefixes and their paths type RoutingTable struct { - root *node - mu sync.RWMutex + routeCount int64 + root *node + mu sync.RWMutex } // NewRoutingTable creates a new routing table @@ -18,6 +20,11 @@ func NewRoutingTable() *RoutingTable { return &RoutingTable{} } +// GetRouteCount gets the amount of stored routes +func (rt *RoutingTable) GetRouteCount() int64 { + return atomic.LoadInt64(&rt.routeCount) +} + // AddPath adds a path to the routing table func (rt *RoutingTable) AddPath(pfx net.Prefix, p *route.Path) error { rt.mu.Lock() @@ -29,6 +36,7 @@ func (rt *RoutingTable) AddPath(pfx net.Prefix, p *route.Path) error { func (rt *RoutingTable) addPath(pfx net.Prefix, p *route.Path) error { if rt.root == nil { rt.root = newNode(pfx, p, pfx.Pfxlen(), false) + atomic.AddInt64(&rt.routeCount, 1) return nil } @@ -55,11 +63,13 @@ func (rt *RoutingTable) ReplacePath(pfx net.Prefix, p *route.Path) []*route.Path } // RemovePath removes a path from the trie -func (rt *RoutingTable) RemovePath(pfx net.Prefix, p *route.Path) bool { +func (rt *RoutingTable) RemovePath(pfx net.Prefix, p *route.Path) { rt.mu.Lock() defer rt.mu.Unlock() - return rt.removePath(pfx, p) + if rt.removePath(pfx, p) { + atomic.AddInt64(&rt.routeCount, -1) + } } func (rt *RoutingTable) removePath(pfx net.Prefix, p *route.Path) bool { diff --git a/routingtable/trie.go b/routingtable/trie.go index 730d10155284863b49c475185e34fc9db3ca0798..6fe5f4853cd4bd795c21926f6835ca5e711eeced 100644 --- a/routingtable/trie.go +++ b/routingtable/trie.go @@ -27,7 +27,7 @@ func newNode(pfx net.Prefix, path *route.Path, skip uint8, dummy bool) *node { return n } -func (n *node) removePath(pfx net.Prefix, p *route.Path) (success bool) { +func (n *node) removePath(pfx net.Prefix, p *route.Path) (final bool) { if n == nil { return false } @@ -37,14 +37,13 @@ func (n *node) removePath(pfx net.Prefix, p *route.Path) (success bool) { return } - nPaths := len(n.route.Paths()) nPathsAfterDel := n.route.RemovePath(p) if len(n.route.Paths()) == 0 { // FIXME: Can this node actually be removed from the trie entirely? n.dummy = true } - return nPathsAfterDel < nPaths + return nPathsAfterDel == 0 } b := getBitUint32(pfx.Addr(), n.route.Pfxlen()+1)