1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
4 * Copyright (C) 2018 NetDEF, Inc.
15 #include "northbound_cli.h"
18 #include "ripd/ripd.h"
19 #include "ripd/rip_nb.h"
20 #include "ripd/rip_cli_clippy.c"
23 * XPath: /frr-ripd:ripd/instance
25 DEFPY_YANG_NOSH (router_rip
,
27 "router rip [vrf NAME]",
28 "Enable a routing process\n"
29 "Routing Information Protocol (RIP)\n"
32 char xpath
[XPATH_MAXLEN
];
35 /* Build RIP instance XPath. */
37 vrf
= VRF_DEFAULT_NAME
;
38 snprintf(xpath
, sizeof(xpath
), "/frr-ripd:ripd/instance[vrf='%s']",
41 nb_cli_enqueue_change(vty
, xpath
, NB_OP_CREATE
, NULL
);
43 ret
= nb_cli_apply_changes(vty
, NULL
);
44 if (ret
== CMD_SUCCESS
)
45 VTY_PUSH_XPATH(RIP_NODE
, xpath
);
50 DEFPY_YANG (no_router_rip
,
52 "no router rip [vrf NAME]",
54 "Enable a routing process\n"
55 "Routing Information Protocol (RIP)\n"
58 char xpath
[XPATH_MAXLEN
];
60 /* Build RIP instance XPath. */
62 vrf
= VRF_DEFAULT_NAME
;
63 snprintf(xpath
, sizeof(xpath
), "/frr-ripd:ripd/instance[vrf='%s']",
66 nb_cli_enqueue_change(vty
, xpath
, NB_OP_DESTROY
, NULL
);
68 return nb_cli_apply_changes_clear_pending(vty
, NULL
);
71 void cli_show_router_rip(struct vty
*vty
, const struct lyd_node
*dnode
,
76 vrf_name
= yang_dnode_get_string(dnode
, "./vrf");
79 vty_out(vty
, "router rip");
80 if (!strmatch(vrf_name
, VRF_DEFAULT_NAME
))
81 vty_out(vty
, " vrf %s", vrf_name
);
86 * XPath: /frr-ripd:ripd/instance/allow-ecmp
88 DEFPY_YANG (rip_allow_ecmp
,
92 "Allow Equal Cost MultiPath\n")
94 nb_cli_enqueue_change(vty
, "./allow-ecmp", NB_OP_MODIFY
,
95 no
? "false" : "true");
97 return nb_cli_apply_changes(vty
, NULL
);
100 void cli_show_rip_allow_ecmp(struct vty
*vty
, const struct lyd_node
*dnode
,
103 if (!yang_dnode_get_bool(dnode
, NULL
))
106 vty_out(vty
, " allow-ecmp\n");
110 * XPath: /frr-ripd:ripd/instance/default-information-originate
112 DEFPY_YANG (rip_default_information_originate
,
113 rip_default_information_originate_cmd
,
114 "[no] default-information originate",
116 "Control distribution of default route\n"
117 "Distribute a default route\n")
119 nb_cli_enqueue_change(vty
, "./default-information-originate",
120 NB_OP_MODIFY
, no
? "false" : "true");
122 return nb_cli_apply_changes(vty
, NULL
);
125 void cli_show_rip_default_information_originate(struct vty
*vty
,
126 const struct lyd_node
*dnode
,
129 if (!yang_dnode_get_bool(dnode
, NULL
))
132 vty_out(vty
, " default-information originate\n");
136 * XPath: /frr-ripd:ripd/instance/default-metric
138 DEFPY_YANG (rip_default_metric
,
139 rip_default_metric_cmd
,
140 "default-metric (1-16)",
141 "Set a metric of redistribute routes\n"
144 nb_cli_enqueue_change(vty
, "./default-metric", NB_OP_MODIFY
,
147 return nb_cli_apply_changes(vty
, NULL
);
150 DEFPY_YANG (no_rip_default_metric
,
151 no_rip_default_metric_cmd
,
152 "no default-metric [(1-16)]",
154 "Set a metric of redistribute routes\n"
157 nb_cli_enqueue_change(vty
, "./default-metric", NB_OP_MODIFY
, NULL
);
159 return nb_cli_apply_changes(vty
, NULL
);
162 void cli_show_rip_default_metric(struct vty
*vty
, const struct lyd_node
*dnode
,
165 vty_out(vty
, " default-metric %s\n",
166 yang_dnode_get_string(dnode
, NULL
));
170 * XPath: /frr-ripd:ripd/instance/distance/default
172 DEFPY_YANG (rip_distance
,
175 "Administrative distance\n"
178 nb_cli_enqueue_change(vty
, "./distance/default", NB_OP_MODIFY
,
181 return nb_cli_apply_changes(vty
, NULL
);
184 DEFPY_YANG (no_rip_distance
,
186 "no distance [(1-255)]",
188 "Administrative distance\n"
191 nb_cli_enqueue_change(vty
, "./distance/default", NB_OP_MODIFY
, NULL
);
193 return nb_cli_apply_changes(vty
, NULL
);
196 void cli_show_rip_distance(struct vty
*vty
, const struct lyd_node
*dnode
,
199 if (yang_dnode_is_default(dnode
, NULL
))
200 vty_out(vty
, " no distance\n");
202 vty_out(vty
, " distance %s\n",
203 yang_dnode_get_string(dnode
, NULL
));
207 * XPath: /frr-ripd:ripd/instance/distance/source
209 DEFPY_YANG (rip_distance_source
,
210 rip_distance_source_cmd
,
211 "[no] distance (1-255) A.B.C.D/M$prefix [WORD$acl]",
213 "Administrative distance\n"
216 "Access list name\n")
219 nb_cli_enqueue_change(vty
, ".", NB_OP_CREATE
, NULL
);
220 nb_cli_enqueue_change(vty
, "./distance", NB_OP_MODIFY
,
222 nb_cli_enqueue_change(vty
, "./access-list",
223 acl
? NB_OP_MODIFY
: NB_OP_DESTROY
, acl
);
225 nb_cli_enqueue_change(vty
, ".", NB_OP_DESTROY
, NULL
);
227 return nb_cli_apply_changes(vty
, "./distance/source[prefix='%s']",
231 void cli_show_rip_distance_source(struct vty
*vty
, const struct lyd_node
*dnode
,
234 vty_out(vty
, " distance %s %s",
235 yang_dnode_get_string(dnode
, "./distance"),
236 yang_dnode_get_string(dnode
, "./prefix"));
237 if (yang_dnode_exists(dnode
, "./access-list"))
239 yang_dnode_get_string(dnode
, "./access-list"));
244 * XPath: /frr-ripd:ripd/instance/explicit-neighbor
246 DEFPY_YANG (rip_neighbor
,
248 "[no] neighbor A.B.C.D",
250 "Specify a neighbor router\n"
251 "Neighbor address\n")
253 nb_cli_enqueue_change(vty
, "./explicit-neighbor",
254 no
? NB_OP_DESTROY
: NB_OP_CREATE
, neighbor_str
);
256 return nb_cli_apply_changes(vty
, NULL
);
259 void cli_show_rip_neighbor(struct vty
*vty
, const struct lyd_node
*dnode
,
262 vty_out(vty
, " neighbor %s\n", yang_dnode_get_string(dnode
, NULL
));
266 * XPath: /frr-ripd:ripd/instance/network
268 DEFPY_YANG (rip_network_prefix
,
269 rip_network_prefix_cmd
,
270 "[no] network A.B.C.D/M",
272 "Enable routing on an IP network\n"
273 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
275 nb_cli_enqueue_change(vty
, "./network",
276 no
? NB_OP_DESTROY
: NB_OP_CREATE
, network_str
);
278 return nb_cli_apply_changes(vty
, NULL
);
281 void cli_show_rip_network_prefix(struct vty
*vty
, const struct lyd_node
*dnode
,
284 vty_out(vty
, " network %s\n", yang_dnode_get_string(dnode
, NULL
));
288 * XPath: /frr-ripd:ripd/instance/interface
290 DEFPY_YANG (rip_network_if
,
294 "Enable routing on an IP network\n"
297 nb_cli_enqueue_change(vty
, "./interface",
298 no
? NB_OP_DESTROY
: NB_OP_CREATE
, network
);
300 return nb_cli_apply_changes(vty
, NULL
);
303 void cli_show_rip_network_interface(struct vty
*vty
,
304 const struct lyd_node
*dnode
,
307 vty_out(vty
, " network %s\n", yang_dnode_get_string(dnode
, NULL
));
311 * XPath: /frr-ripd:ripd/instance/offset-list
313 DEFPY_YANG (rip_offset_list
,
315 "[no] offset-list ACCESSLIST4_NAME$acl <in|out>$direction (0-16)$metric [IFNAME]",
317 "Modify RIP metric\n"
319 "For incoming updates\n"
320 "For outgoing updates\n"
322 "Interface to match\n")
325 nb_cli_enqueue_change(vty
, ".", NB_OP_CREATE
, NULL
);
326 nb_cli_enqueue_change(vty
, "./access-list", NB_OP_MODIFY
, acl
);
327 nb_cli_enqueue_change(vty
, "./metric", NB_OP_MODIFY
,
330 nb_cli_enqueue_change(vty
, ".", NB_OP_DESTROY
, NULL
);
332 return nb_cli_apply_changes(
333 vty
, "./offset-list[interface='%s'][direction='%s']",
334 ifname
? ifname
: "*", direction
);
337 void cli_show_rip_offset_list(struct vty
*vty
, const struct lyd_node
*dnode
,
340 const char *interface
;
342 interface
= yang_dnode_get_string(dnode
, "./interface");
344 vty_out(vty
, " offset-list %s %s %s",
345 yang_dnode_get_string(dnode
, "./access-list"),
346 yang_dnode_get_string(dnode
, "./direction"),
347 yang_dnode_get_string(dnode
, "./metric"));
348 if (!strmatch(interface
, "*"))
349 vty_out(vty
, " %s", interface
);
354 * XPath: /frr-ripd:ripd/instance/passive-default
356 DEFPY_YANG (rip_passive_default
,
357 rip_passive_default_cmd
,
358 "[no] passive-interface default",
360 "Suppress routing updates on an interface\n"
361 "default for all interfaces\n")
363 nb_cli_enqueue_change(vty
, "./passive-default", NB_OP_MODIFY
,
364 no
? "false" : "true");
366 return nb_cli_apply_changes(vty
, NULL
);
369 void cli_show_rip_passive_default(struct vty
*vty
, const struct lyd_node
*dnode
,
372 if (!yang_dnode_get_bool(dnode
, NULL
))
375 vty_out(vty
, " passive-interface default\n");
379 * XPath: /frr-ripd:ripd/instance/passive-interface
380 * /frr-ripd:ripd/instance/non-passive-interface
382 DEFPY_YANG (rip_passive_interface
,
383 rip_passive_interface_cmd
,
384 "[no] passive-interface IFNAME",
386 "Suppress routing updates on an interface\n"
389 bool passive_default
=
390 yang_dnode_get_bool(vty
->candidate_config
->dnode
, "%s%s",
391 VTY_CURR_XPATH
, "/passive-default");
393 if (passive_default
) {
394 nb_cli_enqueue_change(vty
, "./non-passive-interface",
395 no
? NB_OP_CREATE
: NB_OP_DESTROY
,
398 nb_cli_enqueue_change(vty
, "./passive-interface",
399 no
? NB_OP_DESTROY
: NB_OP_CREATE
,
403 return nb_cli_apply_changes(vty
, NULL
);
406 void cli_show_rip_passive_interface(struct vty
*vty
,
407 const struct lyd_node
*dnode
,
410 vty_out(vty
, " passive-interface %s\n",
411 yang_dnode_get_string(dnode
, NULL
));
414 void cli_show_rip_non_passive_interface(struct vty
*vty
,
415 const struct lyd_node
*dnode
,
418 vty_out(vty
, " no passive-interface %s\n",
419 yang_dnode_get_string(dnode
, NULL
));
423 * XPath: /frr-ripd:ripd/instance/redistribute
425 DEFPY_YANG (rip_redistribute
,
426 rip_redistribute_cmd
,
427 "[no] redistribute " FRR_REDIST_STR_RIPD
"$protocol [{metric (0-16)|route-map RMAP_NAME$route_map}]",
430 FRR_REDIST_HELP_STR_RIPD
433 "Route map reference\n"
434 "Pointer to route-map entries\n")
437 nb_cli_enqueue_change(vty
, ".", NB_OP_CREATE
, NULL
);
438 nb_cli_enqueue_change(vty
, "./route-map",
439 route_map
? NB_OP_MODIFY
: NB_OP_DESTROY
,
441 nb_cli_enqueue_change(vty
, "./metric",
442 metric_str
? NB_OP_MODIFY
: NB_OP_DESTROY
,
445 nb_cli_enqueue_change(vty
, ".", NB_OP_DESTROY
, NULL
);
447 return nb_cli_apply_changes(vty
, "./redistribute[protocol='%s']",
451 void cli_show_rip_redistribute(struct vty
*vty
, const struct lyd_node
*dnode
,
454 vty_out(vty
, " redistribute %s",
455 yang_dnode_get_string(dnode
, "./protocol"));
456 if (yang_dnode_exists(dnode
, "./metric"))
457 vty_out(vty
, " metric %s",
458 yang_dnode_get_string(dnode
, "./metric"));
459 if (yang_dnode_exists(dnode
, "./route-map"))
460 vty_out(vty
, " route-map %s",
461 yang_dnode_get_string(dnode
, "./route-map"));
466 * XPath: /frr-ripd:ripd/instance/static-route
468 DEFPY_YANG (rip_route
,
470 "[no] route A.B.C.D/M",
472 "RIP static route configuration\n"
473 "IP prefix <network>/<length>\n")
475 nb_cli_enqueue_change(vty
, "./static-route",
476 no
? NB_OP_DESTROY
: NB_OP_CREATE
, route_str
);
478 return nb_cli_apply_changes(vty
, NULL
);
481 void cli_show_rip_route(struct vty
*vty
, const struct lyd_node
*dnode
,
484 vty_out(vty
, " route %s\n", yang_dnode_get_string(dnode
, NULL
));
488 * XPath: /frr-ripd:ripd/instance/timers
490 DEFPY_YANG (rip_timers
,
492 "timers basic (5-2147483647)$update (5-2147483647)$timeout (5-2147483647)$garbage",
493 "Adjust routing timers\n"
494 "Basic routing protocol update timers\n"
495 "Routing table update timer value in second. Default is 30.\n"
496 "Routing information timeout timer. Default is 180.\n"
497 "Garbage collection timer. Default is 120.\n")
499 nb_cli_enqueue_change(vty
, "./update-interval", NB_OP_MODIFY
,
501 nb_cli_enqueue_change(vty
, "./holddown-interval", NB_OP_MODIFY
,
503 nb_cli_enqueue_change(vty
, "./flush-interval", NB_OP_MODIFY
,
506 return nb_cli_apply_changes(vty
, "./timers");
509 DEFPY_YANG (no_rip_timers
,
511 "no timers basic [(5-2147483647) (5-2147483647) (5-2147483647)]",
513 "Adjust routing timers\n"
514 "Basic routing protocol update timers\n"
515 "Routing table update timer value in second. Default is 30.\n"
516 "Routing information timeout timer. Default is 180.\n"
517 "Garbage collection timer. Default is 120.\n")
519 nb_cli_enqueue_change(vty
, "./update-interval", NB_OP_MODIFY
, NULL
);
520 nb_cli_enqueue_change(vty
, "./holddown-interval", NB_OP_MODIFY
, NULL
);
521 nb_cli_enqueue_change(vty
, "./flush-interval", NB_OP_MODIFY
, NULL
);
523 return nb_cli_apply_changes(vty
, "./timers");
526 void cli_show_rip_timers(struct vty
*vty
, const struct lyd_node
*dnode
,
529 vty_out(vty
, " timers basic %s %s %s\n",
530 yang_dnode_get_string(dnode
, "./update-interval"),
531 yang_dnode_get_string(dnode
, "./holddown-interval"),
532 yang_dnode_get_string(dnode
, "./flush-interval"));
536 * XPath: /frr-ripd:ripd/instance/version
538 DEFPY_YANG (rip_version
,
541 "Set routing protocol version\n"
544 nb_cli_enqueue_change(vty
, "./version/receive", NB_OP_MODIFY
,
546 nb_cli_enqueue_change(vty
, "./version/send", NB_OP_MODIFY
, version_str
);
548 return nb_cli_apply_changes(vty
, NULL
);
551 DEFPY_YANG (no_rip_version
,
553 "no version [(1-2)]",
555 "Set routing protocol version\n"
558 nb_cli_enqueue_change(vty
, "./version/receive", NB_OP_MODIFY
, NULL
);
559 nb_cli_enqueue_change(vty
, "./version/send", NB_OP_MODIFY
, NULL
);
561 return nb_cli_apply_changes(vty
, NULL
);
564 void cli_show_rip_version(struct vty
*vty
, const struct lyd_node
*dnode
,
568 * We have only one "version" command and three possible combinations of
569 * send/receive values.
571 switch (yang_dnode_get_enum(dnode
, "./receive")) {
572 case RI_RIP_VERSION_1
:
573 vty_out(vty
, " version 1\n");
575 case RI_RIP_VERSION_2
:
576 vty_out(vty
, " version 2\n");
578 case RI_RIP_VERSION_1_AND_2
:
579 vty_out(vty
, " no version\n");
585 * XPath: /frr-ripd:ripd/instance/default-bfd-profile
587 DEFPY_YANG(rip_bfd_default_profile
, rip_bfd_default_profile_cmd
,
588 "bfd default-profile BFDPROF$profile",
589 "Bidirectional Forwarding Detection\n"
590 "BFD default profile\n"
593 nb_cli_enqueue_change(vty
, "./default-bfd-profile", NB_OP_MODIFY
,
596 return nb_cli_apply_changes(vty
, NULL
);
599 DEFPY_YANG(no_rip_bfd_default_profile
, no_rip_bfd_default_profile_cmd
,
600 "no bfd default-profile [BFDPROF]",
602 "Bidirectional Forwarding Detection\n"
603 "BFD default profile\n"
606 nb_cli_enqueue_change(vty
, "./default-bfd-profile", NB_OP_DESTROY
,
609 return nb_cli_apply_changes(vty
, NULL
);
612 void cli_show_ripd_instance_default_bfd_profile(struct vty
*vty
,
613 const struct lyd_node
*dnode
,
616 vty_out(vty
, " bfd default-profile %s\n",
617 yang_dnode_get_string(dnode
, NULL
));
621 * XPath: /frr-interface:lib/interface/frr-ripd:rip/split-horizon
623 DEFPY_YANG (ip_rip_split_horizon
,
624 ip_rip_split_horizon_cmd
,
625 "[no] ip rip split-horizon [poisoned-reverse$poisoned_reverse]",
628 "Routing Information Protocol\n"
629 "Perform split horizon\n"
630 "With poisoned-reverse\n")
636 else if (poisoned_reverse
)
637 value
= "poison-reverse";
641 nb_cli_enqueue_change(vty
, "./split-horizon", NB_OP_MODIFY
, value
);
643 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
646 void cli_show_ip_rip_split_horizon(struct vty
*vty
,
647 const struct lyd_node
*dnode
,
652 value
= yang_dnode_get_enum(dnode
, NULL
);
654 case RIP_NO_SPLIT_HORIZON
:
655 vty_out(vty
, " no ip rip split-horizon\n");
657 case RIP_SPLIT_HORIZON
:
658 vty_out(vty
, " ip rip split-horizon\n");
660 case RIP_SPLIT_HORIZON_POISONED_REVERSE
:
661 vty_out(vty
, " ip rip split-horizon poisoned-reverse\n");
667 * XPath: /frr-interface:lib/interface/frr-ripd:rip/v2-broadcast
669 DEFPY_YANG (ip_rip_v2_broadcast
,
670 ip_rip_v2_broadcast_cmd
,
671 "[no] ip rip v2-broadcast",
674 "Routing Information Protocol\n"
675 "Send ip broadcast v2 update\n")
677 nb_cli_enqueue_change(vty
, "./v2-broadcast", NB_OP_MODIFY
,
678 no
? "false" : "true");
680 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
683 void cli_show_ip_rip_v2_broadcast(struct vty
*vty
, const struct lyd_node
*dnode
,
686 if (!yang_dnode_get_bool(dnode
, NULL
))
689 vty_out(vty
, " ip rip v2-broadcast\n");
693 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-receive
695 DEFPY_YANG (ip_rip_receive_version
,
696 ip_rip_receive_version_cmd
,
697 "ip rip receive version <{1$v1|2$v2}|none>",
699 "Routing Information Protocol\n"
700 "Advertisement reception\n"
717 nb_cli_enqueue_change(vty
, "./version-receive", NB_OP_MODIFY
, value
);
719 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
722 DEFPY_YANG (no_ip_rip_receive_version
,
723 no_ip_rip_receive_version_cmd
,
724 "no ip rip receive version [<{1|2}|none>]",
727 "Routing Information Protocol\n"
728 "Advertisement reception\n"
734 nb_cli_enqueue_change(vty
, "./version-receive", NB_OP_MODIFY
, NULL
);
736 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
739 void cli_show_ip_rip_receive_version(struct vty
*vty
,
740 const struct lyd_node
*dnode
,
743 switch (yang_dnode_get_enum(dnode
, NULL
)) {
745 vty_out(vty
, " no ip rip receive version\n");
747 case RI_RIP_VERSION_1
:
748 vty_out(vty
, " ip rip receive version 1\n");
750 case RI_RIP_VERSION_2
:
751 vty_out(vty
, " ip rip receive version 2\n");
753 case RI_RIP_VERSION_1_AND_2
:
754 vty_out(vty
, " ip rip receive version 1 2\n");
756 case RI_RIP_VERSION_NONE
:
757 vty_out(vty
, " ip rip receive version none\n");
763 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-send
765 DEFPY_YANG (ip_rip_send_version
,
766 ip_rip_send_version_cmd
,
767 "ip rip send version <{1$v1|2$v2}|none>",
769 "Routing Information Protocol\n"
770 "Advertisement transmission\n"
787 nb_cli_enqueue_change(vty
, "./version-send", NB_OP_MODIFY
, value
);
789 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
792 DEFPY_YANG (no_ip_rip_send_version
,
793 no_ip_rip_send_version_cmd
,
794 "no ip rip send version [<{1|2}|none>]",
797 "Routing Information Protocol\n"
798 "Advertisement transmission\n"
804 nb_cli_enqueue_change(vty
, "./version-send", NB_OP_MODIFY
, NULL
);
806 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
809 void cli_show_ip_rip_send_version(struct vty
*vty
, const struct lyd_node
*dnode
,
812 switch (yang_dnode_get_enum(dnode
, NULL
)) {
814 vty_out(vty
, " no ip rip send version\n");
816 case RI_RIP_VERSION_1
:
817 vty_out(vty
, " ip rip send version 1\n");
819 case RI_RIP_VERSION_2
:
820 vty_out(vty
, " ip rip send version 2\n");
822 case RI_RIP_VERSION_1_AND_2
:
823 vty_out(vty
, " ip rip send version 1 2\n");
825 case RI_RIP_VERSION_NONE
:
826 vty_out(vty
, " ip rip send version none\n");
832 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-scheme
834 DEFPY_YANG (ip_rip_authentication_mode
,
835 ip_rip_authentication_mode_cmd
,
836 "ip rip authentication mode <md5$mode [auth-length <rfc|old-ripd>$auth_length]|text$mode>",
838 "Routing Information Protocol\n"
839 "Authentication control\n"
840 "Authentication mode\n"
841 "Keyed message digest\n"
842 "MD5 authentication data length\n"
844 "Old ripd compatible\n"
845 "Clear text authentication\n")
847 const char *value
= NULL
;
850 if (strmatch(auth_length
, "rfc"))
856 nb_cli_enqueue_change(vty
, "./authentication-scheme/mode", NB_OP_MODIFY
,
857 strmatch(mode
, "md5") ? "md5" : "plain-text");
858 if (strmatch(mode
, "md5"))
859 nb_cli_enqueue_change(vty
,
860 "./authentication-scheme/md5-auth-length",
861 NB_OP_MODIFY
, value
);
863 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
866 DEFPY_YANG (no_ip_rip_authentication_mode
,
867 no_ip_rip_authentication_mode_cmd
,
868 "no ip rip authentication mode [<md5 [auth-length <rfc|old-ripd>]|text>]",
871 "Routing Information Protocol\n"
872 "Authentication control\n"
873 "Authentication mode\n"
874 "Keyed message digest\n"
875 "MD5 authentication data length\n"
877 "Old ripd compatible\n"
878 "Clear text authentication\n")
880 nb_cli_enqueue_change(vty
, "./authentication-scheme/mode", NB_OP_MODIFY
,
882 nb_cli_enqueue_change(vty
, "./authentication-scheme/md5-auth-length",
883 NB_OP_DESTROY
, NULL
);
885 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
888 void cli_show_ip_rip_authentication_scheme(struct vty
*vty
,
889 const struct lyd_node
*dnode
,
892 switch (yang_dnode_get_enum(dnode
, "./mode")) {
894 vty_out(vty
, " no ip rip authentication mode\n");
896 case RIP_AUTH_SIMPLE_PASSWORD
:
897 vty_out(vty
, " ip rip authentication mode text\n");
900 vty_out(vty
, " ip rip authentication mode md5");
902 || !yang_dnode_is_default(dnode
, "./md5-auth-length")) {
903 if (yang_dnode_get_enum(dnode
, "./md5-auth-length")
904 == RIP_AUTH_MD5_SIZE
)
905 vty_out(vty
, " auth-length rfc");
907 vty_out(vty
, " auth-length old-ripd");
915 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-password
917 DEFPY_YANG (ip_rip_authentication_string
,
918 ip_rip_authentication_string_cmd
,
919 "ip rip authentication string LINE$password",
921 "Routing Information Protocol\n"
922 "Authentication control\n"
923 "Authentication string\n"
924 "Authentication string\n")
926 if (strlen(password
) > 16) {
928 "%% RIPv2 authentication string must be shorter than 16\n");
929 return CMD_WARNING_CONFIG_FAILED
;
932 if (yang_dnode_existsf(vty
->candidate_config
->dnode
, "%s%s",
934 "/frr-ripd:rip/authentication-key-chain")) {
935 vty_out(vty
, "%% key-chain configuration exists\n");
936 return CMD_WARNING_CONFIG_FAILED
;
939 nb_cli_enqueue_change(vty
, "./authentication-password", NB_OP_MODIFY
,
942 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
945 DEFPY_YANG (no_ip_rip_authentication_string
,
946 no_ip_rip_authentication_string_cmd
,
947 "no ip rip authentication string [LINE]",
950 "Routing Information Protocol\n"
951 "Authentication control\n"
952 "Authentication string\n"
953 "Authentication string\n")
955 nb_cli_enqueue_change(vty
, "./authentication-password", NB_OP_DESTROY
,
958 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
961 void cli_show_ip_rip_authentication_string(struct vty
*vty
,
962 const struct lyd_node
*dnode
,
965 vty_out(vty
, " ip rip authentication string %s\n",
966 yang_dnode_get_string(dnode
, NULL
));
970 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-key-chain
972 DEFPY_YANG (ip_rip_authentication_key_chain
,
973 ip_rip_authentication_key_chain_cmd
,
974 "ip rip authentication key-chain LINE$keychain",
976 "Routing Information Protocol\n"
977 "Authentication control\n"
978 "Authentication key-chain\n"
979 "name of key-chain\n")
981 if (yang_dnode_existsf(vty
->candidate_config
->dnode
, "%s%s",
983 "/frr-ripd:rip/authentication-password")) {
984 vty_out(vty
, "%% authentication string configuration exists\n");
985 return CMD_WARNING_CONFIG_FAILED
;
988 nb_cli_enqueue_change(vty
, "./authentication-key-chain", NB_OP_MODIFY
,
991 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
994 DEFPY_YANG (no_ip_rip_authentication_key_chain
,
995 no_ip_rip_authentication_key_chain_cmd
,
996 "no ip rip authentication key-chain [LINE]",
999 "Routing Information Protocol\n"
1000 "Authentication control\n"
1001 "Authentication key-chain\n"
1002 "name of key-chain\n")
1004 nb_cli_enqueue_change(vty
, "./authentication-key-chain", NB_OP_DESTROY
,
1007 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
1010 void cli_show_ip_rip_authentication_key_chain(struct vty
*vty
,
1011 const struct lyd_node
*dnode
,
1014 vty_out(vty
, " ip rip authentication key-chain %s\n",
1015 yang_dnode_get_string(dnode
, NULL
));
1019 * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd-monitoring/enable
1021 DEFPY_YANG(ip_rip_bfd
, ip_rip_bfd_cmd
, "[no] ip rip bfd",
1023 "Routing Information Protocol\n"
1024 "Enable BFD support\n")
1026 nb_cli_enqueue_change(vty
, "./bfd-monitoring/enable", NB_OP_MODIFY
,
1027 no
? "false" : "true");
1029 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
1032 void cli_show_ip_rip_bfd_enable(struct vty
*vty
, const struct lyd_node
*dnode
,
1035 vty_out(vty
, " ip rip bfd\n");
1039 * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd/profile
1041 DEFPY_YANG(ip_rip_bfd_profile
, ip_rip_bfd_profile_cmd
,
1042 "[no] ip rip bfd profile BFDPROF$profile",
1044 "Routing Information Protocol\n"
1045 "Enable BFD support\n"
1046 "Use a pre-configured profile\n"
1050 nb_cli_enqueue_change(vty
, "./bfd-monitoring/profile",
1051 NB_OP_DESTROY
, NULL
);
1053 nb_cli_enqueue_change(vty
, "./bfd-monitoring/profile",
1054 NB_OP_MODIFY
, profile
);
1056 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
1059 DEFPY_YANG(no_ip_rip_bfd_profile
, no_ip_rip_bfd_profile_cmd
,
1060 "no ip rip bfd profile",
1062 "Routing Information Protocol\n"
1063 "Enable BFD support\n"
1064 "Use a pre-configured profile\n")
1066 nb_cli_enqueue_change(vty
, "./bfd-monitoring/profile", NB_OP_DESTROY
,
1068 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
1071 void cli_show_ip_rip_bfd_profile(struct vty
*vty
, const struct lyd_node
*dnode
,
1074 vty_out(vty
, " ip rip bfd profile %s\n",
1075 yang_dnode_get_string(dnode
, NULL
));
1079 * XPath: /frr-ripd:clear-rip-route
1081 DEFPY_YANG (clear_ip_rip
,
1083 "clear ip rip [vrf WORD]",
1086 "Clear IP RIP database\n"
1094 struct yang_data
*yang_vrf
;
1096 yang_vrf
= yang_data_new("/frr-ripd:clear-rip-route/input/vrf",
1098 listnode_add(input
, yang_vrf
);
1101 ret
= nb_cli_rpc(vty
, "/frr-ripd:clear-rip-route", input
, NULL
);
1103 list_delete(&input
);
1108 DEFUN (rip_distribute_list
,
1109 rip_distribute_list_cmd
,
1110 "distribute-list [prefix] ACCESSLIST4_NAME <in|out> [WORD]",
1111 "Filter networks in routing updates\n"
1112 "Specify a prefix\n"
1113 "Access-list name\n"
1114 "Filter incoming routing updates\n"
1115 "Filter outgoing routing updates\n"
1118 const char *ifname
= NULL
;
1119 int prefix
= (argv
[1]->type
== WORD_TKN
) ? 1 : 0;
1121 if (argv
[argc
- 1]->type
== VARIABLE_TKN
)
1122 ifname
= argv
[argc
- 1]->arg
;
1124 return distribute_list_parser(prefix
, true, argv
[2 + prefix
]->text
,
1125 argv
[1 + prefix
]->arg
, ifname
);
1128 DEFUN (rip_no_distribute_list
,
1129 rip_no_distribute_list_cmd
,
1130 "no distribute-list [prefix] ACCESSLIST4_NAME <in|out> [WORD]",
1132 "Filter networks in routing updates\n"
1133 "Specify a prefix\n"
1134 "Access-list name\n"
1135 "Filter incoming routing updates\n"
1136 "Filter outgoing routing updates\n"
1139 const char *ifname
= NULL
;
1140 int prefix
= (argv
[2]->type
== WORD_TKN
) ? 1 : 0;
1142 if (argv
[argc
- 1]->type
== VARIABLE_TKN
)
1143 ifname
= argv
[argc
- 1]->arg
;
1145 return distribute_list_no_parser(vty
, prefix
, true,
1146 argv
[3 + prefix
]->text
,
1147 argv
[2 + prefix
]->arg
, ifname
);
1150 void rip_cli_init(void)
1152 install_element(CONFIG_NODE
, &router_rip_cmd
);
1153 install_element(CONFIG_NODE
, &no_router_rip_cmd
);
1155 install_element(RIP_NODE
, &rip_distribute_list_cmd
);
1156 install_element(RIP_NODE
, &rip_no_distribute_list_cmd
);
1158 install_element(RIP_NODE
, &rip_allow_ecmp_cmd
);
1159 install_element(RIP_NODE
, &rip_default_information_originate_cmd
);
1160 install_element(RIP_NODE
, &rip_default_metric_cmd
);
1161 install_element(RIP_NODE
, &no_rip_default_metric_cmd
);
1162 install_element(RIP_NODE
, &rip_distance_cmd
);
1163 install_element(RIP_NODE
, &no_rip_distance_cmd
);
1164 install_element(RIP_NODE
, &rip_distance_source_cmd
);
1165 install_element(RIP_NODE
, &rip_neighbor_cmd
);
1166 install_element(RIP_NODE
, &rip_network_prefix_cmd
);
1167 install_element(RIP_NODE
, &rip_network_if_cmd
);
1168 install_element(RIP_NODE
, &rip_offset_list_cmd
);
1169 install_element(RIP_NODE
, &rip_passive_default_cmd
);
1170 install_element(RIP_NODE
, &rip_passive_interface_cmd
);
1171 install_element(RIP_NODE
, &rip_redistribute_cmd
);
1172 install_element(RIP_NODE
, &rip_route_cmd
);
1173 install_element(RIP_NODE
, &rip_timers_cmd
);
1174 install_element(RIP_NODE
, &no_rip_timers_cmd
);
1175 install_element(RIP_NODE
, &rip_version_cmd
);
1176 install_element(RIP_NODE
, &no_rip_version_cmd
);
1177 install_element(RIP_NODE
, &rip_bfd_default_profile_cmd
);
1178 install_element(RIP_NODE
, &no_rip_bfd_default_profile_cmd
);
1180 install_element(INTERFACE_NODE
, &ip_rip_split_horizon_cmd
);
1181 install_element(INTERFACE_NODE
, &ip_rip_v2_broadcast_cmd
);
1182 install_element(INTERFACE_NODE
, &ip_rip_receive_version_cmd
);
1183 install_element(INTERFACE_NODE
, &no_ip_rip_receive_version_cmd
);
1184 install_element(INTERFACE_NODE
, &ip_rip_send_version_cmd
);
1185 install_element(INTERFACE_NODE
, &no_ip_rip_send_version_cmd
);
1186 install_element(INTERFACE_NODE
, &ip_rip_authentication_mode_cmd
);
1187 install_element(INTERFACE_NODE
, &no_ip_rip_authentication_mode_cmd
);
1188 install_element(INTERFACE_NODE
, &ip_rip_authentication_string_cmd
);
1189 install_element(INTERFACE_NODE
, &no_ip_rip_authentication_string_cmd
);
1190 install_element(INTERFACE_NODE
, &ip_rip_authentication_key_chain_cmd
);
1191 install_element(INTERFACE_NODE
,
1192 &no_ip_rip_authentication_key_chain_cmd
);
1193 install_element(INTERFACE_NODE
, &ip_rip_bfd_cmd
);
1194 install_element(INTERFACE_NODE
, &ip_rip_bfd_profile_cmd
);
1195 install_element(INTERFACE_NODE
, &no_ip_rip_bfd_profile_cmd
);
1197 install_element(ENABLE_NODE
, &clear_ip_rip_cmd
);