summaryrefslogtreecommitdiff
path: root/pimd/pim_cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_cmd.c')
-rw-r--r--pimd/pim_cmd.c328
1 files changed, 193 insertions, 135 deletions
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index c890db7bf4..96cbcd1844 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -3766,6 +3766,8 @@ static void show_mroute(struct vty *vty, u_char uj)
int oif_vif_index;
struct interface *ifp_in;
char proto[100];
+ struct vrf *vrf;
+ struct pim_instance *pim;
if (uj) {
json = json_object_new_object();
@@ -3942,123 +3944,145 @@ static void show_mroute(struct vty *vty, u_char uj)
}
/* Print list of static routes */
- for (ALL_LIST_ELEMENTS_RO(qpim_static_route_list, node, s_route)) {
- first = 1;
-
- if (!s_route->c_oil.installed)
+ RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name)
+ {
+ pim = vrf->info;
+ if (!pim)
continue;
- pim_inet4_dump("<group?>", s_route->group, grp_str,
- sizeof(grp_str));
- pim_inet4_dump("<source?>", s_route->source, src_str,
- sizeof(src_str));
- ifp_in = pim_if_find_by_vif_index(s_route->iif);
- found_oif = 0;
-
- if (ifp_in)
- strcpy(in_ifname, ifp_in->name);
- else
- strcpy(in_ifname, "<iif?>");
+ for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, s_route)) {
+ first = 1;
- if (uj) {
+ if (!s_route->c_oil.installed)
+ continue;
- /* Find the group, create it if it doesn't exist */
- json_object_object_get_ex(json, grp_str, &json_group);
+ pim_inet4_dump("<group?>", s_route->group, grp_str,
+ sizeof(grp_str));
+ pim_inet4_dump("<source?>", s_route->source, src_str,
+ sizeof(src_str));
+ ifp_in = pim_if_find_by_vif_index(s_route->iif);
+ found_oif = 0;
- if (!json_group) {
- json_group = json_object_new_object();
- json_object_object_add(json, grp_str,
- json_group);
- }
+ if (ifp_in)
+ strcpy(in_ifname, ifp_in->name);
+ else
+ strcpy(in_ifname, "<iif?>");
- /* Find the source nested under the group, create it if
- * it doesn't exist */
- json_object_object_get_ex(json_group, src_str,
- &json_source);
+ if (uj) {
- if (!json_source) {
- json_source = json_object_new_object();
- json_object_object_add(json_group, src_str,
- json_source);
- }
+ /* Find the group, create it if it doesn't exist
+ */
+ json_object_object_get_ex(json, grp_str,
+ &json_group);
- json_object_string_add(json_source, "iif", in_ifname);
- json_oil = NULL;
- } else {
- strcpy(proto, "STATIC");
- }
+ if (!json_group) {
+ json_group = json_object_new_object();
+ json_object_object_add(json, grp_str,
+ json_group);
+ }
- for (oif_vif_index = 0; oif_vif_index < MAXVIFS;
- ++oif_vif_index) {
- struct interface *ifp_out;
- char oif_uptime[10];
- int ttl;
+ /* Find the source nested under the group,
+ * create it if it doesn't exist */
+ json_object_object_get_ex(json_group, src_str,
+ &json_source);
- ttl = s_route->oif_ttls[oif_vif_index];
- if (ttl < 1)
- continue;
+ if (!json_source) {
+ json_source = json_object_new_object();
+ json_object_object_add(json_group,
+ src_str,
+ json_source);
+ }
- ifp_out = pim_if_find_by_vif_index(oif_vif_index);
- pim_time_uptime(
- oif_uptime, sizeof(oif_uptime),
- now
- - s_route->c_oil
- .oif_creation[oif_vif_index]);
- found_oif = 1;
+ json_object_string_add(json_source, "iif",
+ in_ifname);
+ json_oil = NULL;
+ } else {
+ strcpy(proto, "STATIC");
+ }
- if (ifp_out)
- strcpy(out_ifname, ifp_out->name);
- else
- strcpy(out_ifname, "<oif?>");
+ for (oif_vif_index = 0; oif_vif_index < MAXVIFS;
+ ++oif_vif_index) {
+ struct interface *ifp_out;
+ char oif_uptime[10];
+ int ttl;
+
+ ttl = s_route->oif_ttls[oif_vif_index];
+ if (ttl < 1)
+ continue;
+
+ ifp_out =
+ pim_if_find_by_vif_index(oif_vif_index);
+ pim_time_uptime(
+ oif_uptime, sizeof(oif_uptime),
+ now
+ - s_route->c_oil.oif_creation
+ [oif_vif_index]);
+ found_oif = 1;
+
+ if (ifp_out)
+ strcpy(out_ifname, ifp_out->name);
+ else
+ strcpy(out_ifname, "<oif?>");
- if (uj) {
- json_ifp_out = json_object_new_object();
- json_object_string_add(json_ifp_out, "source",
- src_str);
- json_object_string_add(json_ifp_out, "group",
- grp_str);
- json_object_boolean_true_add(json_ifp_out,
- "protocolStatic");
- json_object_string_add(json_ifp_out,
- "inboundInterface",
- in_ifname);
- json_object_int_add(
- json_ifp_out, "iVifI",
- s_route->c_oil.oil.mfcc_parent);
- json_object_string_add(json_ifp_out,
- "outboundInterface",
- out_ifname);
- json_object_int_add(json_ifp_out, "oVifI",
- oif_vif_index);
- json_object_int_add(json_ifp_out, "ttl", ttl);
- json_object_string_add(json_ifp_out, "upTime",
- oif_uptime);
- if (!json_oil) {
- json_oil = json_object_new_object();
- json_object_object_add(json_source,
- "oil", json_oil);
+ if (uj) {
+ json_ifp_out = json_object_new_object();
+ json_object_string_add(json_ifp_out,
+ "source",
+ src_str);
+ json_object_string_add(
+ json_ifp_out, "group", grp_str);
+ json_object_boolean_true_add(
+ json_ifp_out, "protocolStatic");
+ json_object_string_add(
+ json_ifp_out,
+ "inboundInterface", in_ifname);
+ json_object_int_add(
+ json_ifp_out, "iVifI",
+ s_route->c_oil.oil.mfcc_parent);
+ json_object_string_add(
+ json_ifp_out,
+ "outboundInterface",
+ out_ifname);
+ json_object_int_add(json_ifp_out,
+ "oVifI",
+ oif_vif_index);
+ json_object_int_add(json_ifp_out, "ttl",
+ ttl);
+ json_object_string_add(json_ifp_out,
+ "upTime",
+ oif_uptime);
+ if (!json_oil) {
+ json_oil =
+ json_object_new_object();
+ json_object_object_add(
+ json_source, "oil",
+ json_oil);
+ }
+ json_object_object_add(json_oil,
+ out_ifname,
+ json_ifp_out);
+ } else {
+ vty_out(vty,
+ "%-15s %-15s %-6s %-10s %-10s %-3d %8s %s\n",
+ src_str, grp_str, proto,
+ in_ifname, out_ifname, ttl,
+ oif_uptime, vrf->name);
+ if (first) {
+ src_str[0] = '\0';
+ grp_str[0] = '\0';
+ in_ifname[0] = '\0';
+ first = 0;
+ }
}
- json_object_object_add(json_oil, out_ifname,
- json_ifp_out);
- } else {
+ }
+
+ if (!uj && !found_oif) {
vty_out(vty,
- "%-15s %-15s %-6s %-10s %-10s %-3d %8s\n",
+ "%-15s %-15s %-6s %-10s %-10s %-3d %8s %s\n",
src_str, grp_str, proto, in_ifname,
- out_ifname, ttl, oif_uptime);
- if (first) {
- src_str[0] = '\0';
- grp_str[0] = '\0';
- in_ifname[0] = '\0';
- first = 0;
- }
+ "none", 0, "--:--:--", vrf->name);
}
}
-
- if (!uj && !found_oif) {
- vty_out(vty, "%-15s %-15s %-6s %-10s %-10s %-3d %8s\n",
- src_str, grp_str, proto, in_ifname, "none", 0,
- "--:--:--");
- }
}
if (uj) {
@@ -4086,6 +4110,8 @@ static void show_mroute_count(struct vty *vty)
struct listnode *node;
struct channel_oil *c_oil;
struct static_route *s_route;
+ struct pim_instance *pim;
+ struct vrf *vrf;
vty_out(vty, "\n");
@@ -4114,24 +4140,36 @@ static void show_mroute_count(struct vty *vty)
}
/* Print static route counts */
- for (ALL_LIST_ELEMENTS_RO(qpim_static_route_list, node, s_route)) {
- char group_str[INET_ADDRSTRLEN];
- char source_str[INET_ADDRSTRLEN];
-
- if (!s_route->c_oil.installed)
+ RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name)
+ {
+ pim = vrf->info;
+ if (!pim)
continue;
- pim_mroute_update_counters(&s_route->c_oil);
+ for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, s_route)) {
+ char group_str[INET_ADDRSTRLEN];
+ char source_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<group?>", s_route->c_oil.oil.mfcc_mcastgrp,
- group_str, sizeof(group_str));
- pim_inet4_dump("<source?>", s_route->c_oil.oil.mfcc_origin,
- source_str, sizeof(source_str));
+ if (!s_route->c_oil.installed)
+ continue;
- vty_out(vty, "%-15s %-15s %-8llu %-7ld %-10ld %-7ld\n",
- source_str, group_str, s_route->c_oil.cc.lastused,
- s_route->c_oil.cc.pktcnt, s_route->c_oil.cc.bytecnt,
- s_route->c_oil.cc.wrong_if);
+ pim_mroute_update_counters(&s_route->c_oil);
+
+ pim_inet4_dump("<group?>",
+ s_route->c_oil.oil.mfcc_mcastgrp,
+ group_str, sizeof(group_str));
+ pim_inet4_dump("<source?>",
+ s_route->c_oil.oil.mfcc_origin,
+ source_str, sizeof(source_str));
+
+ vty_out(vty,
+ "%-15s %-15s %-8llu %-7ld %-10ld %-7ld %s\n",
+ source_str, group_str,
+ s_route->c_oil.cc.lastused,
+ s_route->c_oil.cc.pktcnt,
+ s_route->c_oil.cc.bytecnt,
+ s_route->c_oil.cc.wrong_if, vrf->name);
+ }
}
}
@@ -5602,6 +5640,8 @@ DEFUN (interface_ip_mroute,
"Group address\n")
{
VTY_DECLVAR_CONTEXT(interface, iif);
+ struct pim_interface *pim_ifp;
+ struct pim_instance *pim;
int idx_interface = 2;
int idx_ipv4 = 3;
struct interface *oif;
@@ -5611,11 +5651,14 @@ DEFUN (interface_ip_mroute,
struct in_addr src_addr;
int result;
+ pim_ifp = iif->info;
+ pim = pim_ifp->pim;
+
oifname = argv[idx_interface]->arg;
- oif = if_lookup_by_name(oifname, pimg->vrf_id);
+ oif = if_lookup_by_name(oifname, pim->vrf_id);
if (!oif) {
vty_out(vty, "No such interface name %s\n", oifname);
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
grp_str = argv[idx_ipv4]->arg;
@@ -5623,14 +5666,14 @@ DEFUN (interface_ip_mroute,
if (result <= 0) {
vty_out(vty, "Bad group address %s: errno=%d: %s\n", grp_str,
errno, safe_strerror(errno));
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
src_addr.s_addr = INADDR_ANY;
- if (pim_static_add(iif, oif, grp_addr, src_addr)) {
+ if (pim_static_add(pim, iif, oif, grp_addr, src_addr)) {
vty_out(vty, "Failed to add route\n");
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
return CMD_SUCCESS;
@@ -5646,6 +5689,8 @@ DEFUN (interface_ip_mroute_source,
"Source address\n")
{
VTY_DECLVAR_CONTEXT(interface, iif);
+ struct pim_interface *pim_ifp;
+ struct pim_instance *pim;
int idx_interface = 2;
int idx_ipv4 = 3;
int idx_ipv4_2 = 4;
@@ -5657,11 +5702,14 @@ DEFUN (interface_ip_mroute_source,
struct in_addr src_addr;
int result;
+ pim_ifp = iif->info;
+ pim = pim_ifp->pim;
+
oifname = argv[idx_interface]->arg;
- oif = if_lookup_by_name(oifname, pimg->vrf_id);
+ oif = if_lookup_by_name(oifname, pim->vrf_id);
if (!oif) {
vty_out(vty, "No such interface name %s\n", oifname);
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
grp_str = argv[idx_ipv4]->arg;
@@ -5669,7 +5717,7 @@ DEFUN (interface_ip_mroute_source,
if (result <= 0) {
vty_out(vty, "Bad group address %s: errno=%d: %s\n", grp_str,
errno, safe_strerror(errno));
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
src_str = argv[idx_ipv4_2]->arg;
@@ -5677,12 +5725,12 @@ DEFUN (interface_ip_mroute_source,
if (result <= 0) {
vty_out(vty, "Bad source address %s: errno=%d: %s\n", src_str,
errno, safe_strerror(errno));
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
- if (pim_static_add(iif, oif, grp_addr, src_addr)) {
+ if (pim_static_add(pim, iif, oif, grp_addr, src_addr)) {
vty_out(vty, "Failed to add route\n");
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
return CMD_SUCCESS;
@@ -5698,6 +5746,8 @@ DEFUN (interface_no_ip_mroute,
"Group Address\n")
{
VTY_DECLVAR_CONTEXT(interface, iif);
+ struct pim_interface *pim_ifp;
+ struct pim_instance *pim;
int idx_interface = 3;
int idx_ipv4 = 4;
struct interface *oif;
@@ -5707,11 +5757,14 @@ DEFUN (interface_no_ip_mroute,
struct in_addr src_addr;
int result;
+ pim_ifp = iif->info;
+ pim = pim_ifp->pim;
+
oifname = argv[idx_interface]->arg;
- oif = if_lookup_by_name(oifname, pimg->vrf_id);
+ oif = if_lookup_by_name(oifname, pim->vrf_id);
if (!oif) {
vty_out(vty, "No such interface name %s\n", oifname);
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
grp_str = argv[idx_ipv4]->arg;
@@ -5719,14 +5772,14 @@ DEFUN (interface_no_ip_mroute,
if (result <= 0) {
vty_out(vty, "Bad group address %s: errno=%d: %s\n", grp_str,
errno, safe_strerror(errno));
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
src_addr.s_addr = INADDR_ANY;
- if (pim_static_del(iif, oif, grp_addr, src_addr)) {
+ if (pim_static_del(pim, iif, oif, grp_addr, src_addr)) {
vty_out(vty, "Failed to remove route\n");
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
return CMD_SUCCESS;
@@ -5743,6 +5796,8 @@ DEFUN (interface_no_ip_mroute_source,
"Source Address\n")
{
VTY_DECLVAR_CONTEXT(interface, iif);
+ struct pim_interface *pim_ifp;
+ struct pim_instance *pim;
int idx_interface = 3;
int idx_ipv4 = 4;
int idx_ipv4_2 = 5;
@@ -5754,11 +5809,14 @@ DEFUN (interface_no_ip_mroute_source,
struct in_addr src_addr;
int result;
+ pim_ifp = iif->info;
+ pim = pim_ifp->pim;
+
oifname = argv[idx_interface]->arg;
- oif = if_lookup_by_name(oifname, pimg->vrf_id);
+ oif = if_lookup_by_name(oifname, pim->vrf_id);
if (!oif) {
vty_out(vty, "No such interface name %s\n", oifname);
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
grp_str = argv[idx_ipv4]->arg;
@@ -5766,7 +5824,7 @@ DEFUN (interface_no_ip_mroute_source,
if (result <= 0) {
vty_out(vty, "Bad group address %s: errno=%d: %s\n", grp_str,
errno, safe_strerror(errno));
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
src_str = argv[idx_ipv4_2]->arg;
@@ -5774,12 +5832,12 @@ DEFUN (interface_no_ip_mroute_source,
if (result <= 0) {
vty_out(vty, "Bad source address %s: errno=%d: %s\n", src_str,
errno, safe_strerror(errno));
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
- if (pim_static_del(iif, oif, grp_addr, src_addr)) {
+ if (pim_static_del(pim, iif, oif, grp_addr, src_addr)) {
vty_out(vty, "Failed to remove route\n");
- return CMD_WARNING_CONFIG_FAILED;
+ return CMD_WARNING;
}
return CMD_SUCCESS;