From 02a16316f3a771179f35e8956957e6bf26f261f8 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Mon, 22 May 2017 18:14:43 -0400 Subject: [PATCH] pimd: Add vrf ability to msdp show commands Signed-off-by: Donald Sharp --- pimd/pim_cmd.c | 144 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 101 insertions(+), 43 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 56efd8096c..d74b89b16b 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -27,6 +27,7 @@ #include "plist.h" #include "hash.h" #include "nexthop.h" +#include "vrf.h" #include "pimd.h" #include "pim_mroute.h" @@ -70,6 +71,23 @@ static struct cmd_node interface_node = { 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; @@ -6632,8 +6650,9 @@ DEFUN_HIDDEN (no_ip_msdp_peer, 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; @@ -6645,7 +6664,7 @@ static int ip_msdp_mesh_group_member_cmd_worker(struct vty *vty, const char *mg, 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; @@ -6675,11 +6694,13 @@ DEFUN (ip_msdp_mesh_group_member, "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) { @@ -6693,7 +6714,7 @@ static int ip_no_msdp_mesh_group_member_cmd_worker(struct vty *vty, 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; @@ -6720,12 +6741,14 @@ DEFUN (no_ip_msdp_mesh_group_member, "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; @@ -6737,7 +6760,7 @@ static int ip_msdp_mesh_group_source_cmd_worker(struct vty *vty, const char *mg, 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; @@ -6765,16 +6788,18 @@ DEFUN (ip_msdp_mesh_group_source, "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; @@ -6788,11 +6813,13 @@ static int ip_no_msdp_mesh_group_source_cmd_worker(struct vty *vty, 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; @@ -6817,10 +6844,11 @@ DEFUN (no_ip_msdp_mesh_group_source, "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); } @@ -6833,11 +6861,12 @@ static void print_empty_json_obj(struct vty *vty) 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]; @@ -6902,7 +6931,7 @@ static void ip_msdp_show_mesh_group(struct vty *vty, u_char uj) 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 @@ -6910,12 +6939,19 @@ DEFUN (show_ip_msdp_mesh_group, "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; @@ -6935,7 +6971,7 @@ static void ip_msdp_show_peers(struct vty *vty, u_char uj) "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), @@ -6968,8 +7004,8 @@ static void ip_msdp_show_peers(struct vty *vty, u_char uj) } } -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; @@ -6988,7 +7024,7 @@ static void ip_msdp_show_peers_detail(struct vty *vty, const char *peer, 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("", mp->peer, peer_str, sizeof(peer_str)); if (strcmp(peer, "detail") && strcmp(peer, peer_str)) continue; @@ -7075,7 +7111,7 @@ static void ip_msdp_show_peers_detail(struct vty *vty, const char *peer, 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 @@ -7085,18 +7121,21 @@ DEFUN (show_ip_msdp_peer_detail, "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; @@ -7118,7 +7157,7 @@ static void ip_msdp_show_sa(struct vty *vty, u_char uj) "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("", sa->sg.src, src_str, sizeof(src_str)); @@ -7237,7 +7276,8 @@ static void ip_msdp_show_sa_entry_detail(struct pim_msdp_sa *sa, } } -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; @@ -7249,7 +7289,7 @@ static void ip_msdp_show_sa_detail(struct vty *vty, u_char uj) 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("", sa->sg.src, src_str, sizeof(src_str)); pim_inet4_dump("", sa->sg.grp, grp_str, sizeof(grp_str)); ip_msdp_show_sa_entry_detail(sa, src_str, grp_str, vty, uj, @@ -7265,7 +7305,7 @@ static void ip_msdp_show_sa_detail(struct vty *vty, u_char 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 @@ -7274,12 +7314,19 @@ DEFUN (show_ip_msdp_sa_detail, "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; @@ -7291,7 +7338,7 @@ static void ip_msdp_show_sa_addr(struct vty *vty, const char *addr, u_char uj) 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("", sa->sg.src, src_str, sizeof(src_str)); pim_inet4_dump("", sa->sg.grp, grp_str, sizeof(grp_str)); if (!strcmp(addr, src_str) || !strcmp(addr, grp_str)) { @@ -7307,8 +7354,8 @@ static void ip_msdp_show_sa_addr(struct vty *vty, const char *addr, u_char uj) } } -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; @@ -7320,7 +7367,7 @@ static void ip_msdp_show_sa_sg(struct vty *vty, const char *src, 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("", sa->sg.src, src_str, sizeof(src_str)); pim_inet4_dump("", sa->sg.grp, grp_str, sizeof(grp_str)); if (!strcmp(src, src_str) && !strcmp(grp, grp_str)) { @@ -7338,7 +7385,7 @@ static void ip_msdp_show_sa_sg(struct vty *vty, const char *src, 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 @@ -7348,8 +7395,14 @@ DEFUN (show_ip_msdp_sa_sg, "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) @@ -7357,11 +7410,11 @@ DEFUN (show_ip_msdp_sa_sg, : 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; } @@ -7582,10 +7635,15 @@ void pim_cmd_init() 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); -- 2.39.5