diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c index 15467ae2c936..34a80c4095b6 100644 --- a/pimd/pim6_cmd.c +++ b/pimd/pim6_cmd.c @@ -33,12 +33,14 @@ #include "pimd.h" #include "pim6_cmd.h" +#include "pim_cmd_common.h" #include "pim_vty.h" #include "lib/northbound_cli.h" #include "pim_errors.h" #include "pim_nb.h" #include "pim_addr.h" -#include "pim_cmd_common.h" +#include "pim_nht.h" + #ifndef VTYSH_EXTRACT_PL #include "pimd/pim6_cmd_clippy.c" @@ -791,6 +793,82 @@ DEFPY (show_ipv6_pim_neighbor_vrf_all, return CMD_SUCCESS; } +DEFPY (show_ipv6_pim_nexthop, + show_ipv6_pim_nexthop_cmd, + "show ipv6 pim [vrf NAME] nexthop", + SHOW_STR + IPV6_STR + PIM_STR + VRF_CMD_HELP_STR + "PIM cached nexthop rpf information\n") +{ + struct vrf *v; + + v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME); + + if (!v) + return CMD_WARNING; + + pim_show_nexthop(v->info, vty); + + return CMD_SUCCESS; +} + +DEFPY (show_ipv6_pim_nexthop_lookup, + show_ipv6_pim_nexthop_lookup_cmd, + "show ipv6 pim [vrf NAME] nexthop-lookup X:X::X:X$source X:X::X:X$group", + SHOW_STR + IPV6_STR + PIM_STR + VRF_CMD_HELP_STR + "PIM cached nexthop rpf lookup\n" + "Source/RP address\n" + "Multicast Group address\n") +{ + struct prefix nht_p; + int result = 0; + pim_addr src_addr, grp_addr; + pim_addr vif_source; + struct prefix grp; + struct pim_nexthop nexthop; + char nexthop_addr_str[PIM_ADDRSTRLEN]; + struct vrf *v; + + v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME); + + if (!v) + return CMD_WARNING; + + if ((!IPV6_ADDR_SAME(&source, &in6addr_any)) && + (!IPV6_ADDR_SAME(&group, &in6addr_any))) { + memcpy(&src_addr, &source, sizeof(source)); + memcpy(&grp_addr, &group, sizeof(group)); + } else + return CMD_WARNING; + + if (!pim_rp_set_upstream_addr(v->info, &vif_source, src_addr, grp_addr)) + return CMD_SUCCESS; + + pim_addr_to_prefix(&nht_p, vif_source); + pim_addr_to_prefix(&grp, grp_addr); + memset(&nexthop, 0, sizeof(nexthop)); + + result = pim_ecmp_nexthop_lookup(v->info, &nexthop, &nht_p, &grp, 0); + + if (!result) { + vty_out(vty, + "Nexthop Lookup failed, no usable routes returned.\n"); + return CMD_SUCCESS; + } + + pim_addr_dump("", &nexthop.mrib_nexthop_addr, + nexthop_addr_str, sizeof(nexthop_addr_str)); + vty_out(vty, "Group %s --- Nexthop %s Interface %s\n", group_str, + nexthop_addr_str, nexthop.interface->name); + + return CMD_SUCCESS; +} + void pim_cmd_init(void) { if_cmd_init(pim_interface_config_write); @@ -845,4 +923,6 @@ void pim_cmd_init(void) install_element(VIEW_NODE, &show_ipv6_pim_local_membership_cmd); install_element(VIEW_NODE, &show_ipv6_pim_neighbor_cmd); install_element(VIEW_NODE, &show_ipv6_pim_neighbor_vrf_all_cmd); + install_element(VIEW_NODE, &show_ipv6_pim_nexthop_cmd); + install_element(VIEW_NODE, &show_ipv6_pim_nexthop_lookup_cmd); } diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index f370f923176f..478f578b0b94 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -4226,7 +4226,7 @@ DEFUN (show_ip_pim_rpf_vrf_all, return CMD_SUCCESS; } -DEFUN (show_ip_pim_nexthop, +DEFPY (show_ip_pim_nexthop, show_ip_pim_nexthop_cmd, "show ip pim [vrf NAME] nexthop", SHOW_STR @@ -4235,20 +4235,21 @@ DEFUN (show_ip_pim_nexthop, VRF_CMD_HELP_STR "PIM cached nexthop rpf information\n") { - int idx = 2; - struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx); + struct vrf *v; - if (!vrf) + v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME); + + if (!v) return CMD_WARNING; - pim_show_nexthop(vrf->info, vty); + pim_show_nexthop(v->info, vty); return CMD_SUCCESS; } -DEFUN (show_ip_pim_nexthop_lookup, +DEFPY (show_ip_pim_nexthop_lookup, show_ip_pim_nexthop_lookup_cmd, - "show ip pim [vrf NAME] nexthop-lookup A.B.C.D A.B.C.D", + "show ip pim [vrf NAME] nexthop-lookup A.B.C.D$source A.B.C.D$group", SHOW_STR IP_STR PIM_STR @@ -4259,61 +4260,44 @@ DEFUN (show_ip_pim_nexthop_lookup, { struct prefix nht_p; int result = 0; - struct in_addr src_addr, grp_addr; - struct in_addr vif_source; - const char *addr_str, *addr_str1; + pim_addr vif_source; + pim_addr src_addr, grp_addr; struct prefix grp; struct pim_nexthop nexthop; char nexthop_addr_str[PREFIX_STRLEN]; - char grp_str[PREFIX_STRLEN]; - int idx = 2; - struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx); + struct vrf *v; - if (!vrf) - return CMD_WARNING; + v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME); - argv_find(argv, argc, "A.B.C.D", &idx); - addr_str = argv[idx]->arg; - result = inet_pton(AF_INET, addr_str, &src_addr); - if (result <= 0) { - vty_out(vty, "Bad unicast address %s: errno=%d: %s\n", addr_str, - errno, safe_strerror(errno)); + if (!v) return CMD_WARNING; - } - if (pim_is_group_224_4(src_addr)) { + if (pim_is_group_224_4(source)) { vty_out(vty, "Invalid argument. Expected Valid Source Address.\n"); return CMD_WARNING; } - addr_str1 = argv[idx + 1]->arg; - result = inet_pton(AF_INET, addr_str1, &grp_addr); - if (result <= 0) { - vty_out(vty, "Bad unicast address %s: errno=%d: %s\n", addr_str, - errno, safe_strerror(errno)); - return CMD_WARNING; - } - - if (!pim_is_group_224_4(grp_addr)) { + if (!pim_is_group_224_4(group)) { vty_out(vty, "Invalid argument. Expected Valid Multicast Group Address.\n"); return CMD_WARNING; } - if (!pim_rp_set_upstream_addr(vrf->info, &vif_source, src_addr, - grp_addr)) + if ((source.s_addr != INADDR_ANY) && (group.s_addr != INADDR_ANY)) { + memcpy(&src_addr, &source, sizeof(source)); + memcpy(&grp_addr, &group, sizeof(group)); + } else + return CMD_WARNING; + + if (!pim_rp_set_upstream_addr(v->info, &vif_source, src_addr, grp_addr)) return CMD_SUCCESS; - nht_p.family = AF_INET; - nht_p.prefixlen = IPV4_MAX_BITLEN; - nht_p.u.prefix4 = vif_source; - grp.family = AF_INET; - grp.prefixlen = IPV4_MAX_BITLEN; - grp.u.prefix4 = grp_addr; + pim_addr_to_prefix(&nht_p, vif_source); + pim_addr_to_prefix(&grp, grp_addr); memset(&nexthop, 0, sizeof(nexthop)); - result = pim_ecmp_nexthop_lookup(vrf->info, &nexthop, &nht_p, &grp, 0); + result = pim_ecmp_nexthop_lookup(v->info, &nexthop, &nht_p, &grp, 0); if (!result) { vty_out(vty, @@ -4321,10 +4305,9 @@ DEFUN (show_ip_pim_nexthop_lookup, return CMD_SUCCESS; } - pim_addr_dump("", &grp, grp_str, sizeof(grp_str)); pim_addr_dump("", &nexthop.mrib_nexthop_addr, nexthop_addr_str, sizeof(nexthop_addr_str)); - vty_out(vty, "Group %s --- Nexthop %s Interface %s \n", grp_str, + vty_out(vty, "Group %s --- Nexthop %s Interface %s \n", group_str, nexthop_addr_str, nexthop.interface->name); return CMD_SUCCESS;