@@ -752,11 +752,13 @@ static void bmp_mirror_cull(struct bmp_bgp *bmpbgp)
752
752
static int bmp_mirror_packet (struct peer * peer , uint8_t type , bgp_size_t size ,
753
753
struct stream * packet )
754
754
{
755
- struct bmp_bgp * bmpbgp = bmp_bgp_find ( peer -> bgp ) ;
755
+ struct bmp_bgp * bmpbgp ;
756
756
struct timeval tv ;
757
- struct bmp_mirrorq * qitem ;
757
+ struct bmp_mirrorq * qitem = NULL ;
758
758
struct bmp_targets * bt ;
759
759
struct bmp * bmp ;
760
+ struct bgp * bgp_vrf ;
761
+ struct listnode * node ;
760
762
761
763
frrtrace (3 , frr_bgp , bmp_mirror_packet , peer , type , packet );
762
764
@@ -772,36 +774,48 @@ static int bmp_mirror_packet(struct peer *peer, uint8_t type, bgp_size_t size,
772
774
memcpy (bbpeer -> open_rx , packet -> data , size );
773
775
}
774
776
775
- if (!bmpbgp )
776
- return 0 ;
777
777
778
778
qitem = XCALLOC (MTYPE_BMP_MIRRORQ , sizeof (* qitem ) + size );
779
779
qitem -> peerid = peer -> qobj_node .nid ;
780
780
qitem -> tv = tv ;
781
781
qitem -> len = size ;
782
782
memcpy (qitem -> data , packet -> data , size );
783
783
784
- frr_each (bmp_targets , & bmpbgp -> targets , bt ) {
785
- if (!bt -> mirror )
784
+ for (ALL_LIST_ELEMENTS_RO (bm -> bgp , node , bgp_vrf )) {
785
+ bmpbgp = bmp_bgp_find (bgp_vrf );
786
+ if (!bmpbgp )
786
787
continue ;
787
- frr_each (bmp_session , & bt -> sessions , bmp ) {
788
- qitem -> refcount ++ ;
789
- if (!bmp -> mirrorpos )
790
- bmp -> mirrorpos = qitem ;
791
- pullwr_bump (bmp -> pullwr );
792
- }
793
- }
794
- if (qitem -> refcount == 0 )
795
- XFREE (MTYPE_BMP_MIRRORQ , qitem );
796
- else {
797
- bmpbgp -> mirror_qsize += sizeof (* qitem ) + size ;
798
- bmp_mirrorq_add_tail (& bmpbgp -> mirrorq , qitem );
788
+ frr_each (bmp_targets , & bmpbgp -> targets , bt ) {
789
+ if (!bt -> mirror )
790
+ continue ;
791
+
792
+ if (bgp_vrf != peer -> bgp && !bmp_imported_bgp_find (bt , peer -> bgp -> name ))
793
+ continue ;
794
+
795
+ frr_each (bmp_session , & bt -> sessions , bmp ) {
796
+ if (!qitem ) {
797
+ qitem = XCALLOC (MTYPE_BMP_MIRRORQ , sizeof (* qitem ) + size );
798
+ qitem -> peerid = peer -> qobj_node .nid ;
799
+ qitem -> tv = tv ;
800
+ qitem -> len = size ;
801
+ memcpy (qitem -> data , packet -> data , size );
802
+ }
799
803
800
- bmp_mirror_cull (bmpbgp );
804
+ qitem -> refcount ++ ;
805
+ if (!bmp -> mirrorpos )
806
+ bmp -> mirrorpos = qitem ;
807
+ pullwr_bump (bmp -> pullwr );
808
+ }
809
+ bmpbgp -> mirror_qsize += sizeof (* qitem ) + size ;
810
+ bmp_mirrorq_add_tail (& bmpbgp -> mirrorq , qitem );
801
811
802
- bmpbgp -> mirror_qsizemax = MAX (bmpbgp -> mirror_qsizemax ,
803
- bmpbgp -> mirror_qsize );
812
+ bmp_mirror_cull (bmpbgp );
813
+
814
+ bmpbgp -> mirror_qsizemax = MAX (bmpbgp -> mirror_qsizemax , bmpbgp -> mirror_qsize );
815
+ }
804
816
}
817
+ if (qitem && qitem -> refcount == 0 )
818
+ XFREE (MTYPE_BMP_MIRRORQ , qitem );
805
819
return 0 ;
806
820
}
807
821
0 commit comments