diff options
Diffstat (limited to 'src/plugins/vrrp')
-rw-r--r-- | src/plugins/vrrp/vrrp.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/plugins/vrrp/vrrp.c b/src/plugins/vrrp/vrrp.c index eb988d323c9..37ee9ec25a6 100644 --- a/src/plugins/vrrp/vrrp.c +++ b/src/plugins/vrrp/vrrp.c @@ -382,8 +382,10 @@ static int vrrp_intf_enable_disable_mcast (u8 enable, u32 sw_if_index, u8 is_ipv6) { vrrp_main_t *vrm = &vrrp_main; + vrrp_vr_t *vr; vrrp_intf_t *intf; u32 fib_index; + u32 n_vrs = 0; const mfib_prefix_t *vrrp_prefix; fib_protocol_t proto; vnet_link_t link_type; @@ -418,9 +420,18 @@ vrrp_intf_enable_disable_mcast (u8 enable, u32 sw_if_index, u8 is_ipv6) via_itf.frp_proto = fib_proto_to_dpo (proto); fib_index = mfib_table_get_index_for_sw_if_index (proto, sw_if_index); + /* *INDENT-OFF* */ + pool_foreach (vr, vrm->vrs, + ({ + if (vrrp_vr_is_ipv6 (vr) == is_ipv6) + n_vrs++; + })); + /* *INDENT-ON* */ + if (enable) { - if (pool_elts (vrm->vrs) == 1) + /* If this is the first VR configured, add the local mcast routes */ + if (n_vrs == 1) mfib_table_entry_path_update (fib_index, vrrp_prefix, MFIB_SOURCE_API, &for_us); @@ -431,7 +442,8 @@ vrrp_intf_enable_disable_mcast (u8 enable, u32 sw_if_index, u8 is_ipv6) } else { - if (pool_elts (vrm->vrs) == 0) + /* Remove mcast local routes if this is the last VR being deleted */ + if (n_vrs == 0) mfib_table_entry_path_remove (fib_index, vrrp_prefix, MFIB_SOURCE_API, &for_us); |