*: Fix up improper handling of nexthops for nexthop tracking

Currently FRR needs to send a uint16_t value for the number
of nexthops as well it needs the ability to properly decode
all of this.  Find and handle all the places that this happens.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
This commit is contained in:
Donald Sharp 2024-10-11 14:01:10 -04:00
parent 0aef4e4041
commit 645a9e4f83
6 changed files with 13 additions and 13 deletions

View file

@ -2374,7 +2374,7 @@ static bool zapi_nexthop_update_decode(struct stream *s, struct prefix *match,
STREAM_GETW(s, nhr->instance); STREAM_GETW(s, nhr->instance);
STREAM_GETC(s, nhr->distance); STREAM_GETC(s, nhr->distance);
STREAM_GETL(s, nhr->metric); STREAM_GETL(s, nhr->metric);
STREAM_GETC(s, nhr->nexthop_num); STREAM_GETW(s, nhr->nexthop_num);
for (i = 0; i < nhr->nexthop_num; i++) { for (i = 0; i < nhr->nexthop_num; i++) {
if (zapi_nexthop_decode(s, &(nhr->nexthops[i]), 0, 0) != 0) if (zapi_nexthop_decode(s, &(nhr->nexthops[i]), 0, 0) != 0)

View file

@ -193,7 +193,7 @@ static int zclient_read_nexthop(struct pim_instance *pim,
distance = stream_getc(s); distance = stream_getc(s);
metric = stream_getl(s); metric = stream_getl(s);
nexthop_num = stream_getc(s); nexthop_num = stream_getw(s);
if (nexthop_num < 1 || nexthop_num > router->multipath) { if (nexthop_num < 1 || nexthop_num > router->multipath) {
if (PIM_DEBUG_PIM_NHT_DETAIL) if (PIM_DEBUG_PIM_NHT_DETAIL)

View file

@ -43,7 +43,7 @@ struct static_nht_data {
vrf_id_t nh_vrf_id; vrf_id_t nh_vrf_id;
uint32_t refcount; uint32_t refcount;
uint8_t nh_num; uint16_t nh_num;
bool registered; bool registered;
}; };

View file

@ -647,7 +647,7 @@ static int zsend_nexthop_lookup_mrib(struct zserv *client, struct ipaddr *addr,
{ {
struct stream *s; struct stream *s;
unsigned long nump; unsigned long nump;
uint8_t num; uint16_t num;
struct nexthop *nexthop; struct nexthop *nexthop;
/* Get output stream. */ /* Get output stream. */
@ -667,7 +667,7 @@ static int zsend_nexthop_lookup_mrib(struct zserv *client, struct ipaddr *addr,
/* remember position for nexthop_num */ /* remember position for nexthop_num */
nump = stream_get_endp(s); nump = stream_get_endp(s);
/* reserve room for nexthop_num */ /* reserve room for nexthop_num */
stream_putc(s, 0); stream_putw(s, 0);
nhg = rib_get_fib_nhg(re); nhg = rib_get_fib_nhg(re);
for (ALL_NEXTHOPS_PTR(nhg, nexthop)) { for (ALL_NEXTHOPS_PTR(nhg, nexthop)) {
if (rnh_nexthop_valid(re, nexthop)) if (rnh_nexthop_valid(re, nexthop))
@ -675,11 +675,11 @@ static int zsend_nexthop_lookup_mrib(struct zserv *client, struct ipaddr *addr,
} }
/* store nexthop_num */ /* store nexthop_num */
stream_putc_at(s, nump, num); stream_putw_at(s, nump, num);
} else { } else {
stream_putc(s, 0); /* distance */ stream_putc(s, 0); /* distance */
stream_putl(s, 0); /* metric */ stream_putl(s, 0); /* metric */
stream_putc(s, 0); /* nexthop_num */ stream_putw(s, 0); /* nexthop_num */
} }
stream_putw_at(s, 0, stream_get_endp(s)); stream_putw_at(s, 0, stream_get_endp(s));

View file

@ -1141,7 +1141,7 @@ int zebra_send_rnh_update(struct rnh *rnh, struct zserv *client,
struct stream *s = NULL; struct stream *s = NULL;
struct route_entry *re; struct route_entry *re;
unsigned long nump; unsigned long nump;
uint8_t num; uint16_t num;
struct nexthop *nh; struct nexthop *nh;
struct route_node *rn; struct route_node *rn;
int ret; int ret;
@ -1212,7 +1212,7 @@ int zebra_send_rnh_update(struct rnh *rnh, struct zserv *client,
stream_putl(s, re->metric); stream_putl(s, re->metric);
num = 0; num = 0;
nump = stream_get_endp(s); nump = stream_get_endp(s);
stream_putc(s, 0); stream_putw(s, 0);
nhg = rib_get_fib_nhg(re); nhg = rib_get_fib_nhg(re);
for (ALL_NEXTHOPS_PTR(nhg, nh)) for (ALL_NEXTHOPS_PTR(nhg, nh))
@ -1240,13 +1240,13 @@ int zebra_send_rnh_update(struct rnh *rnh, struct zserv *client,
} }
} }
stream_putc_at(s, nump, num); stream_putw_at(s, nump, num);
} else { } else {
stream_putc(s, 0); // type stream_putc(s, 0); // type
stream_putw(s, 0); // instance stream_putw(s, 0); // instance
stream_putc(s, 0); // distance stream_putc(s, 0); // distance
stream_putl(s, 0); // metric stream_putl(s, 0); // metric
stream_putc(s, 0); // nexthops stream_putw(s, 0); // nexthops
} }
stream_putw_at(s, 0, stream_get_endp(s)); stream_putw_at(s, 0, stream_get_endp(s));

View file

@ -145,7 +145,7 @@ static int zebra_sr_policy_notify_update_client(struct zebra_sr_policy *policy,
stream_putc(s, nhlfe->distance); stream_putc(s, nhlfe->distance);
stream_putl(s, 0); /* metric - not available */ stream_putl(s, 0); /* metric - not available */
nump = stream_get_endp(s); nump = stream_get_endp(s);
stream_putc(s, 0); stream_putw(s, 0);
} }
zapi_nexthop_from_nexthop(&znh, nhlfe->nexthop); zapi_nexthop_from_nexthop(&znh, nhlfe->nexthop);
@ -155,7 +155,7 @@ static int zebra_sr_policy_notify_update_client(struct zebra_sr_policy *policy,
num++; num++;
} }
stream_putc_at(s, nump, num); stream_putw_at(s, nump, num);
stream_putw_at(s, 0, stream_get_endp(s)); stream_putw_at(s, 0, stream_get_endp(s));
client->nh_last_upd_time = monotime(NULL); client->nh_last_upd_time = monotime(NULL);