@@ -15,6 +15,8 @@ import (
15
15
"github.com/bio-routing/bio-rd/protocols/bgp/packet"
16
16
bmppkt "github.com/bio-routing/bio-rd/protocols/bmp/packet"
17
17
"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"
18
20
"github.com/bio-routing/bio-rd/routingtable/filter"
19
21
"github.com/bio-routing/bio-rd/routingtable/vrf"
20
22
"github.com/bio-routing/tflow2/convert"
@@ -197,6 +199,48 @@ func (r *Router) processInitiationMsg(msg *bmppkt.InitiationMessage) {
197
199
r .logger .Info (logMsg )
198
200
}
199
201
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
+
200
244
func (r * Router ) processTerminationMsg (msg * bmppkt.TerminationMessage ) {
201
245
const (
202
246
stringType = 0
0 commit comments