Skip to content
Snippets Groups Projects
Commit 7758e3f4 authored by Oliver Herms's avatar Oliver Herms
Browse files

Merge remote-tracking branch 'origin/master' into fsm/integrationtest

parents f0108f7d 97043de5
No related branches found
No related tags found
No related merge requests found
......@@ -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)
}
}()
......
......@@ -82,7 +82,6 @@ func serializeAndSendUpdate(out io.Writer, update serializeAbleUpdate) error {
return nil
}
fmt.Printf("Sending Update: %v\n", updateBytes)
_, err = out.Write(updateBytes)
if err != nil {
return fmt.Errorf("Failed sending Update: %v", err)
......
......@@ -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)
......
......@@ -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()
......
......@@ -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 {
......
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment