Skip to content

Commit

Permalink
pim6d: Adding show ipv6 pim nexthop and nexthop-lookup commands
Browse files Browse the repository at this point in the history
Adding new show commands to display pim nexthops and
pim nexthop lookups received from zebra.

Signed-off-by: Sai Gomathi N <nsaigomathi@vmware.com>
  • Loading branch information
SaiGomathiN committed Mar 23, 2022
1 parent 22fe5b4 commit e9f394c
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 44 deletions.
82 changes: 81 additions & 1 deletion pimd/pim6_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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?>", &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);
Expand Down Expand Up @@ -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);
}
69 changes: 26 additions & 43 deletions pimd/pim_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -4259,72 +4260,54 @@ 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,
"Nexthop Lookup failed, no usable routes returned.\n");
return CMD_SUCCESS;
}

pim_addr_dump("<grp?>", &grp, grp_str, sizeof(grp_str));
pim_addr_dump("<nexthop?>", &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;
Expand Down

0 comments on commit e9f394c

Please sign in to comment.