summaryrefslogtreecommitdiffhomepage
path: root/table/adj.go
diff options
context:
space:
mode:
Diffstat (limited to 'table/adj.go')
-rw-r--r--table/adj.go89
1 files changed, 30 insertions, 59 deletions
diff --git a/table/adj.go b/table/adj.go
index ee9cf549..9e88e155 100644
--- a/table/adj.go
+++ b/table/adj.go
@@ -20,25 +20,23 @@ import (
"reflect"
)
-type Dest struct {
- pathList []*Path
-}
-
type AdjRib struct {
- id string
- accepted map[bgp.RouteFamily]int
- table map[bgp.RouteFamily]map[string]*Dest
+ id string
+ accepted map[bgp.RouteFamily]int
+ table map[bgp.RouteFamily]map[string]*Path
+ isCollector bool
}
-func NewAdjRib(id string, rfList []bgp.RouteFamily) *AdjRib {
- table := make(map[bgp.RouteFamily]map[string]*Dest)
+func NewAdjRib(id string, rfList []bgp.RouteFamily, isCollector bool) *AdjRib {
+ table := make(map[bgp.RouteFamily]map[string]*Path)
for _, rf := range rfList {
- table[rf] = make(map[string]*Dest)
+ table[rf] = make(map[string]*Path)
}
return &AdjRib{
- id: id,
- table: table,
- accepted: make(map[bgp.RouteFamily]int),
+ id: id,
+ table: table,
+ accepted: make(map[bgp.RouteFamily]int),
+ isCollector: isCollector,
}
}
@@ -49,35 +47,21 @@ func (adj *AdjRib) Update(pathList []*Path) {
}
rf := path.GetRouteFamily()
key := path.getPrefix()
- dst := adj.table[rf][key]
- var old *Path
- oldIdx := 0
- if dst == nil {
- dst = &Dest{}
- dst.pathList = make([]*Path, 0)
- adj.table[rf][key] = dst
- } else {
- for i, known := range dst.pathList {
- if known.GetSource() == path.GetSource() {
- old = known
- oldIdx = i
- }
- }
+ if adj.isCollector {
+ key += path.GetSource().Address.String()
}
- if path.IsWithdraw {
- if old != nil {
- dst.pathList = append(dst.pathList[:oldIdx], dst.pathList[oldIdx+1:]...)
- if len(dst.pathList) == 0 {
- delete(adj.table[rf], key)
- }
+ old, found := adj.table[rf][key]
+ if path.IsWithdraw {
+ if found {
+ delete(adj.table[rf], key)
if old.Filtered(adj.id) == POLICY_DIRECTION_NONE {
adj.accepted[rf]--
}
}
} else {
n := path.Filtered(adj.id)
- if old != nil {
+ if found {
o := old.Filtered(adj.id)
if o == POLICY_DIRECTION_IN && n == POLICY_DIRECTION_NONE {
adj.accepted[rf]++
@@ -89,17 +73,10 @@ func (adj *AdjRib) Update(pathList []*Path) {
adj.accepted[rf]++
}
}
- if old != nil {
- dst.pathList[oldIdx] = path
- // avoid updating timestamp for the
- // exact same message due to soft
- // reset, etc
- if reflect.DeepEqual(old.GetPathAttrs(), path.GetPathAttrs()) {
- path.setTimestamp(old.GetTimestamp())
- }
- } else {
- dst.pathList = append(dst.pathList, path)
+ if found && reflect.DeepEqual(old.GetPathAttrs(), path.GetPathAttrs()) {
+ path.setTimestamp(old.GetTimestamp())
}
+ adj.table[rf][key] = path
}
}
}
@@ -107,11 +84,9 @@ func (adj *AdjRib) Update(pathList []*Path) {
func (adj *AdjRib) RefreshAcceptedNumber(rfList []bgp.RouteFamily) {
for _, rf := range rfList {
adj.accepted[rf] = 0
- for _, d := range adj.table[rf] {
- for _, p := range d.pathList {
- if p.Filtered(adj.id) != POLICY_DIRECTION_IN {
- adj.accepted[rf]++
- }
+ for _, p := range adj.table[rf] {
+ if p.Filtered(adj.id) != POLICY_DIRECTION_IN {
+ adj.accepted[rf]++
}
}
}
@@ -120,13 +95,11 @@ func (adj *AdjRib) RefreshAcceptedNumber(rfList []bgp.RouteFamily) {
func (adj *AdjRib) PathList(rfList []bgp.RouteFamily, accepted bool) []*Path {
pathList := make([]*Path, 0, adj.Count(rfList))
for _, rf := range rfList {
- for _, d := range adj.table[rf] {
- for _, p := range d.pathList {
- if accepted && p.Filtered(adj.id) > POLICY_DIRECTION_NONE {
- continue
- }
- pathList = append(pathList, p)
+ for _, rr := range adj.table[rf] {
+ if accepted && rr.Filtered(adj.id) > POLICY_DIRECTION_NONE {
+ continue
}
+ pathList = append(pathList, rr)
}
}
return pathList
@@ -136,9 +109,7 @@ func (adj *AdjRib) Count(rfList []bgp.RouteFamily) int {
count := 0
for _, rf := range rfList {
if table, ok := adj.table[rf]; ok {
- for _, d := range table {
- count += len(d.pathList)
- }
+ count += len(table)
}
}
return count
@@ -157,7 +128,7 @@ func (adj *AdjRib) Accepted(rfList []bgp.RouteFamily) int {
func (adj *AdjRib) Drop(rfList []bgp.RouteFamily) {
for _, rf := range rfList {
if _, ok := adj.table[rf]; ok {
- adj.table[rf] = make(map[string]*Dest)
+ adj.table[rf] = make(map[string]*Path)
adj.accepted[rf] = 0
}
}