mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-29 04:25:43 +00:00
sharp: Modify route install to take nexthop groups
Modify the route_add function to take nexthop groups. Future commits will allow sharpd to use nexthop groups as the install mechanism for routes. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
d52fa66f0e
commit
694b242f21
@ -42,6 +42,7 @@
|
||||
#include "distribute.h"
|
||||
#include "libfrr.h"
|
||||
#include "routemap.h"
|
||||
#include "nexthop_group.h"
|
||||
|
||||
#include "sharp_zebra.h"
|
||||
#include "sharp_vty.h"
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "log.h"
|
||||
#include "vrf.h"
|
||||
#include "zclient.h"
|
||||
#include "nexthop_group.h"
|
||||
|
||||
#include "sharpd/sharp_zebra.h"
|
||||
#include "sharpd/sharp_vty.h"
|
||||
@ -96,6 +97,7 @@ DEFPY (install_routes,
|
||||
int i;
|
||||
struct prefix p;
|
||||
struct nexthop nhop;
|
||||
struct nexthop_group nhg;
|
||||
uint32_t temp;
|
||||
|
||||
total_routes = routes;
|
||||
@ -103,6 +105,7 @@ DEFPY (install_routes,
|
||||
|
||||
memset(&p, 0, sizeof(p));
|
||||
memset(&nhop, 0, sizeof(nhop));
|
||||
memset(&nhg, 0, sizeof(nhg));
|
||||
|
||||
p.family = AF_INET;
|
||||
p.prefixlen = 32;
|
||||
@ -116,11 +119,12 @@ DEFPY (install_routes,
|
||||
nhop.type = NEXTHOP_TYPE_IPV6;
|
||||
}
|
||||
|
||||
nhg.nexthop = &nhop;
|
||||
zlog_debug("Inserting %ld routes", routes);
|
||||
|
||||
temp = ntohl(p.u.prefix4.s_addr);
|
||||
for (i = 0; i < routes; i++) {
|
||||
route_add(&p, (uint8_t)instance, &nhop);
|
||||
route_add(&p, (uint8_t)instance, &nhg);
|
||||
p.u.prefix4.s_addr = htonl(++temp);
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "plist.h"
|
||||
#include "log.h"
|
||||
#include "nexthop.h"
|
||||
#include "nexthop_group.h"
|
||||
|
||||
#include "sharp_zebra.h"
|
||||
|
||||
@ -176,10 +177,12 @@ void vrf_label_add(vrf_id_t vrf_id, afi_t afi, mpls_label_t label)
|
||||
zclient_send_vrf_label(zclient, vrf_id, afi, label, ZEBRA_LSP_SHARP);
|
||||
}
|
||||
|
||||
void route_add(struct prefix *p, uint8_t instance, struct nexthop *nh)
|
||||
void route_add(struct prefix *p, uint8_t instance, struct nexthop_group *nhg)
|
||||
{
|
||||
struct zapi_route api;
|
||||
struct zapi_nexthop *api_nh;
|
||||
struct nexthop *nh;
|
||||
int i = 0;
|
||||
|
||||
memset(&api, 0, sizeof(api));
|
||||
api.vrf_id = VRF_DEFAULT;
|
||||
@ -191,12 +194,35 @@ void route_add(struct prefix *p, uint8_t instance, struct nexthop *nh)
|
||||
SET_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION);
|
||||
SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
|
||||
|
||||
api_nh = &api.nexthops[0];
|
||||
api_nh->vrf_id = VRF_DEFAULT;
|
||||
api_nh->gate = nh->gate;
|
||||
api_nh->type = nh->type;
|
||||
api_nh->ifindex = nh->ifindex;
|
||||
api.nexthop_num = 1;
|
||||
for (ALL_NEXTHOPS_PTR(nhg, nh)) {
|
||||
api_nh = &api.nexthops[i];
|
||||
api_nh->vrf_id = VRF_DEFAULT;
|
||||
api_nh->type = nh->type;
|
||||
switch (nh->type) {
|
||||
case NEXTHOP_TYPE_IPV4:
|
||||
api_nh->gate = nh->gate;
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||
api_nh->gate = nh->gate;
|
||||
api_nh->ifindex = nh->ifindex;
|
||||
break;
|
||||
case NEXTHOP_TYPE_IFINDEX:
|
||||
api_nh->ifindex = nh->ifindex;
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV6:
|
||||
memcpy(&api_nh->gate.ipv6, &nh->gate.ipv6, 16);
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
||||
api_nh->ifindex = nh->ifindex;
|
||||
memcpy(&api_nh->gate.ipv6, &nh->gate.ipv6, 16);
|
||||
break;
|
||||
case NEXTHOP_TYPE_BLACKHOLE:
|
||||
api_nh->bh_type = nh->bh_type;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
api.nexthop_num = i;
|
||||
|
||||
zclient_route_send(ZEBRA_ROUTE_ADD, zclient, &api);
|
||||
}
|
||||
|
@ -25,7 +25,8 @@
|
||||
extern void sharp_zebra_init(void);
|
||||
|
||||
extern void vrf_label_add(vrf_id_t vrf_id, afi_t afi, mpls_label_t label);
|
||||
extern void route_add(struct prefix *p, uint8_t instance, struct nexthop *nh);
|
||||
extern void route_add(struct prefix *p, uint8_t instance,
|
||||
struct nexthop_group *nhg);
|
||||
extern void route_delete(struct prefix *p, uint8_t instance);
|
||||
extern void sharp_zebra_nexthop_watch(struct prefix *p, bool watch);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user