2 * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
3 * Copyright (C) 2018 NetDEF, Inc.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
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
28 #include "northbound_cli.h"
31 #include "ripd/ripd.h"
32 #include "ripd/rip_nb.h"
33 #ifndef VTYSH_EXTRACT_PL
34 #include "ripd/rip_cli_clippy.c"
38 * XPath: /frr-ripd:ripd/instance
40 DEFPY_YANG_NOSH (router_rip
,
42 "router rip [vrf NAME]",
43 "Enable a routing process\n"
44 "Routing Information Protocol (RIP)\n"
47 char xpath
[XPATH_MAXLEN
];
50 /* Build RIP instance XPath. */
52 vrf
= VRF_DEFAULT_NAME
;
53 snprintf(xpath
, sizeof(xpath
), "/frr-ripd:ripd/instance[vrf='%s']",
56 nb_cli_enqueue_change(vty
, xpath
, NB_OP_CREATE
, NULL
);
58 ret
= nb_cli_apply_changes(vty
, NULL
);
59 if (ret
== CMD_SUCCESS
)
60 VTY_PUSH_XPATH(RIP_NODE
, xpath
);
65 DEFPY_YANG (no_router_rip
,
67 "no router rip [vrf NAME]",
69 "Enable a routing process\n"
70 "Routing Information Protocol (RIP)\n"
73 char xpath
[XPATH_MAXLEN
];
75 /* Build RIP instance XPath. */
77 vrf
= VRF_DEFAULT_NAME
;
78 snprintf(xpath
, sizeof(xpath
), "/frr-ripd:ripd/instance[vrf='%s']",
81 nb_cli_enqueue_change(vty
, xpath
, NB_OP_DESTROY
, NULL
);
83 return nb_cli_apply_changes_clear_pending(vty
, NULL
);
86 void cli_show_router_rip(struct vty
*vty
, const struct lyd_node
*dnode
,
91 vrf_name
= yang_dnode_get_string(dnode
, "./vrf");
94 vty_out(vty
, "router rip");
95 if (!strmatch(vrf_name
, VRF_DEFAULT_NAME
))
96 vty_out(vty
, " vrf %s", vrf_name
);
101 * XPath: /frr-ripd:ripd/instance/allow-ecmp
103 DEFPY_YANG (rip_allow_ecmp
,
107 "Allow Equal Cost MultiPath\n")
109 nb_cli_enqueue_change(vty
, "./allow-ecmp", NB_OP_MODIFY
,
110 no
? "false" : "true");
112 return nb_cli_apply_changes(vty
, NULL
);
115 void cli_show_rip_allow_ecmp(struct vty
*vty
, const struct lyd_node
*dnode
,
118 if (!yang_dnode_get_bool(dnode
, NULL
))
121 vty_out(vty
, " allow-ecmp\n");
125 * XPath: /frr-ripd:ripd/instance/default-information-originate
127 DEFPY_YANG (rip_default_information_originate
,
128 rip_default_information_originate_cmd
,
129 "[no] default-information originate",
131 "Control distribution of default route\n"
132 "Distribute a default route\n")
134 nb_cli_enqueue_change(vty
, "./default-information-originate",
135 NB_OP_MODIFY
, no
? "false" : "true");
137 return nb_cli_apply_changes(vty
, NULL
);
140 void cli_show_rip_default_information_originate(struct vty
*vty
,
141 const struct lyd_node
*dnode
,
144 if (!yang_dnode_get_bool(dnode
, NULL
))
147 vty_out(vty
, " default-information originate\n");
151 * XPath: /frr-ripd:ripd/instance/default-metric
153 DEFPY_YANG (rip_default_metric
,
154 rip_default_metric_cmd
,
155 "default-metric (1-16)",
156 "Set a metric of redistribute routes\n"
159 nb_cli_enqueue_change(vty
, "./default-metric", NB_OP_MODIFY
,
162 return nb_cli_apply_changes(vty
, NULL
);
165 DEFPY_YANG (no_rip_default_metric
,
166 no_rip_default_metric_cmd
,
167 "no default-metric [(1-16)]",
169 "Set a metric of redistribute routes\n"
172 nb_cli_enqueue_change(vty
, "./default-metric", NB_OP_MODIFY
, NULL
);
174 return nb_cli_apply_changes(vty
, NULL
);
177 void cli_show_rip_default_metric(struct vty
*vty
, const struct lyd_node
*dnode
,
180 vty_out(vty
, " default-metric %s\n",
181 yang_dnode_get_string(dnode
, NULL
));
185 * XPath: /frr-ripd:ripd/instance/distance/default
187 DEFPY_YANG (rip_distance
,
190 "Administrative distance\n"
193 nb_cli_enqueue_change(vty
, "./distance/default", NB_OP_MODIFY
,
196 return nb_cli_apply_changes(vty
, NULL
);
199 DEFPY_YANG (no_rip_distance
,
201 "no distance [(1-255)]",
203 "Administrative distance\n"
206 nb_cli_enqueue_change(vty
, "./distance/default", NB_OP_MODIFY
, NULL
);
208 return nb_cli_apply_changes(vty
, NULL
);
211 void cli_show_rip_distance(struct vty
*vty
, const struct lyd_node
*dnode
,
214 if (yang_dnode_is_default(dnode
, NULL
))
215 vty_out(vty
, " no distance\n");
217 vty_out(vty
, " distance %s\n",
218 yang_dnode_get_string(dnode
, NULL
));
222 * XPath: /frr-ripd:ripd/instance/distance/source
224 DEFPY_YANG (rip_distance_source
,
225 rip_distance_source_cmd
,
226 "[no] distance (1-255) A.B.C.D/M$prefix [WORD$acl]",
228 "Administrative distance\n"
231 "Access list name\n")
234 nb_cli_enqueue_change(vty
, ".", NB_OP_CREATE
, NULL
);
235 nb_cli_enqueue_change(vty
, "./distance", NB_OP_MODIFY
,
237 nb_cli_enqueue_change(vty
, "./access-list",
238 acl
? NB_OP_MODIFY
: NB_OP_DESTROY
, acl
);
240 nb_cli_enqueue_change(vty
, ".", NB_OP_DESTROY
, NULL
);
242 return nb_cli_apply_changes(vty
, "./distance/source[prefix='%s']",
246 void cli_show_rip_distance_source(struct vty
*vty
, const struct lyd_node
*dnode
,
249 vty_out(vty
, " distance %s %s",
250 yang_dnode_get_string(dnode
, "./distance"),
251 yang_dnode_get_string(dnode
, "./prefix"));
252 if (yang_dnode_exists(dnode
, "./access-list"))
254 yang_dnode_get_string(dnode
, "./access-list"));
259 * XPath: /frr-ripd:ripd/instance/explicit-neighbor
261 DEFPY_YANG (rip_neighbor
,
263 "[no] neighbor A.B.C.D",
265 "Specify a neighbor router\n"
266 "Neighbor address\n")
268 nb_cli_enqueue_change(vty
, "./explicit-neighbor",
269 no
? NB_OP_DESTROY
: NB_OP_CREATE
, neighbor_str
);
271 return nb_cli_apply_changes(vty
, NULL
);
274 void cli_show_rip_neighbor(struct vty
*vty
, const struct lyd_node
*dnode
,
277 vty_out(vty
, " neighbor %s\n", yang_dnode_get_string(dnode
, NULL
));
281 * XPath: /frr-ripd:ripd/instance/network
283 DEFPY_YANG (rip_network_prefix
,
284 rip_network_prefix_cmd
,
285 "[no] network A.B.C.D/M",
287 "Enable routing on an IP network\n"
288 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
290 nb_cli_enqueue_change(vty
, "./network",
291 no
? NB_OP_DESTROY
: NB_OP_CREATE
, network_str
);
293 return nb_cli_apply_changes(vty
, NULL
);
296 void cli_show_rip_network_prefix(struct vty
*vty
, const struct lyd_node
*dnode
,
299 vty_out(vty
, " network %s\n", yang_dnode_get_string(dnode
, NULL
));
303 * XPath: /frr-ripd:ripd/instance/interface
305 DEFPY_YANG (rip_network_if
,
309 "Enable routing on an IP network\n"
312 nb_cli_enqueue_change(vty
, "./interface",
313 no
? NB_OP_DESTROY
: NB_OP_CREATE
, network
);
315 return nb_cli_apply_changes(vty
, NULL
);
318 void cli_show_rip_network_interface(struct vty
*vty
,
319 const struct lyd_node
*dnode
,
322 vty_out(vty
, " network %s\n", yang_dnode_get_string(dnode
, NULL
));
326 * XPath: /frr-ripd:ripd/instance/offset-list
328 DEFPY_YANG (rip_offset_list
,
330 "[no] offset-list ACCESSLIST4_NAME$acl <in|out>$direction (0-16)$metric [IFNAME]",
332 "Modify RIP metric\n"
334 "For incoming updates\n"
335 "For outgoing updates\n"
337 "Interface to match\n")
340 nb_cli_enqueue_change(vty
, ".", NB_OP_CREATE
, NULL
);
341 nb_cli_enqueue_change(vty
, "./access-list", NB_OP_MODIFY
, acl
);
342 nb_cli_enqueue_change(vty
, "./metric", NB_OP_MODIFY
,
345 nb_cli_enqueue_change(vty
, ".", NB_OP_DESTROY
, NULL
);
347 return nb_cli_apply_changes(
348 vty
, "./offset-list[interface='%s'][direction='%s']",
349 ifname
? ifname
: "*", direction
);
352 void cli_show_rip_offset_list(struct vty
*vty
, const struct lyd_node
*dnode
,
355 const char *interface
;
357 interface
= yang_dnode_get_string(dnode
, "./interface");
359 vty_out(vty
, " offset-list %s %s %s",
360 yang_dnode_get_string(dnode
, "./access-list"),
361 yang_dnode_get_string(dnode
, "./direction"),
362 yang_dnode_get_string(dnode
, "./metric"));
363 if (!strmatch(interface
, "*"))
364 vty_out(vty
, " %s", interface
);
369 * XPath: /frr-ripd:ripd/instance/passive-default
371 DEFPY_YANG (rip_passive_default
,
372 rip_passive_default_cmd
,
373 "[no] passive-interface default",
375 "Suppress routing updates on an interface\n"
376 "default for all interfaces\n")
378 nb_cli_enqueue_change(vty
, "./passive-default", NB_OP_MODIFY
,
379 no
? "false" : "true");
381 return nb_cli_apply_changes(vty
, NULL
);
384 void cli_show_rip_passive_default(struct vty
*vty
, const struct lyd_node
*dnode
,
387 if (!yang_dnode_get_bool(dnode
, NULL
))
390 vty_out(vty
, " passive-interface default\n");
394 * XPath: /frr-ripd:ripd/instance/passive-interface
395 * /frr-ripd:ripd/instance/non-passive-interface
397 DEFPY_YANG (rip_passive_interface
,
398 rip_passive_interface_cmd
,
399 "[no] passive-interface IFNAME",
401 "Suppress routing updates on an interface\n"
404 bool passive_default
=
405 yang_dnode_get_bool(vty
->candidate_config
->dnode
, "%s%s",
406 VTY_CURR_XPATH
, "/passive-default");
408 if (passive_default
) {
409 nb_cli_enqueue_change(vty
, "./non-passive-interface",
410 no
? NB_OP_CREATE
: NB_OP_DESTROY
,
413 nb_cli_enqueue_change(vty
, "./passive-interface",
414 no
? NB_OP_DESTROY
: NB_OP_CREATE
,
418 return nb_cli_apply_changes(vty
, NULL
);
421 void cli_show_rip_passive_interface(struct vty
*vty
,
422 const struct lyd_node
*dnode
,
425 vty_out(vty
, " passive-interface %s\n",
426 yang_dnode_get_string(dnode
, NULL
));
429 void cli_show_rip_non_passive_interface(struct vty
*vty
,
430 const struct lyd_node
*dnode
,
433 vty_out(vty
, " no passive-interface %s\n",
434 yang_dnode_get_string(dnode
, NULL
));
438 * XPath: /frr-ripd:ripd/instance/redistribute
440 DEFPY_YANG (rip_redistribute
,
441 rip_redistribute_cmd
,
442 "[no] redistribute " FRR_REDIST_STR_RIPD
"$protocol [{metric (0-16)|route-map RMAP_NAME$route_map}]",
445 FRR_REDIST_HELP_STR_RIPD
448 "Route map reference\n"
449 "Pointer to route-map entries\n")
452 nb_cli_enqueue_change(vty
, ".", NB_OP_CREATE
, NULL
);
453 nb_cli_enqueue_change(vty
, "./route-map",
454 route_map
? NB_OP_MODIFY
: NB_OP_DESTROY
,
456 nb_cli_enqueue_change(vty
, "./metric",
457 metric_str
? NB_OP_MODIFY
: NB_OP_DESTROY
,
460 nb_cli_enqueue_change(vty
, ".", NB_OP_DESTROY
, NULL
);
462 return nb_cli_apply_changes(vty
, "./redistribute[protocol='%s']",
466 void cli_show_rip_redistribute(struct vty
*vty
, const struct lyd_node
*dnode
,
469 vty_out(vty
, " redistribute %s",
470 yang_dnode_get_string(dnode
, "./protocol"));
471 if (yang_dnode_exists(dnode
, "./metric"))
472 vty_out(vty
, " metric %s",
473 yang_dnode_get_string(dnode
, "./metric"));
474 if (yang_dnode_exists(dnode
, "./route-map"))
475 vty_out(vty
, " route-map %s",
476 yang_dnode_get_string(dnode
, "./route-map"));
481 * XPath: /frr-ripd:ripd/instance/static-route
483 DEFPY_YANG (rip_route
,
485 "[no] route A.B.C.D/M",
487 "RIP static route configuration\n"
488 "IP prefix <network>/<length>\n")
490 nb_cli_enqueue_change(vty
, "./static-route",
491 no
? NB_OP_DESTROY
: NB_OP_CREATE
, route_str
);
493 return nb_cli_apply_changes(vty
, NULL
);
496 void cli_show_rip_route(struct vty
*vty
, const struct lyd_node
*dnode
,
499 vty_out(vty
, " route %s\n", yang_dnode_get_string(dnode
, NULL
));
503 * XPath: /frr-ripd:ripd/instance/timers
505 DEFPY_YANG (rip_timers
,
507 "timers basic (5-2147483647)$update (5-2147483647)$timeout (5-2147483647)$garbage",
508 "Adjust routing timers\n"
509 "Basic routing protocol update timers\n"
510 "Routing table update timer value in second. Default is 30.\n"
511 "Routing information timeout timer. Default is 180.\n"
512 "Garbage collection timer. Default is 120.\n")
514 nb_cli_enqueue_change(vty
, "./update-interval", NB_OP_MODIFY
,
516 nb_cli_enqueue_change(vty
, "./holddown-interval", NB_OP_MODIFY
,
518 nb_cli_enqueue_change(vty
, "./flush-interval", NB_OP_MODIFY
,
521 return nb_cli_apply_changes(vty
, "./timers");
524 DEFPY_YANG (no_rip_timers
,
526 "no timers basic [(5-2147483647) (5-2147483647) (5-2147483647)]",
528 "Adjust routing timers\n"
529 "Basic routing protocol update timers\n"
530 "Routing table update timer value in second. Default is 30.\n"
531 "Routing information timeout timer. Default is 180.\n"
532 "Garbage collection timer. Default is 120.\n")
534 nb_cli_enqueue_change(vty
, "./update-interval", NB_OP_MODIFY
, NULL
);
535 nb_cli_enqueue_change(vty
, "./holddown-interval", NB_OP_MODIFY
, NULL
);
536 nb_cli_enqueue_change(vty
, "./flush-interval", NB_OP_MODIFY
, NULL
);
538 return nb_cli_apply_changes(vty
, "./timers");
541 void cli_show_rip_timers(struct vty
*vty
, const struct lyd_node
*dnode
,
544 vty_out(vty
, " timers basic %s %s %s\n",
545 yang_dnode_get_string(dnode
, "./update-interval"),
546 yang_dnode_get_string(dnode
, "./holddown-interval"),
547 yang_dnode_get_string(dnode
, "./flush-interval"));
551 * XPath: /frr-ripd:ripd/instance/version
553 DEFPY_YANG (rip_version
,
556 "Set routing protocol version\n"
559 nb_cli_enqueue_change(vty
, "./version/receive", NB_OP_MODIFY
,
561 nb_cli_enqueue_change(vty
, "./version/send", NB_OP_MODIFY
, version_str
);
563 return nb_cli_apply_changes(vty
, NULL
);
566 DEFPY_YANG (no_rip_version
,
568 "no version [(1-2)]",
570 "Set routing protocol version\n"
573 nb_cli_enqueue_change(vty
, "./version/receive", NB_OP_MODIFY
, NULL
);
574 nb_cli_enqueue_change(vty
, "./version/send", NB_OP_MODIFY
, NULL
);
576 return nb_cli_apply_changes(vty
, NULL
);
579 void cli_show_rip_version(struct vty
*vty
, const struct lyd_node
*dnode
,
583 * We have only one "version" command and three possible combinations of
584 * send/receive values.
586 switch (yang_dnode_get_enum(dnode
, "./receive")) {
587 case RI_RIP_VERSION_1
:
588 vty_out(vty
, " version 1\n");
590 case RI_RIP_VERSION_2
:
591 vty_out(vty
, " version 2\n");
593 case RI_RIP_VERSION_1_AND_2
:
594 vty_out(vty
, " no version\n");
600 * XPath: /frr-interface:lib/interface/frr-ripd:rip/split-horizon
602 DEFPY_YANG (ip_rip_split_horizon
,
603 ip_rip_split_horizon_cmd
,
604 "[no] ip rip split-horizon [poisoned-reverse$poisoned_reverse]",
607 "Routing Information Protocol\n"
608 "Perform split horizon\n"
609 "With poisoned-reverse\n")
615 else if (poisoned_reverse
)
616 value
= "poison-reverse";
620 nb_cli_enqueue_change(vty
, "./split-horizon", NB_OP_MODIFY
, value
);
622 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
625 void cli_show_ip_rip_split_horizon(struct vty
*vty
,
626 const struct lyd_node
*dnode
,
631 value
= yang_dnode_get_enum(dnode
, NULL
);
633 case RIP_NO_SPLIT_HORIZON
:
634 vty_out(vty
, " no ip rip split-horizon\n");
636 case RIP_SPLIT_HORIZON
:
637 vty_out(vty
, " ip rip split-horizon\n");
639 case RIP_SPLIT_HORIZON_POISONED_REVERSE
:
640 vty_out(vty
, " ip rip split-horizon poisoned-reverse\n");
646 * XPath: /frr-interface:lib/interface/frr-ripd:rip/v2-broadcast
648 DEFPY_YANG (ip_rip_v2_broadcast
,
649 ip_rip_v2_broadcast_cmd
,
650 "[no] ip rip v2-broadcast",
653 "Routing Information Protocol\n"
654 "Send ip broadcast v2 update\n")
656 nb_cli_enqueue_change(vty
, "./v2-broadcast", NB_OP_MODIFY
,
657 no
? "false" : "true");
659 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
662 void cli_show_ip_rip_v2_broadcast(struct vty
*vty
, const struct lyd_node
*dnode
,
665 if (!yang_dnode_get_bool(dnode
, NULL
))
668 vty_out(vty
, " ip rip v2-broadcast\n");
672 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-receive
674 DEFPY_YANG (ip_rip_receive_version
,
675 ip_rip_receive_version_cmd
,
676 "ip rip receive version <{1$v1|2$v2}|none>",
678 "Routing Information Protocol\n"
679 "Advertisement reception\n"
696 nb_cli_enqueue_change(vty
, "./version-receive", NB_OP_MODIFY
, value
);
698 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
701 DEFPY_YANG (no_ip_rip_receive_version
,
702 no_ip_rip_receive_version_cmd
,
703 "no ip rip receive version [<{1|2}|none>]",
706 "Routing Information Protocol\n"
707 "Advertisement reception\n"
713 nb_cli_enqueue_change(vty
, "./version-receive", NB_OP_MODIFY
, NULL
);
715 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
718 void cli_show_ip_rip_receive_version(struct vty
*vty
,
719 const struct lyd_node
*dnode
,
722 switch (yang_dnode_get_enum(dnode
, NULL
)) {
724 vty_out(vty
, " no ip rip receive version\n");
726 case RI_RIP_VERSION_1
:
727 vty_out(vty
, " ip rip receive version 1\n");
729 case RI_RIP_VERSION_2
:
730 vty_out(vty
, " ip rip receive version 2\n");
732 case RI_RIP_VERSION_1_AND_2
:
733 vty_out(vty
, " ip rip receive version 1 2\n");
735 case RI_RIP_VERSION_NONE
:
736 vty_out(vty
, " ip rip receive version none\n");
742 * XPath: /frr-interface:lib/interface/frr-ripd:rip/version-send
744 DEFPY_YANG (ip_rip_send_version
,
745 ip_rip_send_version_cmd
,
746 "ip rip send version <{1$v1|2$v2}|none>",
748 "Routing Information Protocol\n"
749 "Advertisement transmission\n"
766 nb_cli_enqueue_change(vty
, "./version-send", NB_OP_MODIFY
, value
);
768 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
771 DEFPY_YANG (no_ip_rip_send_version
,
772 no_ip_rip_send_version_cmd
,
773 "no ip rip send version [<{1|2}|none>]",
776 "Routing Information Protocol\n"
777 "Advertisement transmission\n"
783 nb_cli_enqueue_change(vty
, "./version-send", NB_OP_MODIFY
, NULL
);
785 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
788 void cli_show_ip_rip_send_version(struct vty
*vty
, const struct lyd_node
*dnode
,
791 switch (yang_dnode_get_enum(dnode
, NULL
)) {
793 vty_out(vty
, " no ip rip send version\n");
795 case RI_RIP_VERSION_1
:
796 vty_out(vty
, " ip rip send version 1\n");
798 case RI_RIP_VERSION_2
:
799 vty_out(vty
, " ip rip send version 2\n");
801 case RI_RIP_VERSION_1_AND_2
:
802 vty_out(vty
, " ip rip send version 1 2\n");
804 case RI_RIP_VERSION_NONE
:
805 vty_out(vty
, " ip rip send version none\n");
811 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-scheme
813 DEFPY_YANG (ip_rip_authentication_mode
,
814 ip_rip_authentication_mode_cmd
,
815 "ip rip authentication mode <md5$mode [auth-length <rfc|old-ripd>$auth_length]|text$mode>",
817 "Routing Information Protocol\n"
818 "Authentication control\n"
819 "Authentication mode\n"
820 "Keyed message digest\n"
821 "MD5 authentication data length\n"
823 "Old ripd compatible\n"
824 "Clear text authentication\n")
826 const char *value
= NULL
;
829 if (strmatch(auth_length
, "rfc"))
835 nb_cli_enqueue_change(vty
, "./authentication-scheme/mode", NB_OP_MODIFY
,
836 strmatch(mode
, "md5") ? "md5" : "plain-text");
837 if (strmatch(mode
, "md5"))
838 nb_cli_enqueue_change(vty
,
839 "./authentication-scheme/md5-auth-length",
840 NB_OP_MODIFY
, value
);
842 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
845 DEFPY_YANG (no_ip_rip_authentication_mode
,
846 no_ip_rip_authentication_mode_cmd
,
847 "no ip rip authentication mode [<md5 [auth-length <rfc|old-ripd>]|text>]",
850 "Routing Information Protocol\n"
851 "Authentication control\n"
852 "Authentication mode\n"
853 "Keyed message digest\n"
854 "MD5 authentication data length\n"
856 "Old ripd compatible\n"
857 "Clear text authentication\n")
859 nb_cli_enqueue_change(vty
, "./authentication-scheme/mode", NB_OP_MODIFY
,
861 nb_cli_enqueue_change(vty
, "./authentication-scheme/md5-auth-length",
862 NB_OP_DESTROY
, NULL
);
864 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
867 void cli_show_ip_rip_authentication_scheme(struct vty
*vty
,
868 const struct lyd_node
*dnode
,
871 switch (yang_dnode_get_enum(dnode
, "./mode")) {
873 vty_out(vty
, " no ip rip authentication mode\n");
875 case RIP_AUTH_SIMPLE_PASSWORD
:
876 vty_out(vty
, " ip rip authentication mode text\n");
879 vty_out(vty
, " ip rip authentication mode md5");
881 || !yang_dnode_is_default(dnode
, "./md5-auth-length")) {
882 if (yang_dnode_get_enum(dnode
, "./md5-auth-length")
883 == RIP_AUTH_MD5_SIZE
)
884 vty_out(vty
, " auth-length rfc");
886 vty_out(vty
, " auth-length old-ripd");
894 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-password
896 DEFPY_YANG (ip_rip_authentication_string
,
897 ip_rip_authentication_string_cmd
,
898 "ip rip authentication string LINE$password",
900 "Routing Information Protocol\n"
901 "Authentication control\n"
902 "Authentication string\n"
903 "Authentication string\n")
905 if (strlen(password
) > 16) {
907 "%% RIPv2 authentication string must be shorter than 16\n");
908 return CMD_WARNING_CONFIG_FAILED
;
911 if (yang_dnode_existsf(vty
->candidate_config
->dnode
, "%s%s",
913 "/frr-ripd:rip/authentication-key-chain")) {
914 vty_out(vty
, "%% key-chain configuration exists\n");
915 return CMD_WARNING_CONFIG_FAILED
;
918 nb_cli_enqueue_change(vty
, "./authentication-password", NB_OP_MODIFY
,
921 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
924 DEFPY_YANG (no_ip_rip_authentication_string
,
925 no_ip_rip_authentication_string_cmd
,
926 "no ip rip authentication string [LINE]",
929 "Routing Information Protocol\n"
930 "Authentication control\n"
931 "Authentication string\n"
932 "Authentication string\n")
934 nb_cli_enqueue_change(vty
, "./authentication-password", NB_OP_DESTROY
,
937 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
940 void cli_show_ip_rip_authentication_string(struct vty
*vty
,
941 const struct lyd_node
*dnode
,
944 vty_out(vty
, " ip rip authentication string %s\n",
945 yang_dnode_get_string(dnode
, NULL
));
949 * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-key-chain
951 DEFPY_YANG (ip_rip_authentication_key_chain
,
952 ip_rip_authentication_key_chain_cmd
,
953 "ip rip authentication key-chain LINE$keychain",
955 "Routing Information Protocol\n"
956 "Authentication control\n"
957 "Authentication key-chain\n"
958 "name of key-chain\n")
960 if (yang_dnode_existsf(vty
->candidate_config
->dnode
, "%s%s",
962 "/frr-ripd:rip/authentication-password")) {
963 vty_out(vty
, "%% authentication string configuration exists\n");
964 return CMD_WARNING_CONFIG_FAILED
;
967 nb_cli_enqueue_change(vty
, "./authentication-key-chain", NB_OP_MODIFY
,
970 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
973 DEFPY_YANG (no_ip_rip_authentication_key_chain
,
974 no_ip_rip_authentication_key_chain_cmd
,
975 "no ip rip authentication key-chain [LINE]",
978 "Routing Information Protocol\n"
979 "Authentication control\n"
980 "Authentication key-chain\n"
981 "name of key-chain\n")
983 nb_cli_enqueue_change(vty
, "./authentication-key-chain", NB_OP_DESTROY
,
986 return nb_cli_apply_changes(vty
, "./frr-ripd:rip");
989 void cli_show_ip_rip_authentication_key_chain(struct vty
*vty
,
990 const struct lyd_node
*dnode
,
993 vty_out(vty
, " ip rip authentication key-chain %s\n",
994 yang_dnode_get_string(dnode
, NULL
));
998 * XPath: /frr-ripd:clear-rip-route
1000 DEFPY_YANG (clear_ip_rip
,
1002 "clear ip rip [vrf WORD]",
1005 "Clear IP RIP database\n"
1013 struct yang_data
*yang_vrf
;
1015 yang_vrf
= yang_data_new("/frr-ripd:clear-rip-route/input/vrf",
1017 listnode_add(input
, yang_vrf
);
1020 ret
= nb_cli_rpc(vty
, "/frr-ripd:clear-rip-route", input
, NULL
);
1022 list_delete(&input
);
1027 DEFUN (rip_distribute_list
,
1028 rip_distribute_list_cmd
,
1029 "distribute-list [prefix] ACCESSLIST4_NAME <in|out> [WORD]",
1030 "Filter networks in routing updates\n"
1031 "Specify a prefix\n"
1032 "Access-list name\n"
1033 "Filter incoming routing updates\n"
1034 "Filter outgoing routing updates\n"
1037 const char *ifname
= NULL
;
1038 int prefix
= (argv
[1]->type
== WORD_TKN
) ? 1 : 0;
1040 if (argv
[argc
- 1]->type
== VARIABLE_TKN
)
1041 ifname
= argv
[argc
- 1]->arg
;
1043 return distribute_list_parser(prefix
, true, argv
[2 + prefix
]->text
,
1044 argv
[1 + prefix
]->arg
, ifname
);
1047 DEFUN (rip_no_distribute_list
,
1048 rip_no_distribute_list_cmd
,
1049 "no distribute-list [prefix] ACCESSLIST4_NAME <in|out> [WORD]",
1051 "Filter networks in routing updates\n"
1052 "Specify a prefix\n"
1053 "Access-list name\n"
1054 "Filter incoming routing updates\n"
1055 "Filter outgoing routing updates\n"
1058 const char *ifname
= NULL
;
1059 int prefix
= (argv
[2]->type
== WORD_TKN
) ? 1 : 0;
1061 if (argv
[argc
- 1]->type
== VARIABLE_TKN
)
1062 ifname
= argv
[argc
- 1]->arg
;
1064 return distribute_list_no_parser(vty
, prefix
, true,
1065 argv
[3 + prefix
]->text
,
1066 argv
[2 + prefix
]->arg
, ifname
);
1069 void rip_cli_init(void)
1071 install_element(CONFIG_NODE
, &router_rip_cmd
);
1072 install_element(CONFIG_NODE
, &no_router_rip_cmd
);
1074 install_element(RIP_NODE
, &rip_distribute_list_cmd
);
1075 install_element(RIP_NODE
, &rip_no_distribute_list_cmd
);
1077 install_element(RIP_NODE
, &rip_allow_ecmp_cmd
);
1078 install_element(RIP_NODE
, &rip_default_information_originate_cmd
);
1079 install_element(RIP_NODE
, &rip_default_metric_cmd
);
1080 install_element(RIP_NODE
, &no_rip_default_metric_cmd
);
1081 install_element(RIP_NODE
, &rip_distance_cmd
);
1082 install_element(RIP_NODE
, &no_rip_distance_cmd
);
1083 install_element(RIP_NODE
, &rip_distance_source_cmd
);
1084 install_element(RIP_NODE
, &rip_neighbor_cmd
);
1085 install_element(RIP_NODE
, &rip_network_prefix_cmd
);
1086 install_element(RIP_NODE
, &rip_network_if_cmd
);
1087 install_element(RIP_NODE
, &rip_offset_list_cmd
);
1088 install_element(RIP_NODE
, &rip_passive_default_cmd
);
1089 install_element(RIP_NODE
, &rip_passive_interface_cmd
);
1090 install_element(RIP_NODE
, &rip_redistribute_cmd
);
1091 install_element(RIP_NODE
, &rip_route_cmd
);
1092 install_element(RIP_NODE
, &rip_timers_cmd
);
1093 install_element(RIP_NODE
, &no_rip_timers_cmd
);
1094 install_element(RIP_NODE
, &rip_version_cmd
);
1095 install_element(RIP_NODE
, &no_rip_version_cmd
);
1097 install_element(INTERFACE_NODE
, &ip_rip_split_horizon_cmd
);
1098 install_element(INTERFACE_NODE
, &ip_rip_v2_broadcast_cmd
);
1099 install_element(INTERFACE_NODE
, &ip_rip_receive_version_cmd
);
1100 install_element(INTERFACE_NODE
, &no_ip_rip_receive_version_cmd
);
1101 install_element(INTERFACE_NODE
, &ip_rip_send_version_cmd
);
1102 install_element(INTERFACE_NODE
, &no_ip_rip_send_version_cmd
);
1103 install_element(INTERFACE_NODE
, &ip_rip_authentication_mode_cmd
);
1104 install_element(INTERFACE_NODE
, &no_ip_rip_authentication_mode_cmd
);
1105 install_element(INTERFACE_NODE
, &ip_rip_authentication_string_cmd
);
1106 install_element(INTERFACE_NODE
, &no_ip_rip_authentication_string_cmd
);
1107 install_element(INTERFACE_NODE
, &ip_rip_authentication_key_chain_cmd
);
1108 install_element(INTERFACE_NODE
,
1109 &no_ip_rip_authentication_key_chain_cmd
);
1111 install_element(ENABLE_NODE
, &clear_ip_rip_cmd
);