@@ -15,6 +15,8 @@ import (
1515 "github.com/bio-routing/bio-rd/protocols/bgp/packet"
1616 bmppkt "github.com/bio-routing/bio-rd/protocols/bmp/packet"
1717 "github.com/bio-routing/bio-rd/routingtable"
18+ "github.com/bio-routing/bio-rd/routingtable/adjRIBIn"
19+ "github.com/bio-routing/bio-rd/routingtable/adjRIBOut"
1820 "github.com/bio-routing/bio-rd/routingtable/filter"
1921 "github.com/bio-routing/bio-rd/routingtable/vrf"
2022 "github.com/bio-routing/tflow2/convert"
@@ -197,6 +199,48 @@ func (r *Router) processInitiationMsg(msg *bmppkt.InitiationMessage) {
197199 r .logger .Info (logMsg )
198200}
199201
202+ func (r * Router ) getNeighborAddressFamily (addr * bnet.IP , afi uint16 , safi uint8 ) (* fsmAddressFamily , error ) {
203+ if safi != packet .UnicastSAFI {
204+ return nil , fmt .Errorf ("Unsupported safi, only unicast is supported" )
205+ }
206+
207+ for _ , neigh := range r .neighborManager .list () {
208+ if * neigh .fsm .peer .addr == * addr {
209+ af := neigh .fsm .addressFamily (afi , safi )
210+ if af == nil {
211+ return nil , fmt .Errorf ("Address family not available" )
212+ }
213+ return af , nil
214+ }
215+ }
216+
217+ return nil , fmt .Errorf ("Could not find neighbor with ip %s" , addr .String ())
218+ }
219+
220+ // GetNeighborRIBIn returns the AdjRIBIn of a BMP neighbor
221+ func (r * Router ) GetNeighborRIBIn (addr * bnet.IP , afi uint16 , safi uint8 ) (* adjRIBIn.AdjRIBIn , error ) {
222+ neighAF , err := r .getNeighborAddressFamily (addr , afi , safi )
223+ if err != nil {
224+ return nil , errors .Wrap (err , "Could not get RIBIn" )
225+ }
226+ if neighAF .adjRIBIn == nil {
227+ return nil , fmt .Errorf ("RIBIn not available" )
228+ }
229+ return neighAF .adjRIBIn .(* adjRIBIn.AdjRIBIn ), nil
230+ }
231+
232+ // GetNeighborRIBOut returns the AdjRIBOut of a BMP neighbor
233+ func (r * Router ) GetNeighborRIBOut (addr * bnet.IP , afi uint16 , safi uint8 ) (* adjRIBOut.AdjRIBOut , error ) {
234+ neighAF , err := r .getNeighborAddressFamily (addr , afi , safi )
235+ if err != nil {
236+ return nil , errors .Wrap (err , "Could not get RIBIn" )
237+ }
238+ if neighAF .adjRIBOut == nil {
239+ return nil , fmt .Errorf ("RIBOut not available" )
240+ }
241+ return neighAF .adjRIBOut .(* adjRIBOut.AdjRIBOut ), nil
242+ }
243+
200244func (r * Router ) processTerminationMsg (msg * bmppkt.TerminationMessage ) {
201245 const (
202246 stringType = 0
0 commit comments