mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-10 14:35:35 +00:00
bmp: add L3VPN support
Support for BMP L3VPN monitoring messages through SAFI_MPLS_VPN address family. Signed-off-by: Francois Dumontet <francois.dumontet@6wind.com>
This commit is contained in:
parent
9d8dc1b901
commit
5dde29654e
@ -168,6 +168,16 @@ static int bmp_qhash_cmp(const struct bmp_queue_entry *a,
|
|||||||
else if (b->afi == AFI_L2VPN && b->safi == SAFI_EVPN)
|
else if (b->afi == AFI_L2VPN && b->safi == SAFI_EVPN)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (a->afi == b->afi && a->safi == SAFI_MPLS_VPN &&
|
||||||
|
b->safi == SAFI_MPLS_VPN) {
|
||||||
|
ret = prefix_cmp(&a->rd, &b->rd);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
} else if (a->safi == SAFI_MPLS_VPN)
|
||||||
|
return 1;
|
||||||
|
else if (b->safi == SAFI_MPLS_VPN)
|
||||||
|
return -1;
|
||||||
|
|
||||||
ret = prefix_cmp(&a->p, &b->p);
|
ret = prefix_cmp(&a->p, &b->p);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@ -186,7 +196,8 @@ static uint32_t bmp_qhash_hkey(const struct bmp_queue_entry *e)
|
|||||||
offsetof(struct bmp_queue_entry, refcount)
|
offsetof(struct bmp_queue_entry, refcount)
|
||||||
- offsetof(struct bmp_queue_entry, peerid),
|
- offsetof(struct bmp_queue_entry, peerid),
|
||||||
key);
|
key);
|
||||||
if (e->afi == AFI_L2VPN && e->safi == SAFI_EVPN)
|
if ((e->afi == AFI_L2VPN && e->safi == SAFI_EVPN) ||
|
||||||
|
(e->safi == SAFI_MPLS_VPN))
|
||||||
key = jhash(&e->rd,
|
key = jhash(&e->rd,
|
||||||
offsetof(struct bmp_queue_entry, rd)
|
offsetof(struct bmp_queue_entry, rd)
|
||||||
- offsetof(struct bmp_queue_entry, refcount)
|
- offsetof(struct bmp_queue_entry, refcount)
|
||||||
@ -985,7 +996,8 @@ afibreak:
|
|||||||
struct bgp_path_info *bpi = NULL, *bpiter;
|
struct bgp_path_info *bpi = NULL, *bpiter;
|
||||||
struct bgp_adj_in *adjin = NULL, *adjiter;
|
struct bgp_adj_in *adjin = NULL, *adjiter;
|
||||||
|
|
||||||
if (afi == AFI_L2VPN && safi == SAFI_EVPN) {
|
if ((afi == AFI_L2VPN && safi == SAFI_EVPN) ||
|
||||||
|
(safi == SAFI_MPLS_VPN)) {
|
||||||
/* initialize syncrdpos to the first
|
/* initialize syncrdpos to the first
|
||||||
* mid-layer table entry
|
* mid-layer table entry
|
||||||
*/
|
*/
|
||||||
@ -1014,7 +1026,8 @@ afibreak:
|
|||||||
if (!bn) {
|
if (!bn) {
|
||||||
bn = bgp_table_get_next(table, &bmp->syncpos);
|
bn = bgp_table_get_next(table, &bmp->syncpos);
|
||||||
if (!bn) {
|
if (!bn) {
|
||||||
if (afi == AFI_L2VPN && safi == SAFI_EVPN) {
|
if ((afi == AFI_L2VPN && safi == SAFI_EVPN) ||
|
||||||
|
(safi == SAFI_MPLS_VPN)) {
|
||||||
/* reset bottom-layer pointer */
|
/* reset bottom-layer pointer */
|
||||||
memset(&bmp->syncpos, 0,
|
memset(&bmp->syncpos, 0,
|
||||||
sizeof(bmp->syncpos));
|
sizeof(bmp->syncpos));
|
||||||
@ -1096,7 +1109,8 @@ afibreak:
|
|||||||
|
|
||||||
const struct prefix *bn_p = bgp_dest_get_prefix(bn);
|
const struct prefix *bn_p = bgp_dest_get_prefix(bn);
|
||||||
struct prefix_rd *prd = NULL;
|
struct prefix_rd *prd = NULL;
|
||||||
if (afi == AFI_L2VPN && safi == SAFI_EVPN)
|
if (((afi == AFI_L2VPN) && (safi == SAFI_EVPN)) ||
|
||||||
|
(safi == SAFI_MPLS_VPN))
|
||||||
prd = (struct prefix_rd *)bgp_dest_get_prefix(bmp->syncrdpos);
|
prd = (struct prefix_rd *)bgp_dest_get_prefix(bmp->syncrdpos);
|
||||||
|
|
||||||
if (bpi)
|
if (bpi)
|
||||||
@ -1168,7 +1182,8 @@ static bool bmp_wrqueue(struct bmp *bmp, struct pullwr *pullwr)
|
|||||||
|
|
||||||
bn = bgp_node_lookup(bmp->targets->bgp->rib[afi][safi], &bqe->p);
|
bn = bgp_node_lookup(bmp->targets->bgp->rib[afi][safi], &bqe->p);
|
||||||
struct prefix_rd *prd = NULL;
|
struct prefix_rd *prd = NULL;
|
||||||
if (bqe->afi == AFI_L2VPN && bqe->safi == SAFI_EVPN)
|
if ((bqe->afi == AFI_L2VPN && bqe->safi == SAFI_EVPN) ||
|
||||||
|
(bqe->safi == SAFI_MPLS_VPN))
|
||||||
prd = &bqe->rd;
|
prd = &bqe->rd;
|
||||||
|
|
||||||
if (bmp->targets->afimon[afi][safi] & BMP_MON_POSTPOLICY) {
|
if (bmp->targets->afimon[afi][safi] & BMP_MON_POSTPOLICY) {
|
||||||
@ -1256,7 +1271,8 @@ static void bmp_process_one(struct bmp_targets *bt, struct bgp *bgp, afi_t afi,
|
|||||||
bqeref.afi = afi;
|
bqeref.afi = afi;
|
||||||
bqeref.safi = safi;
|
bqeref.safi = safi;
|
||||||
|
|
||||||
if (afi == AFI_L2VPN && safi == SAFI_EVPN && bn->pdest)
|
if ((afi == AFI_L2VPN && safi == SAFI_EVPN && bn->pdest) ||
|
||||||
|
(safi == SAFI_MPLS_VPN))
|
||||||
prefix_copy(&bqeref.rd,
|
prefix_copy(&bqeref.rd,
|
||||||
(struct prefix_rd *)bgp_dest_get_prefix(bn->pdest));
|
(struct prefix_rd *)bgp_dest_get_prefix(bn->pdest));
|
||||||
|
|
||||||
@ -2195,12 +2211,12 @@ DEFPY(bmp_stats_cfg,
|
|||||||
|
|
||||||
DEFPY(bmp_monitor_cfg,
|
DEFPY(bmp_monitor_cfg,
|
||||||
bmp_monitor_cmd,
|
bmp_monitor_cmd,
|
||||||
"[no] bmp monitor <ipv4|ipv6|l2vpn> <unicast|multicast|evpn> <pre-policy|post-policy>$policy",
|
"[no] bmp monitor <ipv4|ipv6|l2vpn> <unicast|multicast|evpn|vpn> <pre-policy|post-policy>$policy",
|
||||||
NO_STR
|
NO_STR
|
||||||
BMP_STR
|
BMP_STR
|
||||||
"Send BMP route monitoring messages\n"
|
"Send BMP route monitoring messages\n"
|
||||||
"Address Family\nAddress Family\nAddress Family\n"
|
"Address Family\nAddress Family\nAddress Family\n"
|
||||||
"Address Family\nAddress Family\nAddress Family\n"
|
"Address Family\nAddress Family\nAddress Family\nAddress Family\n"
|
||||||
"Send state before policy and filter processing\n"
|
"Send state before policy and filter processing\n"
|
||||||
"Send state with policy and filters applied\n")
|
"Send state with policy and filters applied\n")
|
||||||
{
|
{
|
||||||
|
@ -149,8 +149,9 @@ associated with a particular ``bmp targets``:
|
|||||||
.. clicmd:: bmp monitor AFI SAFI <pre-policy|post-policy>
|
.. clicmd:: bmp monitor AFI SAFI <pre-policy|post-policy>
|
||||||
|
|
||||||
Perform Route Monitoring for the specified AFI and SAFI. Only IPv4 and
|
Perform Route Monitoring for the specified AFI and SAFI. Only IPv4 and
|
||||||
IPv6 are currently valid for AFI, and only unicast and multicast are valid
|
IPv6 are currently valid for AFI. SAFI valid values are currently
|
||||||
for SAFI. Other AFI/SAFI combinations may be added in the future.
|
unicast, multicast, evpn and vpn.
|
||||||
|
Other AFI/SAFI combinations may be added in the future.
|
||||||
|
|
||||||
All BGP neighbors are included in Route Monitoring. Options to select
|
All BGP neighbors are included in Route Monitoring. Options to select
|
||||||
a subset of BGP sessions may be added in the future.
|
a subset of BGP sessions may be added in the future.
|
||||||
|
Loading…
Reference in New Issue
Block a user