summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--server/server.go9
-rw-r--r--table/table.go20
2 files changed, 25 insertions, 4 deletions
diff --git a/server/server.go b/server/server.go
index 0bee727e..6a766261 100644
--- a/server/server.go
+++ b/server/server.go
@@ -1619,10 +1619,11 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) {
}
} else if dst.LongerPrefixes {
_, prefix, _ := net.ParseCIDR(key)
- ones, bits := prefix.Mask.Size()
- for i := ones + 1; i <= bits; i++ {
- prefix.Mask = net.CIDRMask(i, bits)
- f(id, prefix.String())
+
+ for _, dst := range rib.Tables[af].GetLongerPrefixDestinations(prefix.String()) {
+ if d := dst.ToApiStruct(id); d != nil {
+ dsts = append(dsts, d)
+ }
}
}
}
diff --git a/table/table.go b/table/table.go
index cbe5c4c9..33db8130 100644
--- a/table/table.go
+++ b/table/table.go
@@ -234,6 +234,26 @@ func (t *Table) GetDestination(key string) *Destination {
}
}
+func (t *Table) GetLongerPrefixDestinations(key string) []*Destination {
+ results := make([]*Destination, 0, len(t.GetDestinations()))
+ switch t.routeFamily {
+ case bgp.RF_IPv4_UC, bgp.RF_IPv6_UC:
+ r := radix.New()
+ for _, dst := range t.GetDestinations() {
+ r.Insert(dst.RadixKey, dst)
+ }
+ r.WalkPrefix(key, func(s string, v interface{}) bool {
+ results = append(results, v.(*Destination))
+ return false
+ })
+ default:
+ for _, dst := range t.GetDestinations() {
+ results = append(results, dst)
+ }
+ }
+ return results
+}
+
func (t *Table) setDestination(key string, dest *Destination) {
t.destinations[key] = dest
}