diff options
Diffstat (limited to 'ripd/rip_zebra.c')
| -rw-r--r-- | ripd/rip_zebra.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/ripd/rip_zebra.c b/ripd/rip_zebra.c index 35c4b1f1be..ce94e8e754 100644 --- a/ripd/rip_zebra.c +++ b/ripd/rip_zebra.c @@ -13,6 +13,9 @@ #include "zclient.h" #include "log.h" #include "vrf.h" +#include "bfd.h" +#include "frrdistance.h" + #include "ripd/ripd.h" #include "ripd/rip_debug.h" #include "ripd/rip_interface.h" @@ -29,7 +32,7 @@ static void rip_zebra_ipv4_send(struct rip *rip, struct route_node *rp, struct zapi_nexthop *api_nh; struct listnode *listnode = NULL; struct rip_info *rinfo = NULL; - int count = 0; + uint32_t count = 0; memset(&api, 0, sizeof(api)); api.vrf_id = rip->vrf->vrf_id; @@ -38,7 +41,7 @@ static void rip_zebra_ipv4_send(struct rip *rip, struct route_node *rp, SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP); for (ALL_LIST_ELEMENTS_RO(list, listnode, rinfo)) { - if (count >= MULTIPATH_NUM) + if (count >= zebra_ecmp_count) break; api_nh = &api.nexthops[count]; api_nh->vrf_id = rip->vrf->vrf_id; @@ -196,6 +199,7 @@ void rip_zebra_vrf_register(struct vrf *vrf) vrf->name, vrf->vrf_id); zclient_send_reg_requests(zclient, vrf->vrf_id); + bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER, vrf->vrf_id); } void rip_zebra_vrf_deregister(struct vrf *vrf) @@ -208,21 +212,27 @@ void rip_zebra_vrf_deregister(struct vrf *vrf) vrf->name, vrf->vrf_id); zclient_send_dereg_requests(zclient, vrf->vrf_id); + bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_DEREGISTER, vrf->vrf_id); } static void rip_zebra_connected(struct zclient *zclient) { zclient_send_reg_requests(zclient, VRF_DEFAULT); + bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER, VRF_DEFAULT); } zclient_handler *const rip_handlers[] = { [ZEBRA_INTERFACE_ADDRESS_ADD] = rip_interface_address_add, [ZEBRA_INTERFACE_ADDRESS_DELETE] = rip_interface_address_delete, - [ZEBRA_INTERFACE_VRF_UPDATE] = rip_interface_vrf_update, [ZEBRA_REDISTRIBUTE_ROUTE_ADD] = rip_zebra_read_route, [ZEBRA_REDISTRIBUTE_ROUTE_DEL] = rip_zebra_read_route, }; +static void rip_zebra_capabilities(struct zclient_capabilities *cap) +{ + zebra_ecmp_count = MIN(cap->ecmp, zebra_ecmp_count); +} + void rip_zclient_init(struct event_loop *master) { /* Set default value to the zebra client structure. */ @@ -230,6 +240,7 @@ void rip_zclient_init(struct event_loop *master) array_size(rip_handlers)); zclient_init(zclient, ZEBRA_ROUTE_RIP, 0, &ripd_privs); zclient->zebra_connected = rip_zebra_connected; + zclient->zebra_capabilities = rip_zebra_capabilities; } void rip_zclient_stop(void) |
