3 Copyright (C) 2008 Everton da Silva Marques
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; see the file COPYING; if not, write to the
17 Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
31 #include "pim_mroute.h"
33 #include "pim_iface.h"
35 #include "pim_mroute.h"
38 #include "pim_igmpv3.h"
43 #include "pim_neighbor.h"
45 #include "pim_ifchannel.h"
46 #include "pim_hello.h"
48 #include "pim_upstream.h"
50 #include "pim_macro.h"
51 #include "pim_ssmpingd.h"
52 #include "pim_zebra.h"
53 #include "pim_static.h"
55 #include "pim_zlookup.h"
59 static struct cmd_node pim_global_node
= {
65 static struct cmd_node interface_node
= {
71 static struct cmd_node debug_node
=
78 static void pim_if_membership_clear(struct interface
*ifp
)
80 struct pim_interface
*pim_ifp
;
85 if (PIM_IF_TEST_PIM(pim_ifp
->options
) &&
86 PIM_IF_TEST_IGMP(pim_ifp
->options
)) {
90 pim_ifchannel_membership_clear(ifp
);
94 When PIM is disabled on interface, IGMPv3 local membership
95 information is not injected into PIM interface state.
97 The function pim_if_membership_refresh() fetches all IGMPv3 local
98 membership information into PIM. It is intented to be called
99 whenever PIM is enabled on the interface in order to collect missed
100 local membership information.
102 static void pim_if_membership_refresh(struct interface
*ifp
)
104 struct pim_interface
*pim_ifp
;
105 struct listnode
*sock_node
;
106 struct igmp_sock
*igmp
;
111 if (!PIM_IF_TEST_PIM(pim_ifp
->options
))
113 if (!PIM_IF_TEST_IGMP(pim_ifp
->options
))
117 First clear off membership from all PIM (S,G) entries on the
121 pim_ifchannel_membership_clear(ifp
);
124 Then restore PIM (S,G) membership from all IGMPv3 (S,G) entries on
128 /* scan igmp sockets */
129 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->igmp_socket_list
, sock_node
, igmp
)) {
130 struct listnode
*grpnode
;
131 struct igmp_group
*grp
;
133 /* scan igmp groups */
134 for (ALL_LIST_ELEMENTS_RO(igmp
->igmp_group_list
, grpnode
, grp
)) {
135 struct listnode
*srcnode
;
136 struct igmp_source
*src
;
138 /* scan group sources */
139 for (ALL_LIST_ELEMENTS_RO(grp
->group_source_list
, srcnode
, src
)) {
141 if (IGMP_SOURCE_TEST_FORWARDING(src
->source_flags
)) {
144 memset (&sg
, 0, sizeof (struct prefix_sg
));
145 sg
.src
= src
->source_addr
;
146 sg
.grp
= grp
->group_addr
;
147 pim_ifchannel_local_membership_add(ifp
, &sg
);
150 } /* scan group sources */
151 } /* scan igmp groups */
152 } /* scan igmp sockets */
155 Finally delete every PIM (S,G) entry lacking all state info
158 pim_ifchannel_delete_on_noinfo(ifp
);
162 static void pim_show_assert(struct vty
*vty
)
164 struct pim_interface
*pim_ifp
;
165 struct pim_ifchannel
*ch
;
166 struct listnode
*ch_node
;
167 struct in_addr ifaddr
;
170 now
= pim_time_monotonic_sec();
173 "Interface Address Source Group State Winner Uptime Timer%s",
176 for (ALL_LIST_ELEMENTS_RO(pim_ifchannel_list
, ch_node
, ch
)) {
177 char ch_src_str
[INET_ADDRSTRLEN
];
178 char ch_grp_str
[INET_ADDRSTRLEN
];
179 char winner_str
[INET_ADDRSTRLEN
];
183 pim_ifp
= ch
->interface
->info
;
188 ifaddr
= pim_ifp
->primary_address
;
190 pim_inet4_dump("<ch_src?>", ch
->sg
.src
,
191 ch_src_str
, sizeof(ch_src_str
));
192 pim_inet4_dump("<ch_grp?>", ch
->sg
.grp
,
193 ch_grp_str
, sizeof(ch_grp_str
));
194 pim_inet4_dump("<assrt_win?>", ch
->ifassert_winner
,
195 winner_str
, sizeof(winner_str
));
197 pim_time_uptime(uptime
, sizeof(uptime
), now
- ch
->ifassert_creation
);
198 pim_time_timer_to_mmss(timer
, sizeof(timer
),
199 ch
->t_ifassert_timer
);
201 vty_out(vty
, "%-9s %-15s %-15s %-15s %-6s %-15s %-8s %-5s%s",
206 pim_ifchannel_ifassert_name(ch
->ifassert_state
),
211 } /* scan interface channels */
214 static void pim_show_assert_internal(struct vty
*vty
)
216 struct pim_interface
*pim_ifp
;
217 struct listnode
*ch_node
;
218 struct pim_ifchannel
*ch
;
219 struct in_addr ifaddr
;
223 "ECA: Evaluate CouldAssert%s"
224 "ATD: AssertTrackingDesired%s"
225 "eATD: Evaluate AssertTrackingDesired%s%s",
226 VTY_NEWLINE
, VTY_NEWLINE
, VTY_NEWLINE
, VTY_NEWLINE
, VTY_NEWLINE
);
229 "Interface Address Source Group CA eCA ATD eATD%s",
232 for (ALL_LIST_ELEMENTS_RO(pim_ifchannel_list
, ch_node
, ch
)) {
233 pim_ifp
= ch
->interface
->info
;
238 ifaddr
= pim_ifp
->primary_address
;
240 char ch_src_str
[INET_ADDRSTRLEN
];
241 char ch_grp_str
[INET_ADDRSTRLEN
];
243 pim_inet4_dump("<ch_src?>", ch
->sg
.src
,
244 ch_src_str
, sizeof(ch_src_str
));
245 pim_inet4_dump("<ch_grp?>", ch
->sg
.grp
,
246 ch_grp_str
, sizeof(ch_grp_str
));
247 vty_out(vty
, "%-9s %-15s %-15s %-15s %-3s %-3s %-3s %-4s%s",
252 PIM_IF_FLAG_TEST_COULD_ASSERT(ch
->flags
) ? "yes" : "no",
253 pim_macro_ch_could_assert_eval(ch
) ? "yes" : "no",
254 PIM_IF_FLAG_TEST_ASSERT_TRACKING_DESIRED(ch
->flags
) ? "yes" : "no",
255 pim_macro_assert_tracking_desired_eval(ch
) ? "yes" : "no",
257 } /* scan interface channels */
260 static void pim_show_assert_metric(struct vty
*vty
)
262 struct pim_interface
*pim_ifp
;
263 struct listnode
*ch_node
;
264 struct pim_ifchannel
*ch
;
265 struct in_addr ifaddr
;
268 "Interface Address Source Group RPT Pref Metric Address %s",
271 for (ALL_LIST_ELEMENTS_RO(pim_ifchannel_list
, ch_node
, ch
)) {
272 pim_ifp
= ch
->interface
->info
;
277 ifaddr
= pim_ifp
->primary_address
;
279 char ch_src_str
[INET_ADDRSTRLEN
];
280 char ch_grp_str
[INET_ADDRSTRLEN
];
281 char addr_str
[INET_ADDRSTRLEN
];
282 struct pim_assert_metric am
;
284 am
= pim_macro_spt_assert_metric(&ch
->upstream
->rpf
, pim_ifp
->primary_address
);
286 pim_inet4_dump("<ch_src?>", ch
->sg
.src
,
287 ch_src_str
, sizeof(ch_src_str
));
288 pim_inet4_dump("<ch_grp?>", ch
->sg
.grp
,
289 ch_grp_str
, sizeof(ch_grp_str
));
290 pim_inet4_dump("<addr?>", am
.ip_address
,
291 addr_str
, sizeof(addr_str
));
293 vty_out(vty
, "%-9s %-15s %-15s %-15s %-3s %4u %6u %-15s%s",
298 am
.rpt_bit_flag
? "yes" : "no",
299 am
.metric_preference
,
303 } /* scan interface channels */
306 static void pim_show_assert_winner_metric(struct vty
*vty
)
308 struct pim_interface
*pim_ifp
;
309 struct listnode
*ch_node
;
310 struct pim_ifchannel
*ch
;
311 struct in_addr ifaddr
;
314 "Interface Address Source Group RPT Pref Metric Address %s",
317 for (ALL_LIST_ELEMENTS_RO(pim_ifchannel_list
, ch_node
, ch
)) {
318 pim_ifp
= ch
->interface
->info
;
323 ifaddr
= pim_ifp
->primary_address
;
325 char ch_src_str
[INET_ADDRSTRLEN
];
326 char ch_grp_str
[INET_ADDRSTRLEN
];
327 char addr_str
[INET_ADDRSTRLEN
];
328 struct pim_assert_metric
*am
;
332 am
= &ch
->ifassert_winner_metric
;
334 pim_inet4_dump("<ch_src?>", ch
->sg
.src
,
335 ch_src_str
, sizeof(ch_src_str
));
336 pim_inet4_dump("<ch_grp?>", ch
->sg
.grp
,
337 ch_grp_str
, sizeof(ch_grp_str
));
338 pim_inet4_dump("<addr?>", am
->ip_address
,
339 addr_str
, sizeof(addr_str
));
341 if (am
->metric_preference
== PIM_ASSERT_METRIC_PREFERENCE_MAX
)
342 snprintf(pref_str
, sizeof(pref_str
), "INFI");
344 snprintf(pref_str
, sizeof(pref_str
), "%4u", am
->metric_preference
);
346 if (am
->route_metric
== PIM_ASSERT_ROUTE_METRIC_MAX
)
347 snprintf(metr_str
, sizeof(metr_str
), "INFI");
349 snprintf(metr_str
, sizeof(metr_str
), "%6u", am
->route_metric
);
351 vty_out(vty
, "%-9s %-15s %-15s %-15s %-3s %-4s %-6s %-15s%s",
356 am
->rpt_bit_flag
? "yes" : "no",
361 } /* scan interface channels */
364 static void json_object_pim_ifp_add(struct json_object
*json
, struct interface
*ifp
)
366 struct pim_interface
*pim_ifp
;
369 json_object_string_add(json
, "name", ifp
->name
);
370 json_object_string_add(json
, "state", if_is_up(ifp
) ? "up" : "down");
371 json_object_string_add(json
, "address", inet_ntoa(pim_ifp
->primary_address
));
372 json_object_int_add(json
, "index", ifp
->ifindex
);
374 if (if_is_multicast(ifp
))
375 json_object_boolean_true_add(json
, "flagMulticast");
377 if (if_is_broadcast(ifp
))
378 json_object_boolean_true_add(json
, "flagBroadcast");
380 if (ifp
->flags
& IFF_ALLMULTI
)
381 json_object_boolean_true_add(json
, "flagAllMulticast");
383 if (ifp
->flags
& IFF_PROMISC
)
384 json_object_boolean_true_add(json
, "flagPromiscuous");
386 if (PIM_IF_IS_DELETED(ifp
))
387 json_object_boolean_true_add(json
, "flagDeleted");
389 if (pim_if_lan_delay_enabled(ifp
))
390 json_object_boolean_true_add(json
, "lanDelayEnabled");
393 static void pim_show_membership(struct vty
*vty
, u_char uj
)
395 struct pim_interface
*pim_ifp
;
396 struct listnode
*ch_node
;
397 struct pim_ifchannel
*ch
;
399 json_object
*json
= NULL
;
400 json_object
*json_iface
= NULL
;
401 json_object
*json_row
= NULL
;
402 json_object
*json_tmp
= NULL
;
404 json
= json_object_new_object();
406 for (ALL_LIST_ELEMENTS_RO(pim_ifchannel_list
, ch_node
, ch
)) {
408 pim_ifp
= ch
->interface
->info
;
413 char ch_src_str
[INET_ADDRSTRLEN
];
414 char ch_grp_str
[INET_ADDRSTRLEN
];
416 pim_inet4_dump("<ch_src?>", ch
->sg
.src
,
417 ch_src_str
, sizeof(ch_src_str
));
418 pim_inet4_dump("<ch_grp?>", ch
->sg
.grp
,
419 ch_grp_str
, sizeof(ch_grp_str
));
421 json_object_object_get_ex(json
, ch
->interface
->name
, &json_iface
);
424 json_iface
= json_object_new_object();
425 json_object_pim_ifp_add(json_iface
, ch
->interface
);
426 json_object_object_add(json
, ch
->interface
->name
, json_iface
);
429 json_row
= json_object_new_object();
430 json_object_string_add(json_row
, "source", ch_src_str
);
431 json_object_string_add(json_row
, "group", ch_grp_str
);
432 json_object_string_add(json_row
, "localMembership",
433 ch
->local_ifmembership
== PIM_IFMEMBERSHIP_NOINFO
? "NOINFO" : "INCLUDE");
434 json_object_object_add(json_iface
, ch_grp_str
, json_row
);
435 } /* scan interface channels */
438 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
441 "Interface Address Source Group Membership%s",
445 * Example of the json data we are traversing
451 * "address":"10.1.20.1",
453 * "flagMulticast":true,
454 * "flagBroadcast":true,
455 * "lanDelayEnabled":true,
458 * "group":"226.10.10.10",
459 * "localMembership":"INCLUDE"
465 /* foreach interface */
466 json_object_object_foreach(json
, key
, val
) {
468 /* Find all of the keys where the val is an object. In the example
469 * above the only one is 226.10.10.10
471 json_object_object_foreach(val
, if_field_key
, if_field_val
) {
472 type
= json_object_get_type(if_field_val
);
474 if (type
== json_type_object
) {
475 vty_out(vty
, "%-9s ", key
);
477 json_object_object_get_ex(val
, "address", &json_tmp
);
478 vty_out(vty
, "%-15s ", json_object_get_string(json_tmp
));
480 json_object_object_get_ex(if_field_val
, "source", &json_tmp
);
481 vty_out(vty
, "%-15s ", json_object_get_string(json_tmp
));
484 vty_out(vty
, "%-15s ", if_field_key
);
486 json_object_object_get_ex(if_field_val
, "localMembership", &json_tmp
);
487 vty_out(vty
, "%-10s%s", json_object_get_string(json_tmp
), VTY_NEWLINE
);
493 json_object_free(json
);
496 static void pim_print_ifp_flags(struct vty
*vty
, struct interface
*ifp
, int mloop
)
498 vty_out(vty
, "Flags%s", VTY_NEWLINE
);
499 vty_out(vty
, "-----%s", VTY_NEWLINE
);
500 vty_out(vty
, "All Multicast : %s%s", (ifp
->flags
& IFF_ALLMULTI
) ? "yes" : "no", VTY_NEWLINE
);
501 vty_out(vty
, "Broadcast : %s%s", if_is_broadcast(ifp
)? "yes" : "no", VTY_NEWLINE
);
502 vty_out(vty
, "Deleted : %s%s", PIM_IF_IS_DELETED(ifp
) ? "yes" : "no", VTY_NEWLINE
);
503 vty_out(vty
, "Interface Index : %d%s", ifp
->ifindex
, VTY_NEWLINE
);
504 vty_out(vty
, "Multicast : %s%s", if_is_multicast(ifp
) ? "yes" : "no", VTY_NEWLINE
);
505 vty_out(vty
, "Multicast Loop : %d%s", mloop
, VTY_NEWLINE
);
506 vty_out(vty
, "Promiscuous : %s%s", (ifp
->flags
& IFF_PROMISC
) ? "yes" : "no", VTY_NEWLINE
);
507 vty_out(vty
, "%s", VTY_NEWLINE
);
508 vty_out(vty
, "%s", VTY_NEWLINE
);
511 static void igmp_show_interfaces(struct vty
*vty
, u_char uj
)
513 struct listnode
*node
;
514 struct interface
*ifp
;
516 json_object
*json
= NULL
;
517 json_object
*json_row
= NULL
;
519 now
= pim_time_monotonic_sec();
522 json
= json_object_new_object();
525 "Interface State Address V Querier Query Timer Uptime%s",
528 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
)) {
529 struct pim_interface
*pim_ifp
;
530 struct listnode
*sock_node
;
531 struct igmp_sock
*igmp
;
538 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->igmp_socket_list
, sock_node
, igmp
)) {
540 char query_hhmmss
[10];
542 pim_time_uptime(uptime
, sizeof(uptime
), now
- igmp
->sock_creation
);
543 pim_time_timer_to_hhmmss(query_hhmmss
, sizeof(query_hhmmss
), igmp
->t_igmp_query_timer
);
546 json_row
= json_object_new_object();
547 json_object_pim_ifp_add(json_row
, ifp
);
548 json_object_string_add(json_row
, "upTime", uptime
);
549 json_object_int_add(json_row
, "version", pim_ifp
->igmp_version
);
551 if (igmp
->t_igmp_query_timer
) {
552 json_object_boolean_true_add(json_row
, "querier");
553 json_object_string_add(json_row
, "queryTimer", query_hhmmss
);
556 json_object_object_add(json
, ifp
->name
, json_row
);
559 vty_out(vty
, "%-9s %5s %15s %d %7s %11s %8s%s",
561 if_is_up(ifp
) ? "up" : "down",
562 inet_ntoa(igmp
->ifaddr
),
563 pim_ifp
->igmp_version
,
564 igmp
->t_igmp_query_timer
? "local" : "other",
573 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
574 json_object_free(json
);
578 static void igmp_show_interfaces_single(struct vty
*vty
, const char *ifname
, u_char uj
)
580 struct igmp_sock
*igmp
;
581 struct interface
*ifp
;
582 struct listnode
*node
;
583 struct listnode
*sock_node
;
584 struct pim_interface
*pim_ifp
;
586 char query_hhmmss
[10];
587 char other_hhmmss
[10];
588 int found_ifname
= 0;
591 long gmi_msec
; /* Group Membership Interval */
594 long oqpi_msec
; /* Other Querier Present Interval */
598 json_object
*json
= NULL
;
599 json_object
*json_row
= NULL
;
602 json
= json_object_new_object();
604 now
= pim_time_monotonic_sec();
606 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
)) {
612 if (strcmp(ifname
, "detail") && strcmp(ifname
, ifp
->name
))
615 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->igmp_socket_list
, sock_node
, igmp
)) {
617 pim_time_uptime(uptime
, sizeof(uptime
), now
- igmp
->sock_creation
);
618 pim_time_timer_to_hhmmss(query_hhmmss
, sizeof(query_hhmmss
), igmp
->t_igmp_query_timer
);
619 pim_time_timer_to_hhmmss(other_hhmmss
, sizeof(other_hhmmss
), igmp
->t_other_querier_timer
);
621 gmi_msec
= PIM_IGMP_GMI_MSEC(igmp
->querier_robustness_variable
,
622 igmp
->querier_query_interval
,
623 pim_ifp
->igmp_query_max_response_time_dsec
);
625 sqi
= PIM_IGMP_SQI(pim_ifp
->igmp_default_query_interval
);
627 oqpi_msec
= PIM_IGMP_OQPI_MSEC(igmp
->querier_robustness_variable
,
628 igmp
->querier_query_interval
,
629 pim_ifp
->igmp_query_max_response_time_dsec
);
631 lmqt_msec
= PIM_IGMP_LMQT_MSEC(pim_ifp
->igmp_query_max_response_time_dsec
,
632 igmp
->querier_robustness_variable
);
634 ohpi_msec
= PIM_IGMP_OHPI_DSEC(igmp
->querier_robustness_variable
,
635 igmp
->querier_query_interval
,
636 pim_ifp
->igmp_query_max_response_time_dsec
) * 100;
638 qri_msec
= pim_ifp
->igmp_query_max_response_time_dsec
* 100;
639 mloop
= pim_socket_mcastloop_get(pim_ifp
->pim_sock_fd
);
642 json_row
= json_object_new_object();
643 json_object_pim_ifp_add(json_row
, ifp
);
644 json_object_string_add(json_row
, "upTime", uptime
);
645 json_object_string_add(json_row
, "querier", igmp
->t_igmp_query_timer
? "local" : "other");
646 json_object_int_add(json_row
, "queryStartCount", igmp
->startup_query_count
);
647 json_object_string_add(json_row
, "queryQueryTimer", query_hhmmss
);
648 json_object_string_add(json_row
, "queryOtherTimer", other_hhmmss
);
649 json_object_int_add(json_row
, "version", pim_ifp
->igmp_version
);
650 json_object_int_add(json_row
, "timerGroupMembershipIntervalMsec", gmi_msec
);
651 json_object_int_add(json_row
, "timerLastMemberQueryMsec", lmqt_msec
);
652 json_object_int_add(json_row
, "timerOlderHostPresentIntervalMsec", ohpi_msec
);
653 json_object_int_add(json_row
, "timerOtherQuerierPresentIntervalMsec", oqpi_msec
);
654 json_object_int_add(json_row
, "timerQueryInterval", igmp
->querier_query_interval
);
655 json_object_int_add(json_row
, "timerQueryResponseIntervalMsec", qri_msec
);
656 json_object_int_add(json_row
, "timerRobustnessVariable", igmp
->querier_robustness_variable
);
657 json_object_int_add(json_row
, "timerStartupQueryInterval", sqi
);
659 json_object_object_add(json
, ifp
->name
, json_row
);
662 vty_out(vty
, "Interface : %s%s", ifp
->name
, VTY_NEWLINE
);
663 vty_out(vty
, "State : %s%s", if_is_up(ifp
) ? "up" : "down", VTY_NEWLINE
);
664 vty_out(vty
, "Address : %s%s", inet_ntoa(pim_ifp
->primary_address
), VTY_NEWLINE
);
665 vty_out(vty
, "Uptime : %s%s", uptime
, VTY_NEWLINE
);
666 vty_out(vty
, "Version : %d%s", pim_ifp
->igmp_version
, VTY_NEWLINE
);
667 vty_out(vty
, "%s", VTY_NEWLINE
);
668 vty_out(vty
, "%s", VTY_NEWLINE
);
670 vty_out(vty
, "Querier%s", VTY_NEWLINE
);
671 vty_out(vty
, "-------%s", VTY_NEWLINE
);
672 vty_out(vty
, "Querier : %s%s", igmp
->t_igmp_query_timer
? "local" : "other", VTY_NEWLINE
);
673 vty_out(vty
, "Start Count : %d%s", igmp
->startup_query_count
, VTY_NEWLINE
);
674 vty_out(vty
, "Query Timer : %s%s", query_hhmmss
, VTY_NEWLINE
);
675 vty_out(vty
, "Other Timer : %s%s", other_hhmmss
, VTY_NEWLINE
);
676 vty_out(vty
, "%s", VTY_NEWLINE
);
677 vty_out(vty
, "%s", VTY_NEWLINE
);
679 vty_out(vty
, "Timers%s", VTY_NEWLINE
);
680 vty_out(vty
, "------%s", VTY_NEWLINE
);
681 vty_out(vty
, "Group Membership Interval : %lis%s", gmi_msec
/1000, VTY_NEWLINE
);
682 vty_out(vty
, "Last Member Query Time : %lis%s", lmqt_msec
/1000, VTY_NEWLINE
);
683 vty_out(vty
, "Older Host Present Interval : %lis%s", ohpi_msec
/1000, VTY_NEWLINE
);
684 vty_out(vty
, "Other Querier Present Interval : %lis%s", oqpi_msec
/1000, VTY_NEWLINE
);
685 vty_out(vty
, "Query Interval : %ds%s", igmp
->querier_query_interval
, VTY_NEWLINE
);
686 vty_out(vty
, "Query Response Interval : %lis%s", qri_msec
/1000, VTY_NEWLINE
);
687 vty_out(vty
, "Robustness Variable : %d%s", igmp
->querier_robustness_variable
, VTY_NEWLINE
);
688 vty_out(vty
, "Startup Query Interval : %ds%s", sqi
, VTY_NEWLINE
);
689 vty_out(vty
, "%s", VTY_NEWLINE
);
690 vty_out(vty
, "%s", VTY_NEWLINE
);
692 pim_print_ifp_flags(vty
, ifp
, mloop
);
698 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
699 json_object_free(json
);
702 vty_out (vty
, "%% No such interface%s", VTY_NEWLINE
);
706 static void igmp_show_interface_join(struct vty
*vty
)
708 struct listnode
*node
;
709 struct interface
*ifp
;
712 now
= pim_time_monotonic_sec();
715 "Interface Address Source Group Socket Uptime %s",
718 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
)) {
719 struct pim_interface
*pim_ifp
;
720 struct listnode
*join_node
;
721 struct igmp_join
*ij
;
722 struct in_addr pri_addr
;
723 char pri_addr_str
[INET_ADDRSTRLEN
];
730 if (!pim_ifp
->igmp_join_list
)
733 pri_addr
= pim_find_primary_addr(ifp
);
734 pim_inet4_dump("<pri?>", pri_addr
, pri_addr_str
, sizeof(pri_addr_str
));
736 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->igmp_join_list
, join_node
, ij
)) {
737 char group_str
[INET_ADDRSTRLEN
];
738 char source_str
[INET_ADDRSTRLEN
];
741 pim_time_uptime(uptime
, sizeof(uptime
), now
- ij
->sock_creation
);
742 pim_inet4_dump("<grp?>", ij
->group_addr
, group_str
, sizeof(group_str
));
743 pim_inet4_dump("<src?>", ij
->source_addr
, source_str
, sizeof(source_str
));
745 vty_out(vty
, "%-9s %-15s %-15s %-15s %6d %8s%s",
753 } /* for (pim_ifp->igmp_join_list) */
759 static void pim_show_interfaces_single(struct vty
*vty
, const char *ifname
, u_char uj
)
761 struct in_addr ifaddr
;
762 struct interface
*ifp
;
763 struct listnode
*neighnode
;
764 struct listnode
*node
;
765 struct listnode
*upnode
;
766 struct pim_interface
*pim_ifp
;
767 struct pim_neighbor
*neigh
;
768 struct pim_upstream
*up
;
770 char dr_str
[INET_ADDRSTRLEN
];
773 char grp_str
[INET_ADDRSTRLEN
];
774 char hello_period
[10];
775 char hello_timer
[10];
776 char neigh_src_str
[INET_ADDRSTRLEN
];
777 char src_str
[INET_ADDRSTRLEN
];
778 char stat_uptime
[10];
781 int found_ifname
= 0;
783 json_object
*json
= NULL
;
784 json_object
*json_row
= NULL
;
785 json_object
*json_pim_neighbor
= NULL
;
786 json_object
*json_pim_neighbors
= NULL
;
787 json_object
*json_group
= NULL
;
788 json_object
*json_group_source
= NULL
;
789 json_object
*json_fhr_sources
= NULL
;
790 struct pim_secondary_addr
*sec_addr
;
791 struct listnode
*sec_node
;
793 now
= pim_time_monotonic_sec();
796 json
= json_object_new_object();
798 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
)) {
804 if (pim_ifp
->pim_sock_fd
< 0)
807 if (strcmp(ifname
, "detail") && strcmp(ifname
, ifp
->name
))
811 ifaddr
= pim_ifp
->primary_address
;
812 pim_inet4_dump("<dr?>", pim_ifp
->pim_dr_addr
, dr_str
, sizeof(dr_str
));
813 pim_time_uptime_begin(dr_uptime
, sizeof(dr_uptime
), now
, pim_ifp
->pim_dr_election_last
);
814 pim_time_timer_to_hhmmss(hello_timer
, sizeof(hello_timer
), pim_ifp
->t_pim_hello_timer
);
815 pim_time_mmss(hello_period
, sizeof(hello_period
), pim_ifp
->pim_hello_period
);
816 pim_time_uptime(stat_uptime
, sizeof(stat_uptime
), now
- pim_ifp
->pim_ifstat_start
);
817 mloop
= pim_socket_mcastloop_get(pim_ifp
->pim_sock_fd
);
820 char pbuf
[PREFIX2STR_BUFFER
];
821 json_row
= json_object_new_object();
822 json_object_pim_ifp_add(json_row
, ifp
);
824 if (pim_ifp
->update_source
.s_addr
!= INADDR_ANY
) {
825 json_object_string_add(json_row
, "useSource", inet_ntoa(pim_ifp
->update_source
));
827 if (pim_ifp
->sec_addr_list
) {
828 json_object
*sec_list
= NULL
;
830 sec_list
= json_object_new_array();
831 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->sec_addr_list
, sec_node
, sec_addr
)) {
832 json_object_array_add(sec_list
,
833 json_object_new_string(prefix2str(&sec_addr
->addr
,
837 json_object_object_add(json_row
, "secondaryAddressList", sec_list
);
841 if (pim_ifp
->pim_neighbor_list
->count
) {
842 json_pim_neighbors
= json_object_new_object();
844 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->pim_neighbor_list
, neighnode
, neigh
)) {
845 json_pim_neighbor
= json_object_new_object();
846 pim_inet4_dump("<src?>", neigh
->source_addr
, neigh_src_str
, sizeof(neigh_src_str
));
847 pim_time_uptime(uptime
, sizeof(uptime
), now
- neigh
->creation
);
848 pim_time_timer_to_hhmmss(expire
, sizeof(expire
), neigh
->t_expire_timer
);
850 json_object_string_add(json_pim_neighbor
, "address", neigh_src_str
);
851 json_object_string_add(json_pim_neighbor
, "upTime", uptime
);
852 json_object_string_add(json_pim_neighbor
, "holdtime", expire
);
854 json_object_object_add(json_pim_neighbors
, neigh_src_str
, json_pim_neighbor
);
857 json_object_object_add(json_row
, "neighbors", json_pim_neighbors
);
860 json_object_string_add(json_row
, "drAddress", dr_str
);
861 json_object_int_add(json_row
, "drPriority", pim_ifp
->pim_dr_priority
);
862 json_object_string_add(json_row
, "drUptime", dr_uptime
);
863 json_object_int_add(json_row
, "drElections", pim_ifp
->pim_dr_election_count
);
864 json_object_int_add(json_row
, "drChanges", pim_ifp
->pim_dr_election_changes
);
867 for (ALL_LIST_ELEMENTS_RO(pim_upstream_list
, upnode
, up
)) {
868 if (ifp
== up
->rpf
.source_nexthop
.interface
) {
869 if (up
->flags
& PIM_UPSTREAM_FLAG_MASK_FHR
) {
870 if (!json_fhr_sources
) {
871 json_fhr_sources
= json_object_new_object();
874 pim_inet4_dump("<src?>", up
->sg
.src
, src_str
, sizeof(src_str
));
875 pim_inet4_dump("<grp?>", up
->sg
.grp
, grp_str
, sizeof(grp_str
));
876 pim_time_uptime(uptime
, sizeof(uptime
), now
- up
->state_transition
);
878 /* Does this group live in json_fhr_sources? If not create it. */
879 json_object_object_get_ex(json_fhr_sources
, grp_str
, &json_group
);
882 json_group
= json_object_new_object();
883 json_object_object_add(json_fhr_sources
, grp_str
, json_group
);
886 json_group_source
= json_object_new_object();
887 json_object_string_add(json_group_source
, "source", src_str
);
888 json_object_string_add(json_group_source
, "group", grp_str
);
889 json_object_string_add(json_group_source
, "upTime", uptime
);
890 json_object_object_add(json_group
, src_str
, json_group_source
);
895 if (json_fhr_sources
) {
896 json_object_object_add(json_row
, "firstHopRouter", json_fhr_sources
);
899 json_object_int_add(json_row
, "helloPeriod", pim_ifp
->pim_hello_period
);
900 json_object_string_add(json_row
, "helloTimer", hello_timer
);
901 json_object_string_add(json_row
, "helloStatStart", stat_uptime
);
902 json_object_int_add(json_row
, "helloReceived", pim_ifp
->pim_ifstat_hello_recv
);
903 json_object_int_add(json_row
, "helloReceivedFailed", pim_ifp
->pim_ifstat_hello_recvfail
);
904 json_object_int_add(json_row
, "helloSend", pim_ifp
->pim_ifstat_hello_sent
);
905 json_object_int_add(json_row
, "hellosendFailed", pim_ifp
->pim_ifstat_hello_sendfail
);
906 json_object_int_add(json_row
, "helloGenerationId", pim_ifp
->pim_generation_id
);
907 json_object_int_add(json_row
, "flagMulticastLoop", mloop
);
909 json_object_int_add(json_row
, "effectivePropagationDelay", pim_if_effective_propagation_delay_msec(ifp
));
910 json_object_int_add(json_row
, "effectiveOverrideInterval", pim_if_effective_override_interval_msec(ifp
));
911 json_object_int_add(json_row
, "joinPruneOverrideInterval", pim_if_jp_override_interval_msec(ifp
));
913 json_object_int_add(json_row
, "propagationDelay", pim_ifp
->pim_propagation_delay_msec
);
914 json_object_int_add(json_row
, "propagationDelayHighest", pim_ifp
->pim_neighbors_highest_propagation_delay_msec
);
915 json_object_int_add(json_row
, "overrideInterval", pim_ifp
->pim_override_interval_msec
);
916 json_object_int_add(json_row
, "overrideIntervalHighest", pim_ifp
->pim_neighbors_highest_override_interval_msec
);
917 json_object_object_add(json
, ifp
->name
, json_row
);
920 vty_out(vty
, "Interface : %s%s", ifp
->name
, VTY_NEWLINE
);
921 vty_out(vty
, "State : %s%s", if_is_up(ifp
) ? "up" : "down", VTY_NEWLINE
);
922 if (pim_ifp
->update_source
.s_addr
!= INADDR_ANY
) {
923 vty_out(vty
, "Use Source : %s%s", inet_ntoa(pim_ifp
->update_source
), VTY_NEWLINE
);
925 if (pim_ifp
->sec_addr_list
) {
926 char pbuf
[PREFIX2STR_BUFFER
];
927 vty_out(vty
, "Address : %s (primary)%s",
928 inet_ntoa(ifaddr
), VTY_NEWLINE
);
929 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->sec_addr_list
, sec_node
, sec_addr
)) {
930 vty_out(vty
, " %s%s",
931 prefix2str(&sec_addr
->addr
,
933 sizeof(pbuf
)), VTY_NEWLINE
);
936 vty_out(vty
, "Address : %s%s", inet_ntoa(ifaddr
), VTY_NEWLINE
);
938 vty_out(vty
, "%s", VTY_NEWLINE
);
943 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->pim_neighbor_list
, neighnode
, neigh
)) {
946 vty_out(vty
, "PIM Neighbors%s", VTY_NEWLINE
);
947 vty_out(vty
, "-------------%s", VTY_NEWLINE
);
951 pim_inet4_dump("<src?>", neigh
->source_addr
, neigh_src_str
, sizeof(neigh_src_str
));
952 pim_time_uptime(uptime
, sizeof(uptime
), now
- neigh
->creation
);
953 pim_time_timer_to_hhmmss(expire
, sizeof(expire
), neigh
->t_expire_timer
);
954 vty_out(vty
, "%-15s : up for %s, holdtime expires in %s%s", neigh_src_str
, uptime
, expire
, VTY_NEWLINE
);
958 vty_out(vty
, "%s", VTY_NEWLINE
);
959 vty_out(vty
, "%s", VTY_NEWLINE
);
962 vty_out(vty
, "Designated Router%s", VTY_NEWLINE
);
963 vty_out(vty
, "-----------------%s", VTY_NEWLINE
);
964 vty_out(vty
, "Address : %s%s", dr_str
, VTY_NEWLINE
);
965 vty_out(vty
, "Priority : %d%s", pim_ifp
->pim_dr_priority
, VTY_NEWLINE
);
966 vty_out(vty
, "Uptime : %s%s", dr_uptime
, VTY_NEWLINE
);
967 vty_out(vty
, "Elections : %d%s", pim_ifp
->pim_dr_election_count
, VTY_NEWLINE
);
968 vty_out(vty
, "Changes : %d%s", pim_ifp
->pim_dr_election_changes
, VTY_NEWLINE
);
969 vty_out(vty
, "%s", VTY_NEWLINE
);
970 vty_out(vty
, "%s", VTY_NEWLINE
);
974 for (ALL_LIST_ELEMENTS_RO(pim_upstream_list
, upnode
, up
)) {
975 if (strcmp(ifp
->name
, up
->rpf
.source_nexthop
.interface
->name
) == 0) {
976 if (up
->flags
& PIM_UPSTREAM_FLAG_MASK_FHR
) {
979 vty_out(vty
, "FHR - First Hop Router%s", VTY_NEWLINE
);
980 vty_out(vty
, "----------------------%s", VTY_NEWLINE
);
984 pim_inet4_dump("<src?>", up
->sg
.src
, src_str
, sizeof(src_str
));
985 pim_inet4_dump("<grp?>", up
->sg
.grp
, grp_str
, sizeof(grp_str
));
986 pim_time_uptime(uptime
, sizeof(uptime
), now
- up
->state_transition
);
987 vty_out(vty
, "%s : %s is a source, uptime is %s%s", grp_str
, src_str
, uptime
, VTY_NEWLINE
);
993 vty_out(vty
, "%s", VTY_NEWLINE
);
994 vty_out(vty
, "%s", VTY_NEWLINE
);
997 vty_out(vty
, "Hellos%s", VTY_NEWLINE
);
998 vty_out(vty
, "------%s", VTY_NEWLINE
);
999 vty_out(vty
, "Period : %d%s", pim_ifp
->pim_hello_period
, VTY_NEWLINE
);
1000 vty_out(vty
, "Timer : %s%s", hello_timer
, VTY_NEWLINE
);
1001 vty_out(vty
, "StatStart : %s%s", stat_uptime
, VTY_NEWLINE
);
1002 vty_out(vty
, "Receive : %d%s", pim_ifp
->pim_ifstat_hello_recv
, VTY_NEWLINE
);
1003 vty_out(vty
, "Receive Failed : %d%s", pim_ifp
->pim_ifstat_hello_recvfail
, VTY_NEWLINE
);
1004 vty_out(vty
, "Send : %d%s", pim_ifp
->pim_ifstat_hello_sent
, VTY_NEWLINE
);
1005 vty_out(vty
, "Send Failed : %d%s", pim_ifp
->pim_ifstat_hello_sendfail
, VTY_NEWLINE
);
1006 vty_out(vty
, "Generation ID : %08x%s", pim_ifp
->pim_generation_id
, VTY_NEWLINE
);
1007 vty_out(vty
, "%s", VTY_NEWLINE
);
1008 vty_out(vty
, "%s", VTY_NEWLINE
);
1010 pim_print_ifp_flags(vty
, ifp
, mloop
);
1012 vty_out(vty
, "Join Prune Interval%s", VTY_NEWLINE
);
1013 vty_out(vty
, "-------------------%s", VTY_NEWLINE
);
1014 vty_out(vty
, "LAN Delay : %s%s", pim_if_lan_delay_enabled(ifp
) ? "yes" : "no", VTY_NEWLINE
);
1015 vty_out(vty
, "Effective Propagation Delay : %d msec%s", pim_if_effective_propagation_delay_msec(ifp
), VTY_NEWLINE
);
1016 vty_out(vty
, "Effective Override Interval : %d msec%s", pim_if_effective_override_interval_msec(ifp
), VTY_NEWLINE
);
1017 vty_out(vty
, "Join Prune Override Interval : %d msec%s", pim_if_jp_override_interval_msec(ifp
), VTY_NEWLINE
);
1018 vty_out(vty
, "%s", VTY_NEWLINE
);
1019 vty_out(vty
, "%s", VTY_NEWLINE
);
1021 vty_out(vty
, "LAN Prune Delay%s", VTY_NEWLINE
);
1022 vty_out(vty
, "---------------%s", VTY_NEWLINE
);
1023 vty_out(vty
, "Propagation Delay : %d msec%s", pim_ifp
->pim_propagation_delay_msec
, VTY_NEWLINE
);
1024 vty_out(vty
, "Propagation Delay (Highest) : %d msec%s", pim_ifp
->pim_neighbors_highest_propagation_delay_msec
, VTY_NEWLINE
);
1025 vty_out(vty
, "Override Interval : %d msec%s", pim_ifp
->pim_override_interval_msec
, VTY_NEWLINE
);
1026 vty_out(vty
, "Override Interval (Highest) : %d msec%s", pim_ifp
->pim_neighbors_highest_override_interval_msec
, VTY_NEWLINE
);
1027 vty_out(vty
, "%s", VTY_NEWLINE
);
1028 vty_out(vty
, "%s", VTY_NEWLINE
);
1033 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
1034 json_object_free(json
);
1037 vty_out (vty
, "%% No such interface%s", VTY_NEWLINE
);
1041 static void pim_show_interfaces(struct vty
*vty
, u_char uj
)
1043 struct interface
*ifp
;
1044 struct listnode
*node
;
1045 struct listnode
*upnode
;
1046 struct pim_interface
*pim_ifp
;
1047 struct pim_upstream
*up
;
1050 int pim_ifchannels
= 0;
1051 json_object
*json
= NULL
;
1052 json_object
*json_row
= NULL
;
1053 json_object
*json_tmp
;
1055 json
= json_object_new_object();
1057 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
)) {
1058 pim_ifp
= ifp
->info
;
1063 if (pim_ifp
->pim_sock_fd
< 0)
1066 pim_nbrs
= pim_ifp
->pim_neighbor_list
->count
;
1067 pim_ifchannels
= pim_ifp
->pim_ifchannel_list
->count
;
1070 for (ALL_LIST_ELEMENTS_RO(pim_upstream_list
, upnode
, up
))
1071 if (ifp
== up
->rpf
.source_nexthop
.interface
)
1072 if (up
->flags
& PIM_UPSTREAM_FLAG_MASK_FHR
)
1075 json_row
= json_object_new_object();
1076 json_object_pim_ifp_add(json_row
, ifp
);
1077 json_object_int_add(json_row
, "pimNeighbors", pim_nbrs
);
1078 json_object_int_add(json_row
, "pimIfChannels", pim_ifchannels
);
1079 json_object_int_add(json_row
, "firstHopRouter", fhr
);
1080 json_object_string_add(json_row
, "pimDesignatedRouter", inet_ntoa(pim_ifp
->pim_dr_addr
));
1082 if (pim_ifp
->pim_dr_addr
.s_addr
== pim_ifp
->primary_address
.s_addr
)
1083 json_object_boolean_true_add(json_row
, "pimDesignatedRouterLocal");
1085 json_object_object_add(json
, ifp
->name
, json_row
);
1089 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
1091 vty_out(vty
, "Interface State Address PIM Nbrs PIM DR FHR IfChannels%s", VTY_NEWLINE
);
1093 json_object_object_foreach(json
, key
, val
) {
1094 vty_out(vty
, "%-9s ", key
);
1096 json_object_object_get_ex(val
, "state", &json_tmp
);
1097 vty_out(vty
, "%5s ", json_object_get_string(json_tmp
));
1099 json_object_object_get_ex(val
, "address", &json_tmp
);
1100 vty_out(vty
, "%15s ", json_object_get_string(json_tmp
));
1102 json_object_object_get_ex(val
, "pimNeighbors", &json_tmp
);
1103 vty_out(vty
, "%8d ", json_object_get_int(json_tmp
));
1105 if (json_object_object_get_ex(val
, "pimDesignatedRouterLocal", &json_tmp
)) {
1106 vty_out(vty
, "%15s ", "local");
1108 json_object_object_get_ex(val
, "pimDesignatedRouter", &json_tmp
);
1109 vty_out(vty
, "%15s ", json_object_get_string(json_tmp
));
1112 json_object_object_get_ex(val
, "firstHopRouter", &json_tmp
);
1113 vty_out(vty
, "%3d ", json_object_get_int(json_tmp
));
1115 json_object_object_get_ex(val
, "pimIfChannels", &json_tmp
);
1116 vty_out(vty
, "%9d%s", json_object_get_int(json_tmp
), VTY_NEWLINE
);
1120 json_object_free(json
);
1123 static void pim_show_join(struct vty
*vty
, u_char uj
)
1125 struct pim_interface
*pim_ifp
;
1126 struct in_addr ifaddr
;
1127 struct listnode
*ch_node
;
1128 struct pim_ifchannel
*ch
;
1130 json_object
*json
= NULL
;
1131 json_object
*json_iface
= NULL
;
1132 json_object
*json_row
= NULL
;
1133 json_object
*json_grp
= NULL
;
1135 now
= pim_time_monotonic_sec();
1138 json
= json_object_new_object();
1141 "Interface Address Source Group State Uptime Expire Prune%s",
1144 for (ALL_LIST_ELEMENTS_RO(pim_ifchannel_list
, ch_node
, ch
)) {
1146 pim_ifp
= ch
->interface
->info
;
1151 ifaddr
= pim_ifp
->primary_address
;
1153 char ch_src_str
[INET_ADDRSTRLEN
];
1154 char ch_grp_str
[INET_ADDRSTRLEN
];
1159 pim_inet4_dump("<ch_src?>", ch
->sg
.src
,
1160 ch_src_str
, sizeof(ch_src_str
));
1161 pim_inet4_dump("<ch_grp?>", ch
->sg
.grp
,
1162 ch_grp_str
, sizeof(ch_grp_str
));
1164 pim_time_uptime_begin(uptime
, sizeof(uptime
), now
, ch
->ifjoin_creation
);
1165 pim_time_timer_to_mmss(expire
, sizeof(expire
),
1166 ch
->t_ifjoin_expiry_timer
);
1167 pim_time_timer_to_mmss(prune
, sizeof(prune
),
1168 ch
->t_ifjoin_prune_pending_timer
);
1171 json_object_object_get_ex(json
, ch
->interface
->name
, &json_iface
);
1174 json_iface
= json_object_new_object();
1175 json_object_pim_ifp_add(json_iface
, ch
->interface
);
1176 json_object_object_add(json
, ch
->interface
->name
, json_iface
);
1179 json_row
= json_object_new_object();
1180 json_object_string_add(json_row
, "source", ch_src_str
);
1181 json_object_string_add(json_row
, "group", ch_grp_str
);
1182 json_object_string_add(json_row
, "upTime", uptime
);
1183 json_object_string_add(json_row
, "expire", expire
);
1184 json_object_string_add(json_row
, "prune", prune
);
1185 json_object_string_add(json_row
, "channelJoinName",
1186 pim_ifchannel_ifjoin_name(ch
->ifjoin_state
, ch
->flags
));
1187 if (PIM_IF_FLAG_TEST_S_G_RPT(ch
->flags
))
1188 json_object_int_add(json_row
, "SGRpt", 1);
1190 json_object_object_get_ex(json_iface
, ch_grp_str
, &json_grp
);
1193 json_grp
= json_object_new_object();
1194 json_object_object_add(json_grp
, ch_src_str
, json_row
);
1195 json_object_object_add(json_iface
, ch_grp_str
, json_grp
);
1198 json_object_object_add(json_grp
, ch_src_str
, json_row
);
1200 vty_out(vty
, "%-9s %-15s %-15s %-15s %-6s %8s %-6s %5s%s",
1201 ch
->interface
->name
,
1205 pim_ifchannel_ifjoin_name(ch
->ifjoin_state
, ch
->flags
),
1211 } /* scan interface channels */
1214 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
1215 json_object_free(json
);
1219 static void pim_show_neighbors_single(struct vty
*vty
, const char *neighbor
, u_char uj
)
1221 struct listnode
*node
;
1222 struct listnode
*neighnode
;
1223 struct interface
*ifp
;
1224 struct pim_interface
*pim_ifp
;
1225 struct pim_neighbor
*neigh
;
1227 int found_neighbor
= 0;
1228 int option_address_list
;
1229 int option_dr_priority
;
1230 int option_generation_id
;
1231 int option_holdtime
;
1232 int option_lan_prune_delay
;
1236 char neigh_src_str
[INET_ADDRSTRLEN
];
1238 json_object
*json
= NULL
;
1239 json_object
*json_ifp
= NULL
;
1240 json_object
*json_row
= NULL
;
1242 now
= pim_time_monotonic_sec();
1245 json
= json_object_new_object();
1247 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
)) {
1248 pim_ifp
= ifp
->info
;
1253 if (pim_ifp
->pim_sock_fd
< 0)
1256 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->pim_neighbor_list
, neighnode
, neigh
)) {
1257 pim_inet4_dump("<src?>", neigh
->source_addr
,
1258 neigh_src_str
, sizeof(neigh_src_str
));
1261 * The user can specify either the interface name or the PIM neighbor IP.
1262 * If this pim_ifp matches neither then skip.
1264 if (strcmp(neighbor
, "detail") &&
1265 strcmp(neighbor
, ifp
->name
) &&
1266 strcmp(neighbor
, neigh_src_str
))
1270 pim_time_uptime(uptime
, sizeof(uptime
), now
- neigh
->creation
);
1271 pim_time_timer_to_hhmmss(expire
, sizeof(expire
), neigh
->t_expire_timer
);
1273 option_address_list
= 0;
1274 option_dr_priority
= 0;
1275 option_generation_id
= 0;
1276 option_holdtime
= 0;
1277 option_lan_prune_delay
= 0;
1280 if (PIM_OPTION_IS_SET(neigh
->hello_options
, PIM_OPTION_MASK_ADDRESS_LIST
))
1281 option_address_list
= 1;
1283 if (PIM_OPTION_IS_SET(neigh
->hello_options
, PIM_OPTION_MASK_DR_PRIORITY
))
1284 option_dr_priority
= 1;
1286 if (PIM_OPTION_IS_SET(neigh
->hello_options
, PIM_OPTION_MASK_GENERATION_ID
))
1287 option_generation_id
= 1;
1289 if (PIM_OPTION_IS_SET(neigh
->hello_options
, PIM_OPTION_MASK_HOLDTIME
))
1290 option_holdtime
= 1;
1292 if (PIM_OPTION_IS_SET(neigh
->hello_options
, PIM_OPTION_MASK_LAN_PRUNE_DELAY
))
1293 option_lan_prune_delay
= 1;
1295 if (PIM_OPTION_IS_SET(neigh
->hello_options
, PIM_OPTION_MASK_CAN_DISABLE_JOIN_SUPPRESSION
))
1300 /* Does this ifp live in json? If not create it. */
1301 json_object_object_get_ex(json
, ifp
->name
, &json_ifp
);
1304 json_ifp
= json_object_new_object();
1305 json_object_pim_ifp_add(json_ifp
, ifp
);
1306 json_object_object_add(json
, ifp
->name
, json_ifp
);
1309 json_row
= json_object_new_object();
1310 json_object_string_add(json_row
, "interface", ifp
->name
);
1311 json_object_string_add(json_row
, "address", neigh_src_str
);
1312 json_object_string_add(json_row
, "upTime", uptime
);
1313 json_object_string_add(json_row
, "holdtime", expire
);
1314 json_object_int_add(json_row
, "drPriority", neigh
->dr_priority
);
1315 json_object_int_add(json_row
, "generationId", neigh
->generation_id
);
1317 if (option_address_list
)
1318 json_object_boolean_true_add(json_row
, "helloOptionAddressList");
1320 if (option_dr_priority
)
1321 json_object_boolean_true_add(json_row
, "helloOptionDrPriority");
1323 if (option_generation_id
)
1324 json_object_boolean_true_add(json_row
, "helloOptionGenerationId");
1326 if (option_holdtime
)
1327 json_object_boolean_true_add(json_row
, "helloOptionHoldtime");
1329 if (option_lan_prune_delay
)
1330 json_object_boolean_true_add(json_row
, "helloOptionLanPruneDelay");
1333 json_object_boolean_true_add(json_row
, "helloOptionTBit");
1335 json_object_object_add(json_ifp
, neigh_src_str
, json_row
);
1338 vty_out(vty
, "Interface : %s%s", ifp
->name
, VTY_NEWLINE
);
1339 vty_out(vty
, "Neighbor : %s%s", neigh_src_str
, VTY_NEWLINE
);
1340 vty_out(vty
, " Uptime : %s%s", uptime
, VTY_NEWLINE
);
1341 vty_out(vty
, " Holdtime : %s%s", expire
, VTY_NEWLINE
);
1342 vty_out(vty
, " DR Priority : %d%s", neigh
->dr_priority
, VTY_NEWLINE
);
1343 vty_out(vty
, " Generation ID : %08x%s", neigh
->generation_id
, VTY_NEWLINE
);
1344 vty_out(vty
, " Override Interval (msec) : %d%s", neigh
->override_interval_msec
, VTY_NEWLINE
);
1345 vty_out(vty
, " Propagation Delay (msec) : %d%s", neigh
->propagation_delay_msec
, VTY_NEWLINE
);
1346 vty_out(vty
, " Hello Option - Address List : %s%s", option_address_list
? "yes" : "no", VTY_NEWLINE
);
1347 vty_out(vty
, " Hello Option - DR Priority : %s%s", option_dr_priority
? "yes" : "no", VTY_NEWLINE
);
1348 vty_out(vty
, " Hello Option - Generation ID : %s%s", option_generation_id
? "yes" : "no", VTY_NEWLINE
);
1349 vty_out(vty
, " Hello Option - Holdtime : %s%s", option_holdtime
? "yes" : "no", VTY_NEWLINE
);
1350 vty_out(vty
, " Hello Option - LAN Prune Delay : %s%s", option_lan_prune_delay
? "yes" : "no", VTY_NEWLINE
);
1351 vty_out(vty
, " Hello Option - T-bit : %s%s", option_t_bit
? "yes" : "no", VTY_NEWLINE
);
1352 vty_out(vty
, "%s", VTY_NEWLINE
);
1358 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
1359 json_object_free(json
);
1362 if (!found_neighbor
)
1363 vty_out (vty
, "%% No such interface or neighbor%s", VTY_NEWLINE
);
1369 pim_show_state(struct vty
*vty
, const char *src_or_group
, const char *group
, u_char uj
)
1371 struct channel_oil
*c_oil
;
1372 struct listnode
*node
;
1373 json_object
*json
= NULL
;
1374 json_object
*json_group
= NULL
;
1375 json_object
*json_ifp_in
= NULL
;
1376 json_object
*json_ifp_out
= NULL
;
1377 json_object
*json_source
= NULL
;
1380 now
= pim_time_monotonic_sec();
1383 json
= json_object_new_object();
1385 vty_out(vty
, "Codes: J -> Pim Join, I -> IGMP Report, S -> Source, * -> Inherited from (*,G)");
1386 vty_out(vty
, "%sInstalled Source Group IIF OIL%s", VTY_NEWLINE
, VTY_NEWLINE
);
1389 for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list
, node
, c_oil
)) {
1390 char grp_str
[INET_ADDRSTRLEN
];
1391 char src_str
[INET_ADDRSTRLEN
];
1392 char in_ifname
[INTERFACE_NAMSIZ
+1];
1393 char out_ifname
[INTERFACE_NAMSIZ
+1];
1395 struct interface
*ifp_in
;
1398 pim_inet4_dump("<group?>", c_oil
->oil
.mfcc_mcastgrp
, grp_str
, sizeof(grp_str
));
1399 pim_inet4_dump("<source?>", c_oil
->oil
.mfcc_origin
, src_str
, sizeof(src_str
));
1400 ifp_in
= pim_if_find_by_vif_index(c_oil
->oil
.mfcc_parent
);
1403 strcpy(in_ifname
, ifp_in
->name
);
1405 strcpy(in_ifname
, "<iif?>");
1409 if (strcmp(src_or_group
, src_str
) && strcmp(src_or_group
, grp_str
))
1412 if (group
&& strcmp(group
, grp_str
))
1418 /* Find the group, create it if it doesn't exist */
1419 json_object_object_get_ex(json
, grp_str
, &json_group
);
1422 json_group
= json_object_new_object();
1423 json_object_object_add(json
, grp_str
, json_group
);
1426 /* Find the source nested under the group, create it if it doesn't exist */
1427 json_object_object_get_ex(json_group
, src_str
, &json_source
);
1430 json_source
= json_object_new_object();
1431 json_object_object_add(json_group
, src_str
, json_source
);
1434 /* Find the inbound interface nested under the source, create it if it doesn't exist */
1435 json_object_object_get_ex(json_source
, in_ifname
, &json_ifp_in
);
1438 json_ifp_in
= json_object_new_object();
1439 json_object_object_add(json_source
, in_ifname
, json_ifp_in
);
1440 json_object_int_add (json_source
, "Installed", c_oil
->installed
);
1441 json_object_int_add (json_source
, "RefCount", c_oil
->oil_ref_count
);
1442 json_object_int_add (json_source
, "OilListSize", c_oil
->oil_size
);
1443 json_object_int_add (json_source
, "OilRescan", c_oil
->oil_inherited_rescan
);
1444 json_object_int_add (json_source
, "LastUsed", c_oil
->cc
.lastused
);
1445 json_object_int_add (json_source
, "PacketCount", c_oil
->cc
.pktcnt
);
1446 json_object_int_add (json_source
, "ByteCount", c_oil
->cc
.bytecnt
);
1447 json_object_int_add (json_source
, "WrongInterface", c_oil
->cc
.wrong_if
);
1450 vty_out(vty
, "%-9d %-15s %-15s %-7s ",
1457 for (oif_vif_index
= 0; oif_vif_index
< MAXVIFS
; ++oif_vif_index
) {
1458 struct interface
*ifp_out
;
1459 char oif_uptime
[10];
1462 ttl
= c_oil
->oil
.mfcc_ttls
[oif_vif_index
];
1466 ifp_out
= pim_if_find_by_vif_index(oif_vif_index
);
1467 pim_time_uptime(oif_uptime
, sizeof(oif_uptime
), now
- c_oil
->oif_creation
[oif_vif_index
]);
1470 strcpy(out_ifname
, ifp_out
->name
);
1472 strcpy(out_ifname
, "<oif?>");
1475 json_ifp_out
= json_object_new_object();
1476 json_object_string_add(json_ifp_out
, "source", src_str
);
1477 json_object_string_add(json_ifp_out
, "group", grp_str
);
1478 json_object_string_add(json_ifp_out
, "inboundInterface", in_ifname
);
1479 json_object_string_add(json_ifp_out
, "outboundInterface", out_ifname
);
1480 json_object_int_add(json_ifp_out
, "installed", c_oil
->installed
);
1482 json_object_object_add(json_ifp_in
, out_ifname
, json_ifp_out
);
1487 vty_out(vty
, "%s(%c%c%c%c)", out_ifname
,
1488 (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_IGMP
) ? 'I' : ' ',
1489 (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_PIM
) ? 'J' : ' ',
1490 (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_SOURCE
) ? 'S' : ' ',
1491 (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_STAR
) ? '*' : ' ');
1494 vty_out(vty
, ", %s(%c%c%c%c)", out_ifname
,
1495 (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_IGMP
) ? 'I' : ' ',
1496 (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_PIM
) ? 'J' : ' ',
1497 (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_SOURCE
) ? 'S' : ' ',
1498 (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_STAR
) ? '*' : ' ' );
1503 vty_out(vty
, "%s", VTY_NEWLINE
);
1508 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
1509 json_object_free(json
);
1511 vty_out(vty
, "%s", VTY_NEWLINE
);
1515 static void pim_show_neighbors(struct vty
*vty
, u_char uj
)
1517 struct listnode
*node
;
1518 struct listnode
*neighnode
;
1519 struct interface
*ifp
;
1520 struct pim_interface
*pim_ifp
;
1521 struct pim_neighbor
*neigh
;
1525 char neigh_src_str
[INET_ADDRSTRLEN
];
1526 json_object
*json
= NULL
;
1527 json_object
*json_ifp_rows
= NULL
;
1528 json_object
*json_row
= NULL
;
1530 now
= pim_time_monotonic_sec();
1533 json
= json_object_new_object();
1535 vty_out(vty
, "Interface Neighbor Uptime Holdtime DR Pri%s", VTY_NEWLINE
);
1538 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
)) {
1539 pim_ifp
= ifp
->info
;
1544 if (pim_ifp
->pim_sock_fd
< 0)
1548 json_ifp_rows
= json_object_new_object();
1550 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->pim_neighbor_list
, neighnode
, neigh
)) {
1551 pim_inet4_dump("<src?>", neigh
->source_addr
,
1552 neigh_src_str
, sizeof(neigh_src_str
));
1553 pim_time_uptime(uptime
, sizeof(uptime
), now
- neigh
->creation
);
1554 pim_time_timer_to_hhmmss(expire
, sizeof(expire
), neigh
->t_expire_timer
);
1557 json_row
= json_object_new_object();
1558 json_object_string_add(json_row
, "interface", ifp
->name
);
1559 json_object_string_add(json_row
, "neighbor", neigh_src_str
);
1560 json_object_string_add(json_row
, "upTime", uptime
);
1561 json_object_string_add(json_row
, "holdTime", expire
);
1562 json_object_int_add(json_row
, "holdTimeMax", neigh
->holdtime
);
1563 json_object_int_add(json_row
, "drPriority", neigh
->dr_priority
);
1564 json_object_object_add(json_ifp_rows
, neigh_src_str
, json_row
);
1567 vty_out(vty
, "%-9s %15s %8s %8s %6d%s",
1578 json_object_object_add(json
, ifp
->name
, json_ifp_rows
);
1579 json_ifp_rows
= NULL
;
1584 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
1585 json_object_free(json
);
1589 static void pim_show_neighbors_secondary(struct vty
*vty
)
1591 struct listnode
*node
;
1592 struct interface
*ifp
;
1594 vty_out(vty
, "Interface Address Neighbor Secondary %s", VTY_NEWLINE
);
1596 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
)) {
1597 struct pim_interface
*pim_ifp
;
1598 struct in_addr ifaddr
;
1599 struct listnode
*neighnode
;
1600 struct pim_neighbor
*neigh
;
1602 pim_ifp
= ifp
->info
;
1607 if (pim_ifp
->pim_sock_fd
< 0)
1610 ifaddr
= pim_ifp
->primary_address
;
1612 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->pim_neighbor_list
, neighnode
, neigh
)) {
1613 char neigh_src_str
[INET_ADDRSTRLEN
];
1614 struct listnode
*prefix_node
;
1617 if (!neigh
->prefix_list
)
1620 pim_inet4_dump("<src?>", neigh
->source_addr
,
1621 neigh_src_str
, sizeof(neigh_src_str
));
1623 for (ALL_LIST_ELEMENTS_RO(neigh
->prefix_list
, prefix_node
, p
)) {
1624 char neigh_sec_str
[PREFIX2STR_BUFFER
];
1626 prefix2str(p
, neigh_sec_str
, sizeof(neigh_sec_str
));
1628 vty_out(vty
, "%-9s %-15s %-15s %-15s%s",
1640 json_object_pim_upstream_add (json_object
*json
, struct pim_upstream
*up
)
1642 if (up
->flags
& PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED
)
1643 json_object_boolean_true_add(json
, "drJoinDesired");
1645 if (up
->flags
& PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED
)
1646 json_object_boolean_true_add(json
, "drJoinDesiredUpdated");
1648 if (up
->flags
& PIM_UPSTREAM_FLAG_MASK_FHR
)
1649 json_object_boolean_true_add(json
, "firstHopRouter");
1651 if (up
->flags
& PIM_UPSTREAM_FLAG_MASK_SRC_IGMP
)
1652 json_object_boolean_true_add(json
, "sourceIgmp");
1654 if (up
->flags
& PIM_UPSTREAM_FLAG_MASK_SRC_PIM
)
1655 json_object_boolean_true_add(json
, "sourcePim");
1657 if (up
->flags
& PIM_UPSTREAM_FLAG_MASK_SRC_STREAM
)
1658 json_object_boolean_true_add(json
, "sourceStream");
1660 /* XXX: need to print ths flag in the plain text display as well */
1661 if (up
->flags
& PIM_UPSTREAM_FLAG_MASK_SRC_MSDP
)
1662 json_object_boolean_true_add(json
, "sourceMsdp");
1666 pim_upstream_state2brief_str (enum pim_upstream_state join_state
, char *state_str
)
1670 case PIM_UPSTREAM_NOTJOINED
:
1671 strcpy (state_str
, "NotJ");
1673 case PIM_UPSTREAM_JOINED
:
1674 strcpy (state_str
, "J");
1677 strcpy (state_str
, "Unk");
1683 pim_reg_state2brief_str (enum pim_reg_state reg_state
, char *state_str
)
1687 case PIM_REG_NOINFO
:
1688 strcpy (state_str
, "RegNI");
1691 strcpy (state_str
, "RegJ");
1693 case PIM_REG_JOIN_PENDING
:
1695 strcpy (state_str
, "RegP");
1698 strcpy (state_str
, "Unk");
1703 static void pim_show_upstream(struct vty
*vty
, u_char uj
)
1705 struct listnode
*upnode
;
1706 struct pim_upstream
*up
;
1708 json_object
*json
= NULL
;
1709 json_object
*json_group
= NULL
;
1710 json_object
*json_row
= NULL
;
1712 now
= pim_time_monotonic_sec();
1715 json
= json_object_new_object();
1717 vty_out(vty
, "Iif Source Group State Uptime JoinTimer RSTimer KATimer RefCnt%s", VTY_NEWLINE
);
1719 for (ALL_LIST_ELEMENTS_RO(pim_upstream_list
, upnode
, up
)) {
1720 char src_str
[INET_ADDRSTRLEN
];
1721 char grp_str
[INET_ADDRSTRLEN
];
1723 char join_timer
[10];
1726 char msdp_reg_timer
[10];
1727 char state_str
[PIM_REG_STATE_STR_LEN
];
1729 pim_inet4_dump("<src?>", up
->sg
.src
, src_str
, sizeof(src_str
));
1730 pim_inet4_dump("<grp?>", up
->sg
.grp
, grp_str
, sizeof(grp_str
));
1731 pim_time_uptime(uptime
, sizeof(uptime
), now
- up
->state_transition
);
1732 pim_time_timer_to_hhmmss (join_timer
, sizeof(join_timer
), up
->t_join_timer
);
1735 * If we have a J/P timer for the neighbor display that
1737 if (!up
->t_join_timer
)
1739 struct pim_neighbor
*nbr
;
1741 nbr
= pim_neighbor_find (up
->rpf
.source_nexthop
.interface
,
1742 up
->rpf
.rpf_addr
.u
.prefix4
);
1744 pim_time_timer_to_hhmmss (join_timer
, sizeof(join_timer
), nbr
->jp_timer
);
1747 pim_time_timer_to_hhmmss (rs_timer
, sizeof (rs_timer
), up
->t_rs_timer
);
1748 pim_time_timer_to_hhmmss (ka_timer
, sizeof (ka_timer
), up
->t_ka_timer
);
1749 pim_time_timer_to_hhmmss (msdp_reg_timer
, sizeof (msdp_reg_timer
), up
->t_msdp_reg_timer
);
1751 pim_upstream_state2brief_str (up
->join_state
, state_str
);
1752 if (up
->reg_state
!= PIM_REG_NOINFO
) {
1753 char tmp_str
[PIM_REG_STATE_STR_LEN
];
1755 sprintf (state_str
+ strlen (state_str
), ",%s",
1756 pim_reg_state2brief_str (up
->reg_state
, tmp_str
));
1760 json_object_object_get_ex(json
, grp_str
, &json_group
);
1763 json_group
= json_object_new_object();
1764 json_object_object_add(json
, grp_str
, json_group
);
1767 json_row
= json_object_new_object();
1768 json_object_pim_upstream_add(json_row
, up
);
1769 json_object_string_add(json_row
, "inboundInterface", up
->rpf
.source_nexthop
.interface
->name
);
1770 json_object_string_add(json_row
, "source", src_str
);
1771 json_object_string_add(json_row
, "group", grp_str
);
1772 json_object_string_add(json_row
, "state", state_str
);
1773 json_object_string_add(json_row
, "joinState", pim_upstream_state2str (up
->join_state
));
1774 json_object_string_add(json_row
, "regState", pim_reg_state2str (up
->reg_state
, state_str
));
1775 json_object_string_add(json_row
, "upTime", uptime
);
1776 json_object_string_add(json_row
, "joinTimer", join_timer
);
1777 json_object_string_add(json_row
, "resetTimer", rs_timer
);
1778 json_object_string_add(json_row
, "keepaliveTimer", ka_timer
);
1779 json_object_string_add(json_row
, "msdpRegTimer", msdp_reg_timer
);
1780 json_object_int_add(json_row
, "refCount", up
->ref_count
);
1781 json_object_int_add(json_row
, "sptBit", up
->sptbit
);
1782 json_object_object_add(json_group
, src_str
, json_row
);
1784 vty_out(vty
, "%-10s%-15s %-15s %-11s %-8s %-9s %-9s %-9s %6d%s",
1785 up
->rpf
.source_nexthop
.interface
->name
,
1799 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
1800 json_object_free(json
);
1804 static void pim_show_join_desired(struct vty
*vty
, u_char uj
)
1806 struct listnode
*chnode
;
1807 struct pim_interface
*pim_ifp
;
1808 struct pim_ifchannel
*ch
;
1809 char src_str
[INET_ADDRSTRLEN
];
1810 char grp_str
[INET_ADDRSTRLEN
];
1811 json_object
*json
= NULL
;
1812 json_object
*json_group
= NULL
;
1813 json_object
*json_row
= NULL
;
1816 json
= json_object_new_object();
1819 "Interface Source Group LostAssert Joins PimInclude JoinDesired EvalJD%s",
1822 /* scan per-interface (S,G) state */
1823 for (ALL_LIST_ELEMENTS_RO(pim_ifchannel_list
, chnode
, ch
)) {
1824 /* scan all interfaces */
1825 pim_ifp
= ch
->interface
->info
;
1829 struct pim_upstream
*up
= ch
->upstream
;
1831 pim_inet4_dump("<src?>", up
->sg
.src
, src_str
, sizeof(src_str
));
1832 pim_inet4_dump("<grp?>", up
->sg
.grp
, grp_str
, sizeof(grp_str
));
1835 json_object_object_get_ex(json
, grp_str
, &json_group
);
1838 json_group
= json_object_new_object();
1839 json_object_object_add(json
, grp_str
, json_group
);
1842 json_row
= json_object_new_object();
1843 json_object_pim_upstream_add(json_row
, up
);
1844 json_object_string_add(json_row
, "interface", ch
->interface
->name
);
1845 json_object_string_add(json_row
, "source", src_str
);
1846 json_object_string_add(json_row
, "group", grp_str
);
1848 if (pim_macro_ch_lost_assert(ch
))
1849 json_object_boolean_true_add(json_row
, "lostAssert");
1851 if (pim_macro_chisin_joins(ch
))
1852 json_object_boolean_true_add(json_row
, "joins");
1854 if (pim_macro_chisin_pim_include(ch
))
1855 json_object_boolean_true_add(json_row
, "pimInclude");
1857 if (pim_upstream_evaluate_join_desired(up
))
1858 json_object_boolean_true_add(json_row
, "evaluateJoinDesired");
1860 json_object_object_add(json_group
, src_str
, json_row
);
1863 vty_out(vty
, "%-9s %-15s %-15s %-10s %-5s %-10s %-11s %-6s%s",
1864 ch
->interface
->name
,
1867 pim_macro_ch_lost_assert(ch
) ? "yes" : "no",
1868 pim_macro_chisin_joins(ch
) ? "yes" : "no",
1869 pim_macro_chisin_pim_include(ch
) ? "yes" : "no",
1870 PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED(up
->flags
) ? "yes" : "no",
1871 pim_upstream_evaluate_join_desired(up
) ? "yes" : "no",
1877 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
1878 json_object_free(json
);
1882 static void pim_show_upstream_rpf(struct vty
*vty
, u_char uj
)
1884 struct listnode
*upnode
;
1885 struct pim_upstream
*up
;
1886 json_object
*json
= NULL
;
1887 json_object
*json_group
= NULL
;
1888 json_object
*json_row
= NULL
;
1891 json
= json_object_new_object();
1894 "Source Group RpfIface RibNextHop RpfAddress %s",
1897 for (ALL_LIST_ELEMENTS_RO(pim_upstream_list
, upnode
, up
)) {
1898 char src_str
[INET_ADDRSTRLEN
];
1899 char grp_str
[INET_ADDRSTRLEN
];
1900 char rpf_nexthop_str
[PREFIX_STRLEN
];
1901 char rpf_addr_str
[PREFIX_STRLEN
];
1902 struct pim_rpf
*rpf
;
1903 const char *rpf_ifname
;
1907 pim_inet4_dump("<src?>", up
->sg
.src
, src_str
, sizeof(src_str
));
1908 pim_inet4_dump("<grp?>", up
->sg
.grp
, grp_str
, sizeof(grp_str
));
1909 pim_addr_dump("<nexthop?>", &rpf
->source_nexthop
.mrib_nexthop_addr
, rpf_nexthop_str
, sizeof(rpf_nexthop_str
));
1910 pim_addr_dump("<rpf?>", &rpf
->rpf_addr
, rpf_addr_str
, sizeof(rpf_addr_str
));
1912 rpf_ifname
= rpf
->source_nexthop
.interface
? rpf
->source_nexthop
.interface
->name
: "<ifname?>";
1915 json_object_object_get_ex(json
, grp_str
, &json_group
);
1918 json_group
= json_object_new_object();
1919 json_object_object_add(json
, grp_str
, json_group
);
1922 json_row
= json_object_new_object();
1923 json_object_pim_upstream_add(json_row
, up
);
1924 json_object_string_add(json_row
, "source", src_str
);
1925 json_object_string_add(json_row
, "group", grp_str
);
1926 json_object_string_add(json_row
, "rpfInterface", rpf_ifname
);
1927 json_object_string_add(json_row
, "ribNexthop", rpf_nexthop_str
);
1928 json_object_string_add(json_row
, "rpfAddress", rpf_addr_str
);
1929 json_object_object_add(json_group
, src_str
, json_row
);
1931 vty_out(vty
, "%-15s %-15s %-8s %-15s %-15s%s",
1942 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
1943 json_object_free(json
);
1947 static void show_rpf_refresh_stats(struct vty
*vty
, time_t now
, json_object
*json
)
1949 char refresh_uptime
[10];
1951 pim_time_uptime_begin(refresh_uptime
, sizeof(refresh_uptime
), now
, qpim_rpf_cache_refresh_last
);
1954 json_object_int_add(json
, "rpfCacheRefreshDelayMsecs", qpim_rpf_cache_refresh_delay_msec
);
1955 json_object_int_add(json
, "rpfCacheRefreshTimer", pim_time_timer_remain_msec(qpim_rpf_cache_refresher
));
1956 json_object_int_add(json
, "rpfCacheRefreshRequests", qpim_rpf_cache_refresh_requests
);
1957 json_object_int_add(json
, "rpfCacheRefreshEvents", qpim_rpf_cache_refresh_events
);
1958 json_object_string_add(json
, "rpfCacheRefreshLast", refresh_uptime
);
1959 json_object_int_add(json
, "nexthopLookups", qpim_nexthop_lookups
);
1960 json_object_int_add(json
, "nexthopLookupsAvoided", nexthop_lookups_avoided
);
1963 "RPF Cache Refresh Delay: %ld msecs%s"
1964 "RPF Cache Refresh Timer: %ld msecs%s"
1965 "RPF Cache Refresh Requests: %lld%s"
1966 "RPF Cache Refresh Events: %lld%s"
1967 "RPF Cache Refresh Last: %s%s"
1968 "Nexthop Lookups: %lld%s"
1969 "Nexthop Lookups Avoided: %lld%s",
1970 qpim_rpf_cache_refresh_delay_msec
, VTY_NEWLINE
,
1971 pim_time_timer_remain_msec(qpim_rpf_cache_refresher
), VTY_NEWLINE
,
1972 (long long)qpim_rpf_cache_refresh_requests
, VTY_NEWLINE
,
1973 (long long)qpim_rpf_cache_refresh_events
, VTY_NEWLINE
,
1974 refresh_uptime
, VTY_NEWLINE
,
1975 (long long) qpim_nexthop_lookups
, VTY_NEWLINE
,
1976 (long long)nexthop_lookups_avoided
, VTY_NEWLINE
);
1980 static void show_scan_oil_stats(struct vty
*vty
, time_t now
)
1982 char uptime_scan_oil
[10];
1983 char uptime_mroute_add
[10];
1984 char uptime_mroute_del
[10];
1986 pim_time_uptime_begin(uptime_scan_oil
, sizeof(uptime_scan_oil
), now
, qpim_scan_oil_last
);
1987 pim_time_uptime_begin(uptime_mroute_add
, sizeof(uptime_mroute_add
), now
, qpim_mroute_add_last
);
1988 pim_time_uptime_begin(uptime_mroute_del
, sizeof(uptime_mroute_del
), now
, qpim_mroute_del_last
);
1991 "Scan OIL - Last: %s Events: %lld%s"
1992 "MFC Add - Last: %s Events: %lld%s"
1993 "MFC Del - Last: %s Events: %lld%s",
1994 uptime_scan_oil
, (long long) qpim_scan_oil_events
, VTY_NEWLINE
,
1995 uptime_mroute_add
, (long long) qpim_mroute_add_events
, VTY_NEWLINE
,
1996 uptime_mroute_del
, (long long) qpim_mroute_del_events
, VTY_NEWLINE
);
1999 static void pim_show_rpf(struct vty
*vty
, u_char uj
)
2001 struct listnode
*up_node
;
2002 struct pim_upstream
*up
;
2003 time_t now
= pim_time_monotonic_sec();
2004 json_object
*json
= NULL
;
2005 json_object
*json_group
= NULL
;
2006 json_object
*json_row
= NULL
;
2009 json
= json_object_new_object();
2010 show_rpf_refresh_stats(vty
, now
, json
);
2012 show_rpf_refresh_stats(vty
, now
, json
);
2013 vty_out(vty
, "%s", VTY_NEWLINE
);
2015 "Source Group RpfIface RpfAddress RibNextHop Metric Pref%s",
2019 for (ALL_LIST_ELEMENTS_RO(pim_upstream_list
, up_node
, up
)) {
2020 char src_str
[INET_ADDRSTRLEN
];
2021 char grp_str
[INET_ADDRSTRLEN
];
2022 char rpf_addr_str
[PREFIX_STRLEN
];
2023 char rib_nexthop_str
[PREFIX_STRLEN
];
2024 const char *rpf_ifname
;
2025 struct pim_rpf
*rpf
= &up
->rpf
;
2027 pim_inet4_dump("<src?>", up
->sg
.src
, src_str
, sizeof(src_str
));
2028 pim_inet4_dump("<grp?>", up
->sg
.grp
, grp_str
, sizeof(grp_str
));
2029 pim_addr_dump("<rpf?>", &rpf
->rpf_addr
, rpf_addr_str
, sizeof(rpf_addr_str
));
2030 pim_addr_dump("<nexthop?>", &rpf
->source_nexthop
.mrib_nexthop_addr
, rib_nexthop_str
, sizeof(rib_nexthop_str
));
2032 rpf_ifname
= rpf
->source_nexthop
.interface
? rpf
->source_nexthop
.interface
->name
: "<ifname?>";
2035 json_object_object_get_ex(json
, grp_str
, &json_group
);
2038 json_group
= json_object_new_object();
2039 json_object_object_add(json
, grp_str
, json_group
);
2042 json_row
= json_object_new_object();
2043 json_object_string_add(json_row
, "source", src_str
);
2044 json_object_string_add(json_row
, "group", grp_str
);
2045 json_object_string_add(json_row
, "rpfInterface", rpf_ifname
);
2046 json_object_string_add(json_row
, "rpfAddress", rpf_addr_str
);
2047 json_object_string_add(json_row
, "ribNexthop", rib_nexthop_str
);
2048 json_object_int_add(json_row
, "routeMetric", rpf
->source_nexthop
.mrib_route_metric
);
2049 json_object_int_add(json_row
, "routePreference", rpf
->source_nexthop
.mrib_metric_preference
);
2050 json_object_object_add(json_group
, src_str
, json_row
);
2053 vty_out(vty
, "%-15s %-15s %-8s %-15s %-15s %6d %4d%s",
2059 rpf
->source_nexthop
.mrib_route_metric
,
2060 rpf
->source_nexthop
.mrib_metric_preference
,
2066 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
2067 json_object_free(json
);
2071 static void igmp_show_groups(struct vty
*vty
, u_char uj
)
2073 struct listnode
*ifnode
;
2074 struct interface
*ifp
;
2076 json_object
*json
= NULL
;
2077 json_object
*json_iface
= NULL
;
2078 json_object
*json_row
= NULL
;
2080 now
= pim_time_monotonic_sec();
2083 json
= json_object_new_object();
2085 vty_out(vty
, "Interface Address Group Mode Timer Srcs V Uptime %s", VTY_NEWLINE
);
2087 /* scan interfaces */
2088 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), ifnode
, ifp
)) {
2089 struct pim_interface
*pim_ifp
= ifp
->info
;
2090 struct listnode
*sock_node
;
2091 struct igmp_sock
*igmp
;
2096 /* scan igmp sockets */
2097 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->igmp_socket_list
, sock_node
, igmp
)) {
2098 char ifaddr_str
[INET_ADDRSTRLEN
];
2099 struct listnode
*grpnode
;
2100 struct igmp_group
*grp
;
2102 pim_inet4_dump("<ifaddr?>", igmp
->ifaddr
, ifaddr_str
, sizeof(ifaddr_str
));
2104 /* scan igmp groups */
2105 for (ALL_LIST_ELEMENTS_RO(igmp
->igmp_group_list
, grpnode
, grp
)) {
2106 char group_str
[INET_ADDRSTRLEN
];
2110 pim_inet4_dump("<group?>", grp
->group_addr
, group_str
, sizeof(group_str
));
2111 pim_time_timer_to_hhmmss(hhmmss
, sizeof(hhmmss
), grp
->t_group_timer
);
2112 pim_time_uptime(uptime
, sizeof(uptime
), now
- grp
->group_creation
);
2115 json_object_object_get_ex(json
, ifp
->name
, &json_iface
);
2118 json_iface
= json_object_new_object();
2119 json_object_pim_ifp_add(json_iface
, ifp
);
2120 json_object_object_add(json
, ifp
->name
, json_iface
);
2123 json_row
= json_object_new_object();
2124 json_object_string_add(json_row
, "source", ifaddr_str
);
2125 json_object_string_add(json_row
, "group", group_str
);
2127 if (grp
->igmp_version
== 3)
2128 json_object_string_add(json_row
, "mode", grp
->group_filtermode_isexcl
? "EXCLUDE" : "INCLUDE");
2130 json_object_string_add(json_row
, "timer", hhmmss
);
2131 json_object_int_add(json_row
, "sourcesCount", grp
->group_source_list
? listcount(grp
->group_source_list
) : 0);
2132 json_object_int_add(json_row
, "version", grp
->igmp_version
);
2133 json_object_string_add(json_row
, "uptime", uptime
);
2134 json_object_object_add(json_iface
, group_str
, json_row
);
2137 vty_out(vty
, "%-9s %-15s %-15s %4s %8s %4d %d %8s%s",
2141 grp
->igmp_version
== 3 ? (grp
->group_filtermode_isexcl
? "EXCL" : "INCL") : "----",
2143 grp
->group_source_list
? listcount(grp
->group_source_list
) : 0,
2148 } /* scan igmp groups */
2149 } /* scan igmp sockets */
2150 } /* scan interfaces */
2153 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
2154 json_object_free(json
);
2158 static void igmp_show_group_retransmission(struct vty
*vty
)
2160 struct listnode
*ifnode
;
2161 struct interface
*ifp
;
2163 vty_out(vty
, "Interface Address Group RetTimer Counter RetSrcs%s", VTY_NEWLINE
);
2165 /* scan interfaces */
2166 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), ifnode
, ifp
)) {
2167 struct pim_interface
*pim_ifp
= ifp
->info
;
2168 struct listnode
*sock_node
;
2169 struct igmp_sock
*igmp
;
2174 /* scan igmp sockets */
2175 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->igmp_socket_list
, sock_node
, igmp
)) {
2176 char ifaddr_str
[INET_ADDRSTRLEN
];
2177 struct listnode
*grpnode
;
2178 struct igmp_group
*grp
;
2180 pim_inet4_dump("<ifaddr?>", igmp
->ifaddr
, ifaddr_str
, sizeof(ifaddr_str
));
2182 /* scan igmp groups */
2183 for (ALL_LIST_ELEMENTS_RO(igmp
->igmp_group_list
, grpnode
, grp
)) {
2184 char group_str
[INET_ADDRSTRLEN
];
2185 char grp_retr_mmss
[10];
2186 struct listnode
*src_node
;
2187 struct igmp_source
*src
;
2188 int grp_retr_sources
= 0;
2190 pim_inet4_dump("<group?>", grp
->group_addr
, group_str
, sizeof(group_str
));
2191 pim_time_timer_to_mmss(grp_retr_mmss
, sizeof(grp_retr_mmss
), grp
->t_group_query_retransmit_timer
);
2194 /* count group sources with retransmission state */
2195 for (ALL_LIST_ELEMENTS_RO(grp
->group_source_list
, src_node
, src
)) {
2196 if (src
->source_query_retransmit_count
> 0) {
2201 vty_out(vty
, "%-9s %-15s %-15s %-8s %7d %7d%s",
2206 grp
->group_specific_query_retransmit_count
,
2210 } /* scan igmp groups */
2211 } /* scan igmp sockets */
2212 } /* scan interfaces */
2215 static void igmp_show_sources(struct vty
*vty
)
2217 struct listnode
*ifnode
;
2218 struct interface
*ifp
;
2221 now
= pim_time_monotonic_sec();
2223 vty_out(vty
, "Interface Address Group Source Timer Fwd Uptime %s", VTY_NEWLINE
);
2225 /* scan interfaces */
2226 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), ifnode
, ifp
)) {
2227 struct pim_interface
*pim_ifp
= ifp
->info
;
2228 struct listnode
*sock_node
;
2229 struct igmp_sock
*igmp
;
2234 /* scan igmp sockets */
2235 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->igmp_socket_list
, sock_node
, igmp
)) {
2236 char ifaddr_str
[INET_ADDRSTRLEN
];
2237 struct listnode
*grpnode
;
2238 struct igmp_group
*grp
;
2240 pim_inet4_dump("<ifaddr?>", igmp
->ifaddr
, ifaddr_str
, sizeof(ifaddr_str
));
2242 /* scan igmp groups */
2243 for (ALL_LIST_ELEMENTS_RO(igmp
->igmp_group_list
, grpnode
, grp
)) {
2244 char group_str
[INET_ADDRSTRLEN
];
2245 struct listnode
*srcnode
;
2246 struct igmp_source
*src
;
2248 pim_inet4_dump("<group?>", grp
->group_addr
, group_str
, sizeof(group_str
));
2250 /* scan group sources */
2251 for (ALL_LIST_ELEMENTS_RO(grp
->group_source_list
, srcnode
, src
)) {
2252 char source_str
[INET_ADDRSTRLEN
];
2256 pim_inet4_dump("<source?>", src
->source_addr
, source_str
, sizeof(source_str
));
2258 pim_time_timer_to_mmss(mmss
, sizeof(mmss
), src
->t_source_timer
);
2260 pim_time_uptime(uptime
, sizeof(uptime
), now
- src
->source_creation
);
2262 vty_out(vty
, "%-9s %-15s %-15s %-15s %5s %3s %8s%s",
2268 IGMP_SOURCE_TEST_FORWARDING(src
->source_flags
) ? "Y" : "N",
2272 } /* scan group sources */
2273 } /* scan igmp groups */
2274 } /* scan igmp sockets */
2275 } /* scan interfaces */
2278 static void igmp_show_source_retransmission(struct vty
*vty
)
2280 struct listnode
*ifnode
;
2281 struct interface
*ifp
;
2283 vty_out(vty
, "Interface Address Group Source Counter%s", VTY_NEWLINE
);
2285 /* scan interfaces */
2286 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), ifnode
, ifp
)) {
2287 struct pim_interface
*pim_ifp
= ifp
->info
;
2288 struct listnode
*sock_node
;
2289 struct igmp_sock
*igmp
;
2294 /* scan igmp sockets */
2295 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->igmp_socket_list
, sock_node
, igmp
)) {
2296 char ifaddr_str
[INET_ADDRSTRLEN
];
2297 struct listnode
*grpnode
;
2298 struct igmp_group
*grp
;
2300 pim_inet4_dump("<ifaddr?>", igmp
->ifaddr
, ifaddr_str
, sizeof(ifaddr_str
));
2302 /* scan igmp groups */
2303 for (ALL_LIST_ELEMENTS_RO(igmp
->igmp_group_list
, grpnode
, grp
)) {
2304 char group_str
[INET_ADDRSTRLEN
];
2305 struct listnode
*srcnode
;
2306 struct igmp_source
*src
;
2308 pim_inet4_dump("<group?>", grp
->group_addr
, group_str
, sizeof(group_str
));
2310 /* scan group sources */
2311 for (ALL_LIST_ELEMENTS_RO(grp
->group_source_list
, srcnode
, src
)) {
2312 char source_str
[INET_ADDRSTRLEN
];
2314 pim_inet4_dump("<source?>", src
->source_addr
, source_str
, sizeof(source_str
));
2316 vty_out(vty
, "%-9s %-15s %-15s %-15s %7d%s",
2321 src
->source_query_retransmit_count
,
2324 } /* scan group sources */
2325 } /* scan igmp groups */
2326 } /* scan igmp sockets */
2327 } /* scan interfaces */
2330 static void clear_igmp_interfaces()
2332 struct listnode
*ifnode
;
2333 struct listnode
*ifnextnode
;
2334 struct interface
*ifp
;
2336 for (ALL_LIST_ELEMENTS (vrf_iflist (VRF_DEFAULT
), ifnode
, ifnextnode
, ifp
)) {
2337 pim_if_addr_del_all_igmp(ifp
);
2340 for (ALL_LIST_ELEMENTS (vrf_iflist (VRF_DEFAULT
), ifnode
, ifnextnode
, ifp
)) {
2341 pim_if_addr_add_all(ifp
);
2345 static void clear_pim_interfaces()
2347 struct listnode
*ifnode
;
2348 struct listnode
*ifnextnode
;
2349 struct interface
*ifp
;
2351 for (ALL_LIST_ELEMENTS (vrf_iflist (VRF_DEFAULT
), ifnode
, ifnextnode
, ifp
)) {
2353 pim_neighbor_delete_all(ifp
, "interface cleared");
2358 static void clear_interfaces()
2360 clear_igmp_interfaces();
2361 clear_pim_interfaces();
2364 DEFUN (clear_ip_interfaces
,
2365 clear_ip_interfaces_cmd
,
2366 "clear ip interfaces",
2369 "Reset interfaces\n")
2376 DEFUN (clear_ip_igmp_interfaces
,
2377 clear_ip_igmp_interfaces_cmd
,
2378 "clear ip igmp interfaces",
2382 "Reset IGMP interfaces\n")
2384 clear_igmp_interfaces();
2389 static void mroute_add_all()
2391 struct listnode
*node
;
2392 struct channel_oil
*c_oil
;
2394 for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list
, node
, c_oil
)) {
2395 if (pim_mroute_add(c_oil
, __PRETTY_FUNCTION__
)) {
2396 /* just log warning */
2397 char source_str
[INET_ADDRSTRLEN
];
2398 char group_str
[INET_ADDRSTRLEN
];
2399 pim_inet4_dump("<source?>", c_oil
->oil
.mfcc_origin
, source_str
, sizeof(source_str
));
2400 pim_inet4_dump("<group?>", c_oil
->oil
.mfcc_mcastgrp
, group_str
, sizeof(group_str
));
2401 zlog_warn("%s %s: (S,G)=(%s,%s) failure writing MFC",
2402 __FILE__
, __PRETTY_FUNCTION__
,
2403 source_str
, group_str
);
2408 static void mroute_del_all()
2410 struct listnode
*node
;
2411 struct channel_oil
*c_oil
;
2413 for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list
, node
, c_oil
)) {
2414 if (pim_mroute_del(c_oil
, __PRETTY_FUNCTION__
)) {
2415 /* just log warning */
2416 char source_str
[INET_ADDRSTRLEN
];
2417 char group_str
[INET_ADDRSTRLEN
];
2418 pim_inet4_dump("<source?>", c_oil
->oil
.mfcc_origin
, source_str
, sizeof(source_str
));
2419 pim_inet4_dump("<group?>", c_oil
->oil
.mfcc_mcastgrp
, group_str
, sizeof(group_str
));
2420 zlog_warn("%s %s: (S,G)=(%s,%s) failure clearing MFC",
2421 __FILE__
, __PRETTY_FUNCTION__
,
2422 source_str
, group_str
);
2427 DEFUN (clear_ip_mroute
,
2428 clear_ip_mroute_cmd
,
2432 "Reset multicast routes\n")
2440 DEFUN (clear_ip_pim_interfaces
,
2441 clear_ip_pim_interfaces_cmd
,
2442 "clear ip pim interfaces",
2446 "Reset PIM interfaces\n")
2448 clear_pim_interfaces();
2453 DEFUN (clear_ip_pim_oil
,
2454 clear_ip_pim_oil_cmd
,
2459 "Rescan PIM OIL (output interface list)\n")
2466 DEFUN (show_ip_igmp_interface
,
2467 show_ip_igmp_interface_cmd
,
2468 "show ip igmp interface [detail|WORD] [json]",
2472 "IGMP interface information\n"
2475 "JavaScript Object Notation\n")
2477 u_char uj
= use_json(argc
, argv
);
2480 if (argv_find(argv
, argc
, "detail", &idx
) ||
2481 argv_find(argv
, argc
, "WORD", &idx
))
2482 igmp_show_interfaces_single(vty
, argv
[idx
]->arg
, uj
);
2484 igmp_show_interfaces(vty
, uj
);
2489 DEFUN (show_ip_igmp_join
,
2490 show_ip_igmp_join_cmd
,
2491 "show ip igmp join",
2495 "IGMP static join information\n")
2497 igmp_show_interface_join(vty
);
2502 DEFUN (show_ip_igmp_groups
,
2503 show_ip_igmp_groups_cmd
,
2504 "show ip igmp groups [json]",
2509 "JavaScript Object Notation\n")
2511 u_char uj
= use_json(argc
, argv
);
2512 igmp_show_groups(vty
, uj
);
2517 DEFUN (show_ip_igmp_groups_retransmissions
,
2518 show_ip_igmp_groups_retransmissions_cmd
,
2519 "show ip igmp groups retransmissions",
2524 "IGMP group retransmissions\n")
2526 igmp_show_group_retransmission(vty
);
2531 DEFUN (show_ip_igmp_sources
,
2532 show_ip_igmp_sources_cmd
,
2533 "show ip igmp sources",
2539 igmp_show_sources(vty
);
2544 DEFUN (show_ip_igmp_sources_retransmissions
,
2545 show_ip_igmp_sources_retransmissions_cmd
,
2546 "show ip igmp sources retransmissions",
2551 "IGMP source retransmissions\n")
2553 igmp_show_source_retransmission(vty
);
2558 DEFUN (show_ip_pim_assert
,
2559 show_ip_pim_assert_cmd
,
2560 "show ip pim assert",
2564 "PIM interface assert\n")
2566 pim_show_assert(vty
);
2571 DEFUN (show_ip_pim_assert_internal
,
2572 show_ip_pim_assert_internal_cmd
,
2573 "show ip pim assert-internal",
2577 "PIM interface internal assert state\n")
2579 pim_show_assert_internal(vty
);
2584 DEFUN (show_ip_pim_assert_metric
,
2585 show_ip_pim_assert_metric_cmd
,
2586 "show ip pim assert-metric",
2590 "PIM interface assert metric\n")
2592 pim_show_assert_metric(vty
);
2597 DEFUN (show_ip_pim_assert_winner_metric
,
2598 show_ip_pim_assert_winner_metric_cmd
,
2599 "show ip pim assert-winner-metric",
2603 "PIM interface assert winner metric\n")
2605 pim_show_assert_winner_metric(vty
);
2610 DEFUN (show_ip_pim_interface
,
2611 show_ip_pim_interface_cmd
,
2612 "show ip pim interface [detail|WORD] [json]",
2616 "PIM interface information\n"
2619 "JavaScript Object Notation\n")
2621 u_char uj
= use_json(argc
, argv
);
2624 if (argv_find(argv
, argc
, "WORD", &idx
) ||
2625 argv_find(argv
, argc
, "detail", &idx
))
2626 pim_show_interfaces_single(vty
, argv
[idx
]->arg
, uj
);
2629 pim_show_interfaces(vty
, uj
);
2634 DEFUN (show_ip_pim_join
,
2635 show_ip_pim_join_cmd
,
2636 "show ip pim join [json]",
2640 "PIM interface join information\n"
2643 u_char uj
= use_json(argc
, argv
);
2644 pim_show_join(vty
, uj
);
2649 DEFUN (show_ip_pim_local_membership
,
2650 show_ip_pim_local_membership_cmd
,
2651 "show ip pim local-membership [json]",
2655 "PIM interface local-membership\n"
2658 u_char uj
= use_json(argc
, argv
);
2659 pim_show_membership(vty
, uj
);
2664 DEFUN (show_ip_pim_neighbor
,
2665 show_ip_pim_neighbor_cmd
,
2666 "show ip pim neighbor [detail|WORD] [json]",
2670 "PIM neighbor information\n"
2672 "Name of interface or neighbor\n"
2673 "JavaScript Object Notation\n")
2675 u_char uj
= use_json(argc
, argv
);
2678 if (argv_find(argv
, argc
, "detail", &idx
) ||
2679 argv_find(argv
, argc
, "WORD", &idx
))
2680 pim_show_neighbors_single(vty
, argv
[idx
]->arg
, uj
);
2682 pim_show_neighbors(vty
, uj
);
2687 DEFUN (show_ip_pim_secondary
,
2688 show_ip_pim_secondary_cmd
,
2689 "show ip pim secondary",
2693 "PIM neighbor addresses\n")
2695 pim_show_neighbors_secondary(vty
);
2700 DEFUN (show_ip_pim_state
,
2701 show_ip_pim_state_cmd
,
2702 "show ip pim state [A.B.C.D [A.B.C.D]] [json]",
2706 "PIM state information\n"
2707 "Unicast or Multicast address\n"
2708 "Multicast address\n"
2709 "JavaScript Object Notation\n")
2711 const char *src_or_group
= NULL
;
2712 const char *group
= NULL
;
2713 u_char uj
= use_json(argc
, argv
);
2719 src_or_group
= argv
[4]->arg
;
2720 group
= argv
[5]->arg
;
2723 src_or_group
= argv
[4]->arg
;
2725 pim_show_state(vty
, src_or_group
, group
, uj
);
2730 DEFUN (show_ip_pim_upstream
,
2731 show_ip_pim_upstream_cmd
,
2732 "show ip pim upstream [json]",
2736 "PIM upstream information\n"
2737 "JavaScript Object Notation\n")
2739 u_char uj
= use_json(argc
, argv
);
2740 pim_show_upstream(vty
, uj
);
2745 DEFUN (show_ip_pim_upstream_join_desired
,
2746 show_ip_pim_upstream_join_desired_cmd
,
2747 "show ip pim upstream-join-desired [json]",
2751 "PIM upstream join-desired\n"
2752 "JavaScript Object Notation\n")
2754 u_char uj
= use_json(argc
, argv
);
2755 pim_show_join_desired(vty
, uj
);
2760 DEFUN (show_ip_pim_upstream_rpf
,
2761 show_ip_pim_upstream_rpf_cmd
,
2762 "show ip pim upstream-rpf [json]",
2766 "PIM upstream source rpf\n"
2767 "JavaScript Object Notation\n")
2769 u_char uj
= use_json(argc
, argv
);
2770 pim_show_upstream_rpf(vty
, uj
);
2775 DEFUN (show_ip_pim_rp
,
2777 "show ip pim rp-info [json]",
2781 "PIM RP information\n"
2782 "JavaScript Object Notation\n")
2784 u_char uj
= use_json(argc
, argv
);
2785 pim_rp_show_information (vty
, uj
);
2790 DEFUN (show_ip_pim_rpf
,
2791 show_ip_pim_rpf_cmd
,
2792 "show ip pim rpf [json]",
2796 "PIM cached source rpf information\n"
2797 "JavaScript Object Notation\n")
2799 u_char uj
= use_json(argc
, argv
);
2800 pim_show_rpf(vty
, uj
);
2805 static void show_multicast_interfaces(struct vty
*vty
)
2807 struct listnode
*node
;
2808 struct interface
*ifp
;
2810 vty_out(vty
, "%s", VTY_NEWLINE
);
2812 vty_out(vty
, "Interface Address ifi Vif PktsIn PktsOut BytesIn BytesOut%s",
2815 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, ifp
)) {
2816 struct pim_interface
*pim_ifp
;
2817 struct in_addr ifaddr
;
2818 struct sioc_vif_req vreq
;
2820 pim_ifp
= ifp
->info
;
2825 memset(&vreq
, 0, sizeof(vreq
));
2826 vreq
.vifi
= pim_ifp
->mroute_vif_index
;
2828 if (ioctl(qpim_mroute_socket_fd
, SIOCGETVIFCNT
, &vreq
)) {
2829 zlog_warn("ioctl(SIOCGETVIFCNT=%lu) failure for interface %s vif_index=%d: errno=%d: %s%s",
2830 (unsigned long)SIOCGETVIFCNT
,
2832 pim_ifp
->mroute_vif_index
,
2834 safe_strerror(errno
),
2838 ifaddr
= pim_ifp
->primary_address
;
2840 vty_out(vty
, "%-9s %-15s %3d %3d %7lu %7lu %10lu %10lu%s",
2844 pim_ifp
->mroute_vif_index
,
2845 (unsigned long) vreq
.icount
,
2846 (unsigned long) vreq
.ocount
,
2847 (unsigned long) vreq
.ibytes
,
2848 (unsigned long) vreq
.obytes
,
2853 DEFUN (show_ip_multicast
,
2854 show_ip_multicast_cmd
,
2855 "show ip multicast",
2858 "Multicast global information\n")
2860 time_t now
= pim_time_monotonic_sec();
2864 vty_out(vty
, "Mroute socket descriptor: %d%s",
2865 qpim_mroute_socket_fd
,
2868 pim_time_uptime(uptime
, sizeof(uptime
), now
- qpim_mroute_socket_creation
);
2869 vty_out(vty
, "Mroute socket uptime: %s%s",
2873 vty_out(vty
, "%s", VTY_NEWLINE
);
2875 pim_zebra_zclient_update (vty
);
2876 pim_zlookup_show_ip_multicast (vty
);
2878 vty_out(vty
, "%s", VTY_NEWLINE
);
2879 vty_out(vty
, "Maximum highest VifIndex: %d%s",
2880 PIM_MAX_USABLE_VIFS
,
2883 vty_out(vty
, "%s", VTY_NEWLINE
);
2884 vty_out(vty
, "Upstream Join Timer: %d secs%s",
2887 vty_out(vty
, "Join/Prune Holdtime: %d secs%s",
2891 vty_out(vty
, "%s", VTY_NEWLINE
);
2893 show_rpf_refresh_stats(vty
, now
, NULL
);
2895 vty_out(vty
, "%s", VTY_NEWLINE
);
2897 show_scan_oil_stats(vty
, now
);
2899 show_multicast_interfaces(vty
);
2904 static void show_mroute(struct vty
*vty
, u_char uj
)
2906 struct listnode
*node
;
2907 struct channel_oil
*c_oil
;
2908 struct static_route
*s_route
;
2910 json_object
*json
= NULL
;
2911 json_object
*json_group
= NULL
;
2912 json_object
*json_source
= NULL
;
2913 json_object
*json_oil
= NULL
;
2914 json_object
*json_ifp_out
= NULL
;
2917 char grp_str
[INET_ADDRSTRLEN
];
2918 char src_str
[INET_ADDRSTRLEN
];
2919 char in_ifname
[INTERFACE_NAMSIZ
+1];
2920 char out_ifname
[INTERFACE_NAMSIZ
+1];
2922 struct interface
*ifp_in
;
2926 json
= json_object_new_object();
2928 vty_out(vty
, "Source Group Proto Input Output TTL Uptime%s",
2932 now
= pim_time_monotonic_sec();
2934 /* print list of PIM and IGMP routes */
2935 for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list
, node
, c_oil
)) {
2938 if (!c_oil
->installed
&& !uj
)
2941 pim_inet4_dump("<group?>", c_oil
->oil
.mfcc_mcastgrp
, grp_str
, sizeof(grp_str
));
2942 pim_inet4_dump("<source?>", c_oil
->oil
.mfcc_origin
, src_str
, sizeof(src_str
));
2943 ifp_in
= pim_if_find_by_vif_index(c_oil
->oil
.mfcc_parent
);
2946 strcpy(in_ifname
, ifp_in
->name
);
2948 strcpy(in_ifname
, "<iif?>");
2952 /* Find the group, create it if it doesn't exist */
2953 json_object_object_get_ex(json
, grp_str
, &json_group
);
2956 json_group
= json_object_new_object();
2957 json_object_object_add(json
, grp_str
, json_group
);
2960 /* Find the source nested under the group, create it if it doesn't exist */
2961 json_object_object_get_ex(json_group
, src_str
, &json_source
);
2964 json_source
= json_object_new_object();
2965 json_object_object_add(json_group
, src_str
, json_source
);
2968 /* Find the inbound interface nested under the source, create it if it doesn't exist */
2969 json_object_int_add(json_source
, "installed", c_oil
->installed
);
2970 json_object_int_add(json_source
, "refCount", c_oil
->oil_ref_count
);
2971 json_object_int_add(json_source
, "oilSize", c_oil
->oil_size
);
2972 json_object_int_add(json_source
, "OilInheritedRescan", c_oil
->oil_inherited_rescan
);
2973 json_object_string_add(json_source
, "iif", in_ifname
);
2977 for (oif_vif_index
= 0; oif_vif_index
< MAXVIFS
; ++oif_vif_index
) {
2978 struct interface
*ifp_out
;
2979 char oif_uptime
[10];
2982 ttl
= c_oil
->oil
.mfcc_ttls
[oif_vif_index
];
2986 ifp_out
= pim_if_find_by_vif_index(oif_vif_index
);
2987 pim_time_uptime(oif_uptime
, sizeof(oif_uptime
), now
- c_oil
->oif_creation
[oif_vif_index
]);
2991 strcpy(out_ifname
, ifp_out
->name
);
2993 strcpy(out_ifname
, "<oif?>");
2996 json_ifp_out
= json_object_new_object();
2997 json_object_string_add(json_ifp_out
, "source", src_str
);
2998 json_object_string_add(json_ifp_out
, "group", grp_str
);
3000 if (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_PIM
)
3001 json_object_boolean_true_add(json_ifp_out
, "protocolPim");
3003 if (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_IGMP
)
3004 json_object_boolean_true_add(json_ifp_out
, "protocolIgmp");
3006 if (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_SOURCE
)
3007 json_object_boolean_true_add(json_ifp_out
, "protocolSource");
3009 if (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_STAR
)
3010 json_object_boolean_true_add(json_ifp_out
, "protocolInherited");
3012 json_object_string_add(json_ifp_out
, "inboundInterface", in_ifname
);
3013 json_object_int_add(json_ifp_out
, "iVifI", c_oil
->oil
.mfcc_parent
);
3014 json_object_string_add(json_ifp_out
, "outboundInterface", out_ifname
);
3015 json_object_int_add(json_ifp_out
, "oVifI", oif_vif_index
);
3016 json_object_int_add(json_ifp_out
, "ttl", ttl
);
3017 json_object_string_add(json_ifp_out
, "upTime", oif_uptime
);
3019 json_oil
= json_object_new_object();
3020 json_object_object_add(json_source
, "oil", json_oil
);
3022 json_object_object_add(json_oil
, out_ifname
, json_ifp_out
);
3024 if (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_PIM
) {
3025 strcpy(proto
, "PIM");
3028 if (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_IGMP
) {
3029 strcpy(proto
, "IGMP");
3032 if (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_SOURCE
) {
3033 strcpy(proto
, "SRC");
3036 if (c_oil
->oif_flags
[oif_vif_index
] & PIM_OIF_FLAG_PROTO_STAR
) {
3037 strcpy(proto
, "STAR");
3040 vty_out(vty
, "%-15s %-15s %-6s %-10s %-10s %-3d %8s%s",
3054 in_ifname
[0] = '\0';
3060 if (!uj
&& !found_oif
) {
3061 vty_out(vty
, "%-15s %-15s %-6s %-10s %-10s %-3d %8s%s",
3073 /* Print list of static routes */
3074 for (ALL_LIST_ELEMENTS_RO(qpim_static_route_list
, node
, s_route
)) {
3077 if (!s_route
->c_oil
.installed
)
3080 pim_inet4_dump("<group?>", s_route
->group
, grp_str
, sizeof(grp_str
));
3081 pim_inet4_dump("<source?>", s_route
->source
, src_str
, sizeof(src_str
));
3082 ifp_in
= pim_if_find_by_vif_index(s_route
->iif
);
3086 strcpy(in_ifname
, ifp_in
->name
);
3088 strcpy(in_ifname
, "<iif?>");
3092 /* Find the group, create it if it doesn't exist */
3093 json_object_object_get_ex(json
, grp_str
, &json_group
);
3096 json_group
= json_object_new_object();
3097 json_object_object_add(json
, grp_str
, json_group
);
3100 /* Find the source nested under the group, create it if it doesn't exist */
3101 json_object_object_get_ex(json_group
, src_str
, &json_source
);
3104 json_source
= json_object_new_object();
3105 json_object_object_add(json_group
, src_str
, json_source
);
3108 json_object_string_add(json_source
, "iif", in_ifname
);
3111 strcpy(proto
, "STATIC");
3114 for (oif_vif_index
= 0; oif_vif_index
< MAXVIFS
; ++oif_vif_index
) {
3115 struct interface
*ifp_out
;
3116 char oif_uptime
[10];
3119 ttl
= s_route
->oif_ttls
[oif_vif_index
];
3123 ifp_out
= pim_if_find_by_vif_index(oif_vif_index
);
3124 pim_time_uptime(oif_uptime
, sizeof(oif_uptime
), now
- s_route
->c_oil
.oif_creation
[oif_vif_index
]);
3128 strcpy(out_ifname
, ifp_out
->name
);
3130 strcpy(out_ifname
, "<oif?>");
3133 json_ifp_out
= json_object_new_object();
3134 json_object_string_add(json_ifp_out
, "source", src_str
);
3135 json_object_string_add(json_ifp_out
, "group", grp_str
);
3136 json_object_boolean_true_add(json_ifp_out
, "protocolStatic");
3137 json_object_string_add(json_ifp_out
, "inboundInterface", in_ifname
);
3138 json_object_int_add(json_ifp_out
, "iVifI", c_oil
->oil
.mfcc_parent
);
3139 json_object_string_add(json_ifp_out
, "outboundInterface", out_ifname
);
3140 json_object_int_add(json_ifp_out
, "oVifI", oif_vif_index
);
3141 json_object_int_add(json_ifp_out
, "ttl", ttl
);
3142 json_object_string_add(json_ifp_out
, "upTime", oif_uptime
);
3144 json_oil
= json_object_new_object();
3145 json_object_object_add(json_source
, "oil", json_oil
);
3147 json_object_object_add(json_oil
, out_ifname
, json_ifp_out
);
3149 vty_out(vty
, "%-15s %-15s %-6s %-10s %-10s %-3d %8s%s",
3162 in_ifname
[0] = '\0';
3168 if (!uj
&& !found_oif
) {
3169 vty_out(vty
, "%-15s %-15s %-6s %-10s %-10s %-3d %8s%s",
3182 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3183 json_object_free(json
);
3187 DEFUN (show_ip_mroute
,
3189 "show ip mroute [json]",
3195 u_char uj
= use_json(argc
, argv
);
3196 show_mroute(vty
, uj
);
3200 static void show_mroute_count(struct vty
*vty
)
3202 struct listnode
*node
;
3203 struct channel_oil
*c_oil
;
3204 struct static_route
*s_route
;
3206 vty_out(vty
, "%s", VTY_NEWLINE
);
3208 vty_out(vty
, "Source Group LastUsed Packets Bytes WrongIf %s",
3211 /* Print PIM and IGMP route counts */
3212 for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list
, node
, c_oil
)) {
3213 char group_str
[INET_ADDRSTRLEN
];
3214 char source_str
[INET_ADDRSTRLEN
];
3216 if (!c_oil
->installed
)
3219 pim_mroute_update_counters (c_oil
);
3221 pim_inet4_dump("<group?>", c_oil
->oil
.mfcc_mcastgrp
, group_str
, sizeof(group_str
));
3222 pim_inet4_dump("<source?>", c_oil
->oil
.mfcc_origin
, source_str
, sizeof(source_str
));
3224 vty_out(vty
, "%-15s %-15s %-8llu %-7ld %-10ld %-7ld%s",
3227 c_oil
->cc
.lastused
/100,
3234 /* Print static route counts */
3235 for (ALL_LIST_ELEMENTS_RO(qpim_static_route_list
, node
, s_route
)) {
3236 char group_str
[INET_ADDRSTRLEN
];
3237 char source_str
[INET_ADDRSTRLEN
];
3239 if (!s_route
->c_oil
.installed
)
3242 pim_mroute_update_counters (&s_route
->c_oil
);
3244 pim_inet4_dump("<group?>", s_route
->c_oil
.oil
.mfcc_mcastgrp
, group_str
, sizeof(group_str
));
3245 pim_inet4_dump("<source?>", s_route
->c_oil
.oil
.mfcc_origin
, source_str
, sizeof(source_str
));
3247 vty_out(vty
, "%-15s %-15s %-8llu %-7ld %-10ld %-7ld%s",
3250 s_route
->c_oil
.cc
.lastused
,
3251 s_route
->c_oil
.cc
.pktcnt
,
3252 s_route
->c_oil
.cc
.bytecnt
,
3253 s_route
->c_oil
.cc
.wrong_if
,
3258 DEFUN (show_ip_mroute_count
,
3259 show_ip_mroute_count_cmd
,
3260 "show ip mroute count",
3264 "Route and packet count data\n")
3266 show_mroute_count(vty
);
3272 "show ip rib A.B.C.D",
3276 "Unicast address\n")
3279 struct in_addr addr
;
3280 const char *addr_str
;
3281 struct pim_nexthop nexthop
;
3282 char nexthop_addr_str
[PREFIX_STRLEN
];
3285 memset (&nexthop
, 0, sizeof (nexthop
));
3286 addr_str
= argv
[idx_ipv4
]->arg
;
3287 result
= inet_pton(AF_INET
, addr_str
, &addr
);
3289 vty_out(vty
, "Bad unicast address %s: errno=%d: %s%s",
3290 addr_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
3294 if (pim_nexthop_lookup(&nexthop
, addr
, 0)) {
3295 vty_out(vty
, "Failure querying RIB nexthop for unicast address %s%s",
3296 addr_str
, VTY_NEWLINE
);
3300 vty_out(vty
, "Address NextHop Interface Metric Preference%s",
3303 pim_addr_dump("<nexthop?>", &nexthop
.mrib_nexthop_addr
,
3304 nexthop_addr_str
, sizeof(nexthop_addr_str
));
3306 vty_out(vty
, "%-15s %-15s %-9s %6d %10d%s",
3309 nexthop
.interface
? nexthop
.interface
->name
: "<ifname?>",
3310 nexthop
.mrib_route_metric
,
3311 nexthop
.mrib_metric_preference
,
3317 static void show_ssmpingd(struct vty
*vty
)
3319 struct listnode
*node
;
3320 struct ssmpingd_sock
*ss
;
3323 vty_out(vty
, "Source Socket Address Port Uptime Requests%s",
3326 if (!qpim_ssmpingd_list
)
3329 now
= pim_time_monotonic_sec();
3331 for (ALL_LIST_ELEMENTS_RO(qpim_ssmpingd_list
, node
, ss
)) {
3332 char source_str
[INET_ADDRSTRLEN
];
3334 struct sockaddr_in bind_addr
;
3335 socklen_t len
= sizeof(bind_addr
);
3336 char bind_addr_str
[INET_ADDRSTRLEN
];
3338 pim_inet4_dump("<src?>", ss
->source_addr
, source_str
, sizeof(source_str
));
3340 if (pim_socket_getsockname(ss
->sock_fd
, (struct sockaddr
*) &bind_addr
, &len
)) {
3341 vty_out(vty
, "%% Failure reading socket name for ssmpingd source %s on fd=%d%s",
3342 source_str
, ss
->sock_fd
, VTY_NEWLINE
);
3345 pim_inet4_dump("<addr?>", bind_addr
.sin_addr
, bind_addr_str
, sizeof(bind_addr_str
));
3346 pim_time_uptime(ss_uptime
, sizeof(ss_uptime
), now
- ss
->creation
);
3348 vty_out(vty
, "%-15s %6d %-15s %5d %8s %8lld%s",
3352 ntohs(bind_addr
.sin_port
),
3354 (long long)ss
->requests
,
3359 DEFUN (show_ip_ssmpingd
,
3360 show_ip_ssmpingd_cmd
,
3371 pim_rp_cmd_worker (struct vty
*vty
, const char *rp
, const char *group
, const char *plist
)
3375 result
= pim_rp_new (rp
, group
, plist
);
3377 if (result
== PIM_MALLOC_FAIL
)
3379 vty_out (vty
, "%% Out of memory%s", VTY_NEWLINE
);
3383 if (result
== PIM_GROUP_BAD_ADDRESS
)
3385 vty_out (vty
, "%% Bad group address specified: %s%s", group
, VTY_NEWLINE
);
3389 if (result
== PIM_RP_BAD_ADDRESS
)
3391 vty_out (vty
, "%% Bad RP address specified: %s%s", rp
, VTY_NEWLINE
);
3395 if (result
== PIM_RP_NO_PATH
)
3397 vty_out (vty
, "%% No Path to RP address specified: %s%s", rp
, VTY_NEWLINE
);
3401 if (result
== PIM_GROUP_OVERLAP
)
3403 vty_out (vty
, "%% Group range specified cannot overlap%s", VTY_NEWLINE
);
3407 if (result
== PIM_GROUP_PFXLIST_OVERLAP
)
3409 vty_out (vty
, "%% This group is already covered by a RP prefix-list%s", VTY_NEWLINE
);
3413 if (result
== PIM_RP_PFXLIST_IN_USE
)
3415 vty_out (vty
, "%% The same prefix-list cannot be applied to multiple RPs%s", VTY_NEWLINE
);
3422 DEFUN (ip_pim_spt_switchover_infinity
,
3423 ip_pim_spt_switchover_infinity_cmd
,
3424 "ip pim spt-switchover infinity-and-beyond",
3428 "Never switch to SPT Tree\n")
3430 pimg
->spt_switchover
= PIM_SPT_INFINITY
;
3432 pim_upstream_remove_lhr_star_pimreg();
3436 DEFUN (no_ip_pim_spt_switchover_infinity
,
3437 no_ip_pim_spt_switchover_infinity_cmd
,
3438 "no ip pim spt-switchover infinity-and-beyond",
3443 "Never switch to SPT Tree\n")
3445 pimg
->spt_switchover
= PIM_SPT_IMMEDIATE
;
3447 pim_upstream_add_lhr_star_pimreg();
3451 DEFUN (ip_pim_joinprune_time
,
3452 ip_pim_joinprune_time_cmd
,
3453 "ip pim join-prune-interval <60-600>",
3455 "pim multicast routing\n"
3456 "Join Prune Send Interval\n"
3459 qpim_t_periodic
= atoi(argv
[3]->arg
);
3463 DEFUN (no_ip_pim_joinprune_time
,
3464 no_ip_pim_joinprune_time_cmd
,
3465 "no ip pim join-prune-interval <60-600>",
3468 "pim multicast routing\n"
3469 "Join Prune Send Interval\n"
3472 qpim_t_periodic
= PIM_DEFAULT_T_PERIODIC
;
3476 DEFUN (ip_pim_register_suppress
,
3477 ip_pim_register_suppress_cmd
,
3478 "ip pim register-suppress-time <5-60000>",
3480 "pim multicast routing\n"
3481 "Register Suppress Timer\n"
3484 qpim_keep_alive_time
= atoi (argv
[3]->arg
);
3488 DEFUN (no_ip_pim_register_suppress
,
3489 no_ip_pim_register_suppress_cmd
,
3490 "no ip pim register-suppress-time <5-60000>",
3493 "pim multicast routing\n"
3494 "Register Suppress Timer\n"
3497 qpim_register_suppress_time
= PIM_REGISTER_SUPPRESSION_TIME_DEFAULT
;
3501 DEFUN (ip_pim_keep_alive
,
3502 ip_pim_keep_alive_cmd
,
3503 "ip pim keep-alive-timer <31-60000>",
3505 "pim multicast routing\n"
3506 "Keep alive Timer\n"
3509 qpim_rp_keep_alive_time
= atoi (argv
[4]->arg
);
3513 DEFUN (no_ip_pim_keep_alive
,
3514 no_ip_pim_keep_alive_cmd
,
3515 "no ip pim keep-alive-timer <31-60000>",
3518 "pim multicast routing\n"
3519 "Keep alive Timer\n"
3522 qpim_keep_alive_time
= PIM_KEEPALIVE_PERIOD
;
3526 DEFUN (ip_pim_packets
,
3528 "ip pim packets <1-100>",
3530 "pim multicast routing\n"
3531 "packets to process at one time per fd\n"
3532 "Number of packets\n")
3534 qpim_packet_process
= atoi (argv
[3]->arg
);
3538 DEFUN (no_ip_pim_packets
,
3539 no_ip_pim_packets_cmd
,
3540 "no ip pim packets <1-100>",
3543 "pim multicast routing\n"
3544 "packets to process at one time per fd\n"
3545 "Number of packets\n")
3547 qpim_packet_process
= PIM_DEFAULT_PACKET_PROCESS
;
3551 DEFUN (ip_pim_v6_secondary
,
3552 ip_pim_v6_secondary_cmd
,
3553 "ip pim send-v6-secondary",
3555 "pim multicast routing\n"
3556 "Send v6 secondary addresses\n")
3558 pimg
->send_v6_secondary
= 1;
3563 DEFUN (no_ip_pim_v6_secondary
,
3564 no_ip_pim_v6_secondary_cmd
,
3565 "no ip pim send-v6-secondary",
3568 "pim multicast routing\n"
3569 "Send v6 secondary addresses\n")
3571 pimg
->send_v6_secondary
= 0;
3578 "ip pim rp A.B.C.D [A.B.C.D/M]",
3580 "pim multicast routing\n"
3582 "ip address of RP\n"
3583 "Group Address range to cover\n")
3587 if (argc
== (idx_ipv4
+ 1))
3588 return pim_rp_cmd_worker (vty
, argv
[idx_ipv4
]->arg
, argv
[idx_ipv4
+ 1]->arg
, NULL
);
3590 return pim_rp_cmd_worker (vty
, argv
[idx_ipv4
]->arg
, NULL
, NULL
);
3593 DEFUN (ip_pim_rp_prefix_list
,
3594 ip_pim_rp_prefix_list_cmd
,
3595 "ip pim rp A.B.C.D prefix-list WORD",
3597 "pim multicast routing\n"
3599 "ip address of RP\n"
3600 "group prefix-list filter\n"
3601 "Name of a prefix-list\n")
3603 return pim_rp_cmd_worker (vty
, argv
[3]->arg
, NULL
, argv
[5]->arg
);
3607 pim_no_rp_cmd_worker (struct vty
*vty
, const char *rp
, const char *group
,
3610 int result
= pim_rp_del (rp
, group
, plist
);
3612 if (result
== PIM_GROUP_BAD_ADDRESS
)
3614 vty_out (vty
, "%% Bad group address specified: %s%s", group
, VTY_NEWLINE
);
3618 if (result
== PIM_RP_BAD_ADDRESS
)
3620 vty_out (vty
, "%% Bad RP address specified: %s%s", rp
, VTY_NEWLINE
);
3624 if (result
== PIM_RP_NOT_FOUND
)
3626 vty_out (vty
, "%% Unable to find specified RP%s", VTY_NEWLINE
);
3633 DEFUN (no_ip_pim_rp
,
3635 "no ip pim rp A.B.C.D [A.B.C.D/M]",
3638 "pim multicast routing\n"
3640 "ip address of RP\n"
3641 "Group Address range to cover\n")
3643 int idx_ipv4
= 4, idx_group
= 0;
3645 if (argv_find (argv
, argc
, "A.B.C.D/M", &idx_group
))
3646 return pim_no_rp_cmd_worker (vty
, argv
[idx_ipv4
]->arg
, argv
[idx_group
]->arg
, NULL
);
3648 return pim_no_rp_cmd_worker (vty
, argv
[idx_ipv4
]->arg
, NULL
, NULL
);
3651 DEFUN (no_ip_pim_rp_prefix_list
,
3652 no_ip_pim_rp_prefix_list_cmd
,
3653 "no ip pim rp A.B.C.D prefix-list WORD",
3656 "pim multicast routing\n"
3658 "ip address of RP\n"
3659 "group prefix-list filter\n"
3660 "Name of a prefix-list\n")
3662 return pim_no_rp_cmd_worker (vty
, argv
[4]->arg
, NULL
, argv
[6]->arg
);
3666 pim_ssm_cmd_worker (struct vty
*vty
, const char *plist
)
3668 int result
= pim_ssm_range_set (VRF_DEFAULT
, plist
);
3670 if (result
== PIM_SSM_ERR_NONE
)
3675 case PIM_SSM_ERR_NO_VRF
:
3676 vty_out (vty
, "%% VRF doesn't exist%s", VTY_NEWLINE
);
3678 case PIM_SSM_ERR_DUP
:
3679 vty_out (vty
, "%% duplicate config%s", VTY_NEWLINE
);
3682 vty_out (vty
, "%% ssm range config failed%s", VTY_NEWLINE
);
3688 DEFUN (ip_pim_ssm_prefix_list
,
3689 ip_pim_ssm_prefix_list_cmd
,
3690 "ip pim ssm prefix-list WORD",
3692 "pim multicast routing\n"
3693 "Source Specific Multicast\n"
3694 "group range prefix-list filter\n"
3695 "Name of a prefix-list\n")
3697 return pim_ssm_cmd_worker (vty
, argv
[0]->arg
);
3700 DEFUN (no_ip_pim_ssm_prefix_list
,
3701 no_ip_pim_ssm_prefix_list_cmd
,
3702 "no ip pim ssm prefix-list",
3705 "pim multicast routing\n"
3706 "Source Specific Multicast\n"
3707 "group range prefix-list filter\n")
3709 return pim_ssm_cmd_worker (vty
, NULL
);
3712 DEFUN (no_ip_pim_ssm_prefix_list_name
,
3713 no_ip_pim_ssm_prefix_list_name_cmd
,
3714 "no ip pim ssm prefix-list WORD",
3717 "pim multicast routing\n"
3718 "Source Specific Multicast\n"
3719 "group range prefix-list filter\n"
3720 "Name of a prefix-list\n")
3722 struct pim_ssm
*ssm
= pimg
->ssm_info
;
3724 if (ssm
->plist_name
&& !strcmp(ssm
->plist_name
, argv
[0]->arg
))
3725 return pim_ssm_cmd_worker (vty
, NULL
);
3727 vty_out (vty
, "%% pim ssm prefix-list %s doesn't exist%s",
3728 argv
[0]->arg
, VTY_NEWLINE
);
3734 ip_pim_ssm_show_group_range(struct vty
*vty
, u_char uj
)
3736 struct pim_ssm
*ssm
= pimg
->ssm_info
;
3737 const char *range_str
= ssm
->plist_name
?ssm
->plist_name
:PIM_SSM_STANDARD_RANGE
;
3742 json
= json_object_new_object();
3743 json_object_string_add(json
, "ssmGroups", range_str
);
3744 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3745 json_object_free(json
);
3748 vty_out(vty
, "SSM group range : %s%s", range_str
, VTY_NEWLINE
);
3751 DEFUN (show_ip_pim_ssm_range
,
3752 show_ip_pim_ssm_range_cmd
,
3753 "show ip pim group-type [json]",
3758 "JavaScript Object Notation\n")
3760 u_char uj
= use_json(argc
, argv
);
3761 ip_pim_ssm_show_group_range(vty
, uj
);
3767 ip_pim_ssm_show_group_type(struct vty
*vty
, u_char uj
, const char *group
)
3769 struct in_addr group_addr
;
3770 const char *type_str
;
3773 result
= inet_pton(AF_INET
, group
, &group_addr
);
3775 type_str
= "invalid";
3778 if (pim_is_group_224_4 (group_addr
))
3779 type_str
= pim_is_grp_ssm (group_addr
)?"SSM":"ASM";
3781 type_str
= "not-multicast";
3787 json
= json_object_new_object();
3788 json_object_string_add(json
, "groupType", type_str
);
3789 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3790 json_object_free(json
);
3793 vty_out(vty
, "Group type : %s%s", type_str
, VTY_NEWLINE
);
3796 DEFUN (show_ip_pim_group_type
,
3797 show_ip_pim_group_type_cmd
,
3798 "show ip pim group-type A.B.C.D [json]",
3802 "multicast group type\n"
3804 "JavaScript Object Notation\n")
3806 u_char uj
= use_json(argc
, argv
);
3807 ip_pim_ssm_show_group_type(vty
, uj
, argv
[0]->arg
);
3812 DEFUN_HIDDEN (ip_multicast_routing
,
3813 ip_multicast_routing_cmd
,
3814 "ip multicast-routing",
3816 "Enable IP multicast forwarding\n")
3821 DEFUN_HIDDEN (no_ip_multicast_routing
,
3822 no_ip_multicast_routing_cmd
,
3823 "no ip multicast-routing",
3826 "Global IP configuration subcommands\n"
3827 "Enable IP multicast forwarding\n")
3829 vty_out (vty
, "Command is Disabled and will be removed in a future version%s", VTY_NEWLINE
);
3835 "ip ssmpingd [A.B.C.D]",
3842 struct in_addr source_addr
;
3843 const char *source_str
= (argc
== idx_ipv4
) ? argv
[idx_ipv4
]->arg
: "0.0.0.0";
3845 result
= inet_pton(AF_INET
, source_str
, &source_addr
);
3847 vty_out(vty
, "%% Bad source address %s: errno=%d: %s%s",
3848 source_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
3852 result
= pim_ssmpingd_start(source_addr
);
3854 vty_out(vty
, "%% Failure starting ssmpingd for source %s: %d%s",
3855 source_str
, result
, VTY_NEWLINE
);
3862 DEFUN (no_ip_ssmpingd
,
3864 "no ip ssmpingd [A.B.C.D]",
3872 struct in_addr source_addr
;
3873 const char *source_str
= (argc
== idx_ipv4
) ? argv
[idx_ipv4
]->arg
: "0.0.0.0";
3875 result
= inet_pton(AF_INET
, source_str
, &source_addr
);
3877 vty_out(vty
, "%% Bad source address %s: errno=%d: %s%s",
3878 source_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
3882 result
= pim_ssmpingd_stop(source_addr
);
3884 vty_out(vty
, "%% Failure stopping ssmpingd for source %s: %d%s",
3885 source_str
, result
, VTY_NEWLINE
);
3893 pim_cmd_igmp_start (struct vty
*vty
, struct interface
*ifp
)
3895 struct pim_interface
*pim_ifp
;
3897 pim_ifp
= ifp
->info
;
3900 pim_ifp
= pim_if_new(ifp
, 1 /* igmp=true */, 0 /* pim=false */);
3902 vty_out(vty
, "Could not enable IGMP on interface %s%s",
3903 ifp
->name
, VTY_NEWLINE
);
3908 PIM_IF_DO_IGMP(pim_ifp
->options
);
3911 pim_if_addr_add_all(ifp
);
3912 pim_if_membership_refresh(ifp
);
3917 DEFUN (interface_ip_igmp
,
3918 interface_ip_igmp_cmd
,
3923 VTY_DECLVAR_CONTEXT(interface
, ifp
);
3925 return pim_cmd_igmp_start(vty
, ifp
);
3928 DEFUN (interface_no_ip_igmp
,
3929 interface_no_ip_igmp_cmd
,
3935 VTY_DECLVAR_CONTEXT(interface
, ifp
);
3936 struct pim_interface
*pim_ifp
;
3938 pim_ifp
= ifp
->info
;
3942 PIM_IF_DONT_IGMP(pim_ifp
->options
);
3944 pim_if_membership_clear(ifp
);
3946 pim_if_addr_del_all_igmp(ifp
);
3948 if (!PIM_IF_TEST_PIM(pim_ifp
->options
)) {
3955 DEFUN (interface_ip_igmp_join
,
3956 interface_ip_igmp_join_cmd
,
3957 "ip igmp join A.B.C.D A.B.C.D",
3960 "IGMP join multicast group\n"
3961 "Multicast group address\n"
3964 VTY_DECLVAR_CONTEXT(interface
, ifp
);
3967 const char *group_str
;
3968 const char *source_str
;
3969 struct in_addr group_addr
;
3970 struct in_addr source_addr
;
3974 group_str
= argv
[idx_ipv4
]->arg
;
3975 result
= inet_pton(AF_INET
, group_str
, &group_addr
);
3977 vty_out(vty
, "Bad group address %s: errno=%d: %s%s",
3978 group_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
3982 /* Source address */
3983 source_str
= argv
[idx_ipv4_2
]->arg
;
3984 result
= inet_pton(AF_INET
, source_str
, &source_addr
);
3986 vty_out(vty
, "Bad source address %s: errno=%d: %s%s",
3987 source_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
3991 result
= pim_if_igmp_join_add(ifp
, group_addr
, source_addr
);
3993 vty_out(vty
, "%% Failure joining IGMP group %s source %s on interface %s: %d%s",
3994 group_str
, source_str
, ifp
->name
, result
, VTY_NEWLINE
);
4001 DEFUN (interface_no_ip_igmp_join
,
4002 interface_no_ip_igmp_join_cmd
,
4003 "no ip igmp join A.B.C.D A.B.C.D",
4007 "IGMP join multicast group\n"
4008 "Multicast group address\n"
4011 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4014 const char *group_str
;
4015 const char *source_str
;
4016 struct in_addr group_addr
;
4017 struct in_addr source_addr
;
4021 group_str
= argv
[idx_ipv4
]->arg
;
4022 result
= inet_pton(AF_INET
, group_str
, &group_addr
);
4024 vty_out(vty
, "Bad group address %s: errno=%d: %s%s",
4025 group_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
4029 /* Source address */
4030 source_str
= argv
[idx_ipv4_2
]->arg
;
4031 result
= inet_pton(AF_INET
, source_str
, &source_addr
);
4033 vty_out(vty
, "Bad source address %s: errno=%d: %s%s",
4034 source_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
4038 result
= pim_if_igmp_join_del(ifp
, group_addr
, source_addr
);
4040 vty_out(vty
, "%% Failure leaving IGMP group %s source %s on interface %s: %d%s",
4041 group_str
, source_str
, ifp
->name
, result
, VTY_NEWLINE
);
4049 CLI reconfiguration affects the interface level (struct pim_interface).
4050 This function propagates the reconfiguration to every active socket
4053 static void igmp_sock_query_interval_reconfig(struct igmp_sock
*igmp
)
4055 struct interface
*ifp
;
4056 struct pim_interface
*pim_ifp
;
4060 /* other querier present? */
4062 if (igmp
->t_other_querier_timer
)
4065 /* this is the querier */
4067 zassert(igmp
->interface
);
4068 zassert(igmp
->interface
->info
);
4070 ifp
= igmp
->interface
;
4071 pim_ifp
= ifp
->info
;
4073 if (PIM_DEBUG_IGMP_TRACE
) {
4074 char ifaddr_str
[INET_ADDRSTRLEN
];
4075 pim_inet4_dump("<ifaddr?>", igmp
->ifaddr
, ifaddr_str
, sizeof(ifaddr_str
));
4076 zlog_debug("%s: Querier %s on %s reconfig query_interval=%d",
4077 __PRETTY_FUNCTION__
,
4080 pim_ifp
->igmp_default_query_interval
);
4084 igmp_startup_mode_on() will reset QQI:
4086 igmp->querier_query_interval = pim_ifp->igmp_default_query_interval;
4088 igmp_startup_mode_on(igmp
);
4091 static void igmp_sock_query_reschedule(struct igmp_sock
*igmp
)
4093 if (igmp
->t_igmp_query_timer
) {
4094 /* other querier present */
4095 zassert(igmp
->t_igmp_query_timer
);
4096 zassert(!igmp
->t_other_querier_timer
);
4098 pim_igmp_general_query_off(igmp
);
4099 pim_igmp_general_query_on(igmp
);
4101 zassert(igmp
->t_igmp_query_timer
);
4102 zassert(!igmp
->t_other_querier_timer
);
4105 /* this is the querier */
4107 zassert(!igmp
->t_igmp_query_timer
);
4108 zassert(igmp
->t_other_querier_timer
);
4110 pim_igmp_other_querier_timer_off(igmp
);
4111 pim_igmp_other_querier_timer_on(igmp
);
4113 zassert(!igmp
->t_igmp_query_timer
);
4114 zassert(igmp
->t_other_querier_timer
);
4118 static void change_query_interval(struct pim_interface
*pim_ifp
,
4121 struct listnode
*sock_node
;
4122 struct igmp_sock
*igmp
;
4124 pim_ifp
->igmp_default_query_interval
= query_interval
;
4126 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->igmp_socket_list
, sock_node
, igmp
)) {
4127 igmp_sock_query_interval_reconfig(igmp
);
4128 igmp_sock_query_reschedule(igmp
);
4132 static void change_query_max_response_time(struct pim_interface
*pim_ifp
,
4133 int query_max_response_time_dsec
)
4135 struct listnode
*sock_node
;
4136 struct igmp_sock
*igmp
;
4138 pim_ifp
->igmp_query_max_response_time_dsec
= query_max_response_time_dsec
;
4141 Below we modify socket/group/source timers in order to quickly
4142 reflect the change. Otherwise, those timers would eventually catch
4146 /* scan all sockets */
4147 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->igmp_socket_list
, sock_node
, igmp
)) {
4148 struct listnode
*grp_node
;
4149 struct igmp_group
*grp
;
4151 /* reschedule socket general query */
4152 igmp_sock_query_reschedule(igmp
);
4154 /* scan socket groups */
4155 for (ALL_LIST_ELEMENTS_RO(igmp
->igmp_group_list
, grp_node
, grp
)) {
4156 struct listnode
*src_node
;
4157 struct igmp_source
*src
;
4159 /* reset group timers for groups in EXCLUDE mode */
4160 if (grp
->group_filtermode_isexcl
) {
4161 igmp_group_reset_gmi(grp
);
4164 /* scan group sources */
4165 for (ALL_LIST_ELEMENTS_RO(grp
->group_source_list
, src_node
, src
)) {
4167 /* reset source timers for sources with running timers */
4168 if (src
->t_source_timer
) {
4169 igmp_source_reset_gmi(igmp
, grp
, src
);
4176 #define IGMP_QUERY_INTERVAL_MIN (1)
4177 #define IGMP_QUERY_INTERVAL_MAX (1800)
4179 DEFUN (interface_ip_igmp_query_interval
,
4180 interface_ip_igmp_query_interval_cmd
,
4181 "ip igmp query-interval (1-1800)",
4184 IFACE_IGMP_QUERY_INTERVAL_STR
4185 "Query interval in seconds\n")
4187 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4188 struct pim_interface
*pim_ifp
;
4190 int query_interval_dsec
;
4193 pim_ifp
= ifp
->info
;
4196 ret
= pim_cmd_igmp_start(vty
, ifp
);
4197 if (ret
!= CMD_SUCCESS
)
4199 pim_ifp
= ifp
->info
;
4202 query_interval
= atoi(argv
[3]->arg
);
4203 query_interval_dsec
= 10 * query_interval
;
4206 It seems we don't need to check bounds since command.c does it
4207 already, but we verify them anyway for extra safety.
4209 if (query_interval
< IGMP_QUERY_INTERVAL_MIN
) {
4210 vty_out(vty
, "General query interval %d lower than minimum %d%s",
4212 IGMP_QUERY_INTERVAL_MIN
,
4216 if (query_interval
> IGMP_QUERY_INTERVAL_MAX
) {
4217 vty_out(vty
, "General query interval %d higher than maximum %d%s",
4219 IGMP_QUERY_INTERVAL_MAX
,
4224 if (query_interval_dsec
<= pim_ifp
->igmp_query_max_response_time_dsec
) {
4226 "Can't set general query interval %d dsec <= query max response time %d dsec.%s",
4227 query_interval_dsec
, pim_ifp
->igmp_query_max_response_time_dsec
,
4232 change_query_interval(pim_ifp
, query_interval
);
4237 DEFUN (interface_no_ip_igmp_query_interval
,
4238 interface_no_ip_igmp_query_interval_cmd
,
4239 "no ip igmp query-interval",
4243 IFACE_IGMP_QUERY_INTERVAL_STR
)
4245 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4246 struct pim_interface
*pim_ifp
;
4247 int default_query_interval_dsec
;
4249 pim_ifp
= ifp
->info
;
4254 default_query_interval_dsec
= IGMP_GENERAL_QUERY_INTERVAL
* 10;
4256 if (default_query_interval_dsec
<= pim_ifp
->igmp_query_max_response_time_dsec
) {
4258 "Can't set default general query interval %d dsec <= query max response time %d dsec.%s",
4259 default_query_interval_dsec
, pim_ifp
->igmp_query_max_response_time_dsec
,
4264 change_query_interval(pim_ifp
, IGMP_GENERAL_QUERY_INTERVAL
);
4269 DEFUN (interface_ip_igmp_version
,
4270 interface_ip_igmp_version_cmd
,
4271 "ip igmp version (2-3)",
4275 "IGMP version number\n")
4277 VTY_DECLVAR_CONTEXT(interface
,ifp
);
4278 struct pim_interface
*pim_ifp
;
4282 pim_ifp
= ifp
->info
;
4285 ret
= pim_cmd_igmp_start(vty
, ifp
);
4286 if (ret
!= CMD_SUCCESS
)
4288 pim_ifp
= ifp
->info
;
4291 igmp_version
= atoi(argv
[3]->arg
);
4292 pim_ifp
->igmp_version
= igmp_version
;
4297 DEFUN (interface_no_ip_igmp_version
,
4298 interface_no_ip_igmp_version_cmd
,
4299 "no ip igmp version (2-3)",
4304 "IGMP version number\n")
4306 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4307 struct pim_interface
*pim_ifp
;
4309 pim_ifp
= ifp
->info
;
4314 pim_ifp
->igmp_version
= IGMP_DEFAULT_VERSION
;
4319 #define IGMP_QUERY_MAX_RESPONSE_TIME_MIN_DSEC (10)
4320 #define IGMP_QUERY_MAX_RESPONSE_TIME_MAX_DSEC (250)
4322 DEFUN (interface_ip_igmp_query_max_response_time
,
4323 interface_ip_igmp_query_max_response_time_cmd
,
4324 "ip igmp query-max-response-time (10-250)",
4327 IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_STR
4328 "Query response value in deci-seconds\n")
4330 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4331 struct pim_interface
*pim_ifp
;
4332 int query_max_response_time
;
4335 pim_ifp
= ifp
->info
;
4338 ret
= pim_cmd_igmp_start(vty
, ifp
);
4339 if (ret
!= CMD_SUCCESS
)
4341 pim_ifp
= ifp
->info
;
4344 query_max_response_time
= atoi(argv
[3]->arg
);
4346 if (query_max_response_time
>= pim_ifp
->igmp_default_query_interval
* 10) {
4348 "Can't set query max response time %d sec >= general query interval %d sec%s",
4349 query_max_response_time
, pim_ifp
->igmp_default_query_interval
,
4354 change_query_max_response_time(pim_ifp
, query_max_response_time
);
4359 DEFUN (interface_no_ip_igmp_query_max_response_time
,
4360 interface_no_ip_igmp_query_max_response_time_cmd
,
4361 "no ip igmp query-max-response-time (10-250)",
4365 IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_STR
4366 "Time for response in deci-seconds\n")
4368 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4369 struct pim_interface
*pim_ifp
;
4371 pim_ifp
= ifp
->info
;
4376 change_query_max_response_time(pim_ifp
, IGMP_QUERY_MAX_RESPONSE_TIME_DSEC
);
4381 #define IGMP_QUERY_MAX_RESPONSE_TIME_MIN_DSEC (10)
4382 #define IGMP_QUERY_MAX_RESPONSE_TIME_MAX_DSEC (250)
4384 DEFUN_HIDDEN (interface_ip_igmp_query_max_response_time_dsec
,
4385 interface_ip_igmp_query_max_response_time_dsec_cmd
,
4386 "ip igmp query-max-response-time-dsec (10-250)",
4389 IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_DSEC_STR
4390 "Query response value in deciseconds\n")
4392 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4393 struct pim_interface
*pim_ifp
;
4394 int query_max_response_time_dsec
;
4395 int default_query_interval_dsec
;
4398 pim_ifp
= ifp
->info
;
4401 ret
= pim_cmd_igmp_start(vty
, ifp
);
4402 if (ret
!= CMD_SUCCESS
)
4404 pim_ifp
= ifp
->info
;
4407 query_max_response_time_dsec
= atoi(argv
[4]->arg
);
4409 default_query_interval_dsec
= 10 * pim_ifp
->igmp_default_query_interval
;
4411 if (query_max_response_time_dsec
>= default_query_interval_dsec
) {
4413 "Can't set query max response time %d dsec >= general query interval %d dsec%s",
4414 query_max_response_time_dsec
, default_query_interval_dsec
,
4419 change_query_max_response_time(pim_ifp
, query_max_response_time_dsec
);
4424 DEFUN_HIDDEN (interface_no_ip_igmp_query_max_response_time_dsec
,
4425 interface_no_ip_igmp_query_max_response_time_dsec_cmd
,
4426 "no ip igmp query-max-response-time-dsec",
4430 IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_DSEC_STR
)
4432 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4433 struct pim_interface
*pim_ifp
;
4435 pim_ifp
= ifp
->info
;
4440 change_query_max_response_time(pim_ifp
, IGMP_QUERY_MAX_RESPONSE_TIME_DSEC
);
4445 DEFUN (interface_ip_pim_drprio
,
4446 interface_ip_pim_drprio_cmd
,
4447 "ip pim drpriority (1-4294967295)",
4450 "Set the Designated Router Election Priority\n"
4451 "Value of the new DR Priority\n")
4453 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4455 struct pim_interface
*pim_ifp
;
4456 uint32_t old_dr_prio
;
4458 pim_ifp
= ifp
->info
;
4461 vty_out(vty
, "Please enable PIM on interface, first%s", VTY_NEWLINE
);
4465 old_dr_prio
= pim_ifp
->pim_dr_priority
;
4467 pim_ifp
->pim_dr_priority
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
4469 if (old_dr_prio
!= pim_ifp
->pim_dr_priority
) {
4470 if (pim_if_dr_election(ifp
))
4471 pim_hello_restart_now(ifp
);
4477 DEFUN (interface_no_ip_pim_drprio
,
4478 interface_no_ip_pim_drprio_cmd
,
4479 "no ip pim drpriority [(1-4294967295)]",
4483 "Revert the Designated Router Priority to default\n"
4484 "Old Value of the Priority\n")
4486 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4487 struct pim_interface
*pim_ifp
;
4489 pim_ifp
= ifp
->info
;
4492 vty_out(vty
, "Pim not enabled on this interface%s", VTY_NEWLINE
);
4496 if (pim_ifp
->pim_dr_priority
!= PIM_DEFAULT_DR_PRIORITY
) {
4497 pim_ifp
->pim_dr_priority
= PIM_DEFAULT_DR_PRIORITY
;
4498 if (pim_if_dr_election(ifp
))
4499 pim_hello_restart_now(ifp
);
4506 pim_cmd_interface_add (struct interface
*ifp
)
4508 struct pim_interface
*pim_ifp
= ifp
->info
;
4511 pim_ifp
= pim_if_new(ifp
, 0 /* igmp=false */, 1 /* pim=true */);
4517 PIM_IF_DO_PIM(pim_ifp
->options
);
4520 pim_if_addr_add_all(ifp
);
4521 pim_if_membership_refresh(ifp
);
4525 DEFUN_HIDDEN (interface_ip_pim_ssm
,
4526 interface_ip_pim_ssm_cmd
,
4532 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4534 if (!pim_cmd_interface_add(ifp
)) {
4535 vty_out(vty
, "Could not enable PIM SM on interface%s", VTY_NEWLINE
);
4539 vty_out(vty
, "WARN: Enabled PIM SM on interface; configure PIM SSM range if needed%s", VTY_NEWLINE
);
4543 DEFUN (interface_ip_pim_sm
,
4544 interface_ip_pim_sm_cmd
,
4550 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4551 if (!pim_cmd_interface_add(ifp
)) {
4552 vty_out(vty
, "Could not enable PIM SM on interface%s", VTY_NEWLINE
);
4556 pim_if_create_pimreg();
4562 pim_cmd_interface_delete (struct interface
*ifp
)
4564 struct pim_interface
*pim_ifp
= ifp
->info
;
4569 PIM_IF_DONT_PIM(pim_ifp
->options
);
4571 pim_if_membership_clear(ifp
);
4574 pim_sock_delete() removes all neighbors from
4575 pim_ifp->pim_neighbor_list.
4577 pim_sock_delete(ifp
, "pim unconfigured on interface");
4579 if (!PIM_IF_TEST_IGMP(pim_ifp
->options
)) {
4580 pim_if_addr_del_all(ifp
);
4587 DEFUN_HIDDEN (interface_no_ip_pim_ssm
,
4588 interface_no_ip_pim_ssm_cmd
,
4595 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4596 if (!pim_cmd_interface_delete(ifp
)) {
4597 vty_out(vty
, "Unable to delete interface information%s", VTY_NEWLINE
);
4604 DEFUN (interface_no_ip_pim_sm
,
4605 interface_no_ip_pim_sm_cmd
,
4612 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4613 if (!pim_cmd_interface_delete(ifp
)) {
4614 vty_out(vty
, "Unable to delete interface information%s", VTY_NEWLINE
);
4621 DEFUN (interface_ip_mroute
,
4622 interface_ip_mroute_cmd
,
4623 "ip mroute INTERFACE A.B.C.D",
4625 "Add multicast route\n"
4626 "Outgoing interface name\n"
4629 VTY_DECLVAR_CONTEXT(interface
, iif
);
4630 int idx_interface
= 2;
4632 struct interface
*oif
;
4633 const char *oifname
;
4634 const char *grp_str
;
4635 struct in_addr grp_addr
;
4636 struct in_addr src_addr
;
4639 oifname
= argv
[idx_interface
]->arg
;
4640 oif
= if_lookup_by_name(oifname
, VRF_DEFAULT
);
4642 vty_out(vty
, "No such interface name %s%s",
4643 oifname
, VTY_NEWLINE
);
4647 grp_str
= argv
[idx_ipv4
]->arg
;
4648 result
= inet_pton(AF_INET
, grp_str
, &grp_addr
);
4650 vty_out(vty
, "Bad group address %s: errno=%d: %s%s",
4651 grp_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
4655 src_addr
.s_addr
= INADDR_ANY
;
4657 if (pim_static_add(iif
, oif
, grp_addr
, src_addr
)) {
4658 vty_out(vty
, "Failed to add route%s", VTY_NEWLINE
);
4665 DEFUN (interface_ip_mroute_source
,
4666 interface_ip_mroute_source_cmd
,
4667 "ip mroute INTERFACE A.B.C.D A.B.C.D",
4669 "Add multicast route\n"
4670 "Outgoing interface name\n"
4674 VTY_DECLVAR_CONTEXT(interface
, iif
);
4675 int idx_interface
= 2;
4678 struct interface
*oif
;
4679 const char *oifname
;
4680 const char *grp_str
;
4681 struct in_addr grp_addr
;
4682 const char *src_str
;
4683 struct in_addr src_addr
;
4686 oifname
= argv
[idx_interface
]->arg
;
4687 oif
= if_lookup_by_name(oifname
, VRF_DEFAULT
);
4689 vty_out(vty
, "No such interface name %s%s",
4690 oifname
, VTY_NEWLINE
);
4694 grp_str
= argv
[idx_ipv4
]->arg
;
4695 result
= inet_pton(AF_INET
, grp_str
, &grp_addr
);
4697 vty_out(vty
, "Bad group address %s: errno=%d: %s%s",
4698 grp_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
4702 src_str
= argv
[idx_ipv4_2
]->arg
;
4703 result
= inet_pton(AF_INET
, src_str
, &src_addr
);
4705 vty_out(vty
, "Bad source address %s: errno=%d: %s%s",
4706 src_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
4710 if (pim_static_add(iif
, oif
, grp_addr
, src_addr
)) {
4711 vty_out(vty
, "Failed to add route%s", VTY_NEWLINE
);
4718 DEFUN (interface_no_ip_mroute
,
4719 interface_no_ip_mroute_cmd
,
4720 "no ip mroute INTERFACE A.B.C.D",
4723 "Add multicast route\n"
4724 "Outgoing interface name\n"
4727 VTY_DECLVAR_CONTEXT(interface
, iif
);
4728 int idx_interface
= 3;
4730 struct interface
*oif
;
4731 const char *oifname
;
4732 const char *grp_str
;
4733 struct in_addr grp_addr
;
4734 struct in_addr src_addr
;
4737 oifname
= argv
[idx_interface
]->arg
;
4738 oif
= if_lookup_by_name(oifname
, VRF_DEFAULT
);
4740 vty_out(vty
, "No such interface name %s%s",
4741 oifname
, VTY_NEWLINE
);
4745 grp_str
= argv
[idx_ipv4
]->arg
;
4746 result
= inet_pton(AF_INET
, grp_str
, &grp_addr
);
4748 vty_out(vty
, "Bad group address %s: errno=%d: %s%s",
4749 grp_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
4753 src_addr
.s_addr
= INADDR_ANY
;
4755 if (pim_static_del(iif
, oif
, grp_addr
, src_addr
)) {
4756 vty_out(vty
, "Failed to remove route%s", VTY_NEWLINE
);
4763 DEFUN (interface_no_ip_mroute_source
,
4764 interface_no_ip_mroute_source_cmd
,
4765 "no ip mroute INTERFACE A.B.C.D A.B.C.D",
4768 "Add multicast route\n"
4769 "Outgoing interface name\n"
4773 VTY_DECLVAR_CONTEXT(interface
, iif
);
4774 int idx_interface
= 3;
4777 struct interface
*oif
;
4778 const char *oifname
;
4779 const char *grp_str
;
4780 struct in_addr grp_addr
;
4781 const char *src_str
;
4782 struct in_addr src_addr
;
4785 oifname
= argv
[idx_interface
]->arg
;
4786 oif
= if_lookup_by_name(oifname
, VRF_DEFAULT
);
4788 vty_out(vty
, "No such interface name %s%s",
4789 oifname
, VTY_NEWLINE
);
4793 grp_str
= argv
[idx_ipv4
]->arg
;
4794 result
= inet_pton(AF_INET
, grp_str
, &grp_addr
);
4796 vty_out(vty
, "Bad group address %s: errno=%d: %s%s",
4797 grp_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
4801 src_str
= argv
[idx_ipv4_2
]->arg
;
4802 result
= inet_pton(AF_INET
, src_str
, &src_addr
);
4804 vty_out(vty
, "Bad source address %s: errno=%d: %s%s",
4805 src_str
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
4809 if (pim_static_del(iif
, oif
, grp_addr
, src_addr
)) {
4810 vty_out(vty
, "Failed to remove route%s", VTY_NEWLINE
);
4817 DEFUN (interface_ip_pim_hello
,
4818 interface_ip_pim_hello_cmd
,
4819 "ip pim hello (1-180) [(1-180)]",
4823 IFACE_PIM_HELLO_TIME_STR
4824 IFACE_PIM_HELLO_HOLD_STR
)
4826 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4829 struct pim_interface
*pim_ifp
;
4831 pim_ifp
= ifp
->info
;
4834 vty_out(vty
, "Pim not enabled on this interface%s", VTY_NEWLINE
);
4838 pim_ifp
->pim_hello_period
= strtol(argv
[idx_time
]->arg
, NULL
, 10);
4840 if (argc
== idx_hold
)
4841 pim_ifp
->pim_default_holdtime
= strtol(argv
[idx_hold
]->arg
, NULL
, 10);
4848 DEFUN (interface_no_ip_pim_hello
,
4849 interface_no_ip_pim_hello_cmd
,
4850 "no ip pim hello [(1-180) (1-180)]",
4855 IFACE_PIM_HELLO_TIME_STR
4856 IFACE_PIM_HELLO_HOLD_STR
)
4858 VTY_DECLVAR_CONTEXT(interface
, ifp
);
4859 struct pim_interface
*pim_ifp
;
4861 pim_ifp
= ifp
->info
;
4864 vty_out(vty
, "Pim not enabled on this interface%s", VTY_NEWLINE
);
4868 pim_ifp
->pim_hello_period
= PIM_DEFAULT_HELLO_PERIOD
;
4869 pim_ifp
->pim_default_holdtime
= -1;
4880 PIM_DO_DEBUG_IGMP_EVENTS
;
4881 PIM_DO_DEBUG_IGMP_PACKETS
;
4882 PIM_DO_DEBUG_IGMP_TRACE
;
4886 DEFUN (no_debug_igmp
,
4893 PIM_DONT_DEBUG_IGMP_EVENTS
;
4894 PIM_DONT_DEBUG_IGMP_PACKETS
;
4895 PIM_DONT_DEBUG_IGMP_TRACE
;
4900 DEFUN (debug_igmp_events
,
4901 debug_igmp_events_cmd
,
4902 "debug igmp events",
4905 DEBUG_IGMP_EVENTS_STR
)
4907 PIM_DO_DEBUG_IGMP_EVENTS
;
4911 DEFUN (no_debug_igmp_events
,
4912 no_debug_igmp_events_cmd
,
4913 "no debug igmp events",
4917 DEBUG_IGMP_EVENTS_STR
)
4919 PIM_DONT_DEBUG_IGMP_EVENTS
;
4924 DEFUN (debug_igmp_packets
,
4925 debug_igmp_packets_cmd
,
4926 "debug igmp packets",
4929 DEBUG_IGMP_PACKETS_STR
)
4931 PIM_DO_DEBUG_IGMP_PACKETS
;
4935 DEFUN (no_debug_igmp_packets
,
4936 no_debug_igmp_packets_cmd
,
4937 "no debug igmp packets",
4941 DEBUG_IGMP_PACKETS_STR
)
4943 PIM_DONT_DEBUG_IGMP_PACKETS
;
4948 DEFUN (debug_igmp_trace
,
4949 debug_igmp_trace_cmd
,
4953 DEBUG_IGMP_TRACE_STR
)
4955 PIM_DO_DEBUG_IGMP_TRACE
;
4959 DEFUN (no_debug_igmp_trace
,
4960 no_debug_igmp_trace_cmd
,
4961 "no debug igmp trace",
4965 DEBUG_IGMP_TRACE_STR
)
4967 PIM_DONT_DEBUG_IGMP_TRACE
;
4972 DEFUN (debug_mroute
,
4978 PIM_DO_DEBUG_MROUTE
;
4982 DEFUN (debug_mroute_detail
,
4983 debug_mroute_detail_cmd
,
4984 "debug mroute detail",
4989 PIM_DO_DEBUG_MROUTE_DETAIL
;
4993 DEFUN (no_debug_mroute
,
4994 no_debug_mroute_cmd
,
5000 PIM_DONT_DEBUG_MROUTE
;
5004 DEFUN (no_debug_mroute_detail
,
5005 no_debug_mroute_detail_cmd
,
5006 "no debug mroute detail",
5012 PIM_DONT_DEBUG_MROUTE_DETAIL
;
5016 DEFUN (debug_static
,
5022 PIM_DO_DEBUG_STATIC
;
5026 DEFUN (no_debug_static
,
5027 no_debug_static_cmd
,
5033 PIM_DONT_DEBUG_STATIC
;
5044 PIM_DO_DEBUG_PIM_EVENTS
;
5045 PIM_DO_DEBUG_PIM_PACKETS
;
5046 PIM_DO_DEBUG_PIM_TRACE
;
5047 PIM_DO_DEBUG_MSDP_EVENTS
;
5048 PIM_DO_DEBUG_MSDP_PACKETS
;
5052 DEFUN (no_debug_pim
,
5059 PIM_DONT_DEBUG_PIM_EVENTS
;
5060 PIM_DONT_DEBUG_PIM_PACKETS
;
5061 PIM_DONT_DEBUG_PIM_TRACE
;
5062 PIM_DONT_DEBUG_MSDP_EVENTS
;
5063 PIM_DONT_DEBUG_MSDP_PACKETS
;
5065 PIM_DONT_DEBUG_PIM_PACKETDUMP_SEND
;
5066 PIM_DONT_DEBUG_PIM_PACKETDUMP_RECV
;
5072 DEFUN (debug_pim_events
,
5073 debug_pim_events_cmd
,
5077 DEBUG_PIM_EVENTS_STR
)
5079 PIM_DO_DEBUG_PIM_EVENTS
;
5083 DEFUN (no_debug_pim_events
,
5084 no_debug_pim_events_cmd
,
5085 "no debug pim events",
5089 DEBUG_PIM_EVENTS_STR
)
5091 PIM_DONT_DEBUG_PIM_EVENTS
;
5095 DEFUN (debug_pim_packets
,
5096 debug_pim_packets_cmd
,
5097 "debug pim packets [<hello|joins|register>]",
5100 DEBUG_PIM_PACKETS_STR
5101 DEBUG_PIM_HELLO_PACKETS_STR
5102 DEBUG_PIM_J_P_PACKETS_STR
5103 DEBUG_PIM_PIM_REG_PACKETS_STR
)
5106 if (argv_find (argv
, argc
, "hello", &idx
))
5108 PIM_DO_DEBUG_PIM_HELLO
;
5109 vty_out (vty
, "PIM Hello debugging is on%s", VTY_NEWLINE
);
5111 else if (argv_find (argv
, argc
,"joins", &idx
))
5113 PIM_DO_DEBUG_PIM_J_P
;
5114 vty_out (vty
, "PIM Join/Prune debugging is on%s", VTY_NEWLINE
);
5116 else if (argv_find (argv
, argc
, "register", &idx
))
5118 PIM_DO_DEBUG_PIM_REG
;
5119 vty_out (vty
, "PIM Register debugging is on%s", VTY_NEWLINE
);
5123 PIM_DO_DEBUG_PIM_PACKETS
;
5124 vty_out (vty
, "PIM Packet debugging is on %s", VTY_NEWLINE
);
5129 DEFUN (no_debug_pim_packets
,
5130 no_debug_pim_packets_cmd
,
5131 "no debug pim packets [<hello|joins|register>]",
5135 DEBUG_PIM_PACKETS_STR
5136 DEBUG_PIM_HELLO_PACKETS_STR
5137 DEBUG_PIM_J_P_PACKETS_STR
5138 DEBUG_PIM_PIM_REG_PACKETS_STR
)
5141 if (argv_find (argv
, argc
,"hello",&idx
))
5143 PIM_DONT_DEBUG_PIM_HELLO
;
5144 vty_out (vty
, "PIM Hello debugging is off %s", VTY_NEWLINE
);
5146 else if (argv_find (argv
, argc
, "joins", &idx
))
5148 PIM_DONT_DEBUG_PIM_J_P
;
5149 vty_out (vty
, "PIM Join/Prune debugging is off %s", VTY_NEWLINE
);
5151 else if (argv_find (argv
, argc
, "register", &idx
))
5153 PIM_DONT_DEBUG_PIM_REG
;
5154 vty_out (vty
, "PIM Register debugging is off%s", VTY_NEWLINE
);
5157 PIM_DONT_DEBUG_PIM_PACKETS
;
5163 DEFUN (debug_pim_packetdump_send
,
5164 debug_pim_packetdump_send_cmd
,
5165 "debug pim packet-dump send",
5168 DEBUG_PIM_PACKETDUMP_STR
5169 DEBUG_PIM_PACKETDUMP_SEND_STR
)
5171 PIM_DO_DEBUG_PIM_PACKETDUMP_SEND
;
5175 DEFUN (no_debug_pim_packetdump_send
,
5176 no_debug_pim_packetdump_send_cmd
,
5177 "no debug pim packet-dump send",
5181 DEBUG_PIM_PACKETDUMP_STR
5182 DEBUG_PIM_PACKETDUMP_SEND_STR
)
5184 PIM_DONT_DEBUG_PIM_PACKETDUMP_SEND
;
5189 DEFUN (debug_pim_packetdump_recv
,
5190 debug_pim_packetdump_recv_cmd
,
5191 "debug pim packet-dump receive",
5194 DEBUG_PIM_PACKETDUMP_STR
5195 DEBUG_PIM_PACKETDUMP_RECV_STR
)
5197 PIM_DO_DEBUG_PIM_PACKETDUMP_RECV
;
5201 DEFUN (no_debug_pim_packetdump_recv
,
5202 no_debug_pim_packetdump_recv_cmd
,
5203 "no debug pim packet-dump receive",
5207 DEBUG_PIM_PACKETDUMP_STR
5208 DEBUG_PIM_PACKETDUMP_RECV_STR
)
5210 PIM_DONT_DEBUG_PIM_PACKETDUMP_RECV
;
5215 DEFUN (debug_pim_trace
,
5216 debug_pim_trace_cmd
,
5220 DEBUG_PIM_TRACE_STR
)
5222 PIM_DO_DEBUG_PIM_TRACE
;
5226 DEFUN (no_debug_pim_trace
,
5227 no_debug_pim_trace_cmd
,
5228 "no debug pim trace",
5232 DEBUG_PIM_TRACE_STR
)
5234 PIM_DONT_DEBUG_PIM_TRACE
;
5239 DEFUN (debug_ssmpingd
,
5246 PIM_DO_DEBUG_SSMPINGD
;
5250 DEFUN (no_debug_ssmpingd
,
5251 no_debug_ssmpingd_cmd
,
5252 "no debug ssmpingd",
5258 PIM_DONT_DEBUG_SSMPINGD
;
5263 DEFUN (debug_pim_zebra
,
5264 debug_pim_zebra_cmd
,
5268 DEBUG_PIM_ZEBRA_STR
)
5274 DEFUN (no_debug_pim_zebra
,
5275 no_debug_pim_zebra_cmd
,
5276 "no debug pim zebra",
5280 DEBUG_PIM_ZEBRA_STR
)
5282 PIM_DONT_DEBUG_ZEBRA
;
5293 PIM_DO_DEBUG_MSDP_EVENTS
;
5294 PIM_DO_DEBUG_MSDP_PACKETS
;
5298 DEFUN (no_debug_msdp
,
5305 PIM_DONT_DEBUG_MSDP_EVENTS
;
5306 PIM_DONT_DEBUG_MSDP_PACKETS
;
5310 ALIAS (no_debug_msdp
,
5316 DEFUN (debug_msdp_events
,
5317 debug_msdp_events_cmd
,
5318 "debug msdp events",
5321 DEBUG_MSDP_EVENTS_STR
)
5323 PIM_DO_DEBUG_MSDP_EVENTS
;
5327 DEFUN (no_debug_msdp_events
,
5328 no_debug_msdp_events_cmd
,
5329 "no debug msdp events",
5333 DEBUG_MSDP_EVENTS_STR
)
5335 PIM_DONT_DEBUG_MSDP_EVENTS
;
5339 ALIAS (no_debug_msdp_events
,
5340 undebug_msdp_events_cmd
,
5341 "undebug msdp events",
5344 DEBUG_MSDP_EVENTS_STR
)
5346 DEFUN (debug_msdp_packets
,
5347 debug_msdp_packets_cmd
,
5348 "debug msdp packets",
5351 DEBUG_MSDP_PACKETS_STR
)
5353 PIM_DO_DEBUG_MSDP_PACKETS
;
5357 DEFUN (no_debug_msdp_packets
,
5358 no_debug_msdp_packets_cmd
,
5359 "no debug msdp packets",
5363 DEBUG_MSDP_PACKETS_STR
)
5365 PIM_DONT_DEBUG_MSDP_PACKETS
;
5369 ALIAS (no_debug_msdp_packets
,
5370 undebug_msdp_packets_cmd
,
5371 "undebug msdp packets",
5374 DEBUG_MSDP_PACKETS_STR
)
5376 DEFUN (show_debugging_pim
,
5377 show_debugging_pim_cmd
,
5378 "show debugging pim",
5383 pim_debug_config_write(vty
);
5388 interface_pim_use_src_cmd_worker(struct vty
*vty
, const char *source
)
5391 struct in_addr source_addr
;
5392 VTY_DECLVAR_CONTEXT(interface
, ifp
);
5394 result
= inet_pton(AF_INET
, source
, &source_addr
);
5396 vty_out(vty
, "%% Bad source address %s: errno=%d: %s%s",
5397 source
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
5401 result
= pim_update_source_set(ifp
, source_addr
);
5405 case PIM_IFACE_NOT_FOUND
:
5406 vty_out(vty
, "Pim not enabled on this interface%s", VTY_NEWLINE
);
5408 case PIM_UPDATE_SOURCE_DUP
:
5409 vty_out(vty
, "%% Source already set to %s%s", source
, VTY_NEWLINE
);
5412 vty_out(vty
, "%% Source set failed%s", VTY_NEWLINE
);
5415 return result
?CMD_WARNING
:CMD_SUCCESS
;
5418 DEFUN (interface_pim_use_source
,
5419 interface_pim_use_source_cmd
,
5420 "ip pim use-source A.B.C.D",
5422 "pim multicast routing\n"
5423 "Configure primary IP address\n"
5424 "source ip address\n")
5426 return interface_pim_use_src_cmd_worker (vty
, argv
[3]->arg
);
5429 DEFUN (interface_no_pim_use_source
,
5430 interface_no_pim_use_source_cmd
,
5431 "no ip pim use-source",
5434 "pim multicast routing\n"
5435 "Delete source IP address\n")
5437 return interface_pim_use_src_cmd_worker (vty
, "0.0.0.0");
5441 ip_msdp_peer_cmd_worker (struct vty
*vty
, const char *peer
, const char *local
)
5443 enum pim_msdp_err result
;
5444 struct in_addr peer_addr
;
5445 struct in_addr local_addr
;
5447 result
= inet_pton(AF_INET
, peer
, &peer_addr
);
5449 vty_out(vty
, "%% Bad peer address %s: errno=%d: %s%s",
5450 peer
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
5454 result
= inet_pton(AF_INET
, local
, &local_addr
);
5456 vty_out(vty
, "%% Bad source address %s: errno=%d: %s%s",
5457 local
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
5461 result
= pim_msdp_peer_add(peer_addr
, local_addr
, "default", NULL
/* mp_p */);
5463 case PIM_MSDP_ERR_NONE
:
5465 case PIM_MSDP_ERR_OOM
:
5466 vty_out(vty
, "%% Out of memory%s", VTY_NEWLINE
);
5468 case PIM_MSDP_ERR_PEER_EXISTS
:
5469 vty_out(vty
, "%% Peer exists%s", VTY_NEWLINE
);
5471 case PIM_MSDP_ERR_MAX_MESH_GROUPS
:
5472 vty_out(vty
, "%% Only one mesh-group allowed currently%s", VTY_NEWLINE
);
5475 vty_out(vty
, "%% peer add failed%s", VTY_NEWLINE
);
5478 return result
?CMD_WARNING
:CMD_SUCCESS
;
5481 DEFUN_HIDDEN (ip_msdp_peer
,
5483 "ip msdp peer A.B.C.D source A.B.C.D",
5486 "Configure MSDP peer\n"
5488 "Source address for TCP connection\n"
5489 "local ip address\n")
5491 return ip_msdp_peer_cmd_worker (vty
, argv
[3]->arg
, argv
[5]->arg
);
5495 ip_no_msdp_peer_cmd_worker (struct vty
*vty
, const char *peer
)
5497 enum pim_msdp_err result
;
5498 struct in_addr peer_addr
;
5500 result
= inet_pton(AF_INET
, peer
, &peer_addr
);
5502 vty_out(vty
, "%% Bad peer address %s: errno=%d: %s%s",
5503 peer
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
5507 result
= pim_msdp_peer_del(peer_addr
);
5509 case PIM_MSDP_ERR_NONE
:
5511 case PIM_MSDP_ERR_NO_PEER
:
5512 vty_out(vty
, "%% Peer does not exist%s", VTY_NEWLINE
);
5515 vty_out(vty
, "%% peer del failed%s", VTY_NEWLINE
);
5518 return result
?CMD_WARNING
:CMD_SUCCESS
;
5521 DEFUN_HIDDEN (no_ip_msdp_peer
,
5522 no_ip_msdp_peer_cmd
,
5523 "no ip msdp peer A.B.C.D",
5527 "Delete MSDP peer\n"
5528 "peer ip address\n")
5530 return ip_no_msdp_peer_cmd_worker (vty
, argv
[4]->arg
);
5534 ip_msdp_mesh_group_member_cmd_worker(struct vty
*vty
, const char *mg
, const char *mbr
)
5536 enum pim_msdp_err result
;
5537 struct in_addr mbr_ip
;
5539 result
= inet_pton(AF_INET
, mbr
, &mbr_ip
);
5541 vty_out(vty
, "%% Bad member address %s: errno=%d: %s%s",
5542 mbr
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
5546 result
= pim_msdp_mg_mbr_add(mg
, mbr_ip
);
5548 case PIM_MSDP_ERR_NONE
:
5550 case PIM_MSDP_ERR_OOM
:
5551 vty_out(vty
, "%% Out of memory%s", VTY_NEWLINE
);
5553 case PIM_MSDP_ERR_MG_MBR_EXISTS
:
5554 vty_out(vty
, "%% mesh-group member exists%s", VTY_NEWLINE
);
5556 case PIM_MSDP_ERR_MAX_MESH_GROUPS
:
5557 vty_out(vty
, "%% Only one mesh-group allowed currently%s", VTY_NEWLINE
);
5560 vty_out(vty
, "%% member add failed%s", VTY_NEWLINE
);
5563 return result
?CMD_WARNING
:CMD_SUCCESS
;
5566 DEFUN (ip_msdp_mesh_group_member
,
5567 ip_msdp_mesh_group_member_cmd
,
5568 "ip msdp mesh-group WORD member A.B.C.D",
5571 "Configure MSDP mesh-group\n"
5573 "mesh group member\n"
5574 "peer ip address\n")
5576 return ip_msdp_mesh_group_member_cmd_worker(vty
, argv
[3]->arg
, argv
[5]->arg
);
5580 ip_no_msdp_mesh_group_member_cmd_worker(struct vty
*vty
, const char *mg
, const char *mbr
)
5582 enum pim_msdp_err result
;
5583 struct in_addr mbr_ip
;
5585 result
= inet_pton(AF_INET
, mbr
, &mbr_ip
);
5587 vty_out(vty
, "%% Bad member address %s: errno=%d: %s%s",
5588 mbr
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
5592 result
= pim_msdp_mg_mbr_del(mg
, mbr_ip
);
5594 case PIM_MSDP_ERR_NONE
:
5596 case PIM_MSDP_ERR_NO_MG
:
5597 vty_out(vty
, "%% mesh-group does not exist%s", VTY_NEWLINE
);
5599 case PIM_MSDP_ERR_NO_MG_MBR
:
5600 vty_out(vty
, "%% mesh-group member does not exist%s", VTY_NEWLINE
);
5603 vty_out(vty
, "%% mesh-group member del failed%s", VTY_NEWLINE
);
5606 return result
?CMD_WARNING
:CMD_SUCCESS
;
5608 DEFUN (no_ip_msdp_mesh_group_member
,
5609 no_ip_msdp_mesh_group_member_cmd
,
5610 "no ip msdp mesh-group WORD member A.B.C.D",
5614 "Delete MSDP mesh-group member\n"
5616 "mesh group member\n"
5617 "peer ip address\n")
5619 return ip_no_msdp_mesh_group_member_cmd_worker(vty
, argv
[4]->arg
, argv
[6]->arg
);
5623 ip_msdp_mesh_group_source_cmd_worker(struct vty
*vty
, const char *mg
, const char *src
)
5625 enum pim_msdp_err result
;
5626 struct in_addr src_ip
;
5628 result
= inet_pton(AF_INET
, src
, &src_ip
);
5630 vty_out(vty
, "%% Bad source address %s: errno=%d: %s%s",
5631 src
, errno
, safe_strerror(errno
), VTY_NEWLINE
);
5635 result
= pim_msdp_mg_src_add(mg
, src_ip
);
5637 case PIM_MSDP_ERR_NONE
:
5639 case PIM_MSDP_ERR_OOM
:
5640 vty_out(vty
, "%% Out of memory%s", VTY_NEWLINE
);
5642 case PIM_MSDP_ERR_MAX_MESH_GROUPS
:
5643 vty_out(vty
, "%% Only one mesh-group allowed currently%s", VTY_NEWLINE
);
5646 vty_out(vty
, "%% source add failed%s", VTY_NEWLINE
);
5649 return result
?CMD_WARNING
:CMD_SUCCESS
;
5653 DEFUN (ip_msdp_mesh_group_source
,
5654 ip_msdp_mesh_group_source_cmd
,
5655 "ip msdp mesh-group WORD source A.B.C.D",
5658 "Configure MSDP mesh-group\n"
5660 "mesh group local address\n"
5661 "source ip address for the TCP connection\n")
5663 return ip_msdp_mesh_group_source_cmd_worker(vty
, argv
[3]->arg
, argv
[5]->arg
);
5667 ip_no_msdp_mesh_group_source_cmd_worker(struct vty
*vty
, const char *mg
)
5669 enum pim_msdp_err result
;
5671 result
= pim_msdp_mg_src_del(mg
);
5673 case PIM_MSDP_ERR_NONE
:
5675 case PIM_MSDP_ERR_NO_MG
:
5676 vty_out(vty
, "%% mesh-group does not exist%s", VTY_NEWLINE
);
5679 vty_out(vty
, "%% mesh-group source del failed%s", VTY_NEWLINE
);
5682 return result
?CMD_WARNING
:CMD_SUCCESS
;
5686 ip_no_msdp_mesh_group_cmd_worker(struct vty
*vty
, const char *mg
)
5688 enum pim_msdp_err result
;
5690 result
= pim_msdp_mg_del(mg
);
5692 case PIM_MSDP_ERR_NONE
:
5694 case PIM_MSDP_ERR_NO_MG
:
5695 vty_out(vty
, "%% mesh-group does not exist%s", VTY_NEWLINE
);
5698 vty_out(vty
, "%% mesh-group source del failed%s", VTY_NEWLINE
);
5701 return result
? CMD_WARNING
: CMD_SUCCESS
;
5704 DEFUN (no_ip_msdp_mesh_group_source
,
5705 no_ip_msdp_mesh_group_source_cmd
,
5706 "no ip msdp mesh-group WORD source [A.B.C.D]",
5710 "Delete MSDP mesh-group source\n"
5712 "mesh group source\n"
5713 "mesh group local address\n")
5716 return ip_no_msdp_mesh_group_cmd_worker(vty
, argv
[6]->arg
);
5718 return ip_no_msdp_mesh_group_source_cmd_worker(vty
, argv
[4]->arg
);
5722 print_empty_json_obj(struct vty
*vty
)
5725 json
= json_object_new_object();
5726 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
5727 json_object_free(json
);
5731 ip_msdp_show_mesh_group(struct vty
*vty
, u_char uj
)
5733 struct listnode
*mbrnode
;
5734 struct pim_msdp_mg_mbr
*mbr
;
5735 struct pim_msdp_mg
*mg
= msdp
->mg
;
5736 char mbr_str
[INET_ADDRSTRLEN
];
5737 char src_str
[INET_ADDRSTRLEN
];
5738 char state_str
[PIM_MSDP_STATE_STRLEN
];
5739 enum pim_msdp_peer_state state
;
5740 json_object
*json
= NULL
;
5741 json_object
*json_mg_row
= NULL
;
5742 json_object
*json_members
= NULL
;
5743 json_object
*json_row
= NULL
;
5747 print_empty_json_obj(vty
);
5751 pim_inet4_dump("<source?>", mg
->src_ip
, src_str
, sizeof(src_str
));
5753 json
= json_object_new_object();
5754 /* currently there is only one mesh group but we should still make
5755 * it a dict with mg-name as key */
5756 json_mg_row
= json_object_new_object();
5757 json_object_string_add(json_mg_row
, "name", mg
->mesh_group_name
);
5758 json_object_string_add(json_mg_row
, "source", src_str
);
5760 vty_out(vty
, "Mesh group : %s%s", mg
->mesh_group_name
, VTY_NEWLINE
);
5761 vty_out(vty
, " Source : %s%s", src_str
, VTY_NEWLINE
);
5762 vty_out(vty
, " Member State%s", VTY_NEWLINE
);
5765 for (ALL_LIST_ELEMENTS_RO(mg
->mbr_list
, mbrnode
, mbr
)) {
5766 pim_inet4_dump("<mbr?>", mbr
->mbr_ip
, mbr_str
, sizeof(mbr_str
));
5768 state
= mbr
->mp
->state
;
5770 state
= PIM_MSDP_DISABLED
;
5772 pim_msdp_state_dump(state
, state_str
, sizeof(state_str
));
5774 json_row
= json_object_new_object();
5775 json_object_string_add(json_row
, "member", mbr_str
);
5776 json_object_string_add(json_row
, "state", state_str
);
5777 if (!json_members
) {
5778 json_members
= json_object_new_object();
5779 json_object_object_add(json_mg_row
, "members", json_members
);
5781 json_object_object_add(json_members
, mbr_str
, json_row
);
5783 vty_out(vty
, " %-15s %11s%s",
5784 mbr_str
, state_str
, VTY_NEWLINE
);
5789 json_object_object_add(json
, mg
->mesh_group_name
, json_mg_row
);
5790 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
5791 json_object_free(json
);
5795 DEFUN (show_ip_msdp_mesh_group
,
5796 show_ip_msdp_mesh_group_cmd
,
5797 "show ip msdp mesh-group [json]",
5801 "MSDP mesh-group information\n"
5802 "JavaScript Object Notation\n")
5804 u_char uj
= use_json(argc
, argv
);
5805 ip_msdp_show_mesh_group(vty
, uj
);
5811 ip_msdp_show_peers(struct vty
*vty
, u_char uj
)
5813 struct listnode
*mpnode
;
5814 struct pim_msdp_peer
*mp
;
5815 char peer_str
[INET_ADDRSTRLEN
];
5816 char local_str
[INET_ADDRSTRLEN
];
5817 char state_str
[PIM_MSDP_STATE_STRLEN
];
5818 char timebuf
[PIM_MSDP_UPTIME_STRLEN
];
5820 json_object
*json
= NULL
;
5821 json_object
*json_row
= NULL
;
5825 json
= json_object_new_object();
5827 vty_out(vty
, "Peer Local State Uptime SaCnt%s", VTY_NEWLINE
);
5830 for (ALL_LIST_ELEMENTS_RO(msdp
->peer_list
, mpnode
, mp
)) {
5831 if (mp
->state
== PIM_MSDP_ESTABLISHED
) {
5832 now
= pim_time_monotonic_sec();
5833 pim_time_uptime(timebuf
, sizeof(timebuf
), now
- mp
->uptime
);
5835 strcpy(timebuf
, "-");
5837 pim_inet4_dump("<peer?>", mp
->peer
, peer_str
, sizeof(peer_str
));
5838 pim_inet4_dump("<local?>", mp
->local
, local_str
, sizeof(local_str
));
5839 pim_msdp_state_dump(mp
->state
, state_str
, sizeof(state_str
));
5841 json_row
= json_object_new_object();
5842 json_object_string_add(json_row
, "peer", peer_str
);
5843 json_object_string_add(json_row
, "local", local_str
);
5844 json_object_string_add(json_row
, "state", state_str
);
5845 json_object_string_add(json_row
, "upTime", timebuf
);
5846 json_object_int_add(json_row
, "saCount", mp
->sa_cnt
);
5847 json_object_object_add(json
, peer_str
, json_row
);
5849 vty_out(vty
, "%-15s %15s %11s %8s %6d%s",
5850 peer_str
, local_str
, state_str
,
5851 timebuf
, mp
->sa_cnt
, VTY_NEWLINE
);
5856 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
5857 json_object_free(json
);
5862 ip_msdp_show_peers_detail(struct vty
*vty
, const char *peer
, u_char uj
)
5864 struct listnode
*mpnode
;
5865 struct pim_msdp_peer
*mp
;
5866 char peer_str
[INET_ADDRSTRLEN
];
5867 char local_str
[INET_ADDRSTRLEN
];
5868 char state_str
[PIM_MSDP_STATE_STRLEN
];
5869 char timebuf
[PIM_MSDP_UPTIME_STRLEN
];
5870 char katimer
[PIM_MSDP_TIMER_STRLEN
];
5871 char crtimer
[PIM_MSDP_TIMER_STRLEN
];
5872 char holdtimer
[PIM_MSDP_TIMER_STRLEN
];
5874 json_object
*json
= NULL
;
5875 json_object
*json_row
= NULL
;
5878 json
= json_object_new_object();
5881 for (ALL_LIST_ELEMENTS_RO(msdp
->peer_list
, mpnode
, mp
)) {
5882 pim_inet4_dump("<peer?>", mp
->peer
, peer_str
, sizeof(peer_str
));
5883 if (strcmp(peer
, "detail") &&
5884 strcmp(peer
, peer_str
))
5887 if (mp
->state
== PIM_MSDP_ESTABLISHED
) {
5888 now
= pim_time_monotonic_sec();
5889 pim_time_uptime(timebuf
, sizeof(timebuf
), now
- mp
->uptime
);
5891 strcpy(timebuf
, "-");
5893 pim_inet4_dump("<local?>", mp
->local
, local_str
, sizeof(local_str
));
5894 pim_msdp_state_dump(mp
->state
, state_str
, sizeof(state_str
));
5895 pim_time_timer_to_hhmmss(katimer
, sizeof(katimer
), mp
->ka_timer
);
5896 pim_time_timer_to_hhmmss(crtimer
, sizeof(crtimer
), mp
->cr_timer
);
5897 pim_time_timer_to_hhmmss(holdtimer
, sizeof(holdtimer
), mp
->hold_timer
);
5900 json_row
= json_object_new_object();
5901 json_object_string_add(json_row
, "peer", peer_str
);
5902 json_object_string_add(json_row
, "local", local_str
);
5903 json_object_string_add(json_row
, "meshGroupName", mp
->mesh_group_name
);
5904 json_object_string_add(json_row
, "state", state_str
);
5905 json_object_string_add(json_row
, "upTime", timebuf
);
5906 json_object_string_add(json_row
, "keepAliveTimer", katimer
);
5907 json_object_string_add(json_row
, "connRetryTimer", crtimer
);
5908 json_object_string_add(json_row
, "holdTimer", holdtimer
);
5909 json_object_string_add(json_row
, "lastReset", mp
->last_reset
);
5910 json_object_int_add(json_row
, "connAttempts", mp
->conn_attempts
);
5911 json_object_int_add(json_row
, "establishedChanges", mp
->est_flaps
);
5912 json_object_int_add(json_row
, "saCount", mp
->sa_cnt
);
5913 json_object_int_add(json_row
, "kaSent", mp
->ka_tx_cnt
);
5914 json_object_int_add(json_row
, "kaRcvd", mp
->ka_rx_cnt
);
5915 json_object_int_add(json_row
, "saSent", mp
->sa_tx_cnt
);
5916 json_object_int_add(json_row
, "saRcvd", mp
->sa_rx_cnt
);
5917 json_object_object_add(json
, peer_str
, json_row
);
5919 vty_out(vty
, "Peer : %s%s", peer_str
, VTY_NEWLINE
);
5920 vty_out(vty
, " Local : %s%s", local_str
, VTY_NEWLINE
);
5921 vty_out(vty
, " Mesh Group : %s%s", mp
->mesh_group_name
, VTY_NEWLINE
);
5922 vty_out(vty
, " State : %s%s", state_str
, VTY_NEWLINE
);
5923 vty_out(vty
, " Uptime : %s%s", timebuf
, VTY_NEWLINE
);
5925 vty_out(vty
, " Keepalive Timer : %s%s", katimer
, VTY_NEWLINE
);
5926 vty_out(vty
, " Conn Retry Timer : %s%s", crtimer
, VTY_NEWLINE
);
5927 vty_out(vty
, " Hold Timer : %s%s", holdtimer
, VTY_NEWLINE
);
5928 vty_out(vty
, " Last Reset : %s%s", mp
->last_reset
, VTY_NEWLINE
);
5929 vty_out(vty
, " Conn Attempts : %d%s", mp
->conn_attempts
, VTY_NEWLINE
);
5930 vty_out(vty
, " Established Changes : %d%s", mp
->est_flaps
, VTY_NEWLINE
);
5931 vty_out(vty
, " SA Count : %d%s", mp
->sa_cnt
, VTY_NEWLINE
);
5932 vty_out(vty
, " Statistics :%s", VTY_NEWLINE
);
5933 vty_out(vty
, " Sent Rcvd%s", VTY_NEWLINE
);
5934 vty_out(vty
, " Keepalives : %10d %10d%s",
5935 mp
->ka_tx_cnt
, mp
->ka_rx_cnt
, VTY_NEWLINE
);
5936 vty_out(vty
, " SAs : %10d %10d%s",
5937 mp
->sa_tx_cnt
, mp
->sa_rx_cnt
, VTY_NEWLINE
);
5938 vty_out(vty
, "%s", VTY_NEWLINE
);
5943 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
5944 json_object_free(json
);
5948 DEFUN (show_ip_msdp_peer_detail
,
5949 show_ip_msdp_peer_detail_cmd
,
5950 "show ip msdp peer [detail|A.B.C.D] [json]",
5954 "MSDP peer information\n"
5957 "JavaScript Object Notation\n")
5959 u_char uj
= use_json(argc
, argv
);
5964 ip_msdp_show_peers_detail(vty
, argv
[4]->arg
, uj
);
5966 ip_msdp_show_peers(vty
, uj
);
5972 ip_msdp_show_sa(struct vty
*vty
, u_char uj
)
5974 struct listnode
*sanode
;
5975 struct pim_msdp_sa
*sa
;
5976 char src_str
[INET_ADDRSTRLEN
];
5977 char grp_str
[INET_ADDRSTRLEN
];
5978 char rp_str
[INET_ADDRSTRLEN
];
5979 char timebuf
[PIM_MSDP_UPTIME_STRLEN
];
5983 json_object
*json
= NULL
;
5984 json_object
*json_group
= NULL
;
5985 json_object
*json_row
= NULL
;
5988 json
= json_object_new_object();
5990 vty_out(vty
, "Source Group RP Local SPT Uptime%s", VTY_NEWLINE
);
5993 for (ALL_LIST_ELEMENTS_RO(msdp
->sa_list
, sanode
, sa
)) {
5994 now
= pim_time_monotonic_sec();
5995 pim_time_uptime(timebuf
, sizeof(timebuf
), now
- sa
->uptime
);
5996 pim_inet4_dump("<src?>", sa
->sg
.src
, src_str
, sizeof(src_str
));
5997 pim_inet4_dump("<grp?>", sa
->sg
.grp
, grp_str
, sizeof(grp_str
));
5998 if (sa
->flags
& PIM_MSDP_SAF_PEER
) {
5999 pim_inet4_dump("<rp?>", sa
->rp
, rp_str
, sizeof(rp_str
));
6001 strcpy(spt_str
, "yes");
6003 strcpy(spt_str
, "no");
6006 strcpy(rp_str
, "-");
6007 strcpy(spt_str
, "-");
6009 if (sa
->flags
& PIM_MSDP_SAF_LOCAL
) {
6010 strcpy(local_str
, "yes");
6012 strcpy(local_str
, "no");
6015 json_object_object_get_ex(json
, grp_str
, &json_group
);
6018 json_group
= json_object_new_object();
6019 json_object_object_add(json
, grp_str
, json_group
);
6022 json_row
= json_object_new_object();
6023 json_object_string_add(json_row
, "source", src_str
);
6024 json_object_string_add(json_row
, "group", grp_str
);
6025 json_object_string_add(json_row
, "rp", rp_str
);
6026 json_object_string_add(json_row
, "local", local_str
);
6027 json_object_string_add(json_row
, "sptSetup", spt_str
);
6028 json_object_string_add(json_row
, "upTime", timebuf
);
6029 json_object_object_add(json_group
, src_str
, json_row
);
6031 vty_out(vty
, "%-15s %15s %15s %5c %3c %8s%s",
6032 src_str
, grp_str
, rp_str
, local_str
[0], spt_str
[0], timebuf
, VTY_NEWLINE
);
6038 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
6039 json_object_free(json
);
6044 ip_msdp_show_sa_entry_detail(struct pim_msdp_sa
*sa
, const char *src_str
,
6045 const char *grp_str
, struct vty
*vty
,
6046 u_char uj
, json_object
*json
)
6048 char rp_str
[INET_ADDRSTRLEN
];
6049 char peer_str
[INET_ADDRSTRLEN
];
6050 char timebuf
[PIM_MSDP_UPTIME_STRLEN
];
6053 char statetimer
[PIM_MSDP_TIMER_STRLEN
];
6055 json_object
*json_group
= NULL
;
6056 json_object
*json_row
= NULL
;
6058 now
= pim_time_monotonic_sec();
6059 pim_time_uptime(timebuf
, sizeof(timebuf
), now
- sa
->uptime
);
6060 if (sa
->flags
& PIM_MSDP_SAF_PEER
) {
6061 pim_inet4_dump("<rp?>", sa
->rp
, rp_str
, sizeof(rp_str
));
6062 pim_inet4_dump("<peer?>", sa
->peer
, peer_str
, sizeof(peer_str
));
6064 strcpy(spt_str
, "yes");
6066 strcpy(spt_str
, "no");
6069 strcpy(rp_str
, "-");
6070 strcpy(peer_str
, "-");
6071 strcpy(spt_str
, "-");
6073 if (sa
->flags
& PIM_MSDP_SAF_LOCAL
) {
6074 strcpy(local_str
, "yes");
6076 strcpy(local_str
, "no");
6078 pim_time_timer_to_hhmmss(statetimer
, sizeof(statetimer
), sa
->sa_state_timer
);
6080 json_object_object_get_ex(json
, grp_str
, &json_group
);
6083 json_group
= json_object_new_object();
6084 json_object_object_add(json
, grp_str
, json_group
);
6087 json_row
= json_object_new_object();
6088 json_object_string_add(json_row
, "source", src_str
);
6089 json_object_string_add(json_row
, "group", grp_str
);
6090 json_object_string_add(json_row
, "rp", rp_str
);
6091 json_object_string_add(json_row
, "local", local_str
);
6092 json_object_string_add(json_row
, "sptSetup", spt_str
);
6093 json_object_string_add(json_row
, "upTime", timebuf
);
6094 json_object_string_add(json_row
, "stateTimer", statetimer
);
6095 json_object_object_add(json_group
, src_str
, json_row
);
6097 vty_out(vty
, "SA : %s%s", sa
->sg_str
, VTY_NEWLINE
);
6098 vty_out(vty
, " RP : %s%s", rp_str
, VTY_NEWLINE
);
6099 vty_out(vty
, " Peer : %s%s", peer_str
, VTY_NEWLINE
);
6100 vty_out(vty
, " Local : %s%s", local_str
, VTY_NEWLINE
);
6101 vty_out(vty
, " SPT Setup : %s%s", spt_str
, VTY_NEWLINE
);
6102 vty_out(vty
, " Uptime : %s%s", timebuf
, VTY_NEWLINE
);
6103 vty_out(vty
, " State Timer : %s%s", statetimer
, VTY_NEWLINE
);
6104 vty_out(vty
, "%s", VTY_NEWLINE
);
6109 ip_msdp_show_sa_detail(struct vty
*vty
, u_char uj
)
6111 struct listnode
*sanode
;
6112 struct pim_msdp_sa
*sa
;
6113 char src_str
[INET_ADDRSTRLEN
];
6114 char grp_str
[INET_ADDRSTRLEN
];
6115 json_object
*json
= NULL
;
6118 json
= json_object_new_object();
6121 for (ALL_LIST_ELEMENTS_RO(msdp
->sa_list
, sanode
, sa
)) {
6122 pim_inet4_dump("<src?>", sa
->sg
.src
, src_str
, sizeof(src_str
));
6123 pim_inet4_dump("<grp?>", sa
->sg
.grp
, grp_str
, sizeof(grp_str
));
6124 ip_msdp_show_sa_entry_detail(sa
, src_str
, grp_str
, vty
, uj
, json
);
6128 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
6129 json_object_free(json
);
6133 DEFUN (show_ip_msdp_sa_detail
,
6134 show_ip_msdp_sa_detail_cmd
,
6135 "show ip msdp sa detail [json]",
6139 "MSDP active-source information\n"
6141 "JavaScript Object Notation\n")
6143 u_char uj
= use_json(argc
, argv
);
6144 ip_msdp_show_sa_detail(vty
, uj
);
6150 ip_msdp_show_sa_addr(struct vty
*vty
, const char *addr
, u_char uj
)
6152 struct listnode
*sanode
;
6153 struct pim_msdp_sa
*sa
;
6154 char src_str
[INET_ADDRSTRLEN
];
6155 char grp_str
[INET_ADDRSTRLEN
];
6156 json_object
*json
= NULL
;
6159 json
= json_object_new_object();
6162 for (ALL_LIST_ELEMENTS_RO(msdp
->sa_list
, sanode
, sa
)) {
6163 pim_inet4_dump("<src?>", sa
->sg
.src
, src_str
, sizeof(src_str
));
6164 pim_inet4_dump("<grp?>", sa
->sg
.grp
, grp_str
, sizeof(grp_str
));
6165 if (!strcmp(addr
, src_str
) || !strcmp(addr
, grp_str
)) {
6166 ip_msdp_show_sa_entry_detail(sa
, src_str
, grp_str
, vty
, uj
, json
);
6171 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
6172 json_object_free(json
);
6177 ip_msdp_show_sa_sg(struct vty
*vty
, const char *src
, const char *grp
, u_char uj
)
6179 struct listnode
*sanode
;
6180 struct pim_msdp_sa
*sa
;
6181 char src_str
[INET_ADDRSTRLEN
];
6182 char grp_str
[INET_ADDRSTRLEN
];
6183 json_object
*json
= NULL
;
6186 json
= json_object_new_object();
6189 for (ALL_LIST_ELEMENTS_RO(msdp
->sa_list
, sanode
, sa
)) {
6190 pim_inet4_dump("<src?>", sa
->sg
.src
, src_str
, sizeof(src_str
));
6191 pim_inet4_dump("<grp?>", sa
->sg
.grp
, grp_str
, sizeof(grp_str
));
6192 if (!strcmp(src
, src_str
) && !strcmp(grp
, grp_str
)) {
6193 ip_msdp_show_sa_entry_detail(sa
, src_str
, grp_str
, vty
, uj
, json
);
6198 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
6199 json_object_free(json
);
6203 DEFUN (show_ip_msdp_sa_sg
,
6204 show_ip_msdp_sa_sg_cmd
,
6205 "show ip msdp sa [A.B.C.D [A.B.C.D]] [json]",
6209 "MSDP active-source information\n"
6210 "source or group ip\n"
6212 "JavaScript Object Notation\n")
6214 u_char uj
= use_json(argc
, argv
);
6219 ip_msdp_show_sa_sg(vty
, argv
[4]->arg
, argv
[5]->arg
, uj
);
6221 ip_msdp_show_sa_addr(vty
, argv
[4]->arg
, uj
);
6223 ip_msdp_show_sa(vty
, uj
);
6230 install_node (&pim_global_node
, pim_global_config_write
); /* PIM_NODE */
6231 install_node (&interface_node
, pim_interface_config_write
); /* INTERFACE_NODE */
6234 install_node (&debug_node
, pim_debug_config_write
);
6236 install_element (CONFIG_NODE
, &ip_multicast_routing_cmd
);
6237 install_element (CONFIG_NODE
, &no_ip_multicast_routing_cmd
);
6238 install_element (CONFIG_NODE
, &ip_pim_rp_cmd
);
6239 install_element (CONFIG_NODE
, &no_ip_pim_rp_cmd
);
6240 install_element (CONFIG_NODE
, &ip_pim_rp_prefix_list_cmd
);
6241 install_element (CONFIG_NODE
, &no_ip_pim_rp_prefix_list_cmd
);
6242 install_element (CONFIG_NODE
, &no_ip_pim_ssm_prefix_list_cmd
);
6243 install_element (CONFIG_NODE
, &no_ip_pim_ssm_prefix_list_name_cmd
);
6244 install_element (CONFIG_NODE
, &ip_pim_ssm_prefix_list_cmd
);
6245 install_element (CONFIG_NODE
, &ip_pim_register_suppress_cmd
);
6246 install_element (CONFIG_NODE
, &no_ip_pim_register_suppress_cmd
);
6247 install_element (CONFIG_NODE
, &ip_pim_spt_switchover_infinity_cmd
);
6248 install_element (CONFIG_NODE
, &no_ip_pim_spt_switchover_infinity_cmd
);
6249 install_element (CONFIG_NODE
, &ip_pim_joinprune_time_cmd
);
6250 install_element (CONFIG_NODE
, &no_ip_pim_joinprune_time_cmd
);
6251 install_element (CONFIG_NODE
, &ip_pim_keep_alive_cmd
);
6252 install_element (CONFIG_NODE
, &no_ip_pim_keep_alive_cmd
);
6253 install_element (CONFIG_NODE
, &ip_pim_packets_cmd
);
6254 install_element (CONFIG_NODE
, &no_ip_pim_packets_cmd
);
6255 install_element (CONFIG_NODE
, &ip_pim_v6_secondary_cmd
);
6256 install_element (CONFIG_NODE
, &no_ip_pim_v6_secondary_cmd
);
6257 install_element (CONFIG_NODE
, &ip_ssmpingd_cmd
);
6258 install_element (CONFIG_NODE
, &no_ip_ssmpingd_cmd
);
6259 install_element (CONFIG_NODE
, &ip_msdp_peer_cmd
);
6260 install_element (CONFIG_NODE
, &no_ip_msdp_peer_cmd
);
6262 install_element (INTERFACE_NODE
, &interface_ip_igmp_cmd
);
6263 install_element (INTERFACE_NODE
, &interface_no_ip_igmp_cmd
);
6264 install_element (INTERFACE_NODE
, &interface_ip_igmp_join_cmd
);
6265 install_element (INTERFACE_NODE
, &interface_no_ip_igmp_join_cmd
);
6266 install_element (INTERFACE_NODE
, &interface_ip_igmp_version_cmd
);
6267 install_element (INTERFACE_NODE
, &interface_no_ip_igmp_version_cmd
);
6268 install_element (INTERFACE_NODE
, &interface_ip_igmp_query_interval_cmd
);
6269 install_element (INTERFACE_NODE
, &interface_no_ip_igmp_query_interval_cmd
);
6270 install_element (INTERFACE_NODE
, &interface_ip_igmp_query_max_response_time_cmd
);
6271 install_element (INTERFACE_NODE
, &interface_no_ip_igmp_query_max_response_time_cmd
);
6272 install_element (INTERFACE_NODE
, &interface_ip_igmp_query_max_response_time_dsec_cmd
);
6273 install_element (INTERFACE_NODE
, &interface_no_ip_igmp_query_max_response_time_dsec_cmd
);
6274 install_element (INTERFACE_NODE
, &interface_ip_pim_ssm_cmd
);
6275 install_element (INTERFACE_NODE
, &interface_no_ip_pim_ssm_cmd
);
6276 install_element (INTERFACE_NODE
, &interface_ip_pim_sm_cmd
);
6277 install_element (INTERFACE_NODE
, &interface_no_ip_pim_sm_cmd
);
6278 install_element (INTERFACE_NODE
, &interface_ip_pim_drprio_cmd
);
6279 install_element (INTERFACE_NODE
, &interface_no_ip_pim_drprio_cmd
);
6280 install_element (INTERFACE_NODE
, &interface_ip_pim_hello_cmd
);
6281 install_element (INTERFACE_NODE
, &interface_no_ip_pim_hello_cmd
);
6283 // Static mroutes NEB
6284 install_element (INTERFACE_NODE
, &interface_ip_mroute_cmd
);
6285 install_element (INTERFACE_NODE
, &interface_ip_mroute_source_cmd
);
6286 install_element (INTERFACE_NODE
, &interface_no_ip_mroute_cmd
);
6287 install_element (INTERFACE_NODE
, &interface_no_ip_mroute_source_cmd
);
6289 install_element (VIEW_NODE
, &show_ip_igmp_interface_cmd
);
6290 install_element (VIEW_NODE
, &show_ip_igmp_join_cmd
);
6291 install_element (VIEW_NODE
, &show_ip_igmp_groups_cmd
);
6292 install_element (VIEW_NODE
, &show_ip_igmp_groups_retransmissions_cmd
);
6293 install_element (VIEW_NODE
, &show_ip_igmp_sources_cmd
);
6294 install_element (VIEW_NODE
, &show_ip_igmp_sources_retransmissions_cmd
);
6295 install_element (VIEW_NODE
, &show_ip_pim_assert_cmd
);
6296 install_element (VIEW_NODE
, &show_ip_pim_assert_internal_cmd
);
6297 install_element (VIEW_NODE
, &show_ip_pim_assert_metric_cmd
);
6298 install_element (VIEW_NODE
, &show_ip_pim_assert_winner_metric_cmd
);
6299 install_element (VIEW_NODE
, &show_ip_pim_interface_cmd
);
6300 install_element (VIEW_NODE
, &show_ip_pim_join_cmd
);
6301 install_element (VIEW_NODE
, &show_ip_pim_local_membership_cmd
);
6302 install_element (VIEW_NODE
, &show_ip_pim_neighbor_cmd
);
6303 install_element (VIEW_NODE
, &show_ip_pim_rpf_cmd
);
6304 install_element (VIEW_NODE
, &show_ip_pim_secondary_cmd
);
6305 install_element (VIEW_NODE
, &show_ip_pim_state_cmd
);
6306 install_element (VIEW_NODE
, &show_ip_pim_upstream_cmd
);
6307 install_element (VIEW_NODE
, &show_ip_pim_upstream_join_desired_cmd
);
6308 install_element (VIEW_NODE
, &show_ip_pim_upstream_rpf_cmd
);
6309 install_element (VIEW_NODE
, &show_ip_pim_rp_cmd
);
6310 install_element (VIEW_NODE
, &show_ip_multicast_cmd
);
6311 install_element (VIEW_NODE
, &show_ip_mroute_cmd
);
6312 install_element (VIEW_NODE
, &show_ip_mroute_count_cmd
);
6313 install_element (VIEW_NODE
, &show_ip_rib_cmd
);
6314 install_element (VIEW_NODE
, &show_ip_ssmpingd_cmd
);
6315 install_element (VIEW_NODE
, &show_debugging_pim_cmd
);
6317 install_element (ENABLE_NODE
, &clear_ip_interfaces_cmd
);
6318 install_element (ENABLE_NODE
, &clear_ip_igmp_interfaces_cmd
);
6319 install_element (ENABLE_NODE
, &clear_ip_mroute_cmd
);
6320 install_element (ENABLE_NODE
, &clear_ip_pim_interfaces_cmd
);
6321 install_element (ENABLE_NODE
, &clear_ip_pim_oil_cmd
);
6323 install_element (ENABLE_NODE
, &debug_igmp_cmd
);
6324 install_element (ENABLE_NODE
, &no_debug_igmp_cmd
);
6325 install_element (ENABLE_NODE
, &debug_igmp_events_cmd
);
6326 install_element (ENABLE_NODE
, &no_debug_igmp_events_cmd
);
6327 install_element (ENABLE_NODE
, &debug_igmp_packets_cmd
);
6328 install_element (ENABLE_NODE
, &no_debug_igmp_packets_cmd
);
6329 install_element (ENABLE_NODE
, &debug_igmp_trace_cmd
);
6330 install_element (ENABLE_NODE
, &no_debug_igmp_trace_cmd
);
6331 install_element (ENABLE_NODE
, &debug_mroute_cmd
);
6332 install_element (ENABLE_NODE
, &debug_mroute_detail_cmd
);
6333 install_element (ENABLE_NODE
, &no_debug_mroute_cmd
);
6334 install_element (ENABLE_NODE
, &no_debug_mroute_detail_cmd
);
6335 install_element (ENABLE_NODE
, &debug_static_cmd
);
6336 install_element (ENABLE_NODE
, &no_debug_static_cmd
);
6337 install_element (ENABLE_NODE
, &debug_pim_cmd
);
6338 install_element (ENABLE_NODE
, &no_debug_pim_cmd
);
6339 install_element (ENABLE_NODE
, &debug_pim_events_cmd
);
6340 install_element (ENABLE_NODE
, &no_debug_pim_events_cmd
);
6341 install_element (ENABLE_NODE
, &debug_pim_packets_cmd
);
6342 install_element (ENABLE_NODE
, &no_debug_pim_packets_cmd
);
6343 install_element (ENABLE_NODE
, &debug_pim_packetdump_send_cmd
);
6344 install_element (ENABLE_NODE
, &no_debug_pim_packetdump_send_cmd
);
6345 install_element (ENABLE_NODE
, &debug_pim_packetdump_recv_cmd
);
6346 install_element (ENABLE_NODE
, &no_debug_pim_packetdump_recv_cmd
);
6347 install_element (ENABLE_NODE
, &debug_pim_trace_cmd
);
6348 install_element (ENABLE_NODE
, &no_debug_pim_trace_cmd
);
6349 install_element (ENABLE_NODE
, &debug_ssmpingd_cmd
);
6350 install_element (ENABLE_NODE
, &no_debug_ssmpingd_cmd
);
6351 install_element (ENABLE_NODE
, &debug_pim_zebra_cmd
);
6352 install_element (ENABLE_NODE
, &no_debug_pim_zebra_cmd
);
6353 install_element (ENABLE_NODE
, &debug_msdp_cmd
);
6354 install_element (ENABLE_NODE
, &no_debug_msdp_cmd
);
6355 install_element (ENABLE_NODE
, &undebug_msdp_cmd
);
6356 install_element (ENABLE_NODE
, &debug_msdp_events_cmd
);
6357 install_element (ENABLE_NODE
, &no_debug_msdp_events_cmd
);
6358 install_element (ENABLE_NODE
, &undebug_msdp_events_cmd
);
6359 install_element (ENABLE_NODE
, &debug_msdp_packets_cmd
);
6360 install_element (ENABLE_NODE
, &no_debug_msdp_packets_cmd
);
6361 install_element (ENABLE_NODE
, &undebug_msdp_packets_cmd
);
6363 install_element (CONFIG_NODE
, &debug_igmp_cmd
);
6364 install_element (CONFIG_NODE
, &no_debug_igmp_cmd
);
6365 install_element (CONFIG_NODE
, &debug_igmp_events_cmd
);
6366 install_element (CONFIG_NODE
, &no_debug_igmp_events_cmd
);
6367 install_element (CONFIG_NODE
, &debug_igmp_packets_cmd
);
6368 install_element (CONFIG_NODE
, &no_debug_igmp_packets_cmd
);
6369 install_element (CONFIG_NODE
, &debug_igmp_trace_cmd
);
6370 install_element (CONFIG_NODE
, &no_debug_igmp_trace_cmd
);
6371 install_element (CONFIG_NODE
, &debug_mroute_cmd
);
6372 install_element (CONFIG_NODE
, &debug_mroute_detail_cmd
);
6373 install_element (CONFIG_NODE
, &no_debug_mroute_cmd
);
6374 install_element (CONFIG_NODE
, &no_debug_mroute_detail_cmd
);
6375 install_element (CONFIG_NODE
, &debug_static_cmd
);
6376 install_element (CONFIG_NODE
, &no_debug_static_cmd
);
6377 install_element (CONFIG_NODE
, &debug_pim_cmd
);
6378 install_element (CONFIG_NODE
, &no_debug_pim_cmd
);
6379 install_element (CONFIG_NODE
, &debug_pim_events_cmd
);
6380 install_element (CONFIG_NODE
, &no_debug_pim_events_cmd
);
6381 install_element (CONFIG_NODE
, &debug_pim_packets_cmd
);
6382 install_element (CONFIG_NODE
, &no_debug_pim_packets_cmd
);
6383 install_element (CONFIG_NODE
, &debug_pim_trace_cmd
);
6384 install_element (CONFIG_NODE
, &no_debug_pim_trace_cmd
);
6385 install_element (CONFIG_NODE
, &debug_ssmpingd_cmd
);
6386 install_element (CONFIG_NODE
, &no_debug_ssmpingd_cmd
);
6387 install_element (CONFIG_NODE
, &debug_pim_zebra_cmd
);
6388 install_element (CONFIG_NODE
, &no_debug_pim_zebra_cmd
);
6389 install_element (CONFIG_NODE
, &debug_msdp_cmd
);
6390 install_element (CONFIG_NODE
, &no_debug_msdp_cmd
);
6391 install_element (CONFIG_NODE
, &undebug_msdp_cmd
);
6392 install_element (CONFIG_NODE
, &debug_msdp_events_cmd
);
6393 install_element (CONFIG_NODE
, &no_debug_msdp_events_cmd
);
6394 install_element (CONFIG_NODE
, &undebug_msdp_events_cmd
);
6395 install_element (CONFIG_NODE
, &debug_msdp_packets_cmd
);
6396 install_element (CONFIG_NODE
, &no_debug_msdp_packets_cmd
);
6397 install_element (CONFIG_NODE
, &undebug_msdp_packets_cmd
);
6398 install_element (CONFIG_NODE
, &ip_msdp_mesh_group_member_cmd
);
6399 install_element (CONFIG_NODE
, &no_ip_msdp_mesh_group_member_cmd
);
6400 install_element (CONFIG_NODE
, &ip_msdp_mesh_group_source_cmd
);
6401 install_element (CONFIG_NODE
, &no_ip_msdp_mesh_group_source_cmd
);
6402 install_element (VIEW_NODE
, &show_ip_msdp_peer_detail_cmd
);
6403 install_element (VIEW_NODE
, &show_ip_msdp_sa_detail_cmd
);
6404 install_element (VIEW_NODE
, &show_ip_msdp_sa_sg_cmd
);
6405 install_element (VIEW_NODE
, &show_ip_msdp_mesh_group_cmd
);
6406 install_element (VIEW_NODE
, &show_ip_pim_ssm_range_cmd
);
6407 install_element (VIEW_NODE
, &show_ip_pim_group_type_cmd
);
6408 install_element (INTERFACE_NODE
, &interface_pim_use_source_cmd
);
6409 install_element (INTERFACE_NODE
, &interface_no_pim_use_source_cmd
);