]> git.proxmox.com Git - mirror_frr.git/blame - pimd/pim6_cmd.c
pim6d: Adding "ipv6 mld join" CLI
[mirror_frr.git] / pimd / pim6_cmd.c
CommitLineData
5d613d13
SG
1/*
2 * PIM for IPv6 FRR
3 * Copyright (C) 2022 Vmware, Inc.
4 * Mobashshera Rasool <mrasool@vmware.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <zebra.h>
22
23#include "lib/json.h"
24#include "command.h"
25#include "if.h"
26#include "prefix.h"
27#include "zclient.h"
28#include "plist.h"
29#include "hash.h"
30#include "nexthop.h"
31#include "vrf.h"
32#include "ferr.h"
33
34#include "pimd.h"
35#include "pim6_cmd.h"
36#include "pim_vty.h"
37#include "lib/northbound_cli.h"
38#include "pim_errors.h"
39#include "pim_nb.h"
26cd3d66 40#include "pim_cmd_common.h"
5d613d13
SG
41
42#ifndef VTYSH_EXTRACT_PL
43#include "pimd/pim6_cmd_clippy.c"
44#endif
45
c73113ea
MR
46DEFPY (ipv6_pim_joinprune_time,
47 ipv6_pim_joinprune_time_cmd,
48 "ipv6 pim join-prune-interval (1-65535)$jpi",
49 IPV6_STR
50 PIM_STR
51 "Join Prune Send Interval\n"
52 "Seconds\n")
53{
54 return pim_process_join_prune_cmd(vty, jpi_str);
55}
56
57DEFPY (no_ipv6_pim_joinprune_time,
58 no_ipv6_pim_joinprune_time_cmd,
59 "no ipv6 pim join-prune-interval [(1-65535)]",
60 NO_STR
61 IPV6_STR
62 PIM_STR
63 "Join Prune Send Interval\n"
64 IGNORED_IN_NO_STR)
65{
66 return pim_process_no_join_prune_cmd(vty);
67}
68
fb991ce9
MR
69DEFPY (ipv6_pim_spt_switchover_infinity,
70 ipv6_pim_spt_switchover_infinity_cmd,
71 "ipv6 pim spt-switchover infinity-and-beyond",
72 IPV6_STR
73 PIM_STR
74 "SPT-Switchover\n"
75 "Never switch to SPT Tree\n")
76{
77 return pim_process_spt_switchover_infinity_cmd(vty);
78}
79
80DEFPY (ipv6_pim_spt_switchover_infinity_plist,
81 ipv6_pim_spt_switchover_infinity_plist_cmd,
82 "ipv6 pim spt-switchover infinity-and-beyond prefix-list WORD$plist",
83 IPV6_STR
84 PIM_STR
85 "SPT-Switchover\n"
86 "Never switch to SPT Tree\n"
87 "Prefix-List to control which groups to switch\n"
88 "Prefix-List name\n")
89{
90 return pim_process_spt_switchover_prefixlist_cmd(vty, plist);
91}
92
93DEFPY (no_ipv6_pim_spt_switchover_infinity,
94 no_ipv6_pim_spt_switchover_infinity_cmd,
95 "no ipv6 pim spt-switchover infinity-and-beyond",
96 NO_STR
97 IPV6_STR
98 PIM_STR
99 "SPT_Switchover\n"
100 "Never switch to SPT Tree\n")
101{
102 return pim_process_no_spt_switchover_cmd(vty);
103}
104
105DEFPY (no_ipv6_pim_spt_switchover_infinity_plist,
106 no_ipv6_pim_spt_switchover_infinity_plist_cmd,
107 "no ipv6 pim spt-switchover infinity-and-beyond prefix-list WORD",
108 NO_STR
109 IPV6_STR
110 PIM_STR
111 "SPT_Switchover\n"
112 "Never switch to SPT Tree\n"
113 "Prefix-List to control which groups to switch\n"
114 "Prefix-List name\n")
115{
116 return pim_process_no_spt_switchover_cmd(vty);
117}
118
0da72f1f
MR
119DEFPY (ipv6_pim_packets,
120 ipv6_pim_packets_cmd,
121 "ipv6 pim packets (1-255)",
122 IPV6_STR
123 PIM_STR
124 "packets to process at one time per fd\n"
125 "Number of packets\n")
126{
127 return pim_process_pim_packet_cmd(vty, packets_str);
128}
129
130DEFPY (no_ipv6_pim_packets,
131 no_ipv6_pim_packets_cmd,
132 "no ipv6 pim packets [(1-255)]",
133 NO_STR
134 IPV6_STR
135 PIM_STR
136 "packets to process at one time per fd\n"
137 IGNORED_IN_NO_STR)
138{
139 return pim_process_no_pim_packet_cmd(vty);
140}
141
28e32366
MR
142DEFPY (ipv6_pim_keep_alive,
143 ipv6_pim_keep_alive_cmd,
144 "ipv6 pim keep-alive-timer (1-65535)$kat",
145 IPV6_STR
146 PIM_STR
147 "Keep alive Timer\n"
148 "Seconds\n")
149{
150 return pim_process_keepalivetimer_cmd(vty, kat_str);
151}
152
153DEFPY (no_ipv6_pim_keep_alive,
154 no_ipv6_pim_keep_alive_cmd,
155 "no ipv6 pim keep-alive-timer [(1-65535)]",
156 NO_STR
157 IPV6_STR
158 PIM_STR
159 "Keep alive Timer\n"
160 IGNORED_IN_NO_STR)
161{
162 return pim_process_no_keepalivetimer_cmd(vty);
163}
164
2322b991
MR
165DEFPY (ipv6_pim_rp_keep_alive,
166 ipv6_pim_rp_keep_alive_cmd,
167 "ipv6 pim rp keep-alive-timer (1-65535)$kat",
168 IPV6_STR
169 PIM_STR
170 "Rendevous Point\n"
171 "Keep alive Timer\n"
172 "Seconds\n")
173{
174 return pim_process_rp_kat_cmd(vty, kat_str);
175}
176
177DEFPY (no_ipv6_pim_rp_keep_alive,
178 no_ipv6_pim_rp_keep_alive_cmd,
179 "no ipv6 pim rp keep-alive-timer [(1-65535)]",
180 NO_STR
181 IPV6_STR
182 PIM_STR
183 "Rendevous Point\n"
184 "Keep alive Timer\n"
185 IGNORED_IN_NO_STR)
186{
187 return pim_process_no_rp_kat_cmd(vty);
188}
189
18ca7de5
MR
190DEFPY (ipv6_pim_register_suppress,
191 ipv6_pim_register_suppress_cmd,
192 "ipv6 pim register-suppress-time (1-65535)$rst",
193 IPV6_STR
194 PIM_STR
195 "Register Suppress Timer\n"
196 "Seconds\n")
197{
198 return pim_process_register_suppress_cmd(vty, rst_str);
199}
200
201DEFPY (no_ipv6_pim_register_suppress,
202 no_ipv6_pim_register_suppress_cmd,
203 "no ipv6 pim register-suppress-time [(1-65535)]",
204 NO_STR
205 IPV6_STR
206 PIM_STR
207 "Register Suppress Timer\n"
208 IGNORED_IN_NO_STR)
209{
210 return pim_process_no_register_suppress_cmd(vty);
211}
212
a1caf7a8 213DEFPY (interface_ipv6_pim,
214 interface_ipv6_pim_cmd,
215 "ipv6 pim",
216 IPV6_STR
217 PIM_STR)
218{
219 return pim_process_ip_pim_cmd(vty);
220}
221
222DEFPY (interface_no_ipv6_pim,
223 interface_no_ipv6_pim_cmd,
224 "no ipv6 pim",
225 NO_STR
226 IPV6_STR
227 PIM_STR)
228{
229 return pim_process_no_ip_pim_cmd(vty);
230}
231
bb387611 232DEFPY (interface_ipv6_pim_drprio,
233 interface_ipv6_pim_drprio_cmd,
234 "ipv6 pim drpriority (1-4294967295)",
235 IPV6_STR
236 PIM_STR
237 "Set the Designated Router Election Priority\n"
238 "Value of the new DR Priority\n")
239{
240 return pim_process_ip_pim_drprio_cmd(vty, drpriority_str);
241}
242
243DEFPY (interface_no_ipv6_pim_drprio,
244 interface_no_ipv6_pim_drprio_cmd,
245 "no ip pim drpriority [(1-4294967295)]",
246 NO_STR
247 IPV6_STR
248 PIM_STR
249 "Revert the Designated Router Priority to default\n"
250 "Old Value of the Priority\n")
251{
252 return pim_process_no_ip_pim_drprio_cmd(vty);
253}
254
e6aab613 255DEFPY (interface_ipv6_pim_hello,
256 interface_ipv6_pim_hello_cmd,
257 "ipv6 pim hello (1-65535) [(1-65535)]$hold",
258 IPV6_STR
259 PIM_STR
260 IFACE_PIM_HELLO_STR
261 IFACE_PIM_HELLO_TIME_STR
262 IFACE_PIM_HELLO_HOLD_STR)
263{
264 return pim_process_ip_pim_hello_cmd(vty, hello_str, hold_str);
265}
266
267DEFPY (interface_no_ipv6_pim_hello,
268 interface_no_ipv6_pim_hello_cmd,
269 "no ipv6 pim hello [(1-65535) [(1-65535)]]",
270 NO_STR
271 IPV6_STR
272 PIM_STR
273 IFACE_PIM_HELLO_STR
274 IGNORED_IN_NO_STR
275 IGNORED_IN_NO_STR)
276{
277 return pim_process_no_ip_pim_hello_cmd(vty);
278}
279
7e01b641 280DEFPY (interface_ipv6_pim_activeactive,
281 interface_ipv6_pim_activeactive_cmd,
282 "[no] ipv6 pim active-active",
283 NO_STR
284 IPV6_STR
285 PIM_STR
286 "Mark interface as Active-Active for MLAG operations\n")
287{
288 return pim_process_ip_pim_activeactive_cmd(vty, no);
289}
290
dab0ac29 291DEFPY_HIDDEN (interface_ipv6_pim_ssm,
292 interface_ipv6_pim_ssm_cmd,
293 "ipv6 pim ssm",
294 IPV6_STR
295 PIM_STR
296 IFACE_PIM_STR)
297{
298 int ret;
299
300 ret = pim_process_ip_pim_cmd(vty);
301
302 if (ret != NB_OK)
303 return ret;
304
305 vty_out(vty,
306 "Enabled PIM SM on interface; configure PIM SSM range if needed\n");
307
308 return NB_OK;
309}
310
311DEFPY_HIDDEN (interface_no_ipv6_pim_ssm,
312 interface_no_ipv6_pim_ssm_cmd,
313 "no ipv6 pim ssm",
314 NO_STR
315 IPV6_STR
316 PIM_STR
317 IFACE_PIM_STR)
318{
319 return pim_process_no_ip_pim_cmd(vty);
320}
321
2b16b40f 322DEFPY_HIDDEN (interface_ipv6_pim_sm,
323 interface_ipv6_pim_sm_cmd,
324 "ipv6 pim sm",
325 IPV6_STR
326 PIM_STR
327 IFACE_PIM_SM_STR)
328{
329 return pim_process_ip_pim_cmd(vty);
330}
331
332DEFPY_HIDDEN (interface_no_ipv6_pim_sm,
333 interface_no_ipv6_pim_sm_cmd,
334 "no ipv6 pim sm",
335 NO_STR
336 IPV6_STR
337 PIM_STR
338 IFACE_PIM_SM_STR)
339{
340 return pim_process_no_ip_pim_cmd(vty);
341}
342
52c52d78 343/* boundaries */
344DEFPY (interface_ipv6_pim_boundary_oil,
345 interface_ipv6_pim_boundary_oil_cmd,
346 "ipv6 multicast boundary oil WORD",
347 IPV6_STR
348 "Generic multicast configuration options\n"
349 "Define multicast boundary\n"
350 "Filter OIL by group using prefix list\n"
351 "Prefix list to filter OIL with\n")
352{
353 return pim_process_ip_pim_boundary_oil_cmd(vty, oil);
354}
355
356DEFPY (interface_no_ipv6_pim_boundary_oil,
357 interface_no_ipv6_pim_boundary_oil_cmd,
358 "no ipv6 multicast boundary oil [WORD]",
359 NO_STR
360 IPV6_STR
361 "Generic multicast configuration options\n"
362 "Define multicast boundary\n"
363 "Filter OIL by group using prefix list\n"
364 "Prefix list to filter OIL with\n")
365{
366 return pim_process_no_ip_pim_boundary_oil_cmd(vty);
367}
368
63ee25c0 369DEFPY (interface_ipv6_mroute,
370 interface_ipv6_mroute_cmd,
371 "ipv6 mroute INTERFACE X:X::X:X$group [X:X::X:X]$source",
372 IPV6_STR
373 "Add multicast route\n"
374 "Outgoing interface name\n"
375 "Group address\n"
376 "Source address\n")
377{
378 return pim_process_ip_mroute_cmd(vty, interface, group_str, source_str);
379}
380
381DEFPY (interface_no_ipv6_mroute,
382 interface_no_ipv6_mroute_cmd,
383 "no ipv6 mroute INTERFACE X:X::X:X$group [X:X::X:X]$source",
384 NO_STR
385 IPV6_STR
386 "Add multicast route\n"
387 "Outgoing interface name\n"
388 "Group Address\n"
389 "Source Address\n")
390{
391 return pim_process_no_ip_mroute_cmd(vty, interface, group_str,
392 source_str);
393}
394
34b403cf
MR
395DEFPY (ipv6_pim_rp,
396 ipv6_pim_rp_cmd,
397 "ipv6 pim rp X:X::X:X$rp [X:X::X:X/M]$gp",
398 IPV6_STR
399 PIM_STR
400 "Rendezvous Point\n"
401 "ipv6 address of RP\n"
402 "Group Address range to cover\n")
403{
404 const char *group_str = (gp_str) ? gp_str : "FF00::0/8";
405
406 return pim_process_rp_cmd(vty, rp_str, group_str);
407}
408
409DEFPY (no_ipv6_pim_rp,
410 no_ipv6_pim_rp_cmd,
411 "no ipv6 pim rp X:X::X:X$rp [X:X::X:X/M]$gp",
412 NO_STR
413 IPV6_STR
414 PIM_STR
415 "Rendezvous Point\n"
416 "ipv6 address of RP\n"
417 "Group Address range to cover\n")
418{
419 const char *group_str = (gp_str) ? gp_str : "FF00::0/8";
420
421 return pim_process_no_rp_cmd(vty, rp_str, group_str);
422}
423
8663adc4
MR
424DEFPY (ipv6_pim_rp_prefix_list,
425 ipv6_pim_rp_prefix_list_cmd,
426 "ipv6 pim rp X:X::X:X$rp prefix-list WORD$plist",
427 IPV6_STR
428 PIM_STR
429 "Rendezvous Point\n"
430 "ipv6 address of RP\n"
431 "group prefix-list filter\n"
432 "Name of a prefix-list\n")
433{
434 return pim_process_rp_plist_cmd(vty, rp_str, plist);
435}
436
437DEFPY (no_ipv6_pim_rp_prefix_list,
438 no_ipv6_pim_rp_prefix_list_cmd,
439 "no ipv6 pim rp X:X::X:X$rp prefix-list WORD$plist",
440 NO_STR
441 IPV6_STR
442 PIM_STR
443 "Rendezvous Point\n"
444 "ipv6 address of RP\n"
445 "group prefix-list filter\n"
446 "Name of a prefix-list\n")
447{
448 return pim_process_no_rp_plist_cmd(vty, rp_str, plist);
449}
450
fe2df4f7
A
451DEFPY (interface_ipv6_mld_join,
452 interface_ipv6_mld_join_cmd,
453 "ipv6 mld join X:X::X:X$group [X:X::X:X$source]",
454 IPV6_STR
455 IFACE_MLD_STR
456 "MLD join multicast group\n"
457 "Multicast group address\n"
458 "Source address\n")
459{
460 char xpath[XPATH_MAXLEN];
461
462 if (source_str) {
463 if (IPV6_ADDR_SAME(&source, &in6addr_any)) {
464 vty_out(vty, "Bad source address %s\n", source_str);
465 return CMD_WARNING_CONFIG_FAILED;
466 }
467 } else
468 source_str = "::";
469
470 snprintf(xpath, sizeof(xpath), FRR_GMP_JOIN_XPATH, "frr-routing:ipv6",
471 group_str, source_str);
472
473 nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL);
474
475 return nb_cli_apply_changes(vty, NULL);
476}
477
478DEFPY (interface_no_ipv6_mld_join,
479 interface_no_ipv6_mld_join_cmd,
480 "no ipv6 mld join X:X::X:X$group [X:X::X:X$source]",
481 NO_STR
482 IPV6_STR
483 IFACE_MLD_STR
484 "MLD join multicast group\n"
485 "Multicast group address\n"
486 "Source address\n")
487{
488 char xpath[XPATH_MAXLEN];
489
490 if (source_str) {
491 if (IPV6_ADDR_SAME(&source, &in6addr_any)) {
492 vty_out(vty, "Bad source address %s\n", source_str);
493 return CMD_WARNING_CONFIG_FAILED;
494 }
495 } else
496 source_str = "::";
497
498 snprintf(xpath, sizeof(xpath), FRR_GMP_JOIN_XPATH, "frr-routing:ipv6",
499 group_str, source_str);
500
501 nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL);
502
503 return nb_cli_apply_changes(vty, NULL);
504}
505
5d613d13
SG
506void pim_cmd_init(void)
507{
508 if_cmd_init(pim_interface_config_write);
c73113ea
MR
509
510 install_element(CONFIG_NODE, &ipv6_pim_joinprune_time_cmd);
511 install_element(CONFIG_NODE, &no_ipv6_pim_joinprune_time_cmd);
fb991ce9
MR
512 install_element(CONFIG_NODE, &ipv6_pim_spt_switchover_infinity_cmd);
513 install_element(CONFIG_NODE, &ipv6_pim_spt_switchover_infinity_plist_cmd);
514 install_element(CONFIG_NODE, &no_ipv6_pim_spt_switchover_infinity_cmd);
515 install_element(CONFIG_NODE, &no_ipv6_pim_spt_switchover_infinity_plist_cmd);
0da72f1f
MR
516 install_element(CONFIG_NODE, &ipv6_pim_packets_cmd);
517 install_element(CONFIG_NODE, &no_ipv6_pim_packets_cmd);
28e32366
MR
518 install_element(CONFIG_NODE, &ipv6_pim_keep_alive_cmd);
519 install_element(CONFIG_NODE, &no_ipv6_pim_keep_alive_cmd);
2322b991
MR
520 install_element(CONFIG_NODE, &ipv6_pim_rp_keep_alive_cmd);
521 install_element(CONFIG_NODE, &no_ipv6_pim_rp_keep_alive_cmd);
18ca7de5
MR
522 install_element(CONFIG_NODE, &ipv6_pim_register_suppress_cmd);
523 install_element(CONFIG_NODE, &no_ipv6_pim_register_suppress_cmd);
a1caf7a8 524 install_element(INTERFACE_NODE, &interface_ipv6_pim_cmd);
525 install_element(INTERFACE_NODE, &interface_no_ipv6_pim_cmd);
bb387611 526 install_element(INTERFACE_NODE, &interface_ipv6_pim_drprio_cmd);
527 install_element(INTERFACE_NODE, &interface_no_ipv6_pim_drprio_cmd);
e6aab613 528 install_element(INTERFACE_NODE, &interface_ipv6_pim_hello_cmd);
529 install_element(INTERFACE_NODE, &interface_no_ipv6_pim_hello_cmd);
7e01b641 530 install_element(INTERFACE_NODE, &interface_ipv6_pim_activeactive_cmd);
dab0ac29 531 install_element(INTERFACE_NODE, &interface_ipv6_pim_ssm_cmd);
532 install_element(INTERFACE_NODE, &interface_no_ipv6_pim_ssm_cmd);
2b16b40f 533 install_element(INTERFACE_NODE, &interface_ipv6_pim_sm_cmd);
534 install_element(INTERFACE_NODE, &interface_no_ipv6_pim_sm_cmd);
52c52d78 535 install_element(INTERFACE_NODE,
536 &interface_ipv6_pim_boundary_oil_cmd);
537 install_element(INTERFACE_NODE,
538 &interface_no_ipv6_pim_boundary_oil_cmd);
63ee25c0 539 install_element(INTERFACE_NODE, &interface_ipv6_mroute_cmd);
540 install_element(INTERFACE_NODE, &interface_no_ipv6_mroute_cmd);
34b403cf
MR
541 install_element(CONFIG_NODE, &ipv6_pim_rp_cmd);
542 install_element(VRF_NODE, &ipv6_pim_rp_cmd);
543 install_element(CONFIG_NODE, &no_ipv6_pim_rp_cmd);
544 install_element(VRF_NODE, &no_ipv6_pim_rp_cmd);
8663adc4
MR
545 install_element(CONFIG_NODE, &ipv6_pim_rp_prefix_list_cmd);
546 install_element(VRF_NODE, &ipv6_pim_rp_prefix_list_cmd);
547 install_element(CONFIG_NODE, &no_ipv6_pim_rp_prefix_list_cmd);
548 install_element(VRF_NODE, &no_ipv6_pim_rp_prefix_list_cmd);
fe2df4f7
A
549 install_element(INTERFACE_NODE, &interface_ipv6_mld_join_cmd);
550 install_element(INTERFACE_NODE, &interface_no_ipv6_mld_join_cmd);
5d613d13 551}