From ff689d7a7afa17eee78605e5810f2c0a34c67e05 Mon Sep 17 00:00:00 2001 From: Sebastian Lohff Date: Sun, 24 May 2020 17:28:46 +0200 Subject: [PATCH] Make RIBIn/RIBOut of BMP neighbors accessible --- protocols/bgp/server/bmp_router.go | 44 ++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/protocols/bgp/server/bmp_router.go b/protocols/bgp/server/bmp_router.go index 51a91eea..490c8b01 100644 --- a/protocols/bgp/server/bmp_router.go +++ b/protocols/bgp/server/bmp_router.go @@ -15,6 +15,8 @@ import ( "github.com/bio-routing/bio-rd/protocols/bgp/packet" bmppkt "github.com/bio-routing/bio-rd/protocols/bmp/packet" "github.com/bio-routing/bio-rd/routingtable" + "github.com/bio-routing/bio-rd/routingtable/adjRIBIn" + "github.com/bio-routing/bio-rd/routingtable/adjRIBOut" "github.com/bio-routing/bio-rd/routingtable/filter" "github.com/bio-routing/bio-rd/routingtable/vrf" "github.com/bio-routing/tflow2/convert" @@ -197,6 +199,48 @@ func (r *Router) processInitiationMsg(msg *bmppkt.InitiationMessage) { r.logger.Info(logMsg) } +func (r *Router) getNeighborAddressFamily(addr *bnet.IP, afi uint16, safi uint8) (*fsmAddressFamily, error) { + if safi != packet.UnicastSAFI { + return nil, fmt.Errorf("Unsupported safi, only unicast is supported") + } + + for _, neigh := range r.neighborManager.list() { + if *neigh.fsm.peer.addr == *addr { + af := neigh.fsm.addressFamily(afi, safi) + if af == nil { + return nil, fmt.Errorf("Address family not available") + } + return af, nil + } + } + + return nil, fmt.Errorf("Could not find neighbor with ip %s", addr.String()) +} + +// GetNeighborRIBIn returns the AdjRIBIn of a BMP neighbor +func (r *Router) GetNeighborRIBIn(addr *bnet.IP, afi uint16, safi uint8) (*adjRIBIn.AdjRIBIn, error) { + neighAF, err := r.getNeighborAddressFamily(addr, afi, safi) + if err != nil { + return nil, errors.Wrap(err, "Could not get RIBIn") + } + if neighAF.adjRIBIn == nil { + return nil, fmt.Errorf("RIBIn not available") + } + return neighAF.adjRIBIn.(*adjRIBIn.AdjRIBIn), nil +} + +// GetNeighborRIBOut returns the AdjRIBOut of a BMP neighbor +func (r *Router) GetNeighborRIBOut(addr *bnet.IP, afi uint16, safi uint8) (*adjRIBOut.AdjRIBOut, error) { + neighAF, err := r.getNeighborAddressFamily(addr, afi, safi) + if err != nil { + return nil, errors.Wrap(err, "Could not get RIBIn") + } + if neighAF.adjRIBOut == nil { + return nil, fmt.Errorf("RIBOut not available") + } + return neighAF.adjRIBOut.(*adjRIBOut.AdjRIBOut), nil +} + func (r *Router) processTerminationMsg(msg *bmppkt.TerminationMessage) { const ( stringType = 0