diff options
-rw-r--r-- | server/server.go | 9 | ||||
-rw-r--r-- | table/table.go | 20 |
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 } |