diff options
| -rw-r--r-- | doc/user/zebra.rst | 5 | ||||
| -rw-r--r-- | zebra/rib.h | 9 | ||||
| -rw-r--r-- | zebra/zapi_msg.c | 9 | ||||
| -rw-r--r-- | zebra/zebra_rib.c | 91 | ||||
| -rw-r--r-- | zebra/zebra_vty.c | 48 |
5 files changed, 59 insertions, 103 deletions
diff --git a/doc/user/zebra.rst b/doc/user/zebra.rst index e7e2e5d2ed..d7e768b710 100644 --- a/doc/user/zebra.rst +++ b/doc/user/zebra.rst @@ -974,7 +974,7 @@ unicast topology! Unreachable routes do not receive special treatment and do not cause fallback to a second lookup. -.. clicmd:: show ip rpf ADDR +.. clicmd:: show [ip|ipv6] rpf ADDR Performs a Multicast RPF lookup, as configured with ``ip multicast rpf-lookup-mode MODE``. ADDR specifies the multicast source address to look @@ -984,7 +984,6 @@ unicast topology! > show ip rpf 192.0.2.1 Routing entry for 192.0.2.0/24 using Unicast RIB - Known via "kernel", distance 0, metric 0, best * 198.51.100.1, via eth0 @@ -992,7 +991,7 @@ unicast topology! Indicates that a multicast source lookup for 192.0.2.1 would use an Unicast RIB entry for 192.0.2.0/24 with a gateway of 198.51.100.1. -.. clicmd:: show ip rpf +.. clicmd:: show [ip|ipv6] rpf Prints the entire Multicast RIB. Note that this is independent of the configured RPF lookup mode, the Multicast RIB may be printed yet not diff --git a/zebra/rib.h b/zebra/rib.h index 53ae63354e..70968d3900 100644 --- a/zebra/rib.h +++ b/zebra/rib.h @@ -392,12 +392,9 @@ extern void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type, 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_ipv4_multicast(vrf_id_t vrf_id, - struct in_addr addr, - struct route_node **rn_out); -extern struct route_entry *rib_match_ipv6_multicast(vrf_id_t vrf_id, - struct in6_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); extern struct route_entry *rib_lookup_ipv4(struct prefix_ipv4 *p, vrf_id_t vrf_id); diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index b7344d7cc1..59152df2f1 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -2236,17 +2236,18 @@ static void zread_nexthop_lookup_mrib(ZAPI_HANDLER_ARGS) { struct ipaddr addr; struct route_entry *re = NULL; + union g_addr gaddr; STREAM_GET_IPADDR(msg, &addr); switch (addr.ipa_type) { case IPADDR_V4: - re = rib_match_ipv4_multicast(zvrf_id(zvrf), addr.ipaddr_v4, - NULL); + gaddr.ipv4 = addr.ipaddr_v4; + re = rib_match_multicast(AFI_IP, zvrf_id(zvrf), &gaddr, NULL); break; case IPADDR_V6: - re = rib_match_ipv6_multicast(zvrf_id(zvrf), addr.ipaddr_v6, - NULL); + gaddr.ipv6 = addr.ipaddr_v6; + re = rib_match_multicast(AFI_IP6, zvrf_id(zvrf), &gaddr, NULL); break; case IPADDR_NONE: /* ??? */ diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index c42b8468f9..6c499b77d7 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -509,31 +509,28 @@ struct route_entry *rib_match(afi_t afi, safi_t safi, vrf_id_t vrf_id, return NULL; } -struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id, - struct in_addr addr, - struct route_node **rn_out) +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; - union g_addr gaddr = {.ipv4 = addr}; switch (zrouter.ipv4_multicast_mode) { case MCAST_MRIB_ONLY: - return rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, - rn_out); + return rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, rn_out); case MCAST_URIB_ONLY: - return rib_match(AFI_IP, SAFI_UNICAST, vrf_id, &gaddr, rn_out); + 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_IP, SAFI_MULTICAST, vrf_id, &gaddr, - &m_rn); + re = mre = rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, &m_rn); if (!mre) - re = ure = rib_match(AFI_IP, SAFI_UNICAST, vrf_id, - &gaddr, &u_rn); + re = ure = rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, + &u_rn); break; case MCAST_MIX_DISTANCE: - mre = rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); - ure = rib_match(AFI_IP, SAFI_UNICAST, vrf_id, &gaddr, &u_rn); + 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) @@ -542,8 +539,8 @@ struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id, re = ure; break; case MCAST_MIX_PFXLEN: - mre = rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); - ure = rib_match(AFI_IP, SAFI_UNICAST, vrf_id, &gaddr, &u_rn); + 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) @@ -558,10 +555,12 @@ struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id, if (IS_ZEBRA_DEBUG_RIB) { char buf[BUFSIZ]; - inet_ntop(AF_INET, &addr, buf, BUFSIZ); + inet_ntop(afi == AFI_IP ? AF_INET : AF_INET6, gaddr, buf, + BUFSIZ); - zlog_debug("%s: %s: vrf: %s(%u) found %s, using %s", __func__, - buf, vrf_id_to_name(vrf_id), vrf_id, + 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"); @@ -569,62 +568,6 @@ struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id, return re; } -struct route_entry *rib_match_ipv6_multicast(vrf_id_t vrf_id, - struct in6_addr addr, - struct route_node **rn_out) -{ - struct route_entry *re = NULL, *mre = NULL, *ure = NULL; - struct route_node *m_rn = NULL, *u_rn = NULL; - union g_addr gaddr = {.ipv6 = addr}; - - switch (zrouter.ipv4_multicast_mode) { - case MCAST_MRIB_ONLY: - return rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, - rn_out); - case MCAST_URIB_ONLY: - return rib_match(AFI_IP6, SAFI_UNICAST, vrf_id, &gaddr, rn_out); - case MCAST_NO_CONFIG: - case MCAST_MIX_MRIB_FIRST: - re = mre = rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, - &m_rn); - if (!mre) - re = ure = rib_match(AFI_IP6, SAFI_UNICAST, vrf_id, - &gaddr, &u_rn); - break; - case MCAST_MIX_DISTANCE: - mre = rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); - ure = rib_match(AFI_IP6, 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_IP6, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); - ure = rib_match(AFI_IP6, 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) - zlog_debug("%s: %pI6: vrf: %s(%u) found %s, using %s", __func__, - &addr, 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; -} - struct route_entry *rib_lookup_ipv4(struct prefix_ipv4 *p, vrf_id_t vrf_id) { struct route_table *table; diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index a4aef36dbd..6d61430029 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -131,11 +131,12 @@ DEFUN (no_ip_multicast_mode, } -DEFUN (show_ip_rpf, +DEFPY (show_ip_rpf, show_ip_rpf_cmd, - "show ip rpf [json]", + "show [ip$ip|ipv6$ipv6] rpf [json]", SHOW_STR IP_STR + IPV6_STR "Display RPF information for multicast source\n" JSON_STR) { @@ -144,32 +145,46 @@ DEFUN (show_ip_rpf, .multi = false, }; - return do_show_ip_route(vty, VRF_DEFAULT_NAME, AFI_IP, SAFI_MULTICAST, - false, uj, 0, NULL, false, 0, 0, 0, false, - &ctx); + return do_show_ip_route(vty, VRF_DEFAULT_NAME, ip ? AFI_IP : AFI_IP6, + SAFI_MULTICAST, false, uj, 0, NULL, false, 0, 0, + 0, false, &ctx); } -DEFUN (show_ip_rpf_addr, +DEFPY (show_ip_rpf_addr, show_ip_rpf_addr_cmd, - "show ip rpf A.B.C.D", + "show ip rpf A.B.C.D$address", SHOW_STR IP_STR "Display RPF information for multicast source\n" "IP multicast source address (e.g. 10.0.0.0)\n") { - int idx_ipv4 = 3; - struct in_addr addr; struct route_node *rn; struct route_entry *re; - int ret; - ret = inet_aton(argv[idx_ipv4]->arg, &addr); - if (ret == 0) { - vty_out(vty, "%% Malformed address\n"); - return CMD_WARNING; - } + re = rib_match_multicast(AFI_IP, VRF_DEFAULT, (union g_addr *)&address, + &rn); + + if (re) + vty_show_ip_route_detail(vty, rn, 1, false, false); + else + vty_out(vty, "%% No match for RPF lookup\n"); + + return CMD_SUCCESS; +} + +DEFPY (show_ipv6_rpf_addr, + show_ipv6_rpf_addr_cmd, + "show ipv6 rpf X:X::X:X$address", + SHOW_STR + IPV6_STR + "Display RPF information for multicast source\n" + "IPv6 multicast source address\n") +{ + struct route_node *rn; + struct route_entry *re; - re = rib_match_ipv4_multicast(VRF_DEFAULT, addr, &rn); + re = rib_match_multicast(AFI_IP6, VRF_DEFAULT, (union g_addr *)&address, + &rn); if (re) vty_show_ip_route_detail(vty, rn, 1, false, false); @@ -4576,6 +4591,7 @@ void zebra_vty_init(void) install_element(VIEW_NODE, &show_ip_rpf_cmd); install_element(VIEW_NODE, &show_ip_rpf_addr_cmd); + install_element(VIEW_NODE, &show_ipv6_rpf_addr_cmd); install_element(CONFIG_NODE, &ip_nht_default_route_cmd); install_element(CONFIG_NODE, &no_ip_nht_default_route_cmd); |
