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.