summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sharpd/sharp_main.c1
-rw-r--r--sharpd/sharp_vty.c6
-rw-r--r--sharpd/sharp_zebra.c40
-rw-r--r--sharpd/sharp_zebra.h3
4 files changed, 41 insertions, 9 deletions
diff --git a/sharpd/sharp_main.c b/sharpd/sharp_main.c
index 20cdd21e7..34b84f606 100644
--- a/sharpd/sharp_main.c
+++ b/sharpd/sharp_main.c
@@ -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"
diff --git a/sharpd/sharp_vty.c b/sharpd/sharp_vty.c
index 797e336c2..700b5a911 100644
--- a/sharpd/sharp_vty.c
+++ b/sharpd/sharp_vty.c
@@ -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);
}
diff --git a/sharpd/sharp_zebra.c b/sharpd/sharp_zebra.c
index f752009eb..4a88b6c8e 100644
--- a/sharpd/sharp_zebra.c
+++ b/sharpd/sharp_zebra.c
@@ -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);
}
diff --git a/sharpd/sharp_zebra.h b/sharpd/sharp_zebra.h
index 58438ed01..ffe21df9b 100644
--- a/sharpd/sharp_zebra.h
+++ b/sharpd/sharp_zebra.h
@@ -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