1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (C) 2008 Everton da Silva Marques
21 #include "pim_mroute.h"
23 #include "pim_iface.h"
25 #include "pim_mroute.h"
28 #include "pim_igmpv3.h"
33 #include "pim_neighbor.h"
35 #include "pim_ifchannel.h"
36 #include "pim_hello.h"
38 #include "pim_upstream.h"
40 #include "pim_macro.h"
41 #include "pim_ssmpingd.h"
42 #include "pim_zebra.h"
43 #include "pim_static.h"
45 #include "pim_zlookup.h"
50 #include "pim_vxlan.h"
54 #include "lib/northbound_cli.h"
55 #include "pim_errors.h"
58 #include "pim_cmd_common.h"
60 #include "pimd/pim_cmd_clippy.c"
62 static struct cmd_node debug_node
= {
66 .config_write
= pim_debug_config_write
,
69 static struct vrf
*pim_cmd_lookup_vrf(struct vty
*vty
, struct cmd_token
*argv
[],
70 const int argc
, int *idx
)
74 if (argv_find(argv
, argc
, "NAME", idx
))
75 vrf
= vrf_lookup_by_name(argv
[*idx
]->arg
);
77 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
80 vty_out(vty
, "Specified VRF: %s does not exist\n",
86 static void pim_show_assert_helper(struct vty
*vty
,
87 struct pim_interface
*pim_ifp
,
88 struct pim_ifchannel
*ch
, time_t now
)
90 char winner_str
[INET_ADDRSTRLEN
];
91 struct in_addr ifaddr
;
94 char buf
[PREFIX_STRLEN
];
96 ifaddr
= pim_ifp
->primary_address
;
98 pim_inet4_dump("<assrt_win?>", ch
->ifassert_winner
, winner_str
,
101 pim_time_uptime(uptime
, sizeof(uptime
), now
- ch
->ifassert_creation
);
102 pim_time_timer_to_mmss(timer
, sizeof(timer
), ch
->t_ifassert_timer
);
104 vty_out(vty
, "%-16s %-15s %-15pPAs %-15pPAs %-6s %-15s %-8s %-5s\n",
106 inet_ntop(AF_INET
, &ifaddr
, buf
, sizeof(buf
)), &ch
->sg
.src
,
107 &ch
->sg
.grp
, pim_ifchannel_ifassert_name(ch
->ifassert_state
),
108 winner_str
, uptime
, timer
);
111 static void pim_show_assert(struct pim_instance
*pim
, struct vty
*vty
)
113 struct pim_interface
*pim_ifp
;
114 struct pim_ifchannel
*ch
;
115 struct interface
*ifp
;
118 now
= pim_time_monotonic_sec();
121 "Interface Address Source Group State Winner Uptime Timer\n");
123 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
128 RB_FOREACH (ch
, pim_ifchannel_rb
, &pim_ifp
->ifchannel_rb
) {
129 if (ch
->ifassert_state
== PIM_IFASSERT_NOINFO
)
132 pim_show_assert_helper(vty
, pim_ifp
, ch
, now
);
133 } /* scan interface channels */
137 static void pim_show_assert_internal_helper(struct vty
*vty
,
138 struct pim_interface
*pim_ifp
,
139 struct pim_ifchannel
*ch
)
141 struct in_addr ifaddr
;
142 char buf
[PREFIX_STRLEN
];
144 ifaddr
= pim_ifp
->primary_address
;
146 vty_out(vty
, "%-16s %-15s %-15pPAs %-15pPAs %-3s %-3s %-3s %-4s\n",
148 inet_ntop(AF_INET
, &ifaddr
, buf
, sizeof(buf
)), &ch
->sg
.src
,
150 PIM_IF_FLAG_TEST_COULD_ASSERT(ch
->flags
) ? "yes" : "no",
151 pim_macro_ch_could_assert_eval(ch
) ? "yes" : "no",
152 PIM_IF_FLAG_TEST_ASSERT_TRACKING_DESIRED(ch
->flags
) ? "yes"
154 pim_macro_assert_tracking_desired_eval(ch
) ? "yes" : "no");
157 static void pim_show_assert_internal(struct pim_instance
*pim
, struct vty
*vty
)
159 struct pim_interface
*pim_ifp
;
160 struct pim_ifchannel
*ch
;
161 struct interface
*ifp
;
165 "ECA: Evaluate CouldAssert\n"
166 "ATD: AssertTrackingDesired\n"
167 "eATD: Evaluate AssertTrackingDesired\n\n");
170 "Interface Address Source Group CA eCA ATD eATD\n");
171 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
176 RB_FOREACH (ch
, pim_ifchannel_rb
, &pim_ifp
->ifchannel_rb
) {
177 pim_show_assert_internal_helper(vty
, pim_ifp
, ch
);
178 } /* scan interface channels */
182 static void pim_show_assert_metric_helper(struct vty
*vty
,
183 struct pim_interface
*pim_ifp
,
184 struct pim_ifchannel
*ch
)
186 char addr_str
[INET_ADDRSTRLEN
];
187 struct pim_assert_metric am
;
188 struct in_addr ifaddr
;
189 char buf
[PREFIX_STRLEN
];
191 ifaddr
= pim_ifp
->primary_address
;
193 am
= pim_macro_spt_assert_metric(&ch
->upstream
->rpf
,
194 pim_ifp
->primary_address
);
196 pim_inet4_dump("<addr?>", am
.ip_address
, addr_str
, sizeof(addr_str
));
198 vty_out(vty
, "%-16s %-15s %-15pPAs %-15pPAs %-3s %4u %6u %-15s\n",
200 inet_ntop(AF_INET
, &ifaddr
, buf
, sizeof(buf
)), &ch
->sg
.src
,
201 &ch
->sg
.grp
, am
.rpt_bit_flag
? "yes" : "no",
202 am
.metric_preference
, am
.route_metric
, addr_str
);
205 static void pim_show_assert_metric(struct pim_instance
*pim
, struct vty
*vty
)
207 struct pim_interface
*pim_ifp
;
208 struct pim_ifchannel
*ch
;
209 struct interface
*ifp
;
212 "Interface Address Source Group RPT Pref Metric Address \n");
214 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
219 RB_FOREACH (ch
, pim_ifchannel_rb
, &pim_ifp
->ifchannel_rb
) {
220 pim_show_assert_metric_helper(vty
, pim_ifp
, ch
);
221 } /* scan interface channels */
225 static void pim_show_assert_winner_metric_helper(struct vty
*vty
,
226 struct pim_interface
*pim_ifp
,
227 struct pim_ifchannel
*ch
)
229 char addr_str
[INET_ADDRSTRLEN
];
230 struct pim_assert_metric
*am
;
231 struct in_addr ifaddr
;
234 char buf
[PREFIX_STRLEN
];
236 ifaddr
= pim_ifp
->primary_address
;
238 am
= &ch
->ifassert_winner_metric
;
240 pim_inet4_dump("<addr?>", am
->ip_address
, addr_str
, sizeof(addr_str
));
242 if (am
->metric_preference
== PIM_ASSERT_METRIC_PREFERENCE_MAX
)
243 snprintf(pref_str
, sizeof(pref_str
), "INFI");
245 snprintf(pref_str
, sizeof(pref_str
), "%4u",
246 am
->metric_preference
);
248 if (am
->route_metric
== PIM_ASSERT_ROUTE_METRIC_MAX
)
249 snprintf(metr_str
, sizeof(metr_str
), "INFI");
251 snprintf(metr_str
, sizeof(metr_str
), "%6u", am
->route_metric
);
253 vty_out(vty
, "%-16s %-15s %-15pPAs %-15pPAs %-3s %-4s %-6s %-15s\n",
255 inet_ntop(AF_INET
, &ifaddr
, buf
, sizeof(buf
)), &ch
->sg
.src
,
256 &ch
->sg
.grp
, am
->rpt_bit_flag
? "yes" : "no", pref_str
,
260 static void pim_show_assert_winner_metric(struct pim_instance
*pim
,
263 struct pim_interface
*pim_ifp
;
264 struct pim_ifchannel
*ch
;
265 struct interface
*ifp
;
268 "Interface Address Source Group RPT Pref Metric Address \n");
270 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
275 RB_FOREACH (ch
, pim_ifchannel_rb
, &pim_ifp
->ifchannel_rb
) {
276 pim_show_assert_winner_metric_helper(vty
, pim_ifp
, ch
);
277 } /* scan interface channels */
281 static void igmp_show_interfaces(struct pim_instance
*pim
, struct vty
*vty
,
284 struct interface
*ifp
;
286 char buf
[PREFIX_STRLEN
];
287 json_object
*json
= NULL
;
288 json_object
*json_row
= NULL
;
290 now
= pim_time_monotonic_sec();
293 json
= json_object_new_object();
296 "Interface State Address V Querier QuerierIp Query Timer Uptime\n");
298 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
299 struct pim_interface
*pim_ifp
;
300 struct listnode
*sock_node
;
301 struct gm_sock
*igmp
;
308 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_socket_list
, sock_node
,
311 char query_hhmmss
[10];
313 pim_time_uptime(uptime
, sizeof(uptime
),
314 now
- igmp
->sock_creation
);
315 pim_time_timer_to_hhmmss(query_hhmmss
,
316 sizeof(query_hhmmss
),
317 igmp
->t_igmp_query_timer
);
320 json_row
= json_object_new_object();
321 json_object_pim_ifp_add(json_row
, ifp
);
322 json_object_string_add(json_row
, "upTime",
324 json_object_int_add(json_row
, "version",
325 pim_ifp
->igmp_version
);
327 if (igmp
->t_igmp_query_timer
) {
328 json_object_boolean_true_add(json_row
,
330 json_object_string_add(json_row
,
334 json_object_string_addf(json_row
, "querierIp",
336 &igmp
->querier_addr
);
338 json_object_object_add(json
, ifp
->name
,
341 if (igmp
->mtrace_only
) {
342 json_object_boolean_true_add(
343 json_row
, "mtraceOnly");
347 "%-16s %5s %15s %d %7s %17pI4 %11s %8s\n",
350 ? (igmp
->mtrace_only
? "mtrc"
353 inet_ntop(AF_INET
, &igmp
->ifaddr
, buf
,
355 pim_ifp
->igmp_version
,
356 igmp
->t_igmp_query_timer
? "local"
358 &igmp
->querier_addr
, query_hhmmss
,
368 static void igmp_show_interfaces_single(struct pim_instance
*pim
,
369 struct vty
*vty
, const char *ifname
,
372 struct gm_sock
*igmp
;
373 struct interface
*ifp
;
374 struct listnode
*sock_node
;
375 struct pim_interface
*pim_ifp
;
377 char query_hhmmss
[10];
378 char other_hhmmss
[10];
379 int found_ifname
= 0;
381 long gmi_msec
; /* Group Membership Interval */
384 long oqpi_msec
; /* Other Querier Present Interval */
389 json_object
*json
= NULL
;
390 json_object
*json_row
= NULL
;
393 json
= json_object_new_object();
395 now
= pim_time_monotonic_sec();
397 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
403 if (strcmp(ifname
, "detail") && strcmp(ifname
, ifp
->name
))
406 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_socket_list
, sock_node
,
409 pim_time_uptime(uptime
, sizeof(uptime
),
410 now
- igmp
->sock_creation
);
411 pim_time_timer_to_hhmmss(query_hhmmss
,
412 sizeof(query_hhmmss
),
413 igmp
->t_igmp_query_timer
);
414 pim_time_timer_to_hhmmss(other_hhmmss
,
415 sizeof(other_hhmmss
),
416 igmp
->t_other_querier_timer
);
418 gmi_msec
= PIM_IGMP_GMI_MSEC(
419 igmp
->querier_robustness_variable
,
420 igmp
->querier_query_interval
,
421 pim_ifp
->gm_query_max_response_time_dsec
);
423 sqi
= PIM_IGMP_SQI(pim_ifp
->gm_default_query_interval
);
425 oqpi_msec
= PIM_IGMP_OQPI_MSEC(
426 igmp
->querier_robustness_variable
,
427 igmp
->querier_query_interval
,
428 pim_ifp
->gm_query_max_response_time_dsec
);
430 lmqt_msec
= PIM_IGMP_LMQT_MSEC(
431 pim_ifp
->gm_specific_query_max_response_time_dsec
,
432 pim_ifp
->gm_last_member_query_count
);
436 igmp
->querier_robustness_variable
,
437 igmp
->querier_query_interval
,
438 pim_ifp
->gm_query_max_response_time_dsec
) *
442 pim_ifp
->gm_query_max_response_time_dsec
* 100;
443 lmqc
= pim_ifp
->gm_last_member_query_count
;
446 json_row
= json_object_new_object();
447 json_object_pim_ifp_add(json_row
, ifp
);
448 json_object_string_add(json_row
, "upTime",
450 json_object_string_add(json_row
, "querier",
451 igmp
->t_igmp_query_timer
454 json_object_string_addf(json_row
, "querierIp",
456 &igmp
->querier_addr
);
457 json_object_int_add(json_row
, "queryStartCount",
458 igmp
->startup_query_count
);
459 json_object_string_add(json_row
,
462 json_object_string_add(json_row
,
465 json_object_int_add(json_row
, "version",
466 pim_ifp
->igmp_version
);
469 "timerGroupMembershipIntervalMsec",
471 json_object_int_add(json_row
,
472 "lastMemberQueryCount",
474 json_object_int_add(json_row
,
475 "timerLastMemberQueryMsec",
479 "timerOlderHostPresentIntervalMsec",
483 "timerOtherQuerierPresentIntervalMsec",
486 json_row
, "timerQueryInterval",
487 igmp
->querier_query_interval
);
490 "timerQueryResponseIntervalMsec",
493 json_row
, "timerRobustnessVariable",
494 igmp
->querier_robustness_variable
);
495 json_object_int_add(json_row
,
496 "timerStartupQueryInterval",
499 json_object_object_add(json
, ifp
->name
,
502 if (igmp
->mtrace_only
) {
503 json_object_boolean_true_add(
504 json_row
, "mtraceOnly");
507 vty_out(vty
, "Interface : %s\n", ifp
->name
);
508 vty_out(vty
, "State : %s\n",
509 if_is_up(ifp
) ? (igmp
->mtrace_only
?
513 vty_out(vty
, "Address : %pI4\n",
514 &pim_ifp
->primary_address
);
515 vty_out(vty
, "Uptime : %s\n", uptime
);
516 vty_out(vty
, "Version : %d\n",
517 pim_ifp
->igmp_version
);
521 vty_out(vty
, "Querier\n");
522 vty_out(vty
, "-------\n");
523 vty_out(vty
, "Querier : %s\n",
524 igmp
->t_igmp_query_timer
? "local"
526 vty_out(vty
, "QuerierIp : %pI4",
527 &igmp
->querier_addr
);
528 if (pim_ifp
->primary_address
.s_addr
529 == igmp
->querier_addr
.s_addr
)
530 vty_out(vty
, " (this router)\n");
534 vty_out(vty
, "Start Count : %d\n",
535 igmp
->startup_query_count
);
536 vty_out(vty
, "Query Timer : %s\n",
538 vty_out(vty
, "Other Timer : %s\n",
543 vty_out(vty
, "Timers\n");
544 vty_out(vty
, "------\n");
546 "Group Membership Interval : %lis\n",
549 "Last Member Query Count : %d\n",
552 "Last Member Query Time : %lis\n",
555 "Older Host Present Interval : %lis\n",
558 "Other Querier Present Interval : %lis\n",
561 "Query Interval : %ds\n",
562 igmp
->querier_query_interval
);
564 "Query Response Interval : %lis\n",
567 "Robustness Variable : %d\n",
568 igmp
->querier_robustness_variable
);
570 "Startup Query Interval : %ds\n",
575 pim_print_ifp_flags(vty
, ifp
);
582 else if (!found_ifname
)
583 vty_out(vty
, "%% No such interface\n");
586 static void igmp_show_interface_join(struct pim_instance
*pim
, struct vty
*vty
,
589 struct interface
*ifp
;
591 json_object
*json
= NULL
;
592 json_object
*json_iface
= NULL
;
593 json_object
*json_grp
= NULL
;
594 json_object
*json_grp_arr
= NULL
;
596 now
= pim_time_monotonic_sec();
599 json
= json_object_new_object();
600 json_object_string_add(json
, "vrf",
601 vrf_id_to_name(pim
->vrf
->vrf_id
));
604 "Interface Address Source Group Socket Uptime \n");
607 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
608 struct pim_interface
*pim_ifp
;
609 struct listnode
*join_node
;
611 struct in_addr pri_addr
;
612 char pri_addr_str
[INET_ADDRSTRLEN
];
619 if (!pim_ifp
->gm_join_list
)
622 pri_addr
= pim_find_primary_addr(ifp
);
623 pim_inet4_dump("<pri?>", pri_addr
, pri_addr_str
,
624 sizeof(pri_addr_str
));
626 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_join_list
, join_node
,
628 char group_str
[INET_ADDRSTRLEN
];
629 char source_str
[INET_ADDRSTRLEN
];
632 pim_time_uptime(uptime
, sizeof(uptime
),
633 now
- ij
->sock_creation
);
634 pim_inet4_dump("<grp?>", ij
->group_addr
, group_str
,
636 pim_inet4_dump("<src?>", ij
->source_addr
, source_str
,
640 json_object_object_get_ex(json
, ifp
->name
,
644 json_iface
= json_object_new_object();
645 json_object_string_add(
646 json_iface
, "name", ifp
->name
);
647 json_object_object_add(json
, ifp
->name
,
649 json_grp_arr
= json_object_new_array();
650 json_object_object_add(json_iface
,
655 json_grp
= json_object_new_object();
656 json_object_string_add(json_grp
, "source",
658 json_object_string_add(json_grp
, "group",
660 json_object_string_add(json_grp
, "primaryAddr",
662 json_object_int_add(json_grp
, "sockFd",
664 json_object_string_add(json_grp
, "upTime",
666 json_object_array_add(json_grp_arr
, json_grp
);
669 "%-16s %-15s %-15s %-15s %6d %8s\n",
670 ifp
->name
, pri_addr_str
, source_str
,
671 group_str
, ij
->sock_fd
, uptime
);
673 } /* for (pim_ifp->gm_join_list) */
681 static void igmp_show_statistics(struct pim_instance
*pim
, struct vty
*vty
,
682 const char *ifname
, bool uj
)
684 struct interface
*ifp
;
685 struct igmp_stats igmp_stats
;
686 bool found_ifname
= false;
687 json_object
*json
= NULL
;
689 igmp_stats_init(&igmp_stats
);
692 json
= json_object_new_object();
694 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
695 struct pim_interface
*pim_ifp
;
696 struct listnode
*sock_node
, *source_node
, *group_node
;
697 struct gm_sock
*igmp
;
698 struct gm_group
*group
;
699 struct gm_source
*src
;
706 if (ifname
&& strcmp(ifname
, ifp
->name
))
711 igmp_stats
.joins_failed
+= pim_ifp
->igmp_ifstat_joins_failed
;
712 igmp_stats
.joins_sent
+= pim_ifp
->igmp_ifstat_joins_sent
;
713 igmp_stats
.total_groups
+=
714 pim_ifp
->gm_group_list
715 ? listcount(pim_ifp
->gm_group_list
)
717 igmp_stats
.peak_groups
+= pim_ifp
->igmp_peak_group_count
;
720 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_group_list
, group_node
,
722 for (ALL_LIST_ELEMENTS_RO(group
->group_source_list
,
724 if (pim_addr_is_any(src
->source_addr
))
727 igmp_stats
.total_source_groups
++;
731 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_socket_list
, sock_node
,
733 igmp_stats_add(&igmp_stats
, &igmp
->igmp_stats
);
741 vty_out(vty
, "%% No such interface\n");
746 json_object
*json_row
= json_object_new_object();
748 json_object_string_add(json_row
, "name",
749 ifname
? ifname
: "global");
750 json_object_int_add(json_row
, "queryV1", igmp_stats
.query_v1
);
751 json_object_int_add(json_row
, "queryV2", igmp_stats
.query_v2
);
752 json_object_int_add(json_row
, "queryV3", igmp_stats
.query_v3
);
753 json_object_int_add(json_row
, "leaveV2", igmp_stats
.leave_v2
);
754 json_object_int_add(json_row
, "reportV1", igmp_stats
.report_v1
);
755 json_object_int_add(json_row
, "reportV2", igmp_stats
.report_v2
);
756 json_object_int_add(json_row
, "reportV3", igmp_stats
.report_v3
);
757 json_object_int_add(json_row
, "mtraceResponse",
758 igmp_stats
.mtrace_rsp
);
759 json_object_int_add(json_row
, "mtraceRequest",
760 igmp_stats
.mtrace_req
);
761 json_object_int_add(json_row
, "unsupported",
762 igmp_stats
.unsupported
);
763 json_object_int_add(json_row
, "totalReceivedMessages",
764 igmp_stats
.total_recv_messages
);
765 json_object_int_add(json_row
, "peakGroups",
766 igmp_stats
.peak_groups
);
767 json_object_int_add(json_row
, "totalGroups",
768 igmp_stats
.total_groups
);
769 json_object_int_add(json_row
, "totalSourceGroups",
770 igmp_stats
.total_source_groups
);
771 json_object_int_add(json_row
, "joinsFailed",
772 igmp_stats
.joins_failed
);
773 json_object_int_add(json_row
, "joinsSent",
774 igmp_stats
.joins_sent
);
775 json_object_int_add(json_row
, "generalQueriesSent",
776 igmp_stats
.general_queries_sent
);
777 json_object_int_add(json_row
, "groupQueriesSent",
778 igmp_stats
.group_queries_sent
);
779 json_object_object_add(json
, ifname
? ifname
: "global",
783 vty_out(vty
, "IGMP statistics\n");
784 vty_out(vty
, "Interface : %s\n",
785 ifname
? ifname
: "global");
786 vty_out(vty
, "V1 query : %u\n",
787 igmp_stats
.query_v1
);
788 vty_out(vty
, "V2 query : %u\n",
789 igmp_stats
.query_v2
);
790 vty_out(vty
, "V3 query : %u\n",
791 igmp_stats
.query_v3
);
792 vty_out(vty
, "V2 leave : %u\n",
793 igmp_stats
.leave_v2
);
794 vty_out(vty
, "V1 report : %u\n",
795 igmp_stats
.report_v1
);
796 vty_out(vty
, "V2 report : %u\n",
797 igmp_stats
.report_v2
);
798 vty_out(vty
, "V3 report : %u\n",
799 igmp_stats
.report_v3
);
800 vty_out(vty
, "mtrace response : %u\n",
801 igmp_stats
.mtrace_rsp
);
802 vty_out(vty
, "mtrace request : %u\n",
803 igmp_stats
.mtrace_req
);
804 vty_out(vty
, "unsupported : %u\n",
805 igmp_stats
.unsupported
);
806 vty_out(vty
, "total received messages : %u\n",
807 igmp_stats
.total_recv_messages
);
808 vty_out(vty
, "joins failed : %u\n",
809 igmp_stats
.joins_failed
);
810 vty_out(vty
, "joins sent : %u\n",
811 igmp_stats
.joins_sent
);
812 vty_out(vty
, "general queries sent : %u\n",
813 igmp_stats
.general_queries_sent
);
814 vty_out(vty
, "group queries sent : %u\n",
815 igmp_stats
.group_queries_sent
);
816 vty_out(vty
, "peak groups : %u\n",
817 igmp_stats
.peak_groups
);
818 vty_out(vty
, "total groups : %u\n",
819 igmp_stats
.total_groups
);
820 vty_out(vty
, "total source groups : %u\n",
821 igmp_stats
.total_source_groups
);
825 static void igmp_show_groups(struct pim_instance
*pim
, struct vty
*vty
, bool uj
)
827 struct interface
*ifp
;
829 json_object
*json
= NULL
;
830 json_object
*json_iface
= NULL
;
831 json_object
*json_group
= NULL
;
832 json_object
*json_groups
= NULL
;
834 now
= pim_time_monotonic_sec();
837 json
= json_object_new_object();
838 json_object_int_add(json
, "totalGroups", pim
->gm_group_count
);
839 json_object_int_add(json
, "watermarkLimit",
840 pim
->gm_watermark_limit
);
842 vty_out(vty
, "Total IGMP groups: %u\n", pim
->gm_group_count
);
843 vty_out(vty
, "Watermark warn limit(%s): %u\n",
844 pim
->gm_watermark_limit
? "Set" : "Not Set",
845 pim
->gm_watermark_limit
);
847 "Interface Group Mode Timer Srcs V Uptime \n");
850 /* scan interfaces */
851 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
852 struct pim_interface
*pim_ifp
= ifp
->info
;
853 struct listnode
*grpnode
;
854 struct gm_group
*grp
;
859 /* scan igmp groups */
860 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_group_list
, grpnode
,
862 char group_str
[INET_ADDRSTRLEN
];
866 pim_inet4_dump("<group?>", grp
->group_addr
, group_str
,
868 pim_time_timer_to_hhmmss(hhmmss
, sizeof(hhmmss
),
870 pim_time_uptime(uptime
, sizeof(uptime
),
871 now
- grp
->group_creation
);
874 json_object_object_get_ex(json
, ifp
->name
,
878 json_iface
= json_object_new_object();
879 json_object_pim_ifp_add(json_iface
,
881 json_object_object_add(json
, ifp
->name
,
883 json_groups
= json_object_new_array();
884 json_object_object_add(json_iface
,
889 json_group
= json_object_new_object();
890 json_object_string_add(json_group
, "group",
893 if (grp
->igmp_version
== 3)
894 json_object_string_add(
896 grp
->group_filtermode_isexcl
900 json_object_string_add(json_group
, "timer",
903 json_group
, "sourcesCount",
904 grp
->group_source_list
? listcount(
905 grp
->group_source_list
)
907 json_object_int_add(json_group
, "version",
909 json_object_string_add(json_group
, "uptime",
911 json_object_array_add(json_groups
, json_group
);
913 vty_out(vty
, "%-16s %-15s %4s %8s %4d %d %8s\n",
914 ifp
->name
, group_str
,
915 grp
->igmp_version
== 3
916 ? (grp
->group_filtermode_isexcl
921 grp
->group_source_list
? listcount(
922 grp
->group_source_list
)
924 grp
->igmp_version
, uptime
);
926 } /* scan igmp groups */
927 } /* scan interfaces */
933 static void igmp_show_group_retransmission(struct pim_instance
*pim
,
936 struct interface
*ifp
;
939 "Interface Group RetTimer Counter RetSrcs\n");
941 /* scan interfaces */
942 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
943 struct pim_interface
*pim_ifp
= ifp
->info
;
944 struct listnode
*grpnode
;
945 struct gm_group
*grp
;
950 /* scan igmp groups */
951 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_group_list
, grpnode
,
953 char group_str
[INET_ADDRSTRLEN
];
954 char grp_retr_mmss
[10];
955 struct listnode
*src_node
;
956 struct gm_source
*src
;
957 int grp_retr_sources
= 0;
959 pim_inet4_dump("<group?>", grp
->group_addr
, group_str
,
961 pim_time_timer_to_mmss(
962 grp_retr_mmss
, sizeof(grp_retr_mmss
),
963 grp
->t_group_query_retransmit_timer
);
966 /* count group sources with retransmission state
968 for (ALL_LIST_ELEMENTS_RO(grp
->group_source_list
,
970 if (src
->source_query_retransmit_count
> 0) {
975 vty_out(vty
, "%-16s %-15s %-8s %7d %7d\n", ifp
->name
,
976 group_str
, grp_retr_mmss
,
977 grp
->group_specific_query_retransmit_count
,
980 } /* scan igmp groups */
981 } /* scan interfaces */
984 static void igmp_show_sources(struct pim_instance
*pim
, struct vty
*vty
,
987 struct interface
*ifp
;
989 json_object
*json
= NULL
;
990 json_object
*json_iface
= NULL
;
991 json_object
*json_group
= NULL
;
992 json_object
*json_source
= NULL
;
993 json_object
*json_sources
= NULL
;
995 now
= pim_time_monotonic_sec();
998 json
= json_object_new_object();
1001 "Interface Group Source Timer Fwd Uptime \n");
1003 /* scan interfaces */
1004 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
1005 struct pim_interface
*pim_ifp
= ifp
->info
;
1006 struct listnode
*grpnode
;
1007 struct gm_group
*grp
;
1012 /* scan igmp groups */
1013 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_group_list
, grpnode
,
1015 char group_str
[INET_ADDRSTRLEN
];
1016 struct listnode
*srcnode
;
1017 struct gm_source
*src
;
1019 pim_inet4_dump("<group?>", grp
->group_addr
, group_str
,
1022 /* scan group sources */
1023 for (ALL_LIST_ELEMENTS_RO(grp
->group_source_list
,
1025 char source_str
[INET_ADDRSTRLEN
];
1029 pim_inet4_dump("<source?>", src
->source_addr
,
1030 source_str
, sizeof(source_str
));
1032 pim_time_timer_to_mmss(mmss
, sizeof(mmss
),
1033 src
->t_source_timer
);
1035 pim_time_uptime(uptime
, sizeof(uptime
),
1036 now
- src
->source_creation
);
1039 json_object_object_get_ex(
1040 json
, ifp
->name
, &json_iface
);
1043 json_object_new_object();
1044 json_object_string_add(
1047 json_object_object_add(
1051 json_object_object_get_ex(json_iface
,
1057 json_object_new_object();
1058 json_object_string_add(
1059 json_group
, "group",
1061 json_object_object_add(
1062 json_iface
, group_str
,
1065 json_object_new_array();
1066 json_object_object_add(
1067 json_group
, "sources",
1070 json_source
= json_object_new_object();
1071 json_object_string_add(json_source
,
1074 json_object_string_add(json_source
,
1076 json_object_boolean_add(
1077 json_source
, "forwarded",
1078 IGMP_SOURCE_TEST_FORWARDING(
1079 src
->source_flags
));
1080 json_object_string_add(
1081 json_source
, "uptime", uptime
);
1082 json_object_array_add(json_sources
,
1087 "%-16s %-15s %-15s %5s %3s %8s\n",
1088 ifp
->name
, group_str
,
1090 IGMP_SOURCE_TEST_FORWARDING(
1097 } /* scan group sources */
1098 } /* scan igmp groups */
1099 } /* scan interfaces */
1101 vty_json(vty
, json
);
1104 static void igmp_show_source_retransmission(struct pim_instance
*pim
,
1107 struct interface
*ifp
;
1110 "Interface Group Source Counter\n");
1112 /* scan interfaces */
1113 FOR_ALL_INTERFACES (pim
->vrf
, ifp
) {
1114 struct pim_interface
*pim_ifp
= ifp
->info
;
1115 struct listnode
*grpnode
;
1116 struct gm_group
*grp
;
1121 /* scan igmp groups */
1122 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_group_list
, grpnode
,
1124 char group_str
[INET_ADDRSTRLEN
];
1125 struct listnode
*srcnode
;
1126 struct gm_source
*src
;
1128 pim_inet4_dump("<group?>", grp
->group_addr
, group_str
,
1131 /* scan group sources */
1132 for (ALL_LIST_ELEMENTS_RO(grp
->group_source_list
,
1134 char source_str
[INET_ADDRSTRLEN
];
1136 pim_inet4_dump("<source?>", src
->source_addr
,
1137 source_str
, sizeof(source_str
));
1139 vty_out(vty
, "%-16s %-15s %-15s %7d\n",
1140 ifp
->name
, group_str
, source_str
,
1141 src
->source_query_retransmit_count
);
1143 } /* scan group sources */
1144 } /* scan igmp groups */
1145 } /* scan interfaces */
1148 static void clear_igmp_interfaces(struct pim_instance
*pim
)
1150 struct interface
*ifp
;
1152 FOR_ALL_INTERFACES (pim
->vrf
, ifp
)
1153 pim_if_addr_del_all_igmp(ifp
);
1155 FOR_ALL_INTERFACES (pim
->vrf
, ifp
)
1156 pim_if_addr_add_all(ifp
);
1159 static void clear_interfaces(struct pim_instance
*pim
)
1161 clear_igmp_interfaces(pim
);
1162 clear_pim_interfaces(pim
);
1165 #define PIM_GET_PIM_INTERFACE(pim_ifp, ifp) \
1166 pim_ifp = ifp->info; \
1169 "%% Enable PIM and/or IGMP on this interface first\n"); \
1170 return CMD_WARNING_CONFIG_FAILED; \
1174 * Compatibility function to keep the legacy mesh group CLI behavior:
1175 * Delete group when there are no more configurations in it.
1178 * Don't forget to call `nb_cli_apply_changes` after this.
1180 static void pim_cli_legacy_mesh_group_behavior(struct vty
*vty
,
1183 const char *vrfname
;
1184 char xpath_value
[XPATH_MAXLEN
];
1185 char xpath_member_value
[XPATH_MAXLEN
];
1186 const struct lyd_node
*member_dnode
;
1188 vrfname
= pim_cli_get_vrf_name(vty
);
1189 if (vrfname
== NULL
)
1192 /* Get mesh group base XPath. */
1193 snprintf(xpath_value
, sizeof(xpath_value
),
1194 FRR_PIM_VRF_XPATH
"/msdp-mesh-groups[name='%s']",
1195 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4", gname
);
1196 /* Group must exists, otherwise just quit. */
1197 if (!yang_dnode_exists(vty
->candidate_config
->dnode
, xpath_value
))
1200 /* Group members check: */
1201 strlcpy(xpath_member_value
, xpath_value
, sizeof(xpath_member_value
));
1202 strlcat(xpath_member_value
, "/members", sizeof(xpath_member_value
));
1203 if (yang_dnode_exists(vty
->candidate_config
->dnode
,
1204 xpath_member_value
)) {
1205 member_dnode
= yang_dnode_get(vty
->candidate_config
->dnode
,
1206 xpath_member_value
);
1207 if (!member_dnode
|| !yang_is_last_list_dnode(member_dnode
))
1211 /* Source address check: */
1212 strlcpy(xpath_member_value
, xpath_value
, sizeof(xpath_member_value
));
1213 strlcat(xpath_member_value
, "/source", sizeof(xpath_member_value
));
1214 if (yang_dnode_exists(vty
->candidate_config
->dnode
, xpath_member_value
))
1217 /* No configurations found: delete it. */
1218 nb_cli_enqueue_change(vty
, xpath_value
, NB_OP_DESTROY
, NULL
);
1221 DEFUN (clear_ip_interfaces
,
1222 clear_ip_interfaces_cmd
,
1223 "clear ip interfaces [vrf NAME]",
1226 "Reset interfaces\n"
1230 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1235 clear_interfaces(vrf
->info
);
1240 DEFUN (clear_ip_igmp_interfaces
,
1241 clear_ip_igmp_interfaces_cmd
,
1242 "clear ip igmp [vrf NAME] interfaces",
1247 "Reset IGMP interfaces\n")
1250 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1255 clear_igmp_interfaces(vrf
->info
);
1260 DEFPY (clear_ip_pim_statistics
,
1261 clear_ip_pim_statistics_cmd
,
1262 "clear ip pim statistics [vrf NAME]$name",
1267 "Reset PIM statistics\n")
1269 struct vrf
*v
= pim_cmd_lookup(vty
, name
);
1274 clear_pim_statistics(v
->info
);
1279 DEFPY (clear_ip_mroute
,
1280 clear_ip_mroute_cmd
,
1281 "clear ip mroute [vrf NAME]$name",
1287 struct vrf
*v
= pim_cmd_lookup(vty
, name
);
1292 clear_mroute(v
->info
);
1297 DEFPY (clear_ip_pim_interfaces
,
1298 clear_ip_pim_interfaces_cmd
,
1299 "clear ip pim [vrf NAME] interfaces",
1304 "Reset PIM interfaces\n")
1306 struct vrf
*v
= pim_cmd_lookup(vty
, vrf
);
1311 clear_pim_interfaces(v
->info
);
1316 DEFPY (clear_ip_pim_interface_traffic
,
1317 clear_ip_pim_interface_traffic_cmd
,
1318 "clear ip pim [vrf NAME] interface traffic",
1323 "Reset PIM interfaces\n"
1324 "Reset Protocol Packet counters\n")
1326 return clear_pim_interface_traffic(vrf
, vty
);
1329 DEFPY (clear_ip_pim_oil
,
1330 clear_ip_pim_oil_cmd
,
1331 "clear ip pim [vrf NAME]$name oil",
1336 "Rescan PIM OIL (output interface list)\n")
1338 struct vrf
*v
= pim_cmd_lookup(vty
, name
);
1343 pim_scan_oil(v
->info
);
1348 DEFUN (clear_ip_pim_bsr_db
,
1349 clear_ip_pim_bsr_db_cmd
,
1350 "clear ip pim [vrf NAME] bsr-data",
1355 "Reset pim bsr data\n")
1358 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1363 pim_bsm_clear(vrf
->info
);
1368 DEFUN (show_ip_igmp_interface
,
1369 show_ip_igmp_interface_cmd
,
1370 "show ip igmp [vrf NAME] interface [detail|WORD] [json]",
1375 "IGMP interface information\n"
1381 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1382 bool uj
= use_json(argc
, argv
);
1387 if (argv_find(argv
, argc
, "detail", &idx
)
1388 || argv_find(argv
, argc
, "WORD", &idx
))
1389 igmp_show_interfaces_single(vrf
->info
, vty
, argv
[idx
]->arg
, uj
);
1391 igmp_show_interfaces(vrf
->info
, vty
, uj
);
1396 DEFUN (show_ip_igmp_interface_vrf_all
,
1397 show_ip_igmp_interface_vrf_all_cmd
,
1398 "show ip igmp vrf all interface [detail|WORD] [json]",
1403 "IGMP interface information\n"
1409 bool uj
= use_json(argc
, argv
);
1415 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
1419 vty_out(vty
, " \"%s\": ", vrf
->name
);
1422 vty_out(vty
, "VRF: %s\n", vrf
->name
);
1423 if (argv_find(argv
, argc
, "detail", &idx
)
1424 || argv_find(argv
, argc
, "WORD", &idx
))
1425 igmp_show_interfaces_single(vrf
->info
, vty
,
1426 argv
[idx
]->arg
, uj
);
1428 igmp_show_interfaces(vrf
->info
, vty
, uj
);
1431 vty_out(vty
, "}\n");
1436 DEFUN (show_ip_igmp_join
,
1437 show_ip_igmp_join_cmd
,
1438 "show ip igmp [vrf NAME] join [json]",
1443 "IGMP static join information\n"
1447 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1448 bool uj
= use_json(argc
, argv
);
1453 igmp_show_interface_join(vrf
->info
, vty
, uj
);
1458 DEFUN (show_ip_igmp_join_vrf_all
,
1459 show_ip_igmp_join_vrf_all_cmd
,
1460 "show ip igmp vrf all join [json]",
1465 "IGMP static join information\n"
1468 bool uj
= use_json(argc
, argv
);
1474 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
1478 vty_out(vty
, " \"%s\": ", vrf
->name
);
1481 vty_out(vty
, "VRF: %s\n", vrf
->name
);
1482 igmp_show_interface_join(vrf
->info
, vty
, uj
);
1485 vty_out(vty
, "}\n");
1490 DEFUN (show_ip_igmp_groups
,
1491 show_ip_igmp_groups_cmd
,
1492 "show ip igmp [vrf NAME] groups [json]",
1501 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1502 bool uj
= use_json(argc
, argv
);
1507 igmp_show_groups(vrf
->info
, vty
, uj
);
1512 DEFUN (show_ip_igmp_groups_vrf_all
,
1513 show_ip_igmp_groups_vrf_all_cmd
,
1514 "show ip igmp vrf all groups [json]",
1522 bool uj
= use_json(argc
, argv
);
1528 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
1532 vty_out(vty
, " \"%s\": ", vrf
->name
);
1535 vty_out(vty
, "VRF: %s\n", vrf
->name
);
1536 igmp_show_groups(vrf
->info
, vty
, uj
);
1539 vty_out(vty
, "}\n");
1544 DEFUN (show_ip_igmp_groups_retransmissions
,
1545 show_ip_igmp_groups_retransmissions_cmd
,
1546 "show ip igmp [vrf NAME] groups retransmissions",
1552 "IGMP group retransmissions\n")
1555 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1560 igmp_show_group_retransmission(vrf
->info
, vty
);
1565 DEFUN (show_ip_igmp_sources
,
1566 show_ip_igmp_sources_cmd
,
1567 "show ip igmp [vrf NAME] sources [json]",
1576 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1581 igmp_show_sources(vrf
->info
, vty
, use_json(argc
, argv
));
1586 DEFUN (show_ip_igmp_sources_retransmissions
,
1587 show_ip_igmp_sources_retransmissions_cmd
,
1588 "show ip igmp [vrf NAME] sources retransmissions",
1594 "IGMP source retransmissions\n")
1597 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1602 igmp_show_source_retransmission(vrf
->info
, vty
);
1607 DEFUN (show_ip_igmp_statistics
,
1608 show_ip_igmp_statistics_cmd
,
1609 "show ip igmp [vrf NAME] statistics [interface WORD] [json]",
1620 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1621 bool uj
= use_json(argc
, argv
);
1626 if (argv_find(argv
, argc
, "WORD", &idx
))
1627 igmp_show_statistics(vrf
->info
, vty
, argv
[idx
]->arg
, uj
);
1629 igmp_show_statistics(vrf
->info
, vty
, NULL
, uj
);
1634 DEFUN (show_ip_pim_mlag_summary
,
1635 show_ip_pim_mlag_summary_cmd
,
1636 "show ip pim mlag summary [json]",
1641 "status and stats\n"
1644 bool uj
= use_json(argc
, argv
);
1645 char role_buf
[MLAG_ROLE_STRSIZE
];
1646 char addr_buf
[INET_ADDRSTRLEN
];
1649 json_object
*json
= NULL
;
1650 json_object
*json_stat
= NULL
;
1652 json
= json_object_new_object();
1653 if (router
->mlag_flags
& PIM_MLAGF_LOCAL_CONN_UP
)
1654 json_object_boolean_true_add(json
, "mlagConnUp");
1655 if (router
->mlag_flags
& PIM_MLAGF_PEER_CONN_UP
)
1656 json_object_boolean_true_add(json
, "mlagPeerConnUp");
1657 if (router
->mlag_flags
& PIM_MLAGF_PEER_ZEBRA_UP
)
1658 json_object_boolean_true_add(json
, "mlagPeerZebraUp");
1659 json_object_string_add(json
, "mlagRole",
1660 mlag_role2str(router
->mlag_role
,
1661 role_buf
, sizeof(role_buf
)));
1662 inet_ntop(AF_INET
, &router
->local_vtep_ip
,
1663 addr_buf
, INET_ADDRSTRLEN
);
1664 json_object_string_add(json
, "localVtepIp", addr_buf
);
1665 inet_ntop(AF_INET
, &router
->anycast_vtep_ip
,
1666 addr_buf
, INET_ADDRSTRLEN
);
1667 json_object_string_add(json
, "anycastVtepIp", addr_buf
);
1668 json_object_string_add(json
, "peerlinkRif",
1669 router
->peerlink_rif
);
1671 json_stat
= json_object_new_object();
1672 json_object_int_add(json_stat
, "mlagConnFlaps",
1673 router
->mlag_stats
.mlagd_session_downs
);
1674 json_object_int_add(json_stat
, "mlagPeerConnFlaps",
1675 router
->mlag_stats
.peer_session_downs
);
1676 json_object_int_add(json_stat
, "mlagPeerZebraFlaps",
1677 router
->mlag_stats
.peer_zebra_downs
);
1678 json_object_int_add(json_stat
, "mrouteAddRx",
1679 router
->mlag_stats
.msg
.mroute_add_rx
);
1680 json_object_int_add(json_stat
, "mrouteAddTx",
1681 router
->mlag_stats
.msg
.mroute_add_tx
);
1682 json_object_int_add(json_stat
, "mrouteDelRx",
1683 router
->mlag_stats
.msg
.mroute_del_rx
);
1684 json_object_int_add(json_stat
, "mrouteDelTx",
1685 router
->mlag_stats
.msg
.mroute_del_tx
);
1686 json_object_int_add(json_stat
, "mlagStatusUpdates",
1687 router
->mlag_stats
.msg
.mlag_status_updates
);
1688 json_object_int_add(json_stat
, "peerZebraStatusUpdates",
1689 router
->mlag_stats
.msg
.peer_zebra_status_updates
);
1690 json_object_int_add(json_stat
, "pimStatusUpdates",
1691 router
->mlag_stats
.msg
.pim_status_updates
);
1692 json_object_int_add(json_stat
, "vxlanUpdates",
1693 router
->mlag_stats
.msg
.vxlan_updates
);
1694 json_object_object_add(json
, "connStats", json_stat
);
1696 vty_json(vty
, json
);
1700 vty_out(vty
, "MLAG daemon connection: %s\n",
1701 (router
->mlag_flags
& PIM_MLAGF_LOCAL_CONN_UP
)
1703 vty_out(vty
, "MLAG peer state: %s\n",
1704 (router
->mlag_flags
& PIM_MLAGF_PEER_CONN_UP
)
1706 vty_out(vty
, "Zebra peer state: %s\n",
1707 (router
->mlag_flags
& PIM_MLAGF_PEER_ZEBRA_UP
)
1709 vty_out(vty
, "MLAG role: %s\n",
1710 mlag_role2str(router
->mlag_role
, role_buf
, sizeof(role_buf
)));
1711 inet_ntop(AF_INET
, &router
->local_vtep_ip
,
1712 addr_buf
, INET_ADDRSTRLEN
);
1713 vty_out(vty
, "Local VTEP IP: %s\n", addr_buf
);
1714 inet_ntop(AF_INET
, &router
->anycast_vtep_ip
,
1715 addr_buf
, INET_ADDRSTRLEN
);
1716 vty_out(vty
, "Anycast VTEP IP: %s\n", addr_buf
);
1717 vty_out(vty
, "Peerlink: %s\n", router
->peerlink_rif
);
1718 vty_out(vty
, "Session flaps: mlagd: %d mlag-peer: %d zebra-peer: %d\n",
1719 router
->mlag_stats
.mlagd_session_downs
,
1720 router
->mlag_stats
.peer_session_downs
,
1721 router
->mlag_stats
.peer_zebra_downs
);
1722 vty_out(vty
, "Message Statistics:\n");
1723 vty_out(vty
, " mroute adds: rx: %d, tx: %d\n",
1724 router
->mlag_stats
.msg
.mroute_add_rx
,
1725 router
->mlag_stats
.msg
.mroute_add_tx
);
1726 vty_out(vty
, " mroute dels: rx: %d, tx: %d\n",
1727 router
->mlag_stats
.msg
.mroute_del_rx
,
1728 router
->mlag_stats
.msg
.mroute_del_tx
);
1729 vty_out(vty
, " peer zebra status updates: %d\n",
1730 router
->mlag_stats
.msg
.peer_zebra_status_updates
);
1731 vty_out(vty
, " PIM status updates: %d\n",
1732 router
->mlag_stats
.msg
.pim_status_updates
);
1733 vty_out(vty
, " VxLAN updates: %d\n",
1734 router
->mlag_stats
.msg
.vxlan_updates
);
1739 DEFUN (show_ip_pim_assert
,
1740 show_ip_pim_assert_cmd
,
1741 "show ip pim [vrf NAME] assert",
1746 "PIM interface assert\n")
1749 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1754 pim_show_assert(vrf
->info
, vty
);
1759 DEFUN (show_ip_pim_assert_internal
,
1760 show_ip_pim_assert_internal_cmd
,
1761 "show ip pim [vrf NAME] assert-internal",
1766 "PIM interface internal assert state\n")
1769 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1774 pim_show_assert_internal(vrf
->info
, vty
);
1779 DEFUN (show_ip_pim_assert_metric
,
1780 show_ip_pim_assert_metric_cmd
,
1781 "show ip pim [vrf NAME] assert-metric",
1786 "PIM interface assert metric\n")
1789 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1794 pim_show_assert_metric(vrf
->info
, vty
);
1799 DEFUN (show_ip_pim_assert_winner_metric
,
1800 show_ip_pim_assert_winner_metric_cmd
,
1801 "show ip pim [vrf NAME] assert-winner-metric",
1806 "PIM interface assert winner metric\n")
1809 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
1814 pim_show_assert_winner_metric(vrf
->info
, vty
);
1819 DEFPY (show_ip_pim_interface
,
1820 show_ip_pim_interface_cmd
,
1821 "show ip pim [mlag$mlag] [vrf NAME] interface [detail|WORD]$interface [json$json]",
1827 "PIM interface information\n"
1832 return pim_show_interface_cmd_helper(vrf
, vty
, !!json
, !!mlag
,
1836 DEFPY (show_ip_pim_interface_vrf_all
,
1837 show_ip_pim_interface_vrf_all_cmd
,
1838 "show ip pim [mlag$mlag] vrf all interface [detail|WORD]$interface [json$json]",
1844 "PIM interface information\n"
1849 return pim_show_interface_vrf_all_cmd_helper(vty
, !!json
, !!mlag
,
1853 DEFPY (show_ip_pim_join
,
1854 show_ip_pim_join_cmd
,
1855 "show ip pim [vrf NAME] join [A.B.C.D$s_or_g [A.B.C.D$g]] [json$json]",
1860 "PIM interface join information\n"
1861 "The Source or Group\n"
1865 return pim_show_join_cmd_helper(vrf
, vty
, s_or_g
, g
, json
);
1868 DEFPY (show_ip_pim_join_vrf_all
,
1869 show_ip_pim_join_vrf_all_cmd
,
1870 "show ip pim vrf all join [json$json]",
1875 "PIM interface join information\n"
1878 return pim_show_join_vrf_all_cmd_helper(vty
, json
);
1881 DEFPY (show_ip_pim_jp_agg
,
1882 show_ip_pim_jp_agg_cmd
,
1883 "show ip pim [vrf NAME] jp-agg",
1888 "join prune aggregation list\n")
1890 return pim_show_jp_agg_list_cmd_helper(vrf
, vty
);
1893 DEFPY (show_ip_pim_local_membership
,
1894 show_ip_pim_local_membership_cmd
,
1895 "show ip pim [vrf NAME] local-membership [json$json]",
1900 "PIM interface local-membership\n"
1903 return pim_show_membership_cmd_helper(vrf
, vty
, !!json
);
1906 static void pim_show_mlag_up_entry_detail(struct vrf
*vrf
,
1908 struct pim_upstream
*up
,
1909 char *src_str
, char *grp_str
,
1913 json_object
*json_row
= NULL
;
1914 json_object
*own_list
= NULL
;
1915 json_object
*json_group
= NULL
;
1918 json_object_object_get_ex(json
, grp_str
, &json_group
);
1920 json_group
= json_object_new_object();
1921 json_object_object_add(json
, grp_str
,
1925 json_row
= json_object_new_object();
1926 json_object_string_add(json_row
, "source", src_str
);
1927 json_object_string_add(json_row
, "group", grp_str
);
1929 own_list
= json_object_new_array();
1930 if (pim_up_mlag_is_local(up
))
1931 json_object_array_add(own_list
,
1932 json_object_new_string("local"));
1933 if (up
->flags
& (PIM_UPSTREAM_FLAG_MASK_MLAG_PEER
))
1934 json_object_array_add(own_list
,
1935 json_object_new_string("peer"));
1936 if (up
->flags
& (PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE
))
1937 json_object_array_add(
1938 own_list
, json_object_new_string("Interface"));
1939 json_object_object_add(json_row
, "owners", own_list
);
1941 json_object_int_add(json_row
, "localCost",
1942 pim_up_mlag_local_cost(up
));
1943 json_object_int_add(json_row
, "peerCost",
1944 pim_up_mlag_peer_cost(up
));
1945 if (PIM_UPSTREAM_FLAG_TEST_MLAG_NON_DF(up
->flags
))
1946 json_object_boolean_false_add(json_row
, "df");
1948 json_object_boolean_true_add(json_row
, "df");
1949 json_object_object_add(json_group
, src_str
, json_row
);
1954 if (pim_up_mlag_is_local(up
))
1955 strlcat(own_str
, "L", sizeof(own_str
));
1956 if (up
->flags
& (PIM_UPSTREAM_FLAG_MASK_MLAG_PEER
))
1957 strlcat(own_str
, "P", sizeof(own_str
));
1958 if (up
->flags
& (PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE
))
1959 strlcat(own_str
, "I", sizeof(own_str
));
1960 /* XXX - fixup, print paragraph output */
1962 "%-15s %-15s %-6s %-11u %-10d %2s\n",
1963 src_str
, grp_str
, own_str
,
1964 pim_up_mlag_local_cost(up
),
1965 pim_up_mlag_peer_cost(up
),
1966 PIM_UPSTREAM_FLAG_TEST_MLAG_NON_DF(up
->flags
)
1971 static void pim_show_mlag_up_detail(struct vrf
*vrf
,
1972 struct vty
*vty
, const char *src_or_group
,
1973 const char *group
, bool uj
)
1975 char src_str
[PIM_ADDRSTRLEN
];
1976 char grp_str
[PIM_ADDRSTRLEN
];
1977 struct pim_upstream
*up
;
1978 struct pim_instance
*pim
= vrf
->info
;
1979 json_object
*json
= NULL
;
1982 json
= json_object_new_object();
1985 "Source Group Owner Local-cost Peer-cost DF\n");
1987 frr_each (rb_pim_upstream
, &pim
->upstream_head
, up
) {
1988 if (!(up
->flags
& PIM_UPSTREAM_FLAG_MASK_MLAG_PEER
)
1989 && !(up
->flags
& PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE
)
1990 && !pim_up_mlag_is_local(up
))
1993 snprintfrr(grp_str
, sizeof(grp_str
), "%pPAs", &up
->sg
.grp
);
1994 snprintfrr(src_str
, sizeof(src_str
), "%pPAs", &up
->sg
.src
);
1996 /* XXX: strcmps are clearly inefficient. we should do uint comps
2000 if (strcmp(src_str
, src_or_group
) ||
2001 strcmp(grp_str
, group
))
2004 if (strcmp(src_str
, src_or_group
) &&
2005 strcmp(grp_str
, src_or_group
))
2008 pim_show_mlag_up_entry_detail(vrf
, vty
, up
,
2009 src_str
, grp_str
, json
);
2013 vty_json(vty
, json
);
2016 static void pim_show_mlag_up_vrf(struct vrf
*vrf
, struct vty
*vty
, bool uj
)
2018 json_object
*json
= NULL
;
2019 json_object
*json_row
;
2020 struct pim_upstream
*up
;
2021 struct pim_instance
*pim
= vrf
->info
;
2022 json_object
*json_group
= NULL
;
2025 json
= json_object_new_object();
2028 "Source Group Owner Local-cost Peer-cost DF\n");
2031 frr_each (rb_pim_upstream
, &pim
->upstream_head
, up
) {
2032 if (!(up
->flags
& PIM_UPSTREAM_FLAG_MASK_MLAG_PEER
)
2033 && !(up
->flags
& PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE
)
2034 && !pim_up_mlag_is_local(up
))
2037 char src_str
[PIM_ADDRSTRLEN
];
2038 char grp_str
[PIM_ADDRSTRLEN
];
2039 json_object
*own_list
= NULL
;
2041 snprintfrr(grp_str
, sizeof(grp_str
), "%pPAs",
2043 snprintfrr(src_str
, sizeof(src_str
), "%pPAs",
2046 json_object_object_get_ex(json
, grp_str
, &json_group
);
2048 json_group
= json_object_new_object();
2049 json_object_object_add(json
, grp_str
,
2053 json_row
= json_object_new_object();
2054 json_object_string_add(json_row
, "vrf", vrf
->name
);
2055 json_object_string_add(json_row
, "source", src_str
);
2056 json_object_string_add(json_row
, "group", grp_str
);
2058 own_list
= json_object_new_array();
2059 if (pim_up_mlag_is_local(up
)) {
2061 json_object_array_add(own_list
,
2062 json_object_new_string(
2065 if (up
->flags
& (PIM_UPSTREAM_FLAG_MASK_MLAG_PEER
)) {
2066 json_object_array_add(own_list
,
2067 json_object_new_string(
2070 json_object_object_add(json_row
, "owners", own_list
);
2072 json_object_int_add(json_row
, "localCost",
2073 pim_up_mlag_local_cost(up
));
2074 json_object_int_add(json_row
, "peerCost",
2075 pim_up_mlag_peer_cost(up
));
2076 if (PIM_UPSTREAM_FLAG_TEST_MLAG_NON_DF(up
->flags
))
2077 json_object_boolean_false_add(json_row
, "df");
2079 json_object_boolean_true_add(json_row
, "df");
2080 json_object_object_add(json_group
, src_str
, json_row
);
2085 if (pim_up_mlag_is_local(up
))
2086 strlcat(own_str
, "L", sizeof(own_str
));
2087 if (up
->flags
& (PIM_UPSTREAM_FLAG_MASK_MLAG_PEER
))
2088 strlcat(own_str
, "P", sizeof(own_str
));
2089 if (up
->flags
& (PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE
))
2090 strlcat(own_str
, "I", sizeof(own_str
));
2092 "%-15pPAs %-15pPAs %-6s %-11u %-10u %2s\n",
2093 &up
->sg
.src
, &up
->sg
.grp
, own_str
,
2094 pim_up_mlag_local_cost(up
),
2095 pim_up_mlag_peer_cost(up
),
2096 PIM_UPSTREAM_FLAG_TEST_MLAG_NON_DF(up
->flags
)
2101 vty_json(vty
, json
);
2104 static void pim_show_mlag_help_string(struct vty
*vty
, bool uj
)
2107 vty_out(vty
, "Owner codes:\n");
2109 "L: EVPN-MLAG Entry, I:PIM-MLAG Entry, P: Peer Entry\n");
2114 DEFUN(show_ip_pim_mlag_up
, show_ip_pim_mlag_up_cmd
,
2115 "show ip pim [vrf NAME] mlag upstream [A.B.C.D [A.B.C.D]] [json]",
2122 "Unicast or Multicast address\n"
2123 "Multicast address\n" JSON_STR
)
2125 const char *src_or_group
= NULL
;
2126 const char *group
= NULL
;
2128 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
2129 bool uj
= use_json(argc
, argv
);
2131 if (!vrf
|| !vrf
->info
) {
2132 vty_out(vty
, "%s: VRF or Info missing\n", __func__
);
2139 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
2140 src_or_group
= argv
[idx
]->arg
;
2142 group
= argv
[idx
+ 1]->arg
;
2145 pim_show_mlag_help_string(vty
, uj
);
2148 pim_show_mlag_up_detail(vrf
, vty
, src_or_group
, group
, uj
);
2150 pim_show_mlag_up_vrf(vrf
, vty
, uj
);
2156 DEFUN(show_ip_pim_mlag_up_vrf_all
, show_ip_pim_mlag_up_vrf_all_cmd
,
2157 "show ip pim vrf all mlag upstream [json]",
2158 SHOW_STR IP_STR PIM_STR VRF_CMD_HELP_STR
2160 "upstream\n" JSON_STR
)
2163 bool uj
= use_json(argc
, argv
);
2165 pim_show_mlag_help_string(vty
, uj
);
2166 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
2167 pim_show_mlag_up_vrf(vrf
, vty
, uj
);
2173 DEFPY (show_ip_pim_neighbor
,
2174 show_ip_pim_neighbor_cmd
,
2175 "show ip pim [vrf NAME] neighbor [detail|WORD]$interface [json$json]",
2180 "PIM neighbor information\n"
2182 "Name of interface or neighbor\n"
2185 return pim_show_neighbors_cmd_helper(vrf
, vty
, json
, interface
);
2188 DEFPY (show_ip_pim_neighbor_vrf_all
,
2189 show_ip_pim_neighbor_vrf_all_cmd
,
2190 "show ip pim vrf all neighbor [detail|WORD]$interface [json$json]",
2195 "PIM neighbor information\n"
2197 "Name of interface or neighbor\n"
2200 return pim_show_neighbors_vrf_all_cmd_helper(vty
, json
, interface
);
2203 DEFPY (show_ip_pim_secondary
,
2204 show_ip_pim_secondary_cmd
,
2205 "show ip pim [vrf NAME] secondary",
2210 "PIM neighbor addresses\n")
2212 return pim_show_secondary_helper(vrf
, vty
);
2215 DEFPY (show_ip_pim_state
,
2216 show_ip_pim_state_cmd
,
2217 "show ip pim [vrf NAME] state [A.B.C.D$s_or_g [A.B.C.D$g]] [json$json]",
2222 "PIM state information\n"
2223 "Unicast or Multicast address\n"
2224 "Multicast address\n"
2227 return pim_show_state_helper(vrf
, vty
, s_or_g_str
, g_str
, !!json
);
2230 DEFPY (show_ip_pim_state_vrf_all
,
2231 show_ip_pim_state_vrf_all_cmd
,
2232 "show ip pim vrf all state [A.B.C.D$s_or_g [A.B.C.D$g]] [json$json]",
2237 "PIM state information\n"
2238 "Unicast or Multicast address\n"
2239 "Multicast address\n"
2242 return pim_show_state_vrf_all_helper(vty
, s_or_g_str
, g_str
, !!json
);
2245 DEFPY (show_ip_pim_upstream
,
2246 show_ip_pim_upstream_cmd
,
2247 "show ip pim [vrf NAME] upstream [A.B.C.D$s_or_g [A.B.C.D$g]] [json$json]",
2252 "PIM upstream information\n"
2253 "The Source or Group\n"
2257 return pim_show_upstream_helper(vrf
, vty
, s_or_g
, g
, !!json
);
2260 DEFPY (show_ip_pim_upstream_vrf_all
,
2261 show_ip_pim_upstream_vrf_all_cmd
,
2262 "show ip pim vrf all upstream [json$json]",
2267 "PIM upstream information\n"
2270 return pim_show_upstream_vrf_all_helper(vty
, !!json
);
2273 DEFPY (show_ip_pim_channel
,
2274 show_ip_pim_channel_cmd
,
2275 "show ip pim [vrf NAME] channel [json$json]",
2280 "PIM downstream channel info\n"
2283 return pim_show_channel_cmd_helper(vrf
, vty
, !!json
);
2286 DEFPY (show_ip_pim_upstream_join_desired
,
2287 show_ip_pim_upstream_join_desired_cmd
,
2288 "show ip pim [vrf NAME] upstream-join-desired [json$json]",
2293 "PIM upstream join-desired\n"
2296 return pim_show_upstream_join_desired_helper(vrf
, vty
, !!json
);
2299 DEFPY (show_ip_pim_upstream_rpf
,
2300 show_ip_pim_upstream_rpf_cmd
,
2301 "show ip pim [vrf NAME] upstream-rpf [json$json]",
2306 "PIM upstream source rpf\n"
2309 return pim_show_upstream_rpf_helper(vrf
, vty
, !!json
);
2312 DEFPY (show_ip_pim_rp
,
2314 "show ip pim [vrf NAME] rp-info [A.B.C.D/M$group] [json$json]",
2319 "PIM RP information\n"
2320 "Multicast Group range\n"
2323 return pim_show_rp_helper(vrf
, vty
, group_str
, (struct prefix
*)group
,
2327 DEFPY (show_ip_pim_rp_vrf_all
,
2328 show_ip_pim_rp_vrf_all_cmd
,
2329 "show ip pim vrf all rp-info [A.B.C.D/M$group] [json$json]",
2334 "PIM RP information\n"
2335 "Multicast Group range\n"
2338 return pim_show_rp_vrf_all_helper(vty
, group_str
,
2339 (struct prefix
*)group
, !!json
);
2342 DEFPY (show_ip_pim_rpf
,
2343 show_ip_pim_rpf_cmd
,
2344 "show ip pim [vrf NAME] rpf [json$json]",
2349 "PIM cached source rpf information\n"
2352 return pim_show_rpf_helper(vrf
, vty
, !!json
);
2355 DEFPY (show_ip_pim_rpf_vrf_all
,
2356 show_ip_pim_rpf_vrf_all_cmd
,
2357 "show ip pim vrf all rpf [json$json]",
2362 "PIM cached source rpf information\n"
2365 return pim_show_rpf_vrf_all_helper(vty
, !!json
);
2368 DEFPY (show_ip_pim_nexthop
,
2369 show_ip_pim_nexthop_cmd
,
2370 "show ip pim [vrf NAME] nexthop [json$json]",
2375 "PIM cached nexthop rpf information\n"
2378 return pim_show_nexthop_cmd_helper(vrf
, vty
, !!json
);
2381 DEFPY (show_ip_pim_nexthop_lookup
,
2382 show_ip_pim_nexthop_lookup_cmd
,
2383 "show ip pim [vrf NAME] nexthop-lookup A.B.C.D$source A.B.C.D$group",
2388 "PIM cached nexthop rpf lookup\n"
2389 "Source/RP address\n"
2390 "Multicast Group address\n")
2392 return pim_show_nexthop_lookup_cmd_helper(vrf
, vty
, source
, group
);
2395 DEFPY (show_ip_pim_interface_traffic
,
2396 show_ip_pim_interface_traffic_cmd
,
2397 "show ip pim [vrf NAME] interface traffic [WORD$if_name] [json$json]",
2402 "PIM interface information\n"
2403 "Protocol Packet counters\n"
2407 return pim_show_interface_traffic_helper(vrf
, if_name
, vty
, !!json
);
2410 DEFPY (show_ip_pim_bsm_db
,
2411 show_ip_pim_bsm_db_cmd
,
2412 "show ip pim bsm-database [vrf NAME] [json$json]",
2416 "PIM cached bsm packets information\n"
2420 return pim_show_bsm_db_helper(vrf
, vty
, !!json
);
2423 DEFPY (show_ip_pim_bsrp
,
2424 show_ip_pim_bsrp_cmd
,
2425 "show ip pim bsrp-info [vrf NAME] [json$json]",
2429 "PIM cached group-rp mappings information\n"
2433 return pim_show_group_rp_mappings_info_helper(vrf
, vty
, !!json
);
2436 DEFPY (show_ip_pim_statistics
,
2437 show_ip_pim_statistics_cmd
,
2438 "show ip pim [vrf NAME] statistics [interface WORD$word] [json$json]",
2448 return pim_show_statistics_helper(vrf
, vty
, word
, !!json
);
2451 DEFPY (show_ip_multicast
,
2452 show_ip_multicast_cmd
,
2453 "show ip multicast [vrf NAME]",
2456 "Multicast global information\n"
2459 return pim_show_multicast_helper(vrf
, vty
);
2462 DEFPY (show_ip_multicast_vrf_all
,
2463 show_ip_multicast_vrf_all_cmd
,
2464 "show ip multicast vrf all",
2467 "Multicast global information\n"
2470 return pim_show_multicast_vrf_all_helper(vty
);
2473 DEFPY (show_ip_multicast_count
,
2474 show_ip_multicast_count_cmd
,
2475 "show ip multicast count [vrf NAME] [json$json]",
2478 "Multicast global information\n"
2479 "Data packet count\n"
2483 return pim_show_multicast_count_helper(vrf
, vty
, !!json
);
2486 DEFPY (show_ip_multicast_count_vrf_all
,
2487 show_ip_multicast_count_vrf_all_cmd
,
2488 "show ip multicast count vrf all [json$json]",
2491 "Multicast global information\n"
2492 "Data packet count\n"
2496 return pim_show_multicast_count_vrf_all_helper(vty
, !!json
);
2499 DEFPY (show_ip_mroute
,
2501 "show ip mroute [vrf NAME] [A.B.C.D$s_or_g [A.B.C.D$g]] [fill$fill] [json$json]",
2506 "The Source or Group\n"
2508 "Fill in Assumed data\n"
2511 return pim_show_mroute_helper(vrf
, vty
, s_or_g
, g
, !!fill
, !!json
);
2514 DEFPY (show_ip_mroute_vrf_all
,
2515 show_ip_mroute_vrf_all_cmd
,
2516 "show ip mroute vrf all [fill$fill] [json$json]",
2521 "Fill in Assumed data\n"
2524 return pim_show_mroute_vrf_all_helper(vty
, !!fill
, !!json
);
2527 DEFPY (clear_ip_mroute_count
,
2528 clear_ip_mroute_count_cmd
,
2529 "clear ip mroute [vrf NAME]$name count",
2534 "Route and packet count data\n")
2536 return clear_ip_mroute_count_command(vty
, name
);
2539 DEFPY (show_ip_mroute_count
,
2540 show_ip_mroute_count_cmd
,
2541 "show ip mroute [vrf NAME] count [json$json]",
2546 "Route and packet count data\n"
2549 return pim_show_mroute_count_helper(vrf
, vty
, !!json
);
2552 DEFPY (show_ip_mroute_count_vrf_all
,
2553 show_ip_mroute_count_vrf_all_cmd
,
2554 "show ip mroute vrf all count [json$json]",
2559 "Route and packet count data\n"
2562 return pim_show_mroute_count_vrf_all_helper(vty
, !!json
);
2565 DEFPY (show_ip_mroute_summary
,
2566 show_ip_mroute_summary_cmd
,
2567 "show ip mroute [vrf NAME] summary [json$json]",
2572 "Summary of all mroutes\n"
2575 return pim_show_mroute_summary_helper(vrf
, vty
, !!json
);
2578 DEFPY (show_ip_mroute_summary_vrf_all
,
2579 show_ip_mroute_summary_vrf_all_cmd
,
2580 "show ip mroute vrf all summary [json$json]",
2585 "Summary of all mroutes\n"
2588 return pim_show_mroute_summary_vrf_all_helper(vty
, !!json
);
2593 "show ip rib [vrf NAME] A.B.C.D",
2598 "Unicast address\n")
2601 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
2602 struct in_addr addr
;
2603 const char *addr_str
;
2604 struct pim_nexthop nexthop
;
2610 memset(&nexthop
, 0, sizeof(nexthop
));
2611 argv_find(argv
, argc
, "A.B.C.D", &idx
);
2612 addr_str
= argv
[idx
]->arg
;
2613 result
= inet_pton(AF_INET
, addr_str
, &addr
);
2615 vty_out(vty
, "Bad unicast address %s: errno=%d: %s\n", addr_str
,
2616 errno
, safe_strerror(errno
));
2620 if (!pim_nexthop_lookup(vrf
->info
, &nexthop
, addr
, 0)) {
2622 "Failure querying RIB nexthop for unicast address %s\n",
2628 "Address NextHop Interface Metric Preference\n");
2630 vty_out(vty
, "%-15s %-15pPAs %-9s %6d %10d\n", addr_str
,
2631 &nexthop
.mrib_nexthop_addr
,
2632 nexthop
.interface
? nexthop
.interface
->name
: "<ifname?>",
2633 nexthop
.mrib_route_metric
, nexthop
.mrib_metric_preference
);
2638 static void show_ssmpingd(struct pim_instance
*pim
, struct vty
*vty
)
2640 struct listnode
*node
;
2641 struct ssmpingd_sock
*ss
;
2645 "Source Socket Address Port Uptime Requests\n");
2647 if (!pim
->ssmpingd_list
)
2650 now
= pim_time_monotonic_sec();
2652 for (ALL_LIST_ELEMENTS_RO(pim
->ssmpingd_list
, node
, ss
)) {
2653 char source_str
[INET_ADDRSTRLEN
];
2655 struct sockaddr_in bind_addr
;
2656 socklen_t len
= sizeof(bind_addr
);
2657 char bind_addr_str
[INET_ADDRSTRLEN
];
2659 pim_inet4_dump("<src?>", ss
->source_addr
, source_str
,
2660 sizeof(source_str
));
2662 if (pim_socket_getsockname(
2663 ss
->sock_fd
, (struct sockaddr
*)&bind_addr
, &len
)) {
2665 "%% Failure reading socket name for ssmpingd source %s on fd=%d\n",
2666 source_str
, ss
->sock_fd
);
2669 pim_inet4_dump("<addr?>", bind_addr
.sin_addr
, bind_addr_str
,
2670 sizeof(bind_addr_str
));
2671 pim_time_uptime(ss_uptime
, sizeof(ss_uptime
),
2672 now
- ss
->creation
);
2674 vty_out(vty
, "%-15s %6d %-15s %5d %8s %8lld\n", source_str
,
2675 ss
->sock_fd
, bind_addr_str
, ntohs(bind_addr
.sin_port
),
2676 ss_uptime
, (long long)ss
->requests
);
2680 DEFUN (show_ip_ssmpingd
,
2681 show_ip_ssmpingd_cmd
,
2682 "show ip ssmpingd [vrf NAME]",
2689 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
2694 show_ssmpingd(vrf
->info
, vty
);
2698 DEFUN (ip_pim_spt_switchover_infinity
,
2699 ip_pim_spt_switchover_infinity_cmd
,
2700 "ip pim spt-switchover infinity-and-beyond",
2704 "Never switch to SPT Tree\n")
2706 return pim_process_spt_switchover_infinity_cmd(vty
);
2709 DEFPY (ip_pim_spt_switchover_infinity_plist
,
2710 ip_pim_spt_switchover_infinity_plist_cmd
,
2711 "ip pim spt-switchover infinity-and-beyond prefix-list WORD$plist",
2715 "Never switch to SPT Tree\n"
2716 "Prefix-List to control which groups to switch\n"
2717 "Prefix-List name\n")
2719 return pim_process_spt_switchover_prefixlist_cmd(vty
, plist
);
2722 DEFUN (no_ip_pim_spt_switchover_infinity
,
2723 no_ip_pim_spt_switchover_infinity_cmd
,
2724 "no ip pim spt-switchover infinity-and-beyond",
2729 "Never switch to SPT Tree\n")
2731 return pim_process_no_spt_switchover_cmd(vty
);
2734 DEFUN (no_ip_pim_spt_switchover_infinity_plist
,
2735 no_ip_pim_spt_switchover_infinity_plist_cmd
,
2736 "no ip pim spt-switchover infinity-and-beyond prefix-list WORD",
2741 "Never switch to SPT Tree\n"
2742 "Prefix-List to control which groups to switch\n"
2743 "Prefix-List name\n")
2745 return pim_process_no_spt_switchover_cmd(vty
);
2748 DEFPY (pim_register_accept_list
,
2749 pim_register_accept_list_cmd
,
2750 "[no] ip pim register-accept-list WORD$word",
2754 "Only accept registers from a specific source prefix list\n"
2755 "Prefix-List name\n")
2757 const char *vrfname
;
2758 char reg_alist_xpath
[XPATH_MAXLEN
];
2760 vrfname
= pim_cli_get_vrf_name(vty
);
2761 if (vrfname
== NULL
)
2762 return CMD_WARNING_CONFIG_FAILED
;
2764 snprintf(reg_alist_xpath
, sizeof(reg_alist_xpath
),
2765 FRR_PIM_VRF_XPATH
, "frr-pim:pimd", "pim", vrfname
,
2766 "frr-routing:ipv4");
2767 strlcat(reg_alist_xpath
, "/register-accept-list",
2768 sizeof(reg_alist_xpath
));
2771 nb_cli_enqueue_change(vty
, reg_alist_xpath
,
2772 NB_OP_DESTROY
, NULL
);
2774 nb_cli_enqueue_change(vty
, reg_alist_xpath
,
2775 NB_OP_MODIFY
, word
);
2777 return nb_cli_apply_changes(vty
, NULL
);
2780 DEFPY (ip_pim_joinprune_time
,
2781 ip_pim_joinprune_time_cmd
,
2782 "ip pim join-prune-interval (1-65535)$jpi",
2784 "pim multicast routing\n"
2785 "Join Prune Send Interval\n"
2788 return pim_process_join_prune_cmd(vty
, jpi_str
);
2791 DEFUN (no_ip_pim_joinprune_time
,
2792 no_ip_pim_joinprune_time_cmd
,
2793 "no ip pim join-prune-interval [(1-65535)]",
2796 "pim multicast routing\n"
2797 "Join Prune Send Interval\n"
2800 return pim_process_no_join_prune_cmd(vty
);
2803 DEFPY (ip_pim_register_suppress
,
2804 ip_pim_register_suppress_cmd
,
2805 "ip pim register-suppress-time (1-65535)$rst",
2807 "pim multicast routing\n"
2808 "Register Suppress Timer\n"
2811 return pim_process_register_suppress_cmd(vty
, rst_str
);
2814 DEFUN (no_ip_pim_register_suppress
,
2815 no_ip_pim_register_suppress_cmd
,
2816 "no ip pim register-suppress-time [(1-65535)]",
2819 "pim multicast routing\n"
2820 "Register Suppress Timer\n"
2823 return pim_process_no_register_suppress_cmd(vty
);
2826 DEFPY (ip_pim_rp_keep_alive
,
2827 ip_pim_rp_keep_alive_cmd
,
2828 "ip pim rp keep-alive-timer (1-65535)$kat",
2830 "pim multicast routing\n"
2831 "Rendezvous Point\n"
2832 "Keep alive Timer\n"
2835 return pim_process_rp_kat_cmd(vty
, kat_str
);
2838 DEFUN (no_ip_pim_rp_keep_alive
,
2839 no_ip_pim_rp_keep_alive_cmd
,
2840 "no ip pim rp keep-alive-timer [(1-65535)]",
2843 "pim multicast routing\n"
2844 "Rendezvous Point\n"
2845 "Keep alive Timer\n"
2848 return pim_process_no_rp_kat_cmd(vty
);
2851 DEFPY (ip_pim_keep_alive
,
2852 ip_pim_keep_alive_cmd
,
2853 "ip pim keep-alive-timer (1-65535)$kat",
2855 "pim multicast routing\n"
2856 "Keep alive Timer\n"
2859 return pim_process_keepalivetimer_cmd(vty
, kat_str
);
2862 DEFUN (no_ip_pim_keep_alive
,
2863 no_ip_pim_keep_alive_cmd
,
2864 "no ip pim keep-alive-timer [(1-65535)]",
2867 "pim multicast routing\n"
2868 "Keep alive Timer\n"
2871 return pim_process_no_keepalivetimer_cmd(vty
);
2874 DEFPY (ip_pim_packets
,
2876 "ip pim packets (1-255)",
2878 "pim multicast routing\n"
2879 "packets to process at one time per fd\n"
2880 "Number of packets\n")
2882 return pim_process_pim_packet_cmd(vty
, packets_str
);
2885 DEFUN (no_ip_pim_packets
,
2886 no_ip_pim_packets_cmd
,
2887 "no ip pim packets [(1-255)]",
2890 "pim multicast routing\n"
2891 "packets to process at one time per fd\n"
2894 return pim_process_no_pim_packet_cmd(vty
);
2897 DEFPY (ip_igmp_group_watermark
,
2898 ip_igmp_group_watermark_cmd
,
2899 "ip igmp watermark-warn (1-65535)$limit",
2902 "Configure group limit for watermark warning\n"
2903 "Group count to generate watermark warning\n")
2905 PIM_DECLVAR_CONTEXT_VRF(vrf
, pim
);
2906 pim
->gm_watermark_limit
= limit
;
2911 DEFPY (no_ip_igmp_group_watermark
,
2912 no_ip_igmp_group_watermark_cmd
,
2913 "no ip igmp watermark-warn [(1-65535)$limit]",
2917 "Unconfigure group limit for watermark warning\n"
2920 PIM_DECLVAR_CONTEXT_VRF(vrf
, pim
);
2921 pim
->gm_watermark_limit
= 0;
2926 DEFUN (ip_pim_v6_secondary
,
2927 ip_pim_v6_secondary_cmd
,
2928 "ip pim send-v6-secondary",
2930 "pim multicast routing\n"
2931 "Send v6 secondary addresses\n")
2933 const char *vrfname
;
2934 char send_v6_secondary_xpath
[XPATH_MAXLEN
];
2936 vrfname
= pim_cli_get_vrf_name(vty
);
2937 if (vrfname
== NULL
)
2938 return CMD_WARNING_CONFIG_FAILED
;
2940 snprintf(send_v6_secondary_xpath
, sizeof(send_v6_secondary_xpath
),
2942 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
2943 strlcat(send_v6_secondary_xpath
, "/send-v6-secondary",
2944 sizeof(send_v6_secondary_xpath
));
2946 nb_cli_enqueue_change(vty
, send_v6_secondary_xpath
, NB_OP_MODIFY
,
2949 return nb_cli_apply_changes(vty
, NULL
);
2952 DEFUN (no_ip_pim_v6_secondary
,
2953 no_ip_pim_v6_secondary_cmd
,
2954 "no ip pim send-v6-secondary",
2957 "pim multicast routing\n"
2958 "Send v6 secondary addresses\n")
2960 const char *vrfname
;
2961 char send_v6_secondary_xpath
[XPATH_MAXLEN
];
2963 vrfname
= pim_cli_get_vrf_name(vty
);
2964 if (vrfname
== NULL
)
2965 return CMD_WARNING_CONFIG_FAILED
;
2967 snprintf(send_v6_secondary_xpath
, sizeof(send_v6_secondary_xpath
),
2969 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
2970 strlcat(send_v6_secondary_xpath
, "/send-v6-secondary",
2971 sizeof(send_v6_secondary_xpath
));
2973 nb_cli_enqueue_change(vty
, send_v6_secondary_xpath
, NB_OP_MODIFY
,
2976 return nb_cli_apply_changes(vty
, NULL
);
2981 "ip pim rp A.B.C.D$rp [A.B.C.D/M]$gp",
2983 "pim multicast routing\n"
2984 "Rendezvous Point\n"
2985 "ip address of RP\n"
2986 "Group Address range to cover\n")
2988 const char *group_str
= (gp_str
) ? gp_str
: "224.0.0.0/4";
2990 return pim_process_rp_cmd(vty
, rp_str
, group_str
);
2993 DEFPY (ip_pim_rp_prefix_list
,
2994 ip_pim_rp_prefix_list_cmd
,
2995 "ip pim rp A.B.C.D$rp prefix-list WORD$plist",
2997 "pim multicast routing\n"
2998 "Rendezvous Point\n"
2999 "ip address of RP\n"
3000 "group prefix-list filter\n"
3001 "Name of a prefix-list\n")
3003 return pim_process_rp_plist_cmd(vty
, rp_str
, plist
);
3006 DEFPY (no_ip_pim_rp
,
3008 "no ip pim rp A.B.C.D$rp [A.B.C.D/M]$gp",
3011 "pim multicast routing\n"
3012 "Rendezvous Point\n"
3013 "ip address of RP\n"
3014 "Group Address range to cover\n")
3016 const char *group_str
= (gp_str
) ? gp_str
: "224.0.0.0/4";
3018 return pim_process_no_rp_cmd(vty
, rp_str
, group_str
);
3021 DEFPY (no_ip_pim_rp_prefix_list
,
3022 no_ip_pim_rp_prefix_list_cmd
,
3023 "no ip pim rp A.B.C.D$rp prefix-list WORD$plist",
3026 "pim multicast routing\n"
3027 "Rendezvous Point\n"
3028 "ip address of RP\n"
3029 "group prefix-list filter\n"
3030 "Name of a prefix-list\n")
3032 return pim_process_no_rp_plist_cmd(vty
, rp_str
, plist
);
3035 DEFUN (ip_pim_ssm_prefix_list
,
3036 ip_pim_ssm_prefix_list_cmd
,
3037 "ip pim ssm prefix-list WORD",
3039 "pim multicast routing\n"
3040 "Source Specific Multicast\n"
3041 "group range prefix-list filter\n"
3042 "Name of a prefix-list\n")
3044 const char *vrfname
;
3045 char ssm_plist_xpath
[XPATH_MAXLEN
];
3047 vrfname
= pim_cli_get_vrf_name(vty
);
3048 if (vrfname
== NULL
)
3049 return CMD_WARNING_CONFIG_FAILED
;
3051 snprintf(ssm_plist_xpath
, sizeof(ssm_plist_xpath
), FRR_PIM_VRF_XPATH
,
3052 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
3053 strlcat(ssm_plist_xpath
, "/ssm-prefix-list", sizeof(ssm_plist_xpath
));
3055 nb_cli_enqueue_change(vty
, ssm_plist_xpath
, NB_OP_MODIFY
, argv
[4]->arg
);
3057 return nb_cli_apply_changes(vty
, NULL
);
3060 DEFUN (no_ip_pim_ssm_prefix_list
,
3061 no_ip_pim_ssm_prefix_list_cmd
,
3062 "no ip pim ssm prefix-list",
3065 "pim multicast routing\n"
3066 "Source Specific Multicast\n"
3067 "group range prefix-list filter\n")
3069 const char *vrfname
;
3070 char ssm_plist_xpath
[XPATH_MAXLEN
];
3072 vrfname
= pim_cli_get_vrf_name(vty
);
3073 if (vrfname
== NULL
)
3074 return CMD_WARNING_CONFIG_FAILED
;
3076 snprintf(ssm_plist_xpath
, sizeof(ssm_plist_xpath
),
3078 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
3079 strlcat(ssm_plist_xpath
, "/ssm-prefix-list", sizeof(ssm_plist_xpath
));
3081 nb_cli_enqueue_change(vty
, ssm_plist_xpath
, NB_OP_DESTROY
, NULL
);
3083 return nb_cli_apply_changes(vty
, NULL
);
3086 DEFUN (no_ip_pim_ssm_prefix_list_name
,
3087 no_ip_pim_ssm_prefix_list_name_cmd
,
3088 "no ip pim ssm prefix-list WORD",
3091 "pim multicast routing\n"
3092 "Source Specific Multicast\n"
3093 "group range prefix-list filter\n"
3094 "Name of a prefix-list\n")
3096 const char *vrfname
;
3097 const struct lyd_node
*ssm_plist_dnode
;
3098 char ssm_plist_xpath
[XPATH_MAXLEN
];
3099 const char *ssm_plist_name
;
3101 vrfname
= pim_cli_get_vrf_name(vty
);
3102 if (vrfname
== NULL
)
3103 return CMD_WARNING_CONFIG_FAILED
;
3105 snprintf(ssm_plist_xpath
, sizeof(ssm_plist_xpath
),
3107 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
3108 strlcat(ssm_plist_xpath
, "/ssm-prefix-list", sizeof(ssm_plist_xpath
));
3109 ssm_plist_dnode
= yang_dnode_get(vty
->candidate_config
->dnode
,
3112 if (!ssm_plist_dnode
) {
3114 "%% pim ssm prefix-list %s doesn't exist\n",
3116 return CMD_WARNING_CONFIG_FAILED
;
3119 ssm_plist_name
= yang_dnode_get_string(ssm_plist_dnode
, ".");
3121 if (ssm_plist_name
&& !strcmp(ssm_plist_name
, argv
[5]->arg
)) {
3122 nb_cli_enqueue_change(vty
, ssm_plist_xpath
, NB_OP_DESTROY
,
3125 return nb_cli_apply_changes(vty
, NULL
);
3128 vty_out(vty
, "%% pim ssm prefix-list %s doesn't exist\n", argv
[5]->arg
);
3130 return CMD_WARNING_CONFIG_FAILED
;
3133 DEFUN (show_ip_pim_ssm_range
,
3134 show_ip_pim_ssm_range_cmd
,
3135 "show ip pim [vrf NAME] group-type [json]",
3144 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
3145 bool uj
= use_json(argc
, argv
);
3150 ip_pim_ssm_show_group_range(vrf
->info
, vty
, uj
);
3155 static void ip_pim_ssm_show_group_type(struct pim_instance
*pim
,
3156 struct vty
*vty
, bool uj
,
3159 struct in_addr group_addr
;
3160 const char *type_str
;
3163 result
= inet_pton(AF_INET
, group
, &group_addr
);
3165 type_str
= "invalid";
3167 if (pim_is_group_224_4(group_addr
))
3169 pim_is_grp_ssm(pim
, group_addr
) ? "SSM" : "ASM";
3171 type_str
= "not-multicast";
3176 json
= json_object_new_object();
3177 json_object_string_add(json
, "groupType", type_str
);
3178 vty_json(vty
, json
);
3180 vty_out(vty
, "Group type : %s\n", type_str
);
3183 DEFUN (show_ip_pim_group_type
,
3184 show_ip_pim_group_type_cmd
,
3185 "show ip pim [vrf NAME] group-type A.B.C.D [json]",
3190 "multicast group type\n"
3195 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
3196 bool uj
= use_json(argc
, argv
);
3201 argv_find(argv
, argc
, "A.B.C.D", &idx
);
3202 ip_pim_ssm_show_group_type(vrf
->info
, vty
, uj
, argv
[idx
]->arg
);
3207 DEFPY (show_ip_pim_bsr
,
3208 show_ip_pim_bsr_cmd
,
3209 "show ip pim bsr [vrf NAME] [json$json]",
3213 "boot-strap router information\n"
3217 return pim_show_bsr_helper(vrf
, vty
, !!json
);
3222 "ip ssmpingd [A.B.C.D]",
3228 const char *src_str
= (argc
== 3) ? argv
[idx_ipv4
]->arg
: "0.0.0.0";
3230 return pim_process_ssmpingd_cmd(vty
, NB_OP_CREATE
, src_str
);
3233 DEFUN (no_ip_ssmpingd
,
3235 "no ip ssmpingd [A.B.C.D]",
3242 const char *src_str
= (argc
== 4) ? argv
[idx_ipv4
]->arg
: "0.0.0.0";
3244 return pim_process_ssmpingd_cmd(vty
, NB_OP_DESTROY
, src_str
);
3251 "pim multicast routing\n"
3252 "Enable PIM ECMP \n")
3254 const char *vrfname
;
3255 char ecmp_xpath
[XPATH_MAXLEN
];
3257 vrfname
= pim_cli_get_vrf_name(vty
);
3258 if (vrfname
== NULL
)
3259 return CMD_WARNING_CONFIG_FAILED
;
3261 snprintf(ecmp_xpath
, sizeof(ecmp_xpath
), FRR_PIM_VRF_XPATH
,
3262 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
3263 strlcat(ecmp_xpath
, "/ecmp", sizeof(ecmp_xpath
));
3265 nb_cli_enqueue_change(vty
, ecmp_xpath
, NB_OP_MODIFY
, "true");
3266 return nb_cli_apply_changes(vty
, NULL
);
3269 DEFUN (no_ip_pim_ecmp
,
3274 "pim multicast routing\n"
3275 "Disable PIM ECMP \n")
3277 const char *vrfname
;
3278 char ecmp_xpath
[XPATH_MAXLEN
];
3280 vrfname
= pim_cli_get_vrf_name(vty
);
3281 if (vrfname
== NULL
)
3282 return CMD_WARNING_CONFIG_FAILED
;
3284 snprintf(ecmp_xpath
, sizeof(ecmp_xpath
), FRR_PIM_VRF_XPATH
,
3285 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
3286 strlcat(ecmp_xpath
, "/ecmp", sizeof(ecmp_xpath
));
3288 nb_cli_enqueue_change(vty
, ecmp_xpath
, NB_OP_MODIFY
, "false");
3290 return nb_cli_apply_changes(vty
, NULL
);
3293 DEFUN (ip_pim_ecmp_rebalance
,
3294 ip_pim_ecmp_rebalance_cmd
,
3295 "ip pim ecmp rebalance",
3297 "pim multicast routing\n"
3298 "Enable PIM ECMP \n"
3299 "Enable PIM ECMP Rebalance\n")
3301 const char *vrfname
;
3302 char ecmp_xpath
[XPATH_MAXLEN
];
3303 char ecmp_rebalance_xpath
[XPATH_MAXLEN
];
3305 vrfname
= pim_cli_get_vrf_name(vty
);
3306 if (vrfname
== NULL
)
3307 return CMD_WARNING_CONFIG_FAILED
;
3309 snprintf(ecmp_xpath
, sizeof(ecmp_xpath
), FRR_PIM_VRF_XPATH
,
3310 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
3311 strlcat(ecmp_xpath
, "/ecmp", sizeof(ecmp_xpath
));
3312 snprintf(ecmp_rebalance_xpath
, sizeof(ecmp_rebalance_xpath
),
3314 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
3315 strlcat(ecmp_rebalance_xpath
, "/ecmp-rebalance",
3316 sizeof(ecmp_rebalance_xpath
));
3318 nb_cli_enqueue_change(vty
, ecmp_xpath
, NB_OP_MODIFY
, "true");
3319 nb_cli_enqueue_change(vty
, ecmp_rebalance_xpath
, NB_OP_MODIFY
, "true");
3321 return nb_cli_apply_changes(vty
, NULL
);
3324 DEFUN (no_ip_pim_ecmp_rebalance
,
3325 no_ip_pim_ecmp_rebalance_cmd
,
3326 "no ip pim ecmp rebalance",
3329 "pim multicast routing\n"
3330 "Disable PIM ECMP \n"
3331 "Disable PIM ECMP Rebalance\n")
3333 const char *vrfname
;
3334 char ecmp_rebalance_xpath
[XPATH_MAXLEN
];
3336 vrfname
= pim_cli_get_vrf_name(vty
);
3337 if (vrfname
== NULL
)
3338 return CMD_WARNING_CONFIG_FAILED
;
3340 snprintf(ecmp_rebalance_xpath
, sizeof(ecmp_rebalance_xpath
),
3342 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
3343 strlcat(ecmp_rebalance_xpath
, "/ecmp-rebalance",
3344 sizeof(ecmp_rebalance_xpath
));
3346 nb_cli_enqueue_change(vty
, ecmp_rebalance_xpath
, NB_OP_MODIFY
, "false");
3348 return nb_cli_apply_changes(vty
, NULL
);
3351 DEFUN (interface_ip_igmp
,
3352 interface_ip_igmp_cmd
,
3357 nb_cli_enqueue_change(vty
, "./enable", NB_OP_MODIFY
, "true");
3359 return nb_cli_apply_changes(vty
, FRR_GMP_INTERFACE_XPATH
,
3360 "frr-routing:ipv4");
3363 DEFUN (interface_no_ip_igmp
,
3364 interface_no_ip_igmp_cmd
,
3370 const struct lyd_node
*pim_enable_dnode
;
3371 char pim_if_xpath
[XPATH_MAXLEN
];
3374 snprintf(pim_if_xpath
, sizeof(pim_if_xpath
),
3375 "%s/frr-pim:pim/address-family[address-family='%s']",
3376 VTY_CURR_XPATH
, "frr-routing:ipv4");
3378 if (printed
>= (int)(sizeof(pim_if_xpath
))) {
3379 vty_out(vty
, "Xpath too long (%d > %u)", printed
+ 1,
3381 return CMD_WARNING_CONFIG_FAILED
;
3384 pim_enable_dnode
= yang_dnode_getf(vty
->candidate_config
->dnode
,
3385 FRR_PIM_ENABLE_XPATH
, VTY_CURR_XPATH
,
3386 "frr-routing:ipv4");
3387 if (!pim_enable_dnode
) {
3388 nb_cli_enqueue_change(vty
, pim_if_xpath
, NB_OP_DESTROY
, NULL
);
3389 nb_cli_enqueue_change(vty
, ".", NB_OP_DESTROY
, NULL
);
3391 if (!yang_dnode_get_bool(pim_enable_dnode
, ".")) {
3392 nb_cli_enqueue_change(vty
, pim_if_xpath
, NB_OP_DESTROY
,
3394 nb_cli_enqueue_change(vty
, ".", NB_OP_DESTROY
, NULL
);
3396 nb_cli_enqueue_change(vty
, "./enable",
3397 NB_OP_MODIFY
, "false");
3400 return nb_cli_apply_changes(vty
, FRR_GMP_INTERFACE_XPATH
,
3401 "frr-routing:ipv4");
3404 DEFUN (interface_ip_igmp_join
,
3405 interface_ip_igmp_join_cmd
,
3406 "ip igmp join A.B.C.D [A.B.C.D]",
3409 "IGMP join multicast group\n"
3410 "Multicast group address\n"
3415 const char *source_str
;
3416 char xpath
[XPATH_MAXLEN
];
3419 source_str
= argv
[idx_source
]->arg
;
3421 if (strcmp(source_str
, "0.0.0.0") == 0) {
3422 vty_out(vty
, "Bad source address %s\n",
3423 argv
[idx_source
]->arg
);
3424 return CMD_WARNING_CONFIG_FAILED
;
3427 source_str
= "0.0.0.0";
3429 snprintf(xpath
, sizeof(xpath
), FRR_GMP_JOIN_XPATH
,
3430 "frr-routing:ipv4", argv
[idx_group
]->arg
, source_str
);
3432 nb_cli_enqueue_change(vty
, xpath
, NB_OP_CREATE
, NULL
);
3434 return nb_cli_apply_changes(vty
, NULL
);
3437 DEFUN (interface_no_ip_igmp_join
,
3438 interface_no_ip_igmp_join_cmd
,
3439 "no ip igmp join A.B.C.D [A.B.C.D]",
3443 "IGMP join multicast group\n"
3444 "Multicast group address\n"
3449 const char *source_str
;
3450 char xpath
[XPATH_MAXLEN
];
3453 source_str
= argv
[idx_source
]->arg
;
3455 if (strcmp(source_str
, "0.0.0.0") == 0) {
3456 vty_out(vty
, "Bad source address %s\n",
3457 argv
[idx_source
]->arg
);
3458 return CMD_WARNING_CONFIG_FAILED
;
3461 source_str
= "0.0.0.0";
3463 snprintf(xpath
, sizeof(xpath
), FRR_GMP_JOIN_XPATH
,
3464 "frr-routing:ipv4", argv
[idx_group
]->arg
, source_str
);
3466 nb_cli_enqueue_change(vty
, xpath
, NB_OP_DESTROY
, NULL
);
3468 return nb_cli_apply_changes(vty
, NULL
);
3471 DEFUN (interface_ip_igmp_query_interval
,
3472 interface_ip_igmp_query_interval_cmd
,
3473 "ip igmp query-interval (1-65535)",
3476 IFACE_IGMP_QUERY_INTERVAL_STR
3477 "Query interval in seconds\n")
3479 const struct lyd_node
*pim_enable_dnode
;
3482 yang_dnode_getf(vty
->candidate_config
->dnode
,
3483 FRR_PIM_ENABLE_XPATH
, VTY_CURR_XPATH
,
3484 "frr-routing:ipv4");
3485 if (!pim_enable_dnode
) {
3486 nb_cli_enqueue_change(vty
, "./enable", NB_OP_MODIFY
,
3489 if (!yang_dnode_get_bool(pim_enable_dnode
, "."))
3490 nb_cli_enqueue_change(vty
, "./enable",
3491 NB_OP_MODIFY
, "true");
3494 nb_cli_enqueue_change(vty
, "./query-interval", NB_OP_MODIFY
,
3497 return nb_cli_apply_changes(vty
, FRR_GMP_INTERFACE_XPATH
,
3498 "frr-routing:ipv4");
3501 DEFUN (interface_no_ip_igmp_query_interval
,
3502 interface_no_ip_igmp_query_interval_cmd
,
3503 "no ip igmp query-interval [(1-65535)]",
3507 IFACE_IGMP_QUERY_INTERVAL_STR
3510 nb_cli_enqueue_change(vty
, "./query-interval", NB_OP_DESTROY
, NULL
);
3512 return nb_cli_apply_changes(vty
, FRR_GMP_INTERFACE_XPATH
,
3513 "frr-routing:ipv4");
3516 DEFUN (interface_ip_igmp_version
,
3517 interface_ip_igmp_version_cmd
,
3518 "ip igmp version (2-3)",
3522 "IGMP version number\n")
3524 nb_cli_enqueue_change(vty
, "./enable", NB_OP_MODIFY
,
3526 nb_cli_enqueue_change(vty
, "./igmp-version", NB_OP_MODIFY
,
3529 return nb_cli_apply_changes(vty
, FRR_GMP_INTERFACE_XPATH
,
3530 "frr-routing:ipv4");
3533 DEFUN (interface_no_ip_igmp_version
,
3534 interface_no_ip_igmp_version_cmd
,
3535 "no ip igmp version (2-3)",
3540 "IGMP version number\n")
3542 nb_cli_enqueue_change(vty
, "./igmp-version", NB_OP_DESTROY
, NULL
);
3544 return nb_cli_apply_changes(vty
, FRR_GMP_INTERFACE_XPATH
,
3545 "frr-routing:ipv4");
3548 DEFPY (interface_ip_igmp_query_max_response_time
,
3549 interface_ip_igmp_query_max_response_time_cmd
,
3550 "ip igmp query-max-response-time (1-65535)$qmrt",
3553 IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_STR
3554 "Query response value in deci-seconds\n")
3556 return gm_process_query_max_response_time_cmd(vty
, qmrt_str
);
3559 DEFUN (interface_no_ip_igmp_query_max_response_time
,
3560 interface_no_ip_igmp_query_max_response_time_cmd
,
3561 "no ip igmp query-max-response-time [(1-65535)]",
3565 IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_STR
3568 return gm_process_no_query_max_response_time_cmd(vty
);
3571 DEFUN_HIDDEN (interface_ip_igmp_query_max_response_time_dsec
,
3572 interface_ip_igmp_query_max_response_time_dsec_cmd
,
3573 "ip igmp query-max-response-time-dsec (1-65535)",
3576 IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_DSEC_STR
3577 "Query response value in deciseconds\n")
3579 const struct lyd_node
*pim_enable_dnode
;
3582 yang_dnode_getf(vty
->candidate_config
->dnode
,
3583 FRR_PIM_ENABLE_XPATH
, VTY_CURR_XPATH
,
3584 "frr-routing:ipv4");
3585 if (!pim_enable_dnode
) {
3586 nb_cli_enqueue_change(vty
, "./enable", NB_OP_MODIFY
,
3589 if (!yang_dnode_get_bool(pim_enable_dnode
, "."))
3590 nb_cli_enqueue_change(vty
, "./enable",
3591 NB_OP_MODIFY
, "true");
3594 nb_cli_enqueue_change(vty
, "./query-max-response-time", NB_OP_MODIFY
,
3597 return nb_cli_apply_changes(vty
, FRR_GMP_INTERFACE_XPATH
,
3598 "frr-routing:ipv4");
3601 DEFUN_HIDDEN (interface_no_ip_igmp_query_max_response_time_dsec
,
3602 interface_no_ip_igmp_query_max_response_time_dsec_cmd
,
3603 "no ip igmp query-max-response-time-dsec [(1-65535)]",
3607 IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_DSEC_STR
3610 nb_cli_enqueue_change(vty
, "./query-max-response-time", NB_OP_DESTROY
,
3613 return nb_cli_apply_changes(vty
, FRR_GMP_INTERFACE_XPATH
,
3614 "frr-routing:ipv4");
3617 DEFPY (interface_ip_igmp_last_member_query_count
,
3618 interface_ip_igmp_last_member_query_count_cmd
,
3619 "ip igmp last-member-query-count (1-255)$lmqc",
3622 IFACE_IGMP_LAST_MEMBER_QUERY_COUNT_STR
3623 "Last member query count\n")
3625 return gm_process_last_member_query_count_cmd(vty
, lmqc_str
);
3628 DEFUN (interface_no_ip_igmp_last_member_query_count
,
3629 interface_no_ip_igmp_last_member_query_count_cmd
,
3630 "no ip igmp last-member-query-count [(1-255)]",
3634 IFACE_IGMP_LAST_MEMBER_QUERY_COUNT_STR
3637 return gm_process_no_last_member_query_count_cmd(vty
);
3640 DEFPY (interface_ip_igmp_last_member_query_interval
,
3641 interface_ip_igmp_last_member_query_interval_cmd
,
3642 "ip igmp last-member-query-interval (1-65535)$lmqi",
3645 IFACE_IGMP_LAST_MEMBER_QUERY_INTERVAL_STR
3646 "Last member query interval in deciseconds\n")
3648 return gm_process_last_member_query_interval_cmd(vty
, lmqi_str
);
3651 DEFUN (interface_no_ip_igmp_last_member_query_interval
,
3652 interface_no_ip_igmp_last_member_query_interval_cmd
,
3653 "no ip igmp last-member-query-interval [(1-65535)]",
3657 IFACE_IGMP_LAST_MEMBER_QUERY_INTERVAL_STR
3660 return gm_process_no_last_member_query_interval_cmd(vty
);
3663 DEFUN (interface_ip_pim_drprio
,
3664 interface_ip_pim_drprio_cmd
,
3665 "ip pim drpriority (1-4294967295)",
3668 "Set the Designated Router Election Priority\n"
3669 "Value of the new DR Priority\n")
3673 return pim_process_ip_pim_drprio_cmd(vty
, argv
[idx_number
]->arg
);
3676 DEFUN (interface_no_ip_pim_drprio
,
3677 interface_no_ip_pim_drprio_cmd
,
3678 "no ip pim drpriority [(1-4294967295)]",
3682 "Revert the Designated Router Priority to default\n"
3683 "Old Value of the Priority\n")
3685 return pim_process_no_ip_pim_drprio_cmd(vty
);
3688 DEFPY_HIDDEN (interface_ip_igmp_query_generate
,
3689 interface_ip_igmp_query_generate_cmd
,
3690 "ip igmp generate-query-once [version (2-3)]",
3693 "Generate igmp general query once\n"
3695 "IGMP version number\n")
3698 VTY_DECLVAR_CONTEXT(interface
, ifp
);
3700 struct pim_interface
*pim_ifp
= ifp
->info
;
3703 vty_out(vty
, "IGMP/PIM is not enabled on the interface %s\n",
3705 return CMD_WARNING_CONFIG_FAILED
;
3708 /* It takes the igmp version configured on the interface as default */
3709 igmp_version
= pim_ifp
->igmp_version
;
3712 igmp_version
= atoi(argv
[4]->arg
);
3714 igmp_send_query_on_intf(ifp
, igmp_version
);
3719 DEFPY_HIDDEN (pim_test_sg_keepalive
,
3720 pim_test_sg_keepalive_cmd
,
3721 "test pim [vrf NAME$name] keepalive-reset A.B.C.D$source A.B.C.D$group",
3725 "Reset the Keepalive Timer\n"
3726 "The Source we are resetting\n"
3727 "The Group we are resetting\n")
3729 struct pim_upstream
*up
;
3731 struct pim_instance
*pim
;
3737 vrf
= vrf_lookup_by_name(name
? name
: VRF_DEFAULT_NAME
);
3739 vty_out(vty
, "%% Vrf specified: %s does not exist\n", name
);
3746 vty_out(vty
, "%% Unable to find pim instance\n");
3750 up
= pim_upstream_find(pim
, &sg
);
3752 vty_out(vty
, "%% Unable to find %pSG specified\n", &sg
);
3756 vty_out(vty
, "Setting %pSG to current keep alive time: %d\n", &sg
,
3757 pim
->keep_alive_time
);
3758 pim_upstream_keep_alive_timer_start(up
, pim
->keep_alive_time
);
3763 DEFPY (interface_ip_pim_activeactive
,
3764 interface_ip_pim_activeactive_cmd
,
3765 "[no$no] ip pim active-active",
3769 "Mark interface as Active-Active for MLAG operations, Hidden because not finished yet\n")
3771 return pim_process_ip_pim_activeactive_cmd(vty
, no
);
3774 DEFUN_HIDDEN (interface_ip_pim_ssm
,
3775 interface_ip_pim_ssm_cmd
,
3783 ret
= pim_process_ip_pim_cmd(vty
);
3789 "WARN: Enabled PIM SM on interface; configure PIM SSM range if needed\n");
3794 DEFUN_HIDDEN (interface_ip_pim_sm
,
3795 interface_ip_pim_sm_cmd
,
3801 return pim_process_ip_pim_cmd(vty
);
3804 DEFPY (interface_ip_pim
,
3805 interface_ip_pim_cmd
,
3806 "ip pim [passive$passive]",
3809 "Disable exchange of protocol packets\n")
3813 ret
= pim_process_ip_pim_cmd(vty
);
3819 return pim_process_ip_pim_passive_cmd(vty
, true);
3824 DEFUN_HIDDEN (interface_no_ip_pim_ssm
,
3825 interface_no_ip_pim_ssm_cmd
,
3832 return pim_process_no_ip_pim_cmd(vty
);
3835 DEFUN_HIDDEN (interface_no_ip_pim_sm
,
3836 interface_no_ip_pim_sm_cmd
,
3843 return pim_process_no_ip_pim_cmd(vty
);
3846 DEFPY (interface_no_ip_pim
,
3847 interface_no_ip_pim_cmd
,
3848 "no ip pim [passive$passive]",
3852 "Disable exchange of protocol packets\n")
3855 return pim_process_ip_pim_passive_cmd(vty
, false);
3857 return pim_process_no_ip_pim_cmd(vty
);
3861 DEFUN(interface_ip_pim_boundary_oil
,
3862 interface_ip_pim_boundary_oil_cmd
,
3863 "ip multicast boundary oil WORD",
3865 "Generic multicast configuration options\n"
3866 "Define multicast boundary\n"
3867 "Filter OIL by group using prefix list\n"
3868 "Prefix list to filter OIL with\n")
3870 return pim_process_ip_pim_boundary_oil_cmd(vty
, argv
[4]->arg
);
3873 DEFUN(interface_no_ip_pim_boundary_oil
,
3874 interface_no_ip_pim_boundary_oil_cmd
,
3875 "no ip multicast boundary oil [WORD]",
3878 "Generic multicast configuration options\n"
3879 "Define multicast boundary\n"
3880 "Filter OIL by group using prefix list\n"
3881 "Prefix list to filter OIL with\n")
3883 return pim_process_no_ip_pim_boundary_oil_cmd(vty
);
3886 DEFUN (interface_ip_mroute
,
3887 interface_ip_mroute_cmd
,
3888 "ip mroute INTERFACE A.B.C.D [A.B.C.D]",
3890 "Add multicast route\n"
3891 "Outgoing interface name\n"
3895 int idx_interface
= 2;
3897 const char *source_str
;
3899 if (argc
== (idx_ipv4
+ 1))
3900 source_str
= "0.0.0.0";
3902 source_str
= argv
[idx_ipv4
+ 1]->arg
;
3904 return pim_process_ip_mroute_cmd(vty
, argv
[idx_interface
]->arg
,
3905 argv
[idx_ipv4
]->arg
, source_str
);
3908 DEFUN (interface_no_ip_mroute
,
3909 interface_no_ip_mroute_cmd
,
3910 "no ip mroute INTERFACE A.B.C.D [A.B.C.D]",
3913 "Add multicast route\n"
3914 "Outgoing interface name\n"
3918 int idx_interface
= 3;
3920 const char *source_str
;
3922 if (argc
== (idx_ipv4
+ 1))
3923 source_str
= "0.0.0.0";
3925 source_str
= argv
[idx_ipv4
+ 1]->arg
;
3927 return pim_process_no_ip_mroute_cmd(vty
, argv
[idx_interface
]->arg
,
3928 argv
[idx_ipv4
]->arg
, source_str
);
3931 DEFUN (interface_ip_pim_hello
,
3932 interface_ip_pim_hello_cmd
,
3933 "ip pim hello (1-65535) [(1-65535)]",
3937 IFACE_PIM_HELLO_TIME_STR
3938 IFACE_PIM_HELLO_HOLD_STR
)
3943 if (argc
== idx_hold
+ 1)
3944 return pim_process_ip_pim_hello_cmd(vty
, argv
[idx_time
]->arg
,
3945 argv
[idx_hold
]->arg
);
3948 return pim_process_ip_pim_hello_cmd(vty
, argv
[idx_time
]->arg
,
3952 DEFUN (interface_no_ip_pim_hello
,
3953 interface_no_ip_pim_hello_cmd
,
3954 "no ip pim hello [(1-65535) [(1-65535)]]",
3962 return pim_process_no_ip_pim_hello_cmd(vty
);
3971 PIM_DO_DEBUG_GM_EVENTS
;
3972 PIM_DO_DEBUG_GM_PACKETS
;
3973 PIM_DO_DEBUG_GM_TRACE
;
3977 DEFUN (no_debug_igmp
,
3984 PIM_DONT_DEBUG_GM_EVENTS
;
3985 PIM_DONT_DEBUG_GM_PACKETS
;
3986 PIM_DONT_DEBUG_GM_TRACE
;
3991 DEFUN (debug_igmp_events
,
3992 debug_igmp_events_cmd
,
3993 "debug igmp events",
3996 DEBUG_IGMP_EVENTS_STR
)
3998 PIM_DO_DEBUG_GM_EVENTS
;
4002 DEFUN (no_debug_igmp_events
,
4003 no_debug_igmp_events_cmd
,
4004 "no debug igmp events",
4008 DEBUG_IGMP_EVENTS_STR
)
4010 PIM_DONT_DEBUG_GM_EVENTS
;
4015 DEFUN (debug_igmp_packets
,
4016 debug_igmp_packets_cmd
,
4017 "debug igmp packets",
4020 DEBUG_IGMP_PACKETS_STR
)
4022 PIM_DO_DEBUG_GM_PACKETS
;
4026 DEFUN (no_debug_igmp_packets
,
4027 no_debug_igmp_packets_cmd
,
4028 "no debug igmp packets",
4032 DEBUG_IGMP_PACKETS_STR
)
4034 PIM_DONT_DEBUG_GM_PACKETS
;
4039 DEFUN (debug_igmp_trace
,
4040 debug_igmp_trace_cmd
,
4044 DEBUG_IGMP_TRACE_STR
)
4046 PIM_DO_DEBUG_GM_TRACE
;
4050 DEFUN (no_debug_igmp_trace
,
4051 no_debug_igmp_trace_cmd
,
4052 "no debug igmp trace",
4056 DEBUG_IGMP_TRACE_STR
)
4058 PIM_DONT_DEBUG_GM_TRACE
;
4063 DEFUN (debug_igmp_trace_detail
,
4064 debug_igmp_trace_detail_cmd
,
4065 "debug igmp trace detail",
4068 DEBUG_IGMP_TRACE_STR
4071 PIM_DO_DEBUG_GM_TRACE_DETAIL
;
4075 DEFUN (no_debug_igmp_trace_detail
,
4076 no_debug_igmp_trace_detail_cmd
,
4077 "no debug igmp trace detail",
4081 DEBUG_IGMP_TRACE_STR
4084 PIM_DONT_DEBUG_GM_TRACE_DETAIL
;
4089 DEFUN (debug_mroute
,
4095 PIM_DO_DEBUG_MROUTE
;
4099 DEFUN (debug_mroute_detail
,
4100 debug_mroute_detail_cmd
,
4101 "debug mroute detail",
4106 PIM_DO_DEBUG_MROUTE_DETAIL
;
4110 DEFUN (no_debug_mroute
,
4111 no_debug_mroute_cmd
,
4117 PIM_DONT_DEBUG_MROUTE
;
4121 DEFUN (no_debug_mroute_detail
,
4122 no_debug_mroute_detail_cmd
,
4123 "no debug mroute detail",
4129 PIM_DONT_DEBUG_MROUTE_DETAIL
;
4133 DEFUN (debug_pim_static
,
4134 debug_pim_static_cmd
,
4140 PIM_DO_DEBUG_STATIC
;
4144 DEFUN (no_debug_pim_static
,
4145 no_debug_pim_static_cmd
,
4146 "no debug pim static",
4152 PIM_DONT_DEBUG_STATIC
;
4165 return pim_debug_pim_cmd();
4167 return pim_no_debug_pim_cmd();
4170 DEFPY (debug_pim_nht
,
4172 "[no] debug pim nht",
4176 "Nexthop Tracking\n")
4179 PIM_DO_DEBUG_PIM_NHT
;
4181 PIM_DONT_DEBUG_PIM_NHT
;
4185 DEFPY (debug_pim_nht_det
,
4186 debug_pim_nht_det_cmd
,
4187 "[no] debug pim nht detail",
4191 "Nexthop Tracking\n"
4192 "Detailed Information\n")
4195 PIM_DO_DEBUG_PIM_NHT_DETAIL
;
4197 PIM_DONT_DEBUG_PIM_NHT_DETAIL
;
4201 DEFUN (debug_pim_nht_rp
,
4202 debug_pim_nht_rp_cmd
,
4206 "Nexthop Tracking\n"
4207 "RP Nexthop Tracking\n")
4209 PIM_DO_DEBUG_PIM_NHT_RP
;
4213 DEFUN (no_debug_pim_nht_rp
,
4214 no_debug_pim_nht_rp_cmd
,
4215 "no debug pim nht rp",
4219 "Nexthop Tracking\n"
4220 "RP Nexthop Tracking\n")
4222 PIM_DONT_DEBUG_PIM_NHT_RP
;
4226 DEFPY (debug_pim_events
,
4227 debug_pim_events_cmd
,
4228 "[no] debug pim events",
4232 DEBUG_PIM_EVENTS_STR
)
4235 PIM_DO_DEBUG_PIM_EVENTS
;
4237 PIM_DONT_DEBUG_PIM_EVENTS
;
4241 DEFPY (debug_pim_packets
,
4242 debug_pim_packets_cmd
,
4243 "[no] debug pim packets [<hello$hello|joins$joins|register$registers>]",
4246 DEBUG_PIM_PACKETS_STR
4247 DEBUG_PIM_HELLO_PACKETS_STR
4248 DEBUG_PIM_J_P_PACKETS_STR
4249 DEBUG_PIM_PIM_REG_PACKETS_STR
)
4252 return pim_debug_pim_packets_cmd(hello
, joins
, registers
, vty
);
4254 return pim_no_debug_pim_packets_cmd(hello
, joins
, registers
,
4258 DEFPY (debug_pim_packetdump_send
,
4259 debug_pim_packetdump_send_cmd
,
4260 "[no] debug pim packet-dump send",
4264 DEBUG_PIM_PACKETDUMP_STR
4265 DEBUG_PIM_PACKETDUMP_SEND_STR
)
4268 PIM_DO_DEBUG_PIM_PACKETDUMP_SEND
;
4270 PIM_DONT_DEBUG_PIM_PACKETDUMP_SEND
;
4274 DEFPY (debug_pim_packetdump_recv
,
4275 debug_pim_packetdump_recv_cmd
,
4276 "[no] debug pim packet-dump receive",
4280 DEBUG_PIM_PACKETDUMP_STR
4281 DEBUG_PIM_PACKETDUMP_RECV_STR
)
4284 PIM_DO_DEBUG_PIM_PACKETDUMP_RECV
;
4286 PIM_DONT_DEBUG_PIM_PACKETDUMP_RECV
;
4290 DEFPY (debug_pim_trace
,
4291 debug_pim_trace_cmd
,
4292 "[no] debug pim trace",
4296 DEBUG_PIM_TRACE_STR
)
4299 PIM_DO_DEBUG_PIM_TRACE
;
4301 PIM_DONT_DEBUG_PIM_TRACE
;
4305 DEFPY (debug_pim_trace_detail
,
4306 debug_pim_trace_detail_cmd
,
4307 "[no] debug pim trace detail",
4312 "Detailed Information\n")
4315 PIM_DO_DEBUG_PIM_TRACE_DETAIL
;
4317 PIM_DONT_DEBUG_PIM_TRACE_DETAIL
;
4321 DEFUN (debug_ssmpingd
,
4327 PIM_DO_DEBUG_SSMPINGD
;
4331 DEFUN (no_debug_ssmpingd
,
4332 no_debug_ssmpingd_cmd
,
4333 "no debug ssmpingd",
4338 PIM_DONT_DEBUG_SSMPINGD
;
4342 DEFPY (debug_pim_zebra
,
4343 debug_pim_zebra_cmd
,
4344 "[no] debug pim zebra",
4348 DEBUG_PIM_ZEBRA_STR
)
4353 PIM_DONT_DEBUG_ZEBRA
;
4357 DEFUN(debug_pim_mlag
, debug_pim_mlag_cmd
, "debug pim mlag",
4358 DEBUG_STR DEBUG_PIM_STR DEBUG_PIM_MLAG_STR
)
4364 DEFUN(no_debug_pim_mlag
, no_debug_pim_mlag_cmd
, "no debug pim mlag",
4365 NO_STR DEBUG_STR DEBUG_PIM_STR DEBUG_PIM_MLAG_STR
)
4367 PIM_DONT_DEBUG_MLAG
;
4371 DEFUN (debug_pim_vxlan
,
4372 debug_pim_vxlan_cmd
,
4376 DEBUG_PIM_VXLAN_STR
)
4382 DEFUN (no_debug_pim_vxlan
,
4383 no_debug_pim_vxlan_cmd
,
4384 "no debug pim vxlan",
4388 DEBUG_PIM_VXLAN_STR
)
4390 PIM_DONT_DEBUG_VXLAN
;
4400 PIM_DO_DEBUG_MSDP_EVENTS
;
4401 PIM_DO_DEBUG_MSDP_PACKETS
;
4405 DEFUN (no_debug_msdp
,
4412 PIM_DONT_DEBUG_MSDP_EVENTS
;
4413 PIM_DONT_DEBUG_MSDP_PACKETS
;
4417 DEFUN (debug_msdp_events
,
4418 debug_msdp_events_cmd
,
4419 "debug msdp events",
4422 DEBUG_MSDP_EVENTS_STR
)
4424 PIM_DO_DEBUG_MSDP_EVENTS
;
4428 DEFUN (no_debug_msdp_events
,
4429 no_debug_msdp_events_cmd
,
4430 "no debug msdp events",
4434 DEBUG_MSDP_EVENTS_STR
)
4436 PIM_DONT_DEBUG_MSDP_EVENTS
;
4440 DEFUN (debug_msdp_packets
,
4441 debug_msdp_packets_cmd
,
4442 "debug msdp packets",
4445 DEBUG_MSDP_PACKETS_STR
)
4447 PIM_DO_DEBUG_MSDP_PACKETS
;
4451 DEFUN (no_debug_msdp_packets
,
4452 no_debug_msdp_packets_cmd
,
4453 "no debug msdp packets",
4457 DEBUG_MSDP_PACKETS_STR
)
4459 PIM_DONT_DEBUG_MSDP_PACKETS
;
4463 DEFUN (debug_mtrace
,
4469 PIM_DO_DEBUG_MTRACE
;
4473 DEFUN (no_debug_mtrace
,
4474 no_debug_mtrace_cmd
,
4480 PIM_DONT_DEBUG_MTRACE
;
4495 DEFUN (no_debug_bsm
,
4508 DEFUN_NOSH (show_debugging_pim
,
4509 show_debugging_pim_cmd
,
4510 "show debugging [pim]",
4515 vty_out(vty
, "PIM debugging status\n");
4517 pim_debug_config_write(vty
);
4519 cmd_show_lib_debugs(vty
);
4523 DEFUN (interface_pim_use_source
,
4524 interface_pim_use_source_cmd
,
4525 "ip pim use-source A.B.C.D",
4528 "Configure primary IP address\n"
4529 "source ip address\n")
4531 nb_cli_enqueue_change(vty
, "./use-source", NB_OP_MODIFY
, argv
[3]->arg
);
4533 return nb_cli_apply_changes(vty
,
4534 FRR_PIM_INTERFACE_XPATH
,
4535 "frr-routing:ipv4");
4538 DEFUN (interface_no_pim_use_source
,
4539 interface_no_pim_use_source_cmd
,
4540 "no ip pim use-source [A.B.C.D]",
4544 "Delete source IP address\n"
4545 "source ip address\n")
4547 nb_cli_enqueue_change(vty
, "./use-source", NB_OP_MODIFY
, "0.0.0.0");
4549 return nb_cli_apply_changes(vty
,
4550 FRR_PIM_INTERFACE_XPATH
,
4551 "frr-routing:ipv4");
4556 "ip pim bfd [profile BFDPROF$prof]",
4559 "Enables BFD support\n"
4561 "Use BFD profile name\n")
4563 const struct lyd_node
*igmp_enable_dnode
;
4566 yang_dnode_getf(vty
->candidate_config
->dnode
,
4567 FRR_GMP_ENABLE_XPATH
, VTY_CURR_XPATH
,
4568 "frr-routing:ipv4");
4569 if (!igmp_enable_dnode
)
4570 nb_cli_enqueue_change(vty
, "./pim-enable", NB_OP_MODIFY
,
4573 if (!yang_dnode_get_bool(igmp_enable_dnode
, "."))
4574 nb_cli_enqueue_change(vty
, "./pim-enable", NB_OP_MODIFY
,
4578 nb_cli_enqueue_change(vty
, "./bfd", NB_OP_CREATE
, NULL
);
4580 nb_cli_enqueue_change(vty
, "./bfd/profile", NB_OP_MODIFY
, prof
);
4582 return nb_cli_apply_changes(vty
,
4583 FRR_PIM_INTERFACE_XPATH
,
4584 "frr-routing:ipv4");
4587 DEFPY(no_ip_pim_bfd_profile
, no_ip_pim_bfd_profile_cmd
,
4588 "no ip pim bfd profile [BFDPROF]",
4592 "Enables BFD support\n"
4593 "Disable BFD profile\n"
4594 "BFD Profile name\n")
4596 nb_cli_enqueue_change(vty
, "./bfd/profile", NB_OP_DESTROY
, NULL
);
4598 return nb_cli_apply_changes(vty
,
4599 FRR_PIM_INTERFACE_XPATH
,
4600 "frr-routing:ipv4");
4603 DEFUN (no_ip_pim_bfd
,
4609 "Disables BFD support\n")
4611 nb_cli_enqueue_change(vty
, "./bfd", NB_OP_DESTROY
, NULL
);
4613 return nb_cli_apply_changes(vty
,
4614 FRR_PIM_INTERFACE_XPATH
,
4615 "frr-routing:ipv4");
4623 "Enable BSM support on the interface\n")
4625 return pim_process_bsm_cmd(vty
);
4627 DEFUN (no_ip_pim_bsm
,
4633 "Enable BSM support on the interface\n")
4635 return pim_process_no_bsm_cmd(vty
);
4638 DEFUN (ip_pim_ucast_bsm
,
4639 ip_pim_ucast_bsm_cmd
,
4640 "ip pim unicast-bsm",
4643 "Accept/Send unicast BSM on the interface\n")
4645 return pim_process_unicast_bsm_cmd(vty
);
4648 DEFUN (no_ip_pim_ucast_bsm
,
4649 no_ip_pim_ucast_bsm_cmd
,
4650 "no ip pim unicast-bsm",
4654 "Accept/Send unicast BSM on the interface\n")
4656 return pim_process_no_unicast_bsm_cmd(vty
);
4662 ip_pim_bfd_param_cmd
,
4663 "ip pim bfd (2-255) (1-65535) (1-65535)",
4666 "Enables BFD support\n"
4667 "Detect Multiplier\n"
4668 "Required min receive interval\n"
4669 "Desired min transmit interval\n")
4673 ip_pim_bfd_param_cmd
,
4674 "ip pim bfd (2-255) (1-65535) (1-65535)",
4677 "Enables BFD support\n"
4678 "Detect Multiplier\n"
4679 "Required min receive interval\n"
4680 "Desired min transmit interval\n")
4681 #endif /* HAVE_BFDD */
4684 int idx_number_2
= 4;
4685 int idx_number_3
= 5;
4686 const struct lyd_node
*igmp_enable_dnode
;
4689 yang_dnode_getf(vty
->candidate_config
->dnode
,
4690 FRR_GMP_ENABLE_XPATH
, VTY_CURR_XPATH
,
4691 "frr-routing:ipv4");
4692 if (!igmp_enable_dnode
)
4693 nb_cli_enqueue_change(vty
, "./pim-enable", NB_OP_MODIFY
,
4696 if (!yang_dnode_get_bool(igmp_enable_dnode
, "."))
4697 nb_cli_enqueue_change(vty
, "./pim-enable", NB_OP_MODIFY
,
4701 nb_cli_enqueue_change(vty
, "./bfd", NB_OP_CREATE
, NULL
);
4702 nb_cli_enqueue_change(vty
, "./bfd/min-rx-interval", NB_OP_MODIFY
,
4703 argv
[idx_number_2
]->arg
);
4704 nb_cli_enqueue_change(vty
, "./bfd/min-tx-interval", NB_OP_MODIFY
,
4705 argv
[idx_number_3
]->arg
);
4706 nb_cli_enqueue_change(vty
, "./bfd/detect_mult", NB_OP_MODIFY
,
4707 argv
[idx_number
]->arg
);
4709 return nb_cli_apply_changes(vty
,
4710 FRR_PIM_INTERFACE_XPATH
, "frr-routing:ipv4");
4714 ALIAS(no_ip_pim_bfd
, no_ip_pim_bfd_param_cmd
,
4715 "no ip pim bfd (2-255) (1-65535) (1-65535)",
4719 "Enables BFD support\n"
4720 "Detect Multiplier\n"
4721 "Required min receive interval\n"
4722 "Desired min transmit interval\n")
4723 #endif /* !HAVE_BFDD */
4725 DEFPY(ip_msdp_peer
, ip_msdp_peer_cmd
,
4726 "ip msdp peer A.B.C.D$peer source A.B.C.D$source",
4729 "Configure MSDP peer\n"
4731 "Source address for TCP connection\n"
4732 "Local IP address\n")
4734 const char *vrfname
;
4735 char temp_xpath
[XPATH_MAXLEN
];
4736 char msdp_peer_source_xpath
[XPATH_MAXLEN
];
4738 vrfname
= pim_cli_get_vrf_name(vty
);
4739 if (vrfname
== NULL
)
4740 return CMD_WARNING_CONFIG_FAILED
;
4742 snprintf(msdp_peer_source_xpath
, sizeof(msdp_peer_source_xpath
),
4743 FRR_PIM_VRF_XPATH
, "frr-pim:pimd", "pim", vrfname
,
4744 "frr-routing:ipv4");
4745 snprintf(temp_xpath
, sizeof(temp_xpath
),
4746 "/msdp-peer[peer-ip='%s']/source-ip", peer_str
);
4747 strlcat(msdp_peer_source_xpath
, temp_xpath
,
4748 sizeof(msdp_peer_source_xpath
));
4750 nb_cli_enqueue_change(vty
, msdp_peer_source_xpath
, NB_OP_MODIFY
,
4753 return nb_cli_apply_changes(vty
,
4754 FRR_PIM_INTERFACE_XPATH
, "frr-routing:ipv4");
4757 DEFPY(ip_msdp_timers
, ip_msdp_timers_cmd
,
4758 "ip msdp timers (1-65535)$keepalive (1-65535)$holdtime [(1-65535)$connretry]",
4761 "MSDP timers configuration\n"
4762 "Keep alive period (in seconds)\n"
4763 "Hold time period (in seconds)\n"
4764 "Connection retry period (in seconds)\n")
4766 const char *vrfname
;
4768 vrfname
= pim_cli_get_vrf_name(vty
);
4769 if (vrfname
== NULL
)
4770 return CMD_WARNING_CONFIG_FAILED
;
4772 nb_cli_enqueue_change(vty
, "./hold-time", NB_OP_MODIFY
, holdtime_str
);
4773 nb_cli_enqueue_change(vty
, "./keep-alive", NB_OP_MODIFY
, keepalive_str
);
4775 nb_cli_enqueue_change(vty
, "./connection-retry", NB_OP_MODIFY
,
4778 nb_cli_enqueue_change(vty
, "./connection-retry", NB_OP_DESTROY
,
4781 nb_cli_apply_changes(vty
, FRR_PIM_MSDP_XPATH
, "frr-pim:pimd", "pim",
4782 vrfname
, "frr-routing:ipv4");
4786 DEFPY(no_ip_msdp_timers
, no_ip_msdp_timers_cmd
,
4787 "no ip msdp timers [(1-65535) (1-65535) [(1-65535)]]",
4791 "MSDP timers configuration\n"
4796 const char *vrfname
;
4798 vrfname
= pim_cli_get_vrf_name(vty
);
4799 if (vrfname
== NULL
)
4800 return CMD_WARNING_CONFIG_FAILED
;
4802 nb_cli_enqueue_change(vty
, "./hold-time", NB_OP_DESTROY
, NULL
);
4803 nb_cli_enqueue_change(vty
, "./keep-alive", NB_OP_DESTROY
, NULL
);
4804 nb_cli_enqueue_change(vty
, "./connection-retry", NB_OP_DESTROY
, NULL
);
4806 nb_cli_apply_changes(vty
, FRR_PIM_MSDP_XPATH
, "frr-pim:pimd", "pim",
4807 vrfname
, "frr-routing:ipv4");
4812 DEFUN (no_ip_msdp_peer
,
4813 no_ip_msdp_peer_cmd
,
4814 "no ip msdp peer A.B.C.D",
4818 "Delete MSDP peer\n"
4819 "peer ip address\n")
4821 const char *vrfname
;
4822 char msdp_peer_xpath
[XPATH_MAXLEN
];
4823 char temp_xpath
[XPATH_MAXLEN
];
4825 vrfname
= pim_cli_get_vrf_name(vty
);
4826 if (vrfname
== NULL
)
4827 return CMD_WARNING_CONFIG_FAILED
;
4829 snprintf(msdp_peer_xpath
, sizeof(msdp_peer_xpath
),
4831 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4");
4832 snprintf(temp_xpath
, sizeof(temp_xpath
),
4833 "/msdp-peer[peer-ip='%s']",
4836 strlcat(msdp_peer_xpath
, temp_xpath
, sizeof(msdp_peer_xpath
));
4838 nb_cli_enqueue_change(vty
, msdp_peer_xpath
, NB_OP_DESTROY
, NULL
);
4840 return nb_cli_apply_changes(vty
, NULL
);
4843 DEFPY(ip_msdp_mesh_group_member
,
4844 ip_msdp_mesh_group_member_cmd
,
4845 "ip msdp mesh-group WORD$gname member A.B.C.D$maddr",
4848 "Configure MSDP mesh-group\n"
4850 "Mesh group member\n"
4851 "Peer IP address\n")
4853 const char *vrfname
;
4854 char xpath_value
[XPATH_MAXLEN
];
4856 vrfname
= pim_cli_get_vrf_name(vty
);
4857 if (vrfname
== NULL
)
4858 return CMD_WARNING_CONFIG_FAILED
;
4860 /* Create mesh group. */
4861 snprintf(xpath_value
, sizeof(xpath_value
),
4862 FRR_PIM_VRF_XPATH
"/msdp-mesh-groups[name='%s']",
4863 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4", gname
);
4864 nb_cli_enqueue_change(vty
, xpath_value
, NB_OP_CREATE
, NULL
);
4866 /* Create mesh group member. */
4867 strlcat(xpath_value
, "/members[address='", sizeof(xpath_value
));
4868 strlcat(xpath_value
, maddr_str
, sizeof(xpath_value
));
4869 strlcat(xpath_value
, "']", sizeof(xpath_value
));
4870 nb_cli_enqueue_change(vty
, xpath_value
, NB_OP_CREATE
, NULL
);
4872 return nb_cli_apply_changes(vty
, NULL
);
4875 DEFPY(no_ip_msdp_mesh_group_member
,
4876 no_ip_msdp_mesh_group_member_cmd
,
4877 "no ip msdp mesh-group WORD$gname member A.B.C.D$maddr",
4881 "Delete MSDP mesh-group member\n"
4883 "Mesh group member\n"
4884 "Peer IP address\n")
4886 const char *vrfname
;
4887 char xpath_value
[XPATH_MAXLEN
];
4888 char xpath_member_value
[XPATH_MAXLEN
];
4890 vrfname
= pim_cli_get_vrf_name(vty
);
4891 if (vrfname
== NULL
)
4892 return CMD_WARNING_CONFIG_FAILED
;
4894 /* Get mesh group base XPath. */
4895 snprintf(xpath_value
, sizeof(xpath_value
),
4896 FRR_PIM_VRF_XPATH
"/msdp-mesh-groups[name='%s']",
4897 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4", gname
);
4899 if (!yang_dnode_exists(vty
->candidate_config
->dnode
, xpath_value
)) {
4900 vty_out(vty
, "%% mesh-group does not exist\n");
4901 return CMD_WARNING_CONFIG_FAILED
;
4904 /* Remove mesh group member. */
4905 strlcpy(xpath_member_value
, xpath_value
, sizeof(xpath_member_value
));
4906 strlcat(xpath_member_value
, "/members[address='",
4907 sizeof(xpath_member_value
));
4908 strlcat(xpath_member_value
, maddr_str
, sizeof(xpath_member_value
));
4909 strlcat(xpath_member_value
, "']", sizeof(xpath_member_value
));
4910 if (!yang_dnode_exists(vty
->candidate_config
->dnode
,
4911 xpath_member_value
)) {
4912 vty_out(vty
, "%% mesh-group member does not exist\n");
4913 return CMD_WARNING_CONFIG_FAILED
;
4916 nb_cli_enqueue_change(vty
, xpath_member_value
, NB_OP_DESTROY
, NULL
);
4919 * If this is the last member, then we must remove the group altogether
4920 * to not break legacy CLI behaviour.
4922 pim_cli_legacy_mesh_group_behavior(vty
, gname
);
4924 return nb_cli_apply_changes(vty
, NULL
);
4927 DEFPY(ip_msdp_mesh_group_source
,
4928 ip_msdp_mesh_group_source_cmd
,
4929 "ip msdp mesh-group WORD$gname source A.B.C.D$saddr",
4932 "Configure MSDP mesh-group\n"
4934 "Mesh group local address\n"
4935 "Source IP address for the TCP connection\n")
4937 const char *vrfname
;
4938 char xpath_value
[XPATH_MAXLEN
];
4940 vrfname
= pim_cli_get_vrf_name(vty
);
4941 if (vrfname
== NULL
)
4942 return CMD_WARNING_CONFIG_FAILED
;
4944 /* Create mesh group. */
4945 snprintf(xpath_value
, sizeof(xpath_value
),
4946 FRR_PIM_VRF_XPATH
"/msdp-mesh-groups[name='%s']",
4947 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4", gname
);
4948 nb_cli_enqueue_change(vty
, xpath_value
, NB_OP_CREATE
, NULL
);
4950 /* Create mesh group source. */
4951 strlcat(xpath_value
, "/source", sizeof(xpath_value
));
4952 nb_cli_enqueue_change(vty
, xpath_value
, NB_OP_MODIFY
, saddr_str
);
4954 return nb_cli_apply_changes(vty
, NULL
);
4957 DEFPY(no_ip_msdp_mesh_group_source
,
4958 no_ip_msdp_mesh_group_source_cmd
,
4959 "no ip msdp mesh-group WORD$gname source [A.B.C.D]",
4963 "Delete MSDP mesh-group source\n"
4965 "Mesh group source\n"
4966 "Mesh group local address\n")
4968 const char *vrfname
;
4969 char xpath_value
[XPATH_MAXLEN
];
4971 vrfname
= pim_cli_get_vrf_name(vty
);
4972 if (vrfname
== NULL
)
4973 return CMD_WARNING_CONFIG_FAILED
;
4975 /* Get mesh group base XPath. */
4976 snprintf(xpath_value
, sizeof(xpath_value
),
4977 FRR_PIM_VRF_XPATH
"/msdp-mesh-groups[name='%s']",
4978 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4", gname
);
4979 nb_cli_enqueue_change(vty
, xpath_value
, NB_OP_CREATE
, NULL
);
4981 /* Create mesh group source. */
4982 strlcat(xpath_value
, "/source", sizeof(xpath_value
));
4983 nb_cli_enqueue_change(vty
, xpath_value
, NB_OP_DESTROY
, NULL
);
4986 * If this is the last member, then we must remove the group altogether
4987 * to not break legacy CLI behaviour.
4989 pim_cli_legacy_mesh_group_behavior(vty
, gname
);
4991 return nb_cli_apply_changes(vty
, NULL
);
4994 DEFPY(no_ip_msdp_mesh_group
,
4995 no_ip_msdp_mesh_group_cmd
,
4996 "no ip msdp mesh-group WORD$gname",
5000 "Delete MSDP mesh-group\n"
5001 "Mesh group name\n")
5003 const char *vrfname
;
5004 char xpath_value
[XPATH_MAXLEN
];
5006 vrfname
= pim_cli_get_vrf_name(vty
);
5007 if (vrfname
== NULL
)
5008 return CMD_WARNING_CONFIG_FAILED
;
5010 /* Get mesh group base XPath. */
5011 snprintf(xpath_value
, sizeof(xpath_value
),
5012 FRR_PIM_VRF_XPATH
"/msdp-mesh-groups[name='%s']",
5013 "frr-pim:pimd", "pim", vrfname
, "frr-routing:ipv4", gname
);
5014 if (!yang_dnode_exists(vty
->candidate_config
->dnode
, xpath_value
))
5017 nb_cli_enqueue_change(vty
, xpath_value
, NB_OP_DESTROY
, NULL
);
5018 return nb_cli_apply_changes(vty
, NULL
);
5021 static void ip_msdp_show_mesh_group(struct vty
*vty
, struct pim_msdp_mg
*mg
,
5022 struct json_object
*json
)
5024 struct listnode
*mbrnode
;
5025 struct pim_msdp_mg_mbr
*mbr
;
5026 char mbr_str
[INET_ADDRSTRLEN
];
5027 char src_str
[INET_ADDRSTRLEN
];
5028 char state_str
[PIM_MSDP_STATE_STRLEN
];
5029 enum pim_msdp_peer_state state
;
5030 json_object
*json_mg_row
= NULL
;
5031 json_object
*json_members
= NULL
;
5032 json_object
*json_row
= NULL
;
5034 pim_inet4_dump("<source?>", mg
->src_ip
, src_str
, sizeof(src_str
));
5036 /* currently there is only one mesh group but we should still
5038 * it a dict with mg-name as key */
5039 json_mg_row
= json_object_new_object();
5040 json_object_string_add(json_mg_row
, "name",
5041 mg
->mesh_group_name
);
5042 json_object_string_add(json_mg_row
, "source", src_str
);
5044 vty_out(vty
, "Mesh group : %s\n", mg
->mesh_group_name
);
5045 vty_out(vty
, " Source : %s\n", src_str
);
5046 vty_out(vty
, " Member State\n");
5049 for (ALL_LIST_ELEMENTS_RO(mg
->mbr_list
, mbrnode
, mbr
)) {
5050 pim_inet4_dump("<mbr?>", mbr
->mbr_ip
, mbr_str
, sizeof(mbr_str
));
5052 state
= mbr
->mp
->state
;
5054 state
= PIM_MSDP_DISABLED
;
5056 pim_msdp_state_dump(state
, state_str
, sizeof(state_str
));
5058 json_row
= json_object_new_object();
5059 json_object_string_add(json_row
, "member", mbr_str
);
5060 json_object_string_add(json_row
, "state", state_str
);
5061 if (!json_members
) {
5062 json_members
= json_object_new_object();
5063 json_object_object_add(json_mg_row
, "members",
5066 json_object_object_add(json_members
, mbr_str
, json_row
);
5068 vty_out(vty
, " %-15s %11s\n", mbr_str
, state_str
);
5073 json_object_object_add(json
, mg
->mesh_group_name
, json_mg_row
);
5076 DEFUN (show_ip_msdp_mesh_group
,
5077 show_ip_msdp_mesh_group_cmd
,
5078 "show ip msdp [vrf NAME] mesh-group [json]",
5083 "MSDP mesh-group information\n"
5086 bool uj
= use_json(argc
, argv
);
5088 struct pim_msdp_mg
*mg
;
5089 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
5090 struct pim_instance
*pim
;
5091 struct json_object
*json
= NULL
;
5097 /* Quick case: list is empty. */
5098 if (SLIST_EMPTY(&pim
->msdp
.mglist
)) {
5100 vty_out(vty
, "{}\n");
5106 json
= json_object_new_object();
5108 SLIST_FOREACH (mg
, &pim
->msdp
.mglist
, mg_entry
)
5109 ip_msdp_show_mesh_group(vty
, mg
, json
);
5112 vty_json(vty
, json
);
5117 DEFUN (show_ip_msdp_mesh_group_vrf_all
,
5118 show_ip_msdp_mesh_group_vrf_all_cmd
,
5119 "show ip msdp vrf all mesh-group [json]",
5124 "MSDP mesh-group information\n"
5127 bool uj
= use_json(argc
, argv
);
5128 struct json_object
*json
= NULL
, *vrf_json
= NULL
;
5129 struct pim_instance
*pim
;
5130 struct pim_msdp_mg
*mg
;
5134 json
= json_object_new_object();
5136 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
5138 vrf_json
= json_object_new_object();
5139 json_object_object_add(json
, vrf
->name
, vrf_json
);
5141 vty_out(vty
, "VRF: %s\n", vrf
->name
);
5144 SLIST_FOREACH (mg
, &pim
->msdp
.mglist
, mg_entry
)
5145 ip_msdp_show_mesh_group(vty
, mg
, vrf_json
);
5149 vty_json(vty
, json
);
5155 static void ip_msdp_show_peers(struct pim_instance
*pim
, struct vty
*vty
,
5158 struct listnode
*mpnode
;
5159 struct pim_msdp_peer
*mp
;
5160 char peer_str
[INET_ADDRSTRLEN
];
5161 char local_str
[INET_ADDRSTRLEN
];
5162 char state_str
[PIM_MSDP_STATE_STRLEN
];
5163 char timebuf
[PIM_MSDP_UPTIME_STRLEN
];
5165 json_object
*json
= NULL
;
5166 json_object
*json_row
= NULL
;
5170 json
= json_object_new_object();
5173 "Peer Local State Uptime SaCnt\n");
5176 for (ALL_LIST_ELEMENTS_RO(pim
->msdp
.peer_list
, mpnode
, mp
)) {
5177 if (mp
->state
== PIM_MSDP_ESTABLISHED
) {
5178 now
= pim_time_monotonic_sec();
5179 pim_time_uptime(timebuf
, sizeof(timebuf
),
5182 strlcpy(timebuf
, "-", sizeof(timebuf
));
5184 pim_inet4_dump("<peer?>", mp
->peer
, peer_str
, sizeof(peer_str
));
5185 pim_inet4_dump("<local?>", mp
->local
, local_str
,
5187 pim_msdp_state_dump(mp
->state
, state_str
, sizeof(state_str
));
5189 json_row
= json_object_new_object();
5190 json_object_string_add(json_row
, "peer", peer_str
);
5191 json_object_string_add(json_row
, "local", local_str
);
5192 json_object_string_add(json_row
, "state", state_str
);
5193 json_object_string_add(json_row
, "upTime", timebuf
);
5194 json_object_int_add(json_row
, "saCount", mp
->sa_cnt
);
5195 json_object_object_add(json
, peer_str
, json_row
);
5197 vty_out(vty
, "%-15s %15s %11s %8s %6d\n", peer_str
,
5198 local_str
, state_str
, timebuf
, mp
->sa_cnt
);
5203 vty_json(vty
, json
);
5206 static void ip_msdp_show_peers_detail(struct pim_instance
*pim
, struct vty
*vty
,
5207 const char *peer
, bool uj
)
5209 struct listnode
*mpnode
;
5210 struct pim_msdp_peer
*mp
;
5211 char peer_str
[INET_ADDRSTRLEN
];
5212 char local_str
[INET_ADDRSTRLEN
];
5213 char state_str
[PIM_MSDP_STATE_STRLEN
];
5214 char timebuf
[PIM_MSDP_UPTIME_STRLEN
];
5215 char katimer
[PIM_MSDP_TIMER_STRLEN
];
5216 char crtimer
[PIM_MSDP_TIMER_STRLEN
];
5217 char holdtimer
[PIM_MSDP_TIMER_STRLEN
];
5219 json_object
*json
= NULL
;
5220 json_object
*json_row
= NULL
;
5223 json
= json_object_new_object();
5226 for (ALL_LIST_ELEMENTS_RO(pim
->msdp
.peer_list
, mpnode
, mp
)) {
5227 pim_inet4_dump("<peer?>", mp
->peer
, peer_str
, sizeof(peer_str
));
5228 if (strcmp(peer
, "detail") && strcmp(peer
, peer_str
))
5231 if (mp
->state
== PIM_MSDP_ESTABLISHED
) {
5232 now
= pim_time_monotonic_sec();
5233 pim_time_uptime(timebuf
, sizeof(timebuf
),
5236 strlcpy(timebuf
, "-", sizeof(timebuf
));
5238 pim_inet4_dump("<local?>", mp
->local
, local_str
,
5240 pim_msdp_state_dump(mp
->state
, state_str
, sizeof(state_str
));
5241 pim_time_timer_to_hhmmss(katimer
, sizeof(katimer
),
5243 pim_time_timer_to_hhmmss(crtimer
, sizeof(crtimer
),
5245 pim_time_timer_to_hhmmss(holdtimer
, sizeof(holdtimer
),
5249 json_row
= json_object_new_object();
5250 json_object_string_add(json_row
, "peer", peer_str
);
5251 json_object_string_add(json_row
, "local", local_str
);
5252 if (mp
->flags
& PIM_MSDP_PEERF_IN_GROUP
)
5253 json_object_string_add(json_row
,
5255 mp
->mesh_group_name
);
5256 json_object_string_add(json_row
, "state", state_str
);
5257 json_object_string_add(json_row
, "upTime", timebuf
);
5258 json_object_string_add(json_row
, "keepAliveTimer",
5260 json_object_string_add(json_row
, "connRetryTimer",
5262 json_object_string_add(json_row
, "holdTimer",
5264 json_object_string_add(json_row
, "lastReset",
5266 json_object_int_add(json_row
, "connAttempts",
5268 json_object_int_add(json_row
, "establishedChanges",
5270 json_object_int_add(json_row
, "saCount", mp
->sa_cnt
);
5271 json_object_int_add(json_row
, "kaSent", mp
->ka_tx_cnt
);
5272 json_object_int_add(json_row
, "kaRcvd", mp
->ka_rx_cnt
);
5273 json_object_int_add(json_row
, "saSent", mp
->sa_tx_cnt
);
5274 json_object_int_add(json_row
, "saRcvd", mp
->sa_rx_cnt
);
5275 json_object_object_add(json
, peer_str
, json_row
);
5277 vty_out(vty
, "Peer : %s\n", peer_str
);
5278 vty_out(vty
, " Local : %s\n", local_str
);
5279 if (mp
->flags
& PIM_MSDP_PEERF_IN_GROUP
)
5280 vty_out(vty
, " Mesh Group : %s\n",
5281 mp
->mesh_group_name
);
5282 vty_out(vty
, " State : %s\n", state_str
);
5283 vty_out(vty
, " Uptime : %s\n", timebuf
);
5285 vty_out(vty
, " Keepalive Timer : %s\n", katimer
);
5286 vty_out(vty
, " Conn Retry Timer : %s\n", crtimer
);
5287 vty_out(vty
, " Hold Timer : %s\n", holdtimer
);
5288 vty_out(vty
, " Last Reset : %s\n",
5290 vty_out(vty
, " Conn Attempts : %d\n",
5292 vty_out(vty
, " Established Changes : %d\n",
5294 vty_out(vty
, " SA Count : %d\n",
5296 vty_out(vty
, " Statistics :\n");
5299 vty_out(vty
, " Keepalives : %10d %10d\n",
5300 mp
->ka_tx_cnt
, mp
->ka_rx_cnt
);
5301 vty_out(vty
, " SAs : %10d %10d\n",
5302 mp
->sa_tx_cnt
, mp
->sa_rx_cnt
);
5308 vty_json(vty
, json
);
5311 DEFUN (show_ip_msdp_peer_detail
,
5312 show_ip_msdp_peer_detail_cmd
,
5313 "show ip msdp [vrf NAME] peer [detail|A.B.C.D] [json]",
5318 "MSDP peer information\n"
5323 bool uj
= use_json(argc
, argv
);
5325 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
5332 if (argv_find(argv
, argc
, "detail", &idx
))
5333 arg
= argv
[idx
]->text
;
5334 else if (argv_find(argv
, argc
, "A.B.C.D", &idx
))
5335 arg
= argv
[idx
]->arg
;
5338 ip_msdp_show_peers_detail(vrf
->info
, vty
, argv
[idx
]->arg
, uj
);
5340 ip_msdp_show_peers(vrf
->info
, vty
, uj
);
5345 DEFUN (show_ip_msdp_peer_detail_vrf_all
,
5346 show_ip_msdp_peer_detail_vrf_all_cmd
,
5347 "show ip msdp vrf all peer [detail|A.B.C.D] [json]",
5352 "MSDP peer information\n"
5358 bool uj
= use_json(argc
, argv
);
5364 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
5368 vty_out(vty
, " \"%s\": ", vrf
->name
);
5371 vty_out(vty
, "VRF: %s\n", vrf
->name
);
5372 if (argv_find(argv
, argc
, "detail", &idx
)
5373 || argv_find(argv
, argc
, "A.B.C.D", &idx
))
5374 ip_msdp_show_peers_detail(vrf
->info
, vty
,
5375 argv
[idx
]->arg
, uj
);
5377 ip_msdp_show_peers(vrf
->info
, vty
, uj
);
5380 vty_out(vty
, "}\n");
5385 static void ip_msdp_show_sa(struct pim_instance
*pim
, struct vty
*vty
, bool uj
)
5387 struct listnode
*sanode
;
5388 struct pim_msdp_sa
*sa
;
5389 char rp_str
[INET_ADDRSTRLEN
];
5390 char timebuf
[PIM_MSDP_UPTIME_STRLEN
];
5394 json_object
*json
= NULL
;
5395 json_object
*json_group
= NULL
;
5396 json_object
*json_row
= NULL
;
5399 json
= json_object_new_object();
5402 "Source Group RP Local SPT Uptime\n");
5405 for (ALL_LIST_ELEMENTS_RO(pim
->msdp
.sa_list
, sanode
, sa
)) {
5406 now
= pim_time_monotonic_sec();
5407 pim_time_uptime(timebuf
, sizeof(timebuf
), now
- sa
->uptime
);
5408 if (sa
->flags
& PIM_MSDP_SAF_PEER
) {
5409 pim_inet4_dump("<rp?>", sa
->rp
, rp_str
, sizeof(rp_str
));
5411 strlcpy(spt_str
, "yes", sizeof(spt_str
));
5413 strlcpy(spt_str
, "no", sizeof(spt_str
));
5416 strlcpy(rp_str
, "-", sizeof(rp_str
));
5417 strlcpy(spt_str
, "-", sizeof(spt_str
));
5419 if (sa
->flags
& PIM_MSDP_SAF_LOCAL
) {
5420 strlcpy(local_str
, "yes", sizeof(local_str
));
5422 strlcpy(local_str
, "no", sizeof(local_str
));
5425 char src_str
[PIM_ADDRSTRLEN
];
5426 char grp_str
[PIM_ADDRSTRLEN
];
5428 snprintfrr(grp_str
, sizeof(grp_str
), "%pPAs",
5430 snprintfrr(src_str
, sizeof(src_str
), "%pPAs",
5433 json_object_object_get_ex(json
, grp_str
, &json_group
);
5436 json_group
= json_object_new_object();
5437 json_object_object_add(json
, grp_str
,
5441 json_row
= json_object_new_object();
5442 json_object_string_add(json_row
, "source", src_str
);
5443 json_object_string_add(json_row
, "group", grp_str
);
5444 json_object_string_add(json_row
, "rp", rp_str
);
5445 json_object_string_add(json_row
, "local", local_str
);
5446 json_object_string_add(json_row
, "sptSetup", spt_str
);
5447 json_object_string_add(json_row
, "upTime", timebuf
);
5448 json_object_object_add(json_group
, src_str
, json_row
);
5450 vty_out(vty
, "%-15pPAs %15pPAs %15s %5c %3c %8s\n",
5451 &sa
->sg
.src
, &sa
->sg
.grp
, rp_str
, local_str
[0],
5452 spt_str
[0], timebuf
);
5457 vty_json(vty
, json
);
5460 static void ip_msdp_show_sa_entry_detail(struct pim_msdp_sa
*sa
,
5461 const char *src_str
,
5462 const char *grp_str
, struct vty
*vty
,
5463 bool uj
, json_object
*json
)
5465 char rp_str
[INET_ADDRSTRLEN
];
5466 char peer_str
[INET_ADDRSTRLEN
];
5467 char timebuf
[PIM_MSDP_UPTIME_STRLEN
];
5470 char statetimer
[PIM_MSDP_TIMER_STRLEN
];
5472 json_object
*json_group
= NULL
;
5473 json_object
*json_row
= NULL
;
5475 now
= pim_time_monotonic_sec();
5476 pim_time_uptime(timebuf
, sizeof(timebuf
), now
- sa
->uptime
);
5477 if (sa
->flags
& PIM_MSDP_SAF_PEER
) {
5478 pim_inet4_dump("<rp?>", sa
->rp
, rp_str
, sizeof(rp_str
));
5479 pim_inet4_dump("<peer?>", sa
->peer
, peer_str
, sizeof(peer_str
));
5481 strlcpy(spt_str
, "yes", sizeof(spt_str
));
5483 strlcpy(spt_str
, "no", sizeof(spt_str
));
5486 strlcpy(rp_str
, "-", sizeof(rp_str
));
5487 strlcpy(peer_str
, "-", sizeof(peer_str
));
5488 strlcpy(spt_str
, "-", sizeof(spt_str
));
5490 if (sa
->flags
& PIM_MSDP_SAF_LOCAL
) {
5491 strlcpy(local_str
, "yes", sizeof(local_str
));
5493 strlcpy(local_str
, "no", sizeof(local_str
));
5495 pim_time_timer_to_hhmmss(statetimer
, sizeof(statetimer
),
5496 sa
->sa_state_timer
);
5498 json_object_object_get_ex(json
, grp_str
, &json_group
);
5501 json_group
= json_object_new_object();
5502 json_object_object_add(json
, grp_str
, json_group
);
5505 json_row
= json_object_new_object();
5506 json_object_string_add(json_row
, "source", src_str
);
5507 json_object_string_add(json_row
, "group", grp_str
);
5508 json_object_string_add(json_row
, "rp", rp_str
);
5509 json_object_string_add(json_row
, "local", local_str
);
5510 json_object_string_add(json_row
, "sptSetup", spt_str
);
5511 json_object_string_add(json_row
, "upTime", timebuf
);
5512 json_object_string_add(json_row
, "stateTimer", statetimer
);
5513 json_object_object_add(json_group
, src_str
, json_row
);
5515 vty_out(vty
, "SA : %s\n", sa
->sg_str
);
5516 vty_out(vty
, " RP : %s\n", rp_str
);
5517 vty_out(vty
, " Peer : %s\n", peer_str
);
5518 vty_out(vty
, " Local : %s\n", local_str
);
5519 vty_out(vty
, " SPT Setup : %s\n", spt_str
);
5520 vty_out(vty
, " Uptime : %s\n", timebuf
);
5521 vty_out(vty
, " State Timer : %s\n", statetimer
);
5526 static void ip_msdp_show_sa_detail(struct pim_instance
*pim
, struct vty
*vty
,
5529 struct listnode
*sanode
;
5530 struct pim_msdp_sa
*sa
;
5531 json_object
*json
= NULL
;
5534 json
= json_object_new_object();
5537 for (ALL_LIST_ELEMENTS_RO(pim
->msdp
.sa_list
, sanode
, sa
)) {
5538 char src_str
[PIM_ADDRSTRLEN
];
5539 char grp_str
[PIM_ADDRSTRLEN
];
5541 snprintfrr(grp_str
, sizeof(grp_str
), "%pPAs", &sa
->sg
.grp
);
5542 snprintfrr(src_str
, sizeof(src_str
), "%pPAs", &sa
->sg
.src
);
5544 ip_msdp_show_sa_entry_detail(sa
, src_str
, grp_str
, vty
, uj
,
5549 vty_json(vty
, json
);
5552 DEFUN (show_ip_msdp_sa_detail
,
5553 show_ip_msdp_sa_detail_cmd
,
5554 "show ip msdp [vrf NAME] sa detail [json]",
5559 "MSDP active-source information\n"
5563 bool uj
= use_json(argc
, argv
);
5565 struct vrf
*vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
5570 ip_msdp_show_sa_detail(vrf
->info
, vty
, uj
);
5575 DEFUN (show_ip_msdp_sa_detail_vrf_all
,
5576 show_ip_msdp_sa_detail_vrf_all_cmd
,
5577 "show ip msdp vrf all sa detail [json]",
5582 "MSDP active-source information\n"
5586 bool uj
= use_json(argc
, argv
);
5592 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
5596 vty_out(vty
, " \"%s\": ", vrf
->name
);
5599 vty_out(vty
, "VRF: %s\n", vrf
->name
);
5600 ip_msdp_show_sa_detail(vrf
->info
, vty
, uj
);
5603 vty_out(vty
, "}\n");
5608 static void ip_msdp_show_sa_addr(struct pim_instance
*pim
, struct vty
*vty
,
5609 const char *addr
, bool uj
)
5611 struct listnode
*sanode
;
5612 struct pim_msdp_sa
*sa
;
5613 json_object
*json
= NULL
;
5616 json
= json_object_new_object();
5619 for (ALL_LIST_ELEMENTS_RO(pim
->msdp
.sa_list
, sanode
, sa
)) {
5620 char src_str
[PIM_ADDRSTRLEN
];
5621 char grp_str
[PIM_ADDRSTRLEN
];
5623 snprintfrr(grp_str
, sizeof(grp_str
), "%pPAs", &sa
->sg
.grp
);
5624 snprintfrr(src_str
, sizeof(src_str
), "%pPAs", &sa
->sg
.src
);
5626 if (!strcmp(addr
, src_str
) || !strcmp(addr
, grp_str
)) {
5627 ip_msdp_show_sa_entry_detail(sa
, src_str
, grp_str
, vty
,
5633 vty_json(vty
, json
);
5636 static void ip_msdp_show_sa_sg(struct pim_instance
*pim
, struct vty
*vty
,
5637 const char *src
, const char *grp
, bool uj
)
5639 struct listnode
*sanode
;
5640 struct pim_msdp_sa
*sa
;
5641 json_object
*json
= NULL
;
5644 json
= json_object_new_object();
5647 for (ALL_LIST_ELEMENTS_RO(pim
->msdp
.sa_list
, sanode
, sa
)) {
5648 char src_str
[PIM_ADDRSTRLEN
];
5649 char grp_str
[PIM_ADDRSTRLEN
];
5651 snprintfrr(grp_str
, sizeof(grp_str
), "%pPAs", &sa
->sg
.grp
);
5652 snprintfrr(src_str
, sizeof(src_str
), "%pPAs", &sa
->sg
.src
);
5654 if (!strcmp(src
, src_str
) && !strcmp(grp
, grp_str
)) {
5655 ip_msdp_show_sa_entry_detail(sa
, src_str
, grp_str
, vty
,
5661 vty_json(vty
, json
);
5664 DEFUN (show_ip_msdp_sa_sg
,
5665 show_ip_msdp_sa_sg_cmd
,
5666 "show ip msdp [vrf NAME] sa [A.B.C.D [A.B.C.D]] [json]",
5671 "MSDP active-source information\n"
5672 "source or group ip\n"
5676 bool uj
= use_json(argc
, argv
);
5680 vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
5685 char *src_ip
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
++]->arg
5687 char *grp_ip
= idx
< argc
&& argv_find(argv
, argc
, "A.B.C.D", &idx
)
5691 if (src_ip
&& grp_ip
)
5692 ip_msdp_show_sa_sg(vrf
->info
, vty
, src_ip
, grp_ip
, uj
);
5694 ip_msdp_show_sa_addr(vrf
->info
, vty
, src_ip
, uj
);
5696 ip_msdp_show_sa(vrf
->info
, vty
, uj
);
5701 DEFUN (show_ip_msdp_sa_sg_vrf_all
,
5702 show_ip_msdp_sa_sg_vrf_all_cmd
,
5703 "show ip msdp vrf all sa [A.B.C.D [A.B.C.D]] [json]",
5708 "MSDP active-source information\n"
5709 "source or group ip\n"
5713 bool uj
= use_json(argc
, argv
);
5718 char *src_ip
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
++]->arg
5720 char *grp_ip
= idx
< argc
&& argv_find(argv
, argc
, "A.B.C.D", &idx
)
5726 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
5730 vty_out(vty
, " \"%s\": ", vrf
->name
);
5733 vty_out(vty
, "VRF: %s\n", vrf
->name
);
5735 if (src_ip
&& grp_ip
)
5736 ip_msdp_show_sa_sg(vrf
->info
, vty
, src_ip
, grp_ip
, uj
);
5738 ip_msdp_show_sa_addr(vrf
->info
, vty
, src_ip
, uj
);
5740 ip_msdp_show_sa(vrf
->info
, vty
, uj
);
5743 vty_out(vty
, "}\n");
5748 struct pim_sg_cache_walk_data
{
5751 json_object
*json_group
;
5752 struct in_addr addr
;
5756 static void pim_show_vxlan_sg_entry(struct pim_vxlan_sg
*vxlan_sg
,
5757 struct pim_sg_cache_walk_data
*cwd
)
5759 struct vty
*vty
= cwd
->vty
;
5760 json_object
*json
= cwd
->json
;
5761 json_object
*json_row
;
5762 bool installed
= (vxlan_sg
->up
) ? true : false;
5763 const char *iif_name
= vxlan_sg
->iif
?vxlan_sg
->iif
->name
:"-";
5764 const char *oif_name
;
5766 if (pim_vxlan_is_orig_mroute(vxlan_sg
))
5767 oif_name
= vxlan_sg
->orig_oif
?vxlan_sg
->orig_oif
->name
:"";
5769 oif_name
= vxlan_sg
->term_oif
?vxlan_sg
->term_oif
->name
:"";
5771 if (cwd
->addr_match
&& pim_addr_cmp(vxlan_sg
->sg
.src
, cwd
->addr
) &&
5772 pim_addr_cmp(vxlan_sg
->sg
.grp
, cwd
->addr
)) {
5776 char src_str
[PIM_ADDRSTRLEN
];
5777 char grp_str
[PIM_ADDRSTRLEN
];
5779 snprintfrr(grp_str
, sizeof(grp_str
), "%pPAs",
5781 snprintfrr(src_str
, sizeof(src_str
), "%pPAs",
5784 json_object_object_get_ex(json
, grp_str
, &cwd
->json_group
);
5786 if (!cwd
->json_group
) {
5787 cwd
->json_group
= json_object_new_object();
5788 json_object_object_add(json
, grp_str
,
5792 json_row
= json_object_new_object();
5793 json_object_string_add(json_row
, "source", src_str
);
5794 json_object_string_add(json_row
, "group", grp_str
);
5795 json_object_string_add(json_row
, "input", iif_name
);
5796 json_object_string_add(json_row
, "output", oif_name
);
5798 json_object_boolean_true_add(json_row
, "installed");
5800 json_object_boolean_false_add(json_row
, "installed");
5801 json_object_object_add(cwd
->json_group
, src_str
, json_row
);
5803 vty_out(vty
, "%-15pPAs %-15pPAs %-15s %-15s %-5s\n",
5804 &vxlan_sg
->sg
.src
, &vxlan_sg
->sg
.grp
, iif_name
,
5805 oif_name
, installed
? "I" : "");
5809 static void pim_show_vxlan_sg_hash_entry(struct hash_bucket
*bucket
, void *arg
)
5811 pim_show_vxlan_sg_entry((struct pim_vxlan_sg
*)bucket
->data
,
5812 (struct pim_sg_cache_walk_data
*)arg
);
5815 static void pim_show_vxlan_sg(struct pim_instance
*pim
,
5816 struct vty
*vty
, bool uj
)
5818 json_object
*json
= NULL
;
5819 struct pim_sg_cache_walk_data cwd
;
5822 json
= json_object_new_object();
5824 vty_out(vty
, "Codes: I -> installed\n");
5826 "Source Group Input Output Flags\n");
5829 memset(&cwd
, 0, sizeof(cwd
));
5832 hash_iterate(pim
->vxlan
.sg_hash
, pim_show_vxlan_sg_hash_entry
, &cwd
);
5835 vty_json(vty
, json
);
5838 static void pim_show_vxlan_sg_match_addr(struct pim_instance
*pim
,
5839 struct vty
*vty
, char *addr_str
,
5842 json_object
*json
= NULL
;
5843 struct pim_sg_cache_walk_data cwd
;
5846 memset(&cwd
, 0, sizeof(cwd
));
5847 result
= inet_pton(AF_INET
, addr_str
, &cwd
.addr
);
5849 vty_out(vty
, "Bad address %s: errno=%d: %s\n", addr_str
,
5850 errno
, safe_strerror(errno
));
5855 json
= json_object_new_object();
5857 vty_out(vty
, "Codes: I -> installed\n");
5859 "Source Group Input Output Flags\n");
5864 cwd
.addr_match
= true;
5865 hash_iterate(pim
->vxlan
.sg_hash
, pim_show_vxlan_sg_hash_entry
, &cwd
);
5868 vty_json(vty
, json
);
5871 static void pim_show_vxlan_sg_one(struct pim_instance
*pim
,
5872 struct vty
*vty
, char *src_str
, char *grp_str
,
5875 json_object
*json
= NULL
;
5878 struct pim_vxlan_sg
*vxlan_sg
;
5879 const char *iif_name
;
5881 const char *oif_name
;
5883 result
= inet_pton(AF_INET
, src_str
, &sg
.src
);
5885 vty_out(vty
, "Bad src address %s: errno=%d: %s\n", src_str
,
5886 errno
, safe_strerror(errno
));
5889 result
= inet_pton(AF_INET
, grp_str
, &sg
.grp
);
5891 vty_out(vty
, "Bad grp address %s: errno=%d: %s\n", grp_str
,
5892 errno
, safe_strerror(errno
));
5897 json
= json_object_new_object();
5899 vxlan_sg
= pim_vxlan_sg_find(pim
, &sg
);
5901 installed
= (vxlan_sg
->up
) ? true : false;
5902 iif_name
= vxlan_sg
->iif
?vxlan_sg
->iif
->name
:"-";
5904 if (pim_vxlan_is_orig_mroute(vxlan_sg
))
5906 vxlan_sg
->orig_oif
?vxlan_sg
->orig_oif
->name
:"";
5909 vxlan_sg
->term_oif
?vxlan_sg
->term_oif
->name
:"";
5912 json_object_string_add(json
, "source", src_str
);
5913 json_object_string_add(json
, "group", grp_str
);
5914 json_object_string_add(json
, "input", iif_name
);
5915 json_object_string_add(json
, "output", oif_name
);
5917 json_object_boolean_true_add(json
, "installed");
5919 json_object_boolean_false_add(json
,
5922 vty_out(vty
, "SG : %s\n", vxlan_sg
->sg_str
);
5923 vty_out(vty
, " Input : %s\n", iif_name
);
5924 vty_out(vty
, " Output : %s\n", oif_name
);
5925 vty_out(vty
, " installed : %s\n",
5926 installed
?"yes":"no");
5931 vty_json(vty
, json
);
5934 DEFUN (show_ip_pim_vxlan_sg
,
5935 show_ip_pim_vxlan_sg_cmd
,
5936 "show ip pim [vrf NAME] vxlan-groups [A.B.C.D [A.B.C.D]] [json]",
5941 "VxLAN BUM groups\n"
5942 "source or group ip\n"
5946 bool uj
= use_json(argc
, argv
);
5950 vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
5955 char *src_ip
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ?
5956 argv
[idx
++]->arg
:NULL
;
5957 char *grp_ip
= idx
< argc
&& argv_find(argv
, argc
, "A.B.C.D", &idx
) ?
5958 argv
[idx
]->arg
:NULL
;
5960 if (src_ip
&& grp_ip
)
5961 pim_show_vxlan_sg_one(vrf
->info
, vty
, src_ip
, grp_ip
, uj
);
5963 pim_show_vxlan_sg_match_addr(vrf
->info
, vty
, src_ip
, uj
);
5965 pim_show_vxlan_sg(vrf
->info
, vty
, uj
);
5970 static void pim_show_vxlan_sg_work(struct pim_instance
*pim
,
5971 struct vty
*vty
, bool uj
)
5973 json_object
*json
= NULL
;
5974 struct pim_sg_cache_walk_data cwd
;
5975 struct listnode
*node
;
5976 struct pim_vxlan_sg
*vxlan_sg
;
5979 json
= json_object_new_object();
5981 vty_out(vty
, "Codes: I -> installed\n");
5983 "Source Group Input Flags\n");
5986 memset(&cwd
, 0, sizeof(cwd
));
5989 for (ALL_LIST_ELEMENTS_RO(pim_vxlan_p
->work_list
, node
, vxlan_sg
))
5990 pim_show_vxlan_sg_entry(vxlan_sg
, &cwd
);
5993 vty_json(vty
, json
);
5996 DEFUN_HIDDEN (show_ip_pim_vxlan_sg_work
,
5997 show_ip_pim_vxlan_sg_work_cmd
,
5998 "show ip pim [vrf NAME] vxlan-work [json]",
6006 bool uj
= use_json(argc
, argv
);
6010 vrf
= pim_cmd_lookup_vrf(vty
, argv
, argc
, &idx
);
6015 pim_show_vxlan_sg_work(vrf
->info
, vty
, uj
);
6020 DEFUN_HIDDEN (no_ip_pim_mlag
,
6028 char mlag_xpath
[XPATH_MAXLEN
];
6030 snprintf(mlag_xpath
, sizeof(mlag_xpath
), FRR_PIM_VRF_XPATH
,
6031 "frr-pim:pimd", "pim", "default", "frr-routing:ipv4");
6032 strlcat(mlag_xpath
, "/mlag", sizeof(mlag_xpath
));
6034 nb_cli_enqueue_change(vty
, mlag_xpath
, NB_OP_DESTROY
, NULL
);
6037 return nb_cli_apply_changes(vty
, NULL
);
6040 DEFUN_HIDDEN (ip_pim_mlag
,
6042 "ip pim mlag INTERFACE role [primary|secondary] state [up|down] addr A.B.C.D",
6046 "peerlink sub interface\n"
6048 "MLAG role primary\n"
6049 "MLAG role secondary\n"
6050 "peer session state\n"
6051 "peer session state up\n"
6052 "peer session state down\n"
6054 "unique ip address\n")
6057 char mlag_peerlink_rif_xpath
[XPATH_MAXLEN
];
6058 char mlag_my_role_xpath
[XPATH_MAXLEN
];
6059 char mlag_peer_state_xpath
[XPATH_MAXLEN
];
6060 char mlag_reg_address_xpath
[XPATH_MAXLEN
];
6062 snprintf(mlag_peerlink_rif_xpath
, sizeof(mlag_peerlink_rif_xpath
),
6064 "frr-pim:pimd", "pim", "default", "frr-routing:ipv4");
6065 strlcat(mlag_peerlink_rif_xpath
, "/mlag/peerlink-rif",
6066 sizeof(mlag_peerlink_rif_xpath
));
6069 nb_cli_enqueue_change(vty
, mlag_peerlink_rif_xpath
, NB_OP_MODIFY
,
6072 snprintf(mlag_my_role_xpath
, sizeof(mlag_my_role_xpath
),
6074 "frr-pim:pimd", "pim", "default", "frr-routing:ipv4");
6075 strlcat(mlag_my_role_xpath
, "/mlag/my-role",
6076 sizeof(mlag_my_role_xpath
));
6079 if (!strcmp(argv
[idx
]->arg
, "primary")) {
6080 nb_cli_enqueue_change(vty
, mlag_my_role_xpath
, NB_OP_MODIFY
,
6081 "MLAG_ROLE_PRIMARY");
6083 } else if (!strcmp(argv
[idx
]->arg
, "secondary")) {
6084 nb_cli_enqueue_change(vty
, mlag_my_role_xpath
, NB_OP_MODIFY
,
6085 "MLAG_ROLE_SECONDARY");
6088 vty_out(vty
, "unknown MLAG role %s\n", argv
[idx
]->arg
);
6092 snprintf(mlag_peer_state_xpath
, sizeof(mlag_peer_state_xpath
),
6094 "frr-pim:pimd", "pim", "default", "frr-routing:ipv4");
6095 strlcat(mlag_peer_state_xpath
, "/mlag/peer-state",
6096 sizeof(mlag_peer_state_xpath
));
6099 if (!strcmp(argv
[idx
]->arg
, "up")) {
6100 nb_cli_enqueue_change(vty
, mlag_peer_state_xpath
, NB_OP_MODIFY
,
6103 } else if (strcmp(argv
[idx
]->arg
, "down")) {
6104 nb_cli_enqueue_change(vty
, mlag_peer_state_xpath
, NB_OP_MODIFY
,
6108 vty_out(vty
, "unknown MLAG state %s\n", argv
[idx
]->arg
);
6112 snprintf(mlag_reg_address_xpath
, sizeof(mlag_reg_address_xpath
),
6114 "frr-pim:pimd", "pim", "default", "frr-routing:ipv4");
6115 strlcat(mlag_reg_address_xpath
, "/mlag/reg-address",
6116 sizeof(mlag_reg_address_xpath
));
6119 nb_cli_enqueue_change(vty
, mlag_reg_address_xpath
, NB_OP_MODIFY
,
6122 return nb_cli_apply_changes(vty
, NULL
);
6125 void pim_cmd_init(void)
6127 if_cmd_init(pim_interface_config_write
);
6129 install_node(&debug_node
);
6131 install_element(ENABLE_NODE
, &pim_test_sg_keepalive_cmd
);
6133 install_element(CONFIG_NODE
, &ip_pim_rp_cmd
);
6134 install_element(VRF_NODE
, &ip_pim_rp_cmd
);
6135 install_element(CONFIG_NODE
, &no_ip_pim_rp_cmd
);
6136 install_element(VRF_NODE
, &no_ip_pim_rp_cmd
);
6137 install_element(CONFIG_NODE
, &ip_pim_rp_prefix_list_cmd
);
6138 install_element(VRF_NODE
, &ip_pim_rp_prefix_list_cmd
);
6139 install_element(CONFIG_NODE
, &no_ip_pim_rp_prefix_list_cmd
);
6140 install_element(VRF_NODE
, &no_ip_pim_rp_prefix_list_cmd
);
6141 install_element(CONFIG_NODE
, &no_ip_pim_ssm_prefix_list_cmd
);
6142 install_element(VRF_NODE
, &no_ip_pim_ssm_prefix_list_cmd
);
6143 install_element(CONFIG_NODE
, &no_ip_pim_ssm_prefix_list_name_cmd
);
6144 install_element(VRF_NODE
, &no_ip_pim_ssm_prefix_list_name_cmd
);
6145 install_element(CONFIG_NODE
, &ip_pim_ssm_prefix_list_cmd
);
6146 install_element(VRF_NODE
, &ip_pim_ssm_prefix_list_cmd
);
6147 install_element(CONFIG_NODE
, &ip_pim_register_suppress_cmd
);
6148 install_element(CONFIG_NODE
, &no_ip_pim_register_suppress_cmd
);
6149 install_element(CONFIG_NODE
, &ip_pim_spt_switchover_infinity_cmd
);
6150 install_element(VRF_NODE
, &ip_pim_spt_switchover_infinity_cmd
);
6151 install_element(CONFIG_NODE
, &ip_pim_spt_switchover_infinity_plist_cmd
);
6152 install_element(VRF_NODE
, &ip_pim_spt_switchover_infinity_plist_cmd
);
6153 install_element(CONFIG_NODE
, &no_ip_pim_spt_switchover_infinity_cmd
);
6154 install_element(VRF_NODE
, &no_ip_pim_spt_switchover_infinity_cmd
);
6155 install_element(CONFIG_NODE
,
6156 &no_ip_pim_spt_switchover_infinity_plist_cmd
);
6157 install_element(VRF_NODE
, &no_ip_pim_spt_switchover_infinity_plist_cmd
);
6158 install_element(CONFIG_NODE
, &pim_register_accept_list_cmd
);
6159 install_element(VRF_NODE
, &pim_register_accept_list_cmd
);
6160 install_element(CONFIG_NODE
, &ip_pim_joinprune_time_cmd
);
6161 install_element(CONFIG_NODE
, &no_ip_pim_joinprune_time_cmd
);
6162 install_element(CONFIG_NODE
, &ip_pim_keep_alive_cmd
);
6163 install_element(VRF_NODE
, &ip_pim_keep_alive_cmd
);
6164 install_element(CONFIG_NODE
, &ip_pim_rp_keep_alive_cmd
);
6165 install_element(VRF_NODE
, &ip_pim_rp_keep_alive_cmd
);
6166 install_element(CONFIG_NODE
, &no_ip_pim_keep_alive_cmd
);
6167 install_element(VRF_NODE
, &no_ip_pim_keep_alive_cmd
);
6168 install_element(CONFIG_NODE
, &no_ip_pim_rp_keep_alive_cmd
);
6169 install_element(VRF_NODE
, &no_ip_pim_rp_keep_alive_cmd
);
6170 install_element(CONFIG_NODE
, &ip_pim_packets_cmd
);
6171 install_element(CONFIG_NODE
, &no_ip_pim_packets_cmd
);
6172 install_element(CONFIG_NODE
, &ip_pim_v6_secondary_cmd
);
6173 install_element(VRF_NODE
, &ip_pim_v6_secondary_cmd
);
6174 install_element(CONFIG_NODE
, &no_ip_pim_v6_secondary_cmd
);
6175 install_element(VRF_NODE
, &no_ip_pim_v6_secondary_cmd
);
6176 install_element(CONFIG_NODE
, &ip_ssmpingd_cmd
);
6177 install_element(VRF_NODE
, &ip_ssmpingd_cmd
);
6178 install_element(CONFIG_NODE
, &no_ip_ssmpingd_cmd
);
6179 install_element(VRF_NODE
, &no_ip_ssmpingd_cmd
);
6180 install_element(CONFIG_NODE
, &ip_msdp_peer_cmd
);
6181 install_element(VRF_NODE
, &ip_msdp_peer_cmd
);
6182 install_element(CONFIG_NODE
, &no_ip_msdp_peer_cmd
);
6183 install_element(VRF_NODE
, &no_ip_msdp_peer_cmd
);
6184 install_element(CONFIG_NODE
, &ip_pim_ecmp_cmd
);
6185 install_element(VRF_NODE
, &ip_pim_ecmp_cmd
);
6186 install_element(CONFIG_NODE
, &no_ip_pim_ecmp_cmd
);
6187 install_element(VRF_NODE
, &no_ip_pim_ecmp_cmd
);
6188 install_element(CONFIG_NODE
, &ip_pim_ecmp_rebalance_cmd
);
6189 install_element(VRF_NODE
, &ip_pim_ecmp_rebalance_cmd
);
6190 install_element(CONFIG_NODE
, &no_ip_pim_ecmp_rebalance_cmd
);
6191 install_element(VRF_NODE
, &no_ip_pim_ecmp_rebalance_cmd
);
6192 install_element(CONFIG_NODE
, &ip_pim_mlag_cmd
);
6193 install_element(CONFIG_NODE
, &no_ip_pim_mlag_cmd
);
6194 install_element(CONFIG_NODE
, &ip_igmp_group_watermark_cmd
);
6195 install_element(VRF_NODE
, &ip_igmp_group_watermark_cmd
);
6196 install_element(CONFIG_NODE
, &no_ip_igmp_group_watermark_cmd
);
6197 install_element(VRF_NODE
, &no_ip_igmp_group_watermark_cmd
);
6199 install_element(INTERFACE_NODE
, &interface_ip_igmp_cmd
);
6200 install_element(INTERFACE_NODE
, &interface_no_ip_igmp_cmd
);
6201 install_element(INTERFACE_NODE
, &interface_ip_igmp_join_cmd
);
6202 install_element(INTERFACE_NODE
, &interface_no_ip_igmp_join_cmd
);
6203 install_element(INTERFACE_NODE
, &interface_ip_igmp_version_cmd
);
6204 install_element(INTERFACE_NODE
, &interface_no_ip_igmp_version_cmd
);
6205 install_element(INTERFACE_NODE
, &interface_ip_igmp_query_interval_cmd
);
6206 install_element(INTERFACE_NODE
,
6207 &interface_no_ip_igmp_query_interval_cmd
);
6208 install_element(INTERFACE_NODE
,
6209 &interface_ip_igmp_query_max_response_time_cmd
);
6210 install_element(INTERFACE_NODE
,
6211 &interface_no_ip_igmp_query_max_response_time_cmd
);
6212 install_element(INTERFACE_NODE
,
6213 &interface_ip_igmp_query_max_response_time_dsec_cmd
);
6214 install_element(INTERFACE_NODE
,
6215 &interface_no_ip_igmp_query_max_response_time_dsec_cmd
);
6216 install_element(INTERFACE_NODE
,
6217 &interface_ip_igmp_last_member_query_count_cmd
);
6218 install_element(INTERFACE_NODE
,
6219 &interface_no_ip_igmp_last_member_query_count_cmd
);
6220 install_element(INTERFACE_NODE
,
6221 &interface_ip_igmp_last_member_query_interval_cmd
);
6222 install_element(INTERFACE_NODE
,
6223 &interface_no_ip_igmp_last_member_query_interval_cmd
);
6224 install_element(INTERFACE_NODE
, &interface_ip_pim_activeactive_cmd
);
6225 install_element(INTERFACE_NODE
, &interface_ip_pim_ssm_cmd
);
6226 install_element(INTERFACE_NODE
, &interface_no_ip_pim_ssm_cmd
);
6227 install_element(INTERFACE_NODE
, &interface_ip_pim_sm_cmd
);
6228 install_element(INTERFACE_NODE
, &interface_no_ip_pim_sm_cmd
);
6229 install_element(INTERFACE_NODE
, &interface_ip_pim_cmd
);
6230 install_element(INTERFACE_NODE
, &interface_no_ip_pim_cmd
);
6231 install_element(INTERFACE_NODE
, &interface_ip_pim_drprio_cmd
);
6232 install_element(INTERFACE_NODE
, &interface_no_ip_pim_drprio_cmd
);
6233 install_element(INTERFACE_NODE
, &interface_ip_pim_hello_cmd
);
6234 install_element(INTERFACE_NODE
, &interface_no_ip_pim_hello_cmd
);
6235 install_element(INTERFACE_NODE
, &interface_ip_pim_boundary_oil_cmd
);
6236 install_element(INTERFACE_NODE
, &interface_no_ip_pim_boundary_oil_cmd
);
6237 install_element(INTERFACE_NODE
, &interface_ip_igmp_query_generate_cmd
);
6239 // Static mroutes NEB
6240 install_element(INTERFACE_NODE
, &interface_ip_mroute_cmd
);
6241 install_element(INTERFACE_NODE
, &interface_no_ip_mroute_cmd
);
6243 install_element(VIEW_NODE
, &show_ip_igmp_interface_cmd
);
6244 install_element(VIEW_NODE
, &show_ip_igmp_interface_vrf_all_cmd
);
6245 install_element(VIEW_NODE
, &show_ip_igmp_join_cmd
);
6246 install_element(VIEW_NODE
, &show_ip_igmp_join_vrf_all_cmd
);
6247 install_element(VIEW_NODE
, &show_ip_igmp_groups_cmd
);
6248 install_element(VIEW_NODE
, &show_ip_igmp_groups_vrf_all_cmd
);
6249 install_element(VIEW_NODE
, &show_ip_igmp_groups_retransmissions_cmd
);
6250 install_element(VIEW_NODE
, &show_ip_igmp_sources_cmd
);
6251 install_element(VIEW_NODE
, &show_ip_igmp_sources_retransmissions_cmd
);
6252 install_element(VIEW_NODE
, &show_ip_igmp_statistics_cmd
);
6253 install_element(VIEW_NODE
, &show_ip_pim_assert_cmd
);
6254 install_element(VIEW_NODE
, &show_ip_pim_assert_internal_cmd
);
6255 install_element(VIEW_NODE
, &show_ip_pim_assert_metric_cmd
);
6256 install_element(VIEW_NODE
, &show_ip_pim_assert_winner_metric_cmd
);
6257 install_element(VIEW_NODE
, &show_ip_pim_interface_traffic_cmd
);
6258 install_element(VIEW_NODE
, &show_ip_pim_interface_cmd
);
6259 install_element(VIEW_NODE
, &show_ip_pim_interface_vrf_all_cmd
);
6260 install_element(VIEW_NODE
, &show_ip_pim_join_cmd
);
6261 install_element(VIEW_NODE
, &show_ip_pim_join_vrf_all_cmd
);
6262 install_element(VIEW_NODE
, &show_ip_pim_jp_agg_cmd
);
6263 install_element(VIEW_NODE
, &show_ip_pim_local_membership_cmd
);
6264 install_element(VIEW_NODE
, &show_ip_pim_mlag_summary_cmd
);
6265 install_element(VIEW_NODE
, &show_ip_pim_mlag_up_cmd
);
6266 install_element(VIEW_NODE
, &show_ip_pim_mlag_up_vrf_all_cmd
);
6267 install_element(VIEW_NODE
, &show_ip_pim_neighbor_cmd
);
6268 install_element(VIEW_NODE
, &show_ip_pim_neighbor_vrf_all_cmd
);
6269 install_element(VIEW_NODE
, &show_ip_pim_rpf_cmd
);
6270 install_element(VIEW_NODE
, &show_ip_pim_rpf_vrf_all_cmd
);
6271 install_element(VIEW_NODE
, &show_ip_pim_secondary_cmd
);
6272 install_element(VIEW_NODE
, &show_ip_pim_state_cmd
);
6273 install_element(VIEW_NODE
, &show_ip_pim_state_vrf_all_cmd
);
6274 install_element(VIEW_NODE
, &show_ip_pim_upstream_cmd
);
6275 install_element(VIEW_NODE
, &show_ip_pim_upstream_vrf_all_cmd
);
6276 install_element(VIEW_NODE
, &show_ip_pim_channel_cmd
);
6277 install_element(VIEW_NODE
, &show_ip_pim_upstream_join_desired_cmd
);
6278 install_element(VIEW_NODE
, &show_ip_pim_upstream_rpf_cmd
);
6279 install_element(VIEW_NODE
, &show_ip_pim_rp_cmd
);
6280 install_element(VIEW_NODE
, &show_ip_pim_rp_vrf_all_cmd
);
6281 install_element(VIEW_NODE
, &show_ip_pim_bsr_cmd
);
6282 install_element(VIEW_NODE
, &show_ip_multicast_cmd
);
6283 install_element(VIEW_NODE
, &show_ip_multicast_vrf_all_cmd
);
6284 install_element(VIEW_NODE
, &show_ip_multicast_count_cmd
);
6285 install_element(VIEW_NODE
, &show_ip_multicast_count_vrf_all_cmd
);
6286 install_element(VIEW_NODE
, &show_ip_mroute_cmd
);
6287 install_element(VIEW_NODE
, &show_ip_mroute_vrf_all_cmd
);
6288 install_element(VIEW_NODE
, &show_ip_mroute_count_cmd
);
6289 install_element(VIEW_NODE
, &show_ip_mroute_count_vrf_all_cmd
);
6290 install_element(VIEW_NODE
, &show_ip_mroute_summary_cmd
);
6291 install_element(VIEW_NODE
, &show_ip_mroute_summary_vrf_all_cmd
);
6292 install_element(VIEW_NODE
, &show_ip_rib_cmd
);
6293 install_element(VIEW_NODE
, &show_ip_ssmpingd_cmd
);
6294 install_element(VIEW_NODE
, &show_ip_pim_nexthop_cmd
);
6295 install_element(VIEW_NODE
, &show_ip_pim_nexthop_lookup_cmd
);
6296 install_element(VIEW_NODE
, &show_ip_pim_bsrp_cmd
);
6297 install_element(VIEW_NODE
, &show_ip_pim_bsm_db_cmd
);
6298 install_element(VIEW_NODE
, &show_ip_pim_statistics_cmd
);
6300 install_element(ENABLE_NODE
, &clear_ip_mroute_count_cmd
);
6301 install_element(ENABLE_NODE
, &clear_ip_interfaces_cmd
);
6302 install_element(ENABLE_NODE
, &clear_ip_igmp_interfaces_cmd
);
6303 install_element(ENABLE_NODE
, &clear_ip_mroute_cmd
);
6304 install_element(ENABLE_NODE
, &clear_ip_pim_interfaces_cmd
);
6305 install_element(ENABLE_NODE
, &clear_ip_pim_interface_traffic_cmd
);
6306 install_element(ENABLE_NODE
, &clear_ip_pim_oil_cmd
);
6307 install_element(ENABLE_NODE
, &clear_ip_pim_statistics_cmd
);
6308 install_element(ENABLE_NODE
, &clear_ip_pim_bsr_db_cmd
);
6310 install_element(ENABLE_NODE
, &show_debugging_pim_cmd
);
6312 install_element(ENABLE_NODE
, &debug_igmp_cmd
);
6313 install_element(ENABLE_NODE
, &no_debug_igmp_cmd
);
6314 install_element(ENABLE_NODE
, &debug_igmp_events_cmd
);
6315 install_element(ENABLE_NODE
, &no_debug_igmp_events_cmd
);
6316 install_element(ENABLE_NODE
, &debug_igmp_packets_cmd
);
6317 install_element(ENABLE_NODE
, &no_debug_igmp_packets_cmd
);
6318 install_element(ENABLE_NODE
, &debug_igmp_trace_cmd
);
6319 install_element(ENABLE_NODE
, &no_debug_igmp_trace_cmd
);
6320 install_element(ENABLE_NODE
, &debug_igmp_trace_detail_cmd
);
6321 install_element(ENABLE_NODE
, &no_debug_igmp_trace_detail_cmd
);
6322 install_element(ENABLE_NODE
, &debug_mroute_cmd
);
6323 install_element(ENABLE_NODE
, &debug_mroute_detail_cmd
);
6324 install_element(ENABLE_NODE
, &no_debug_mroute_cmd
);
6325 install_element(ENABLE_NODE
, &no_debug_mroute_detail_cmd
);
6326 install_element(ENABLE_NODE
, &debug_pim_static_cmd
);
6327 install_element(ENABLE_NODE
, &no_debug_pim_static_cmd
);
6328 install_element(ENABLE_NODE
, &debug_pim_cmd
);
6329 install_element(ENABLE_NODE
, &debug_pim_nht_cmd
);
6330 install_element(ENABLE_NODE
, &debug_pim_nht_det_cmd
);
6331 install_element(ENABLE_NODE
, &debug_pim_nht_rp_cmd
);
6332 install_element(ENABLE_NODE
, &no_debug_pim_nht_rp_cmd
);
6333 install_element(ENABLE_NODE
, &debug_pim_events_cmd
);
6334 install_element(ENABLE_NODE
, &debug_pim_packets_cmd
);
6335 install_element(ENABLE_NODE
, &debug_pim_packetdump_send_cmd
);
6336 install_element(ENABLE_NODE
, &debug_pim_packetdump_recv_cmd
);
6337 install_element(ENABLE_NODE
, &debug_pim_trace_cmd
);
6338 install_element(ENABLE_NODE
, &debug_pim_trace_detail_cmd
);
6339 install_element(ENABLE_NODE
, &debug_ssmpingd_cmd
);
6340 install_element(ENABLE_NODE
, &no_debug_ssmpingd_cmd
);
6341 install_element(ENABLE_NODE
, &debug_pim_zebra_cmd
);
6342 install_element(ENABLE_NODE
, &debug_pim_mlag_cmd
);
6343 install_element(ENABLE_NODE
, &no_debug_pim_mlag_cmd
);
6344 install_element(ENABLE_NODE
, &debug_pim_vxlan_cmd
);
6345 install_element(ENABLE_NODE
, &no_debug_pim_vxlan_cmd
);
6346 install_element(ENABLE_NODE
, &debug_msdp_cmd
);
6347 install_element(ENABLE_NODE
, &no_debug_msdp_cmd
);
6348 install_element(ENABLE_NODE
, &debug_msdp_events_cmd
);
6349 install_element(ENABLE_NODE
, &no_debug_msdp_events_cmd
);
6350 install_element(ENABLE_NODE
, &debug_msdp_packets_cmd
);
6351 install_element(ENABLE_NODE
, &no_debug_msdp_packets_cmd
);
6352 install_element(ENABLE_NODE
, &debug_mtrace_cmd
);
6353 install_element(ENABLE_NODE
, &no_debug_mtrace_cmd
);
6354 install_element(ENABLE_NODE
, &debug_bsm_cmd
);
6355 install_element(ENABLE_NODE
, &no_debug_bsm_cmd
);
6357 install_element(CONFIG_NODE
, &debug_igmp_cmd
);
6358 install_element(CONFIG_NODE
, &no_debug_igmp_cmd
);
6359 install_element(CONFIG_NODE
, &debug_igmp_events_cmd
);
6360 install_element(CONFIG_NODE
, &no_debug_igmp_events_cmd
);
6361 install_element(CONFIG_NODE
, &debug_igmp_packets_cmd
);
6362 install_element(CONFIG_NODE
, &no_debug_igmp_packets_cmd
);
6363 install_element(CONFIG_NODE
, &debug_igmp_trace_cmd
);
6364 install_element(CONFIG_NODE
, &no_debug_igmp_trace_cmd
);
6365 install_element(CONFIG_NODE
, &debug_igmp_trace_detail_cmd
);
6366 install_element(CONFIG_NODE
, &no_debug_igmp_trace_detail_cmd
);
6367 install_element(CONFIG_NODE
, &debug_mroute_cmd
);
6368 install_element(CONFIG_NODE
, &debug_mroute_detail_cmd
);
6369 install_element(CONFIG_NODE
, &no_debug_mroute_cmd
);
6370 install_element(CONFIG_NODE
, &no_debug_mroute_detail_cmd
);
6371 install_element(CONFIG_NODE
, &debug_pim_static_cmd
);
6372 install_element(CONFIG_NODE
, &no_debug_pim_static_cmd
);
6373 install_element(CONFIG_NODE
, &debug_pim_cmd
);
6374 install_element(CONFIG_NODE
, &debug_pim_nht_cmd
);
6375 install_element(CONFIG_NODE
, &debug_pim_nht_det_cmd
);
6376 install_element(CONFIG_NODE
, &debug_pim_nht_rp_cmd
);
6377 install_element(CONFIG_NODE
, &no_debug_pim_nht_rp_cmd
);
6378 install_element(CONFIG_NODE
, &debug_pim_events_cmd
);
6379 install_element(CONFIG_NODE
, &debug_pim_packets_cmd
);
6380 install_element(CONFIG_NODE
, &debug_pim_packetdump_send_cmd
);
6381 install_element(CONFIG_NODE
, &debug_pim_packetdump_recv_cmd
);
6382 install_element(CONFIG_NODE
, &debug_pim_trace_cmd
);
6383 install_element(CONFIG_NODE
, &debug_pim_trace_detail_cmd
);
6384 install_element(CONFIG_NODE
, &debug_ssmpingd_cmd
);
6385 install_element(CONFIG_NODE
, &no_debug_ssmpingd_cmd
);
6386 install_element(CONFIG_NODE
, &debug_pim_zebra_cmd
);
6387 install_element(CONFIG_NODE
, &debug_pim_mlag_cmd
);
6388 install_element(CONFIG_NODE
, &no_debug_pim_mlag_cmd
);
6389 install_element(CONFIG_NODE
, &debug_pim_vxlan_cmd
);
6390 install_element(CONFIG_NODE
, &no_debug_pim_vxlan_cmd
);
6391 install_element(CONFIG_NODE
, &debug_msdp_cmd
);
6392 install_element(CONFIG_NODE
, &no_debug_msdp_cmd
);
6393 install_element(CONFIG_NODE
, &debug_msdp_events_cmd
);
6394 install_element(CONFIG_NODE
, &no_debug_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
, &debug_mtrace_cmd
);
6398 install_element(CONFIG_NODE
, &no_debug_mtrace_cmd
);
6399 install_element(CONFIG_NODE
, &debug_bsm_cmd
);
6400 install_element(CONFIG_NODE
, &no_debug_bsm_cmd
);
6402 install_element(CONFIG_NODE
, &ip_msdp_timers_cmd
);
6403 install_element(VRF_NODE
, &ip_msdp_timers_cmd
);
6404 install_element(CONFIG_NODE
, &no_ip_msdp_timers_cmd
);
6405 install_element(VRF_NODE
, &no_ip_msdp_timers_cmd
);
6406 install_element(CONFIG_NODE
, &ip_msdp_mesh_group_member_cmd
);
6407 install_element(VRF_NODE
, &ip_msdp_mesh_group_member_cmd
);
6408 install_element(CONFIG_NODE
, &no_ip_msdp_mesh_group_member_cmd
);
6409 install_element(VRF_NODE
, &no_ip_msdp_mesh_group_member_cmd
);
6410 install_element(CONFIG_NODE
, &ip_msdp_mesh_group_source_cmd
);
6411 install_element(VRF_NODE
, &ip_msdp_mesh_group_source_cmd
);
6412 install_element(CONFIG_NODE
, &no_ip_msdp_mesh_group_source_cmd
);
6413 install_element(VRF_NODE
, &no_ip_msdp_mesh_group_source_cmd
);
6414 install_element(CONFIG_NODE
, &no_ip_msdp_mesh_group_cmd
);
6415 install_element(VRF_NODE
, &no_ip_msdp_mesh_group_cmd
);
6416 install_element(VIEW_NODE
, &show_ip_msdp_peer_detail_cmd
);
6417 install_element(VIEW_NODE
, &show_ip_msdp_peer_detail_vrf_all_cmd
);
6418 install_element(VIEW_NODE
, &show_ip_msdp_sa_detail_cmd
);
6419 install_element(VIEW_NODE
, &show_ip_msdp_sa_detail_vrf_all_cmd
);
6420 install_element(VIEW_NODE
, &show_ip_msdp_sa_sg_cmd
);
6421 install_element(VIEW_NODE
, &show_ip_msdp_sa_sg_vrf_all_cmd
);
6422 install_element(VIEW_NODE
, &show_ip_msdp_mesh_group_cmd
);
6423 install_element(VIEW_NODE
, &show_ip_msdp_mesh_group_vrf_all_cmd
);
6424 install_element(VIEW_NODE
, &show_ip_pim_ssm_range_cmd
);
6425 install_element(VIEW_NODE
, &show_ip_pim_group_type_cmd
);
6426 install_element(VIEW_NODE
, &show_ip_pim_vxlan_sg_cmd
);
6427 install_element(VIEW_NODE
, &show_ip_pim_vxlan_sg_work_cmd
);
6428 install_element(INTERFACE_NODE
, &interface_pim_use_source_cmd
);
6429 install_element(INTERFACE_NODE
, &interface_no_pim_use_source_cmd
);
6430 /* Install BSM command */
6431 install_element(INTERFACE_NODE
, &ip_pim_bsm_cmd
);
6432 install_element(INTERFACE_NODE
, &no_ip_pim_bsm_cmd
);
6433 install_element(INTERFACE_NODE
, &ip_pim_ucast_bsm_cmd
);
6434 install_element(INTERFACE_NODE
, &no_ip_pim_ucast_bsm_cmd
);
6435 /* Install BFD command */
6436 install_element(INTERFACE_NODE
, &ip_pim_bfd_cmd
);
6437 install_element(INTERFACE_NODE
, &ip_pim_bfd_param_cmd
);
6438 install_element(INTERFACE_NODE
, &no_ip_pim_bfd_profile_cmd
);
6439 install_element(INTERFACE_NODE
, &no_ip_pim_bfd_cmd
);
6441 install_element(INTERFACE_NODE
, &no_ip_pim_bfd_param_cmd
);
6442 #endif /* !HAVE_BFDD */