summaryrefslogtreecommitdiff
path: root/lib/zclient.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/zclient.c')
-rw-r--r--lib/zclient.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/zclient.c b/lib/zclient.c
index 5ce1150b05..fd1b181e58 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -802,6 +802,12 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1,
if (next1->type > next2->type)
return 1;
+ if (next1->weight < next2->weight)
+ return -1;
+
+ if (next1->weight > next2->weight)
+ return 1;
+
switch (next1->type) {
case NEXTHOP_TYPE_IPV4:
case NEXTHOP_TYPE_IPV6:
@@ -882,6 +888,9 @@ int zapi_nexthop_encode(struct stream *s, const struct zapi_nexthop *api_nh,
}
}
+ if (api_nh->weight)
+ SET_FLAG(nh_flags, ZAPI_NEXTHOP_FLAG_WEIGHT);
+
/* Note that we're only encoding a single octet */
stream_putc(s, nh_flags);
@@ -920,6 +929,9 @@ int zapi_nexthop_encode(struct stream *s, const struct zapi_nexthop *api_nh,
api_nh->label_num * sizeof(mpls_label_t));
}
+ if (api_nh->weight)
+ stream_putl(s, api_nh->weight);
+
/* Router MAC for EVPN routes. */
if (CHECK_FLAG(api_flags, ZEBRA_FLAG_EVPN_ROUTE))
stream_put(s, &(api_nh->rmac),
@@ -1082,6 +1094,9 @@ static int zapi_nexthop_decode(struct stream *s, struct zapi_nexthop *api_nh,
api_nh->label_num * sizeof(mpls_label_t));
}
+ if (CHECK_FLAG(api_nh->flags, ZAPI_NEXTHOP_FLAG_WEIGHT))
+ STREAM_GETL(s, api_nh->weight);
+
/* Router MAC for EVPN routes. */
if (CHECK_FLAG(api_flags, ZEBRA_FLAG_EVPN_ROUTE))
STREAM_GET(&(api_nh->rmac), s,
@@ -2664,6 +2679,17 @@ int zapi_labels_decode(struct stream *s, struct zapi_labels *zl)
}
STREAM_GETW(s, zl->nexthop_num);
+
+ if (zl->nexthop_num > MULTIPATH_NUM) {
+ flog_warn(
+ EC_LIB_ZAPI_ENCODE,
+ "%s: Prefix %pFX has %d nexthops, but we can only use the first %d",
+ __func__, &zl->route.prefix, zl->nexthop_num,
+ MULTIPATH_NUM);
+ }
+
+ zl->nexthop_num = MIN(MULTIPATH_NUM, zl->nexthop_num);
+
for (int i = 0; i < zl->nexthop_num; i++) {
znh = &zl->nexthops[i];