summaryrefslogtreecommitdiff
path: root/zebra/zapi_msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/zapi_msg.c')
-rw-r--r--zebra/zapi_msg.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index d269cdd015..ab55998af0 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -640,10 +640,15 @@ int zsend_redistribute_route(int cmd, struct zserv *client,
* (Otherwise we would need to implement sending NHT updates for the result of
* this "URIB-MRIB-combined" table, but we only decide that here on the fly,
* so it'd be rather complex to do NHT for.)
+ *
+ * 9/19/24 NEB I've updated this API to include the SAFI in the lookup
+ * request and response. This allows PIM to do a syncronous lookup for the
+ * correct table along side NHT.
+ * This also makes this a more generic synchronous lookup not specifically
+ * tied to the mrib.
*/
-static int zsend_nexthop_lookup_mrib(struct zserv *client, struct ipaddr *addr,
- struct route_entry *re,
- struct zebra_vrf *zvrf)
+static int zsend_nexthop_lookup(struct zserv *client, struct ipaddr *addr, struct route_entry *re,
+ struct route_node *rn, struct zebra_vrf *zvrf, safi_t safi)
{
struct stream *s;
unsigned long nump;
@@ -655,14 +660,16 @@ static int zsend_nexthop_lookup_mrib(struct zserv *client, struct ipaddr *addr,
stream_reset(s);
/* Fill in result. */
- zclient_create_header(s, ZEBRA_NEXTHOP_LOOKUP_MRIB, zvrf_id(zvrf));
+ zclient_create_header(s, ZEBRA_NEXTHOP_LOOKUP, zvrf_id(zvrf));
stream_put_ipaddr(s, addr);
- if (re) {
+ if (re && rn) {
struct nexthop_group *nhg;
stream_putc(s, re->distance);
stream_putl(s, re->metric);
+ stream_putw(s, rn->p.prefixlen);
+
num = 0;
/* remember position for nexthop_num */
nump = stream_get_endp(s);
@@ -679,6 +686,7 @@ static int zsend_nexthop_lookup_mrib(struct zserv *client, struct ipaddr *addr,
} else {
stream_putc(s, 0); /* distance */
stream_putl(s, 0); /* metric */
+ stream_putw(s, 0); /* prefix len */
stream_putw(s, 0); /* nexthop_num */
}
@@ -2315,33 +2323,37 @@ static void zread_route_del(ZAPI_HANDLER_ARGS)
}
}
-/* MRIB Nexthop lookup for IPv4. */
-static void zread_nexthop_lookup_mrib(ZAPI_HANDLER_ARGS)
+/* Syncronous Nexthop lookup. */
+static void zread_nexthop_lookup(ZAPI_HANDLER_ARGS)
{
struct ipaddr addr;
struct route_entry *re = NULL;
+ struct route_node *rn = NULL;
union g_addr gaddr;
+ afi_t afi = AFI_IP;
+ safi_t safi = SAFI_UNICAST;
STREAM_GET_IPADDR(msg, &addr);
+ STREAM_GETC(msg, safi);
switch (addr.ipa_type) {
case IPADDR_V4:
gaddr.ipv4 = addr.ipaddr_v4;
- re = rib_match_multicast(AFI_IP, zvrf_id(zvrf), &gaddr, NULL);
+ afi = AFI_IP;
break;
case IPADDR_V6:
gaddr.ipv6 = addr.ipaddr_v6;
- re = rib_match_multicast(AFI_IP6, zvrf_id(zvrf), &gaddr, NULL);
+ afi = AFI_IP6;
break;
case IPADDR_NONE:
/* ??? */
goto stream_failure;
}
- zsend_nexthop_lookup_mrib(client, &addr, re, zvrf);
+ re = rib_match(afi, safi, zvrf_id(zvrf), &gaddr, &rn);
stream_failure:
- return;
+ zsend_nexthop_lookup(client, &addr, re, rn, zvrf, safi);
}
/* Register zebra server router-id information. Send current router-id */
@@ -4027,7 +4039,7 @@ void (*const zserv_handlers[])(ZAPI_HANDLER_ARGS) = {
[ZEBRA_REDISTRIBUTE_DELETE] = zebra_redistribute_delete,
[ZEBRA_REDISTRIBUTE_DEFAULT_ADD] = zebra_redistribute_default_add,
[ZEBRA_REDISTRIBUTE_DEFAULT_DELETE] = zebra_redistribute_default_delete,
- [ZEBRA_NEXTHOP_LOOKUP_MRIB] = zread_nexthop_lookup_mrib,
+ [ZEBRA_NEXTHOP_LOOKUP] = zread_nexthop_lookup,
[ZEBRA_HELLO] = zread_hello,
[ZEBRA_NEXTHOP_REGISTER] = zread_rnh_register,
[ZEBRA_NEXTHOP_UNREGISTER] = zread_rnh_unregister,