#include "plist.h"
#include "hash.h"
#include "nexthop.h"
+#include "vrf.h"
#include "pimd.h"
#include "pim_mroute.h"
static struct cmd_node debug_node = {DEBUG_NODE, "", 1};
+static struct vrf *pim_cmd_lookup_vrf(struct vty *vty, struct cmd_token *argv[],
+ const int argc, int *idx)
+{
+ struct vrf *vrf;
+
+ if (argv_find(argv, argc, "NAME", idx))
+ vrf = vrf_lookup_by_name(argv[*idx]->arg);
+ else
+ vrf = vrf_lookup_by_id(VRF_DEFAULT);
+
+ if (!vrf)
+ vty_out(vty, "Specified VRF: %s does not exist\n",
+ argv[*idx]->arg);
+
+ return vrf;
+}
+
static void pim_if_membership_clear(struct interface *ifp)
{
struct pim_interface *pim_ifp;
return ip_no_msdp_peer_cmd_worker(vty, pim, argv[4]->arg);
}
-static int ip_msdp_mesh_group_member_cmd_worker(struct vty *vty, const char *mg,
- const char *mbr)
+static int ip_msdp_mesh_group_member_cmd_worker(struct vty *vty,
+ struct pim_instance *pim,
+ const char *mg, const char *mbr)
{
enum pim_msdp_err result;
struct in_addr mbr_ip;
return CMD_WARNING_CONFIG_FAILED;
}
- result = pim_msdp_mg_mbr_add(pimg, mg, mbr_ip);
+ result = pim_msdp_mg_mbr_add(pim, mg, mbr_ip);
switch (result) {
case PIM_MSDP_ERR_NONE:
break;
"mesh group member\n"
"peer ip address\n")
{
- return ip_msdp_mesh_group_member_cmd_worker(vty, argv[3]->arg,
+ PIM_DECLVAR_CONTEXT(vrf, pim);
+ return ip_msdp_mesh_group_member_cmd_worker(vty, pim, argv[3]->arg,
argv[5]->arg);
}
static int ip_no_msdp_mesh_group_member_cmd_worker(struct vty *vty,
+ struct pim_instance *pim,
const char *mg,
const char *mbr)
{
return CMD_WARNING_CONFIG_FAILED;
}
- result = pim_msdp_mg_mbr_del(pimg, mg, mbr_ip);
+ result = pim_msdp_mg_mbr_del(pim, mg, mbr_ip);
switch (result) {
case PIM_MSDP_ERR_NONE:
break;
"mesh group member\n"
"peer ip address\n")
{
- return ip_no_msdp_mesh_group_member_cmd_worker(vty, argv[4]->arg,
+ PIM_DECLVAR_CONTEXT(vrf, pim);
+ return ip_no_msdp_mesh_group_member_cmd_worker(vty, pim, argv[4]->arg,
argv[6]->arg);
}
-static int ip_msdp_mesh_group_source_cmd_worker(struct vty *vty, const char *mg,
- const char *src)
+static int ip_msdp_mesh_group_source_cmd_worker(struct vty *vty,
+ struct pim_instance *pim,
+ const char *mg, const char *src)
{
enum pim_msdp_err result;
struct in_addr src_ip;
return CMD_WARNING_CONFIG_FAILED;
}
- result = pim_msdp_mg_src_add(pimg, mg, src_ip);
+ result = pim_msdp_mg_src_add(pim, mg, src_ip);
switch (result) {
case PIM_MSDP_ERR_NONE:
break;
"mesh group local address\n"
"source ip address for the TCP connection\n")
{
- return ip_msdp_mesh_group_source_cmd_worker(vty, argv[3]->arg,
+ PIM_DECLVAR_CONTEXT(vrf, pim);
+ return ip_msdp_mesh_group_source_cmd_worker(vty, pim, argv[3]->arg,
argv[5]->arg);
}
static int ip_no_msdp_mesh_group_source_cmd_worker(struct vty *vty,
+ struct pim_instance *pim,
const char *mg)
{
enum pim_msdp_err result;
- result = pim_msdp_mg_src_del(pimg, mg);
+ result = pim_msdp_mg_src_del(pim, mg);
switch (result) {
case PIM_MSDP_ERR_NONE:
break;
return result ? CMD_WARNING_CONFIG_FAILED : CMD_SUCCESS;
}
-static int ip_no_msdp_mesh_group_cmd_worker(struct vty *vty, const char *mg)
+static int ip_no_msdp_mesh_group_cmd_worker(struct vty *vty,
+ struct pim_instance *pim,
+ const char *mg)
{
enum pim_msdp_err result;
- result = pim_msdp_mg_del(pimg, mg);
+ result = pim_msdp_mg_del(pim, mg);
switch (result) {
case PIM_MSDP_ERR_NONE:
break;
"mesh group source\n"
"mesh group local address\n")
{
+ PIM_DECLVAR_CONTEXT(vrf, pim);
if (argc == 7)
- return ip_no_msdp_mesh_group_cmd_worker(vty, argv[6]->arg);
+ return ip_no_msdp_mesh_group_cmd_worker(vty, pim, argv[6]->arg);
else
- return ip_no_msdp_mesh_group_source_cmd_worker(vty,
+ return ip_no_msdp_mesh_group_source_cmd_worker(vty, pim,
argv[4]->arg);
}
json_object_free(json);
}
-static void ip_msdp_show_mesh_group(struct vty *vty, u_char uj)
+static void ip_msdp_show_mesh_group(struct vty *vty, struct pim_instance *pim,
+ u_char uj)
{
struct listnode *mbrnode;
struct pim_msdp_mg_mbr *mbr;
- struct pim_msdp_mg *mg = pimg->msdp.mg;
+ struct pim_msdp_mg *mg = pim->msdp.mg;
char mbr_str[INET_ADDRSTRLEN];
char src_str[INET_ADDRSTRLEN];
char state_str[PIM_MSDP_STATE_STRLEN];
DEFUN (show_ip_msdp_mesh_group,
show_ip_msdp_mesh_group_cmd,
- "show ip msdp mesh-group [json]",
+ "show ip msdp mesh-group [vrf NAME] [json]",
SHOW_STR
IP_STR
MSDP_STR
"JavaScript Object Notation\n")
{
u_char uj = use_json(argc, argv);
- ip_msdp_show_mesh_group(vty, uj);
+ int idx = 3;
+ struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
+
+ if (!vrf)
+ return CMD_WARNING;
+
+ ip_msdp_show_mesh_group(vty, vrf->info, uj);
return CMD_SUCCESS;
}
-static void ip_msdp_show_peers(struct vty *vty, u_char uj)
+static void ip_msdp_show_peers(struct vty *vty, struct pim_instance *pim,
+ u_char uj)
{
struct listnode *mpnode;
struct pim_msdp_peer *mp;
"Peer Local State Uptime SaCnt\n");
}
- for (ALL_LIST_ELEMENTS_RO(pimg->msdp.peer_list, mpnode, mp)) {
+ for (ALL_LIST_ELEMENTS_RO(pim->msdp.peer_list, mpnode, mp)) {
if (mp->state == PIM_MSDP_ESTABLISHED) {
now = pim_time_monotonic_sec();
pim_time_uptime(timebuf, sizeof(timebuf),
}
}
-static void ip_msdp_show_peers_detail(struct vty *vty, const char *peer,
- u_char uj)
+static void ip_msdp_show_peers_detail(struct vty *vty, struct pim_instance *pim,
+ const char *peer, u_char uj)
{
struct listnode *mpnode;
struct pim_msdp_peer *mp;
json = json_object_new_object();
}
- for (ALL_LIST_ELEMENTS_RO(pimg->msdp.peer_list, mpnode, mp)) {
+ for (ALL_LIST_ELEMENTS_RO(pim->msdp.peer_list, mpnode, mp)) {
pim_inet4_dump("<peer?>", mp->peer, peer_str, sizeof(peer_str));
if (strcmp(peer, "detail") && strcmp(peer, peer_str))
continue;
DEFUN (show_ip_msdp_peer_detail,
show_ip_msdp_peer_detail_cmd,
- "show ip msdp peer [detail|A.B.C.D] [json]",
+ "show ip msdp peer [vrf NAME] [detail|A.B.C.D] [json]",
SHOW_STR
IP_STR
MSDP_STR
"JavaScript Object Notation\n")
{
u_char uj = use_json(argc, argv);
+ int idx = 3;
+ struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
if (uj)
argc--;
if (argc > 4)
- ip_msdp_show_peers_detail(vty, argv[4]->arg, uj);
+ ip_msdp_show_peers_detail(vty, vrf->info, argv[4]->arg, uj);
else
- ip_msdp_show_peers(vty, uj);
+ ip_msdp_show_peers(vty, vrf->info, uj);
return CMD_SUCCESS;
}
-static void ip_msdp_show_sa(struct vty *vty, u_char uj)
+static void ip_msdp_show_sa(struct vty *vty, struct pim_instance *pim,
+ u_char uj)
{
struct listnode *sanode;
struct pim_msdp_sa *sa;
"Source Group RP Local SPT Uptime\n");
}
- for (ALL_LIST_ELEMENTS_RO(pimg->msdp.sa_list, sanode, sa)) {
+ for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) {
now = pim_time_monotonic_sec();
pim_time_uptime(timebuf, sizeof(timebuf), now - sa->uptime);
pim_inet4_dump("<src?>", sa->sg.src, src_str, sizeof(src_str));
}
}
-static void ip_msdp_show_sa_detail(struct vty *vty, u_char uj)
+static void ip_msdp_show_sa_detail(struct vty *vty, struct pim_instance *pim,
+ u_char uj)
{
struct listnode *sanode;
struct pim_msdp_sa *sa;
json = json_object_new_object();
}
- for (ALL_LIST_ELEMENTS_RO(pimg->msdp.sa_list, sanode, sa)) {
+ for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) {
pim_inet4_dump("<src?>", sa->sg.src, src_str, sizeof(src_str));
pim_inet4_dump("<grp?>", sa->sg.grp, grp_str, sizeof(grp_str));
ip_msdp_show_sa_entry_detail(sa, src_str, grp_str, vty, uj,
DEFUN (show_ip_msdp_sa_detail,
show_ip_msdp_sa_detail_cmd,
- "show ip msdp sa detail [json]",
+ "show ip msdp sa [vrf NAME] detail [json]",
SHOW_STR
IP_STR
MSDP_STR
"JavaScript Object Notation\n")
{
u_char uj = use_json(argc, argv);
- ip_msdp_show_sa_detail(vty, uj);
+ int idx = 3;
+ struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
+
+ if (!vrf)
+ return CMD_WARNING;
+
+ ip_msdp_show_sa_detail(vty, vrf->info, uj);
return CMD_SUCCESS;
}
-static void ip_msdp_show_sa_addr(struct vty *vty, const char *addr, u_char uj)
+static void ip_msdp_show_sa_addr(struct vty *vty, struct pim_instance *pim,
+ const char *addr, u_char uj)
{
struct listnode *sanode;
struct pim_msdp_sa *sa;
json = json_object_new_object();
}
- for (ALL_LIST_ELEMENTS_RO(pimg->msdp.sa_list, sanode, sa)) {
+ for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) {
pim_inet4_dump("<src?>", sa->sg.src, src_str, sizeof(src_str));
pim_inet4_dump("<grp?>", sa->sg.grp, grp_str, sizeof(grp_str));
if (!strcmp(addr, src_str) || !strcmp(addr, grp_str)) {
}
}
-static void ip_msdp_show_sa_sg(struct vty *vty, const char *src,
- const char *grp, u_char uj)
+static void ip_msdp_show_sa_sg(struct vty *vty, struct pim_instance *pim,
+ const char *src, const char *grp, u_char uj)
{
struct listnode *sanode;
struct pim_msdp_sa *sa;
json = json_object_new_object();
}
- for (ALL_LIST_ELEMENTS_RO(pimg->msdp.sa_list, sanode, sa)) {
+ for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) {
pim_inet4_dump("<src?>", sa->sg.src, src_str, sizeof(src_str));
pim_inet4_dump("<grp?>", sa->sg.grp, grp_str, sizeof(grp_str));
if (!strcmp(src, src_str) && !strcmp(grp, grp_str)) {
DEFUN (show_ip_msdp_sa_sg,
show_ip_msdp_sa_sg_cmd,
- "show ip msdp sa [A.B.C.D [A.B.C.D]] [json]",
+ "show ip msdp sa [vrf NAME] [A.B.C.D [A.B.C.D]] [json]",
SHOW_STR
IP_STR
MSDP_STR
"JavaScript Object Notation\n")
{
u_char uj = use_json(argc, argv);
-
+ struct vrf *vrf;
int idx = 0;
+
+ vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
+
+ if (!vrf)
+ return CMD_WARNING;
+
char *src_ip = argv_find(argv, argc, "A.B.C.D", &idx) ? argv[idx++]->arg
: NULL;
char *grp_ip = idx < argc && argv_find(argv, argc, "A.B.C.D", &idx)
: NULL;
if (src_ip && grp_ip)
- ip_msdp_show_sa_sg(vty, src_ip, grp_ip, uj);
+ ip_msdp_show_sa_sg(vty, vrf->info, src_ip, grp_ip, uj);
else if (src_ip)
- ip_msdp_show_sa_addr(vty, src_ip, uj);
+ ip_msdp_show_sa_addr(vty, vrf->info, src_ip, uj);
else
- ip_msdp_show_sa(vty, uj);
+ ip_msdp_show_sa(vty, vrf->info, uj);
return CMD_SUCCESS;
}
install_element(CONFIG_NODE, &debug_msdp_packets_cmd);
install_element(CONFIG_NODE, &no_debug_msdp_packets_cmd);
install_element(CONFIG_NODE, &undebug_msdp_packets_cmd);
+
install_element(CONFIG_NODE, &ip_msdp_mesh_group_member_cmd);
+ install_element(VRF_NODE, &ip_msdp_mesh_group_member_cmd);
install_element(CONFIG_NODE, &no_ip_msdp_mesh_group_member_cmd);
+ install_element(VRF_NODE, &ip_msdp_mesh_group_member_cmd);
install_element(CONFIG_NODE, &ip_msdp_mesh_group_source_cmd);
+ install_element(VRF_NODE, &ip_msdp_mesh_group_source_cmd);
install_element(CONFIG_NODE, &no_ip_msdp_mesh_group_source_cmd);
+ install_element(VRF_NODE, &no_ip_msdp_mesh_group_source_cmd);
install_element(VIEW_NODE, &show_ip_msdp_peer_detail_cmd);
install_element(VIEW_NODE, &show_ip_msdp_sa_detail_cmd);
install_element(VIEW_NODE, &show_ip_msdp_sa_sg_cmd);