summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/log.c2
-rw-r--r--lib/zclient.h2
-rw-r--r--pimd/pim_zlookup.c5
-rw-r--r--zebra/rib.h6
-rw-r--r--zebra/zapi_msg.c36
-rw-r--r--zebra/zebra_rib.c61
6 files changed, 31 insertions, 81 deletions
diff --git a/lib/log.c b/lib/log.c
index 2b049cebe4..bc1ed5c5cc 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -358,7 +358,7 @@ static const struct zebra_desc_table command_types[] = {
DESC_ENTRY(ZEBRA_BFD_CLIENT_DEREGISTER),
DESC_ENTRY(ZEBRA_INTERFACE_ENABLE_RADV),
DESC_ENTRY(ZEBRA_INTERFACE_DISABLE_RADV),
- DESC_ENTRY(ZEBRA_NEXTHOP_LOOKUP_MRIB),
+ DESC_ENTRY(ZEBRA_NEXTHOP_LOOKUP),
DESC_ENTRY(ZEBRA_INTERFACE_LINK_PARAMS),
DESC_ENTRY(ZEBRA_MPLS_LABELS_ADD),
DESC_ENTRY(ZEBRA_MPLS_LABELS_DELETE),
diff --git a/lib/zclient.h b/lib/zclient.h
index 6da9558aa5..2385a8a219 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -131,7 +131,7 @@ typedef enum {
ZEBRA_BFD_CLIENT_DEREGISTER,
ZEBRA_INTERFACE_ENABLE_RADV,
ZEBRA_INTERFACE_DISABLE_RADV,
- ZEBRA_NEXTHOP_LOOKUP_MRIB,
+ ZEBRA_NEXTHOP_LOOKUP,
ZEBRA_INTERFACE_LINK_PARAMS,
ZEBRA_MPLS_LABELS_ADD,
ZEBRA_MPLS_LABELS_DELETE,
diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c
index 5d344f1f66..e2644c531b 100644
--- a/pimd/pim_zlookup.c
+++ b/pimd/pim_zlookup.c
@@ -162,7 +162,7 @@ static int zclient_read_nexthop(struct pim_instance *pim,
s = zlookup->ibuf;
- while (command != ZEBRA_NEXTHOP_LOOKUP_MRIB) {
+ while (command != ZEBRA_NEXTHOP_LOOKUP) {
stream_reset(s);
err = zclient_read_header(s, zlookup->sock, &length, &marker,
&version, &vrf_id, &command);
@@ -337,8 +337,9 @@ static int zclient_lookup_nexthop_once(struct pim_instance *pim,
s = zlookup->obuf;
stream_reset(s);
- zclient_create_header(s, ZEBRA_NEXTHOP_LOOKUP_MRIB, pim->vrf->vrf_id);
+ zclient_create_header(s, ZEBRA_NEXTHOP_LOOKUP, pim->vrf->vrf_id);
stream_put_ipaddr(s, &ipaddr);
+ stream_putc(s, SAFI_MULTICAST); // TODO NEB Set the real safi
stream_putw_at(s, 0, stream_get_endp(s));
ret = writen(zlookup->sock, s->data, stream_get_endp(s));
diff --git a/zebra/rib.h b/zebra/rib.h
index 5fedb07335..8484fe1291 100644
--- a/zebra/rib.h
+++ b/zebra/rib.h
@@ -402,11 +402,7 @@ extern void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
bool fromkernel);
extern struct route_entry *rib_match(afi_t afi, safi_t safi, vrf_id_t vrf_id,
- const union g_addr *addr,
- struct route_node **rn_out);
-extern struct route_entry *rib_match_multicast(afi_t afi, vrf_id_t vrf_id,
- union g_addr *gaddr,
- struct route_node **rn_out);
+ const union g_addr *addr, struct route_node **rn_out);
extern void rib_update(enum rib_update_event event);
extern void rib_update_table(struct route_table *table,
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,
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index e64a620f00..51458e4e84 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -503,7 +503,7 @@ struct route_entry *rib_match(afi_t afi, safi_t safi, vrf_id_t vrf_id,
/* Lookup table. */
table = zebra_vrf_table(afi, safi, vrf_id);
if (!table)
- return 0;
+ return NULL;
memset(&p, 0, sizeof(p));
p.family = afi;
@@ -552,65 +552,6 @@ struct route_entry *rib_match(afi_t afi, safi_t safi, vrf_id_t vrf_id,
return NULL;
}
-struct route_entry *rib_match_multicast(afi_t afi, vrf_id_t vrf_id,
- union g_addr *gaddr,
- struct route_node **rn_out)
-{
- struct route_entry *re = NULL, *mre = NULL, *ure = NULL;
- struct route_node *m_rn = NULL, *u_rn = NULL;
-
- switch (zrouter.ipv4_multicast_mode) {
- case MCAST_MRIB_ONLY:
- return rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, rn_out);
- case MCAST_URIB_ONLY:
- return rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, rn_out);
- case MCAST_NO_CONFIG:
- case MCAST_MIX_MRIB_FIRST:
- re = mre = rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, &m_rn);
- if (!mre)
- re = ure = rib_match(afi, SAFI_UNICAST, vrf_id, gaddr,
- &u_rn);
- break;
- case MCAST_MIX_DISTANCE:
- mre = rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, &m_rn);
- ure = rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, &u_rn);
- if (mre && ure)
- re = ure->distance < mre->distance ? ure : mre;
- else if (mre)
- re = mre;
- else if (ure)
- re = ure;
- break;
- case MCAST_MIX_PFXLEN:
- mre = rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, &m_rn);
- ure = rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, &u_rn);
- if (mre && ure)
- re = u_rn->p.prefixlen > m_rn->p.prefixlen ? ure : mre;
- else if (mre)
- re = mre;
- else if (ure)
- re = ure;
- break;
- }
-
- if (rn_out)
- *rn_out = (re == mre) ? m_rn : u_rn;
-
- if (IS_ZEBRA_DEBUG_RIB) {
- char buf[BUFSIZ];
- inet_ntop(afi == AFI_IP ? AF_INET : AF_INET6, gaddr, buf,
- BUFSIZ);
-
- zlog_debug("%s: %s: %pRN vrf: %s(%u) found %s, using %s",
- __func__, buf, (re == mre) ? m_rn : u_rn,
- vrf_id_to_name(vrf_id), vrf_id,
- mre ? (ure ? "MRIB+URIB" : "MRIB")
- : ure ? "URIB" : "nothing",
- re == ure ? "URIB" : re == mre ? "MRIB" : "none");
- }
- return re;
-}
-
/*
* Is this RIB labeled-unicast? It must be of type BGP and all paths
* (nexthops) must have a label.