Skip to content
Snippets Groups Projects
Commit 95d1905a authored by Daniel Czerwonk's avatar Daniel Czerwonk
Browse files

Merge remote-tracking branch 'origin/master' into feature/rfc6793

parents 927dde83 97043de5
No related branches found
No related tags found
No related merge requests found
...@@ -79,7 +79,7 @@ func main() { ...@@ -79,7 +79,7 @@ func main() {
go func() { go func() {
for { for {
fmt.Print(rib.Print()) fmt.Printf("LocRIB count: %d\n", rib.Count())
time.Sleep(time.Second * 10) time.Sleep(time.Second * 10)
} }
}() }()
......
...@@ -82,7 +82,6 @@ func serializeAndSendUpdate(out io.Writer, update serializeAbleUpdate, opt *pack ...@@ -82,7 +82,6 @@ func serializeAndSendUpdate(out io.Writer, update serializeAbleUpdate, opt *pack
return nil return nil
} }
fmt.Printf("Sending Update: %v\n", updateBytes)
_, err = out.Write(updateBytes) _, err = out.Write(updateBytes)
if err != nil { if err != nil {
return fmt.Errorf("Failed sending Update: %v", err) return fmt.Errorf("Failed sending Update: %v", err)
......
...@@ -72,12 +72,10 @@ func (a *AdjRIBOut) AddPath(pfx bnet.Prefix, p *route.Path) error { ...@@ -72,12 +72,10 @@ func (a *AdjRIBOut) AddPath(pfx bnet.Prefix, p *route.Path) error {
a.removePathsFromClients(pfx, oldPaths) a.removePathsFromClients(pfx, oldPaths)
} }
fmt.Printf("Adding path: %s\n", p.Print())
pathID, err := a.pathIDManager.addPath(p) pathID, err := a.pathIDManager.addPath(p)
if err != nil { if err != nil {
return fmt.Errorf("Unable to get path ID: %v", err) return fmt.Errorf("Unable to get path ID: %v", err)
} }
fmt.Printf("New path ID: %d\n", pathID)
p.BGPPath.PathIdentifier = pathID p.BGPPath.PathIdentifier = pathID
a.rt.AddPath(pfx, p) a.rt.AddPath(pfx, p)
......
...@@ -27,6 +27,14 @@ func New() *LocRIB { ...@@ -27,6 +27,14 @@ func New() *LocRIB {
return a 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 // UpdateNewClient sends current state to a new client
func (a *LocRIB) UpdateNewClient(client routingtable.RouteTableClient) error { func (a *LocRIB) UpdateNewClient(client routingtable.RouteTableClient) error {
a.mu.RLock() a.mu.RLock()
......
...@@ -2,6 +2,7 @@ package routingtable ...@@ -2,6 +2,7 @@ package routingtable
import ( import (
"sync" "sync"
"sync/atomic"
"github.com/bio-routing/bio-rd/net" "github.com/bio-routing/bio-rd/net"
"github.com/bio-routing/bio-rd/route" "github.com/bio-routing/bio-rd/route"
...@@ -9,8 +10,9 @@ import ( ...@@ -9,8 +10,9 @@ import (
// RoutingTable is a binary trie that stores prefixes and their paths // RoutingTable is a binary trie that stores prefixes and their paths
type RoutingTable struct { type RoutingTable struct {
root *node routeCount int64
mu sync.RWMutex root *node
mu sync.RWMutex
} }
// NewRoutingTable creates a new routing table // NewRoutingTable creates a new routing table
...@@ -18,6 +20,11 @@ func NewRoutingTable() *RoutingTable { ...@@ -18,6 +20,11 @@ func NewRoutingTable() *RoutingTable {
return &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 // AddPath adds a path to the routing table
func (rt *RoutingTable) AddPath(pfx net.Prefix, p *route.Path) error { func (rt *RoutingTable) AddPath(pfx net.Prefix, p *route.Path) error {
rt.mu.Lock() rt.mu.Lock()
...@@ -29,6 +36,7 @@ func (rt *RoutingTable) AddPath(pfx net.Prefix, p *route.Path) error { ...@@ -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 { func (rt *RoutingTable) addPath(pfx net.Prefix, p *route.Path) error {
if rt.root == nil { if rt.root == nil {
rt.root = newNode(pfx, p, pfx.Pfxlen(), false) rt.root = newNode(pfx, p, pfx.Pfxlen(), false)
atomic.AddInt64(&rt.routeCount, 1)
return nil return nil
} }
...@@ -55,11 +63,13 @@ func (rt *RoutingTable) ReplacePath(pfx net.Prefix, p *route.Path) []*route.Path ...@@ -55,11 +63,13 @@ func (rt *RoutingTable) ReplacePath(pfx net.Prefix, p *route.Path) []*route.Path
} }
// RemovePath removes a path from the trie // 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() rt.mu.Lock()
defer rt.mu.Unlock() 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 { 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 { ...@@ -27,7 +27,7 @@ func newNode(pfx net.Prefix, path *route.Path, skip uint8, dummy bool) *node {
return n 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 { if n == nil {
return false return false
} }
...@@ -37,14 +37,13 @@ func (n *node) removePath(pfx net.Prefix, p *route.Path) (success bool) { ...@@ -37,14 +37,13 @@ func (n *node) removePath(pfx net.Prefix, p *route.Path) (success bool) {
return return
} }
nPaths := len(n.route.Paths())
nPathsAfterDel := n.route.RemovePath(p) nPathsAfterDel := n.route.RemovePath(p)
if len(n.route.Paths()) == 0 { if len(n.route.Paths()) == 0 {
// FIXME: Can this node actually be removed from the trie entirely? // FIXME: Can this node actually be removed from the trie entirely?
n.dummy = true n.dummy = true
} }
return nPathsAfterDel < nPaths return nPathsAfterDel == 0
} }
b := getBitUint32(pfx.Addr(), n.route.Pfxlen()+1) 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