mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 04:47:05 +00:00
*: explicitly print "exit" at the end of every node config
There is a possibility that the same line can be matched as a command in some node and its parent node. In this case, when reading the config, this line is always executed as a command of the child node. For example, with the following config: ``` router ospf network 193.168.0.0/16 area 0 ! mpls ldp discovery hello interval 111 ! ``` Line `mpls ldp` is processed as command `mpls ldp-sync` inside the `router ospf` node. This leads to a complete loss of `mpls ldp` node configuration. To eliminate this issue and all possible similar issues, let's print an explicit "exit" at the end of every node config. This commit also changes indentation for a couple of existing exit commands so that all existing commands are on the same level as their corresponding node-entering commands. Fixes #9206. Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
This commit is contained in:
parent
ac9103aadc
commit
07679ad98a
@ -1362,7 +1362,7 @@ interface_config_write (struct vty *vty)
|
|||||||
write++;
|
write++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vty_endframe (vty, "!\n");
|
vty_endframe (vty, "exit\n!\n");
|
||||||
write++;
|
write++;
|
||||||
}
|
}
|
||||||
return write;
|
return write;
|
||||||
|
@ -132,6 +132,8 @@ babel_config_write (struct vty *vty)
|
|||||||
|
|
||||||
lines += config_write_distribute (vty, babel_routing_process->distribute_ctx);
|
lines += config_write_distribute (vty, babel_routing_process->distribute_ctx);
|
||||||
|
|
||||||
|
vty_out (vty, "exit\n");
|
||||||
|
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,6 +101,7 @@ void bfd_cli_show_header(struct vty *vty,
|
|||||||
void bfd_cli_show_header_end(struct vty *vty,
|
void bfd_cli_show_header_end(struct vty *vty,
|
||||||
struct lyd_node *dnode __attribute__((__unused__)))
|
struct lyd_node *dnode __attribute__((__unused__)))
|
||||||
{
|
{
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,6 +276,7 @@ void bfd_cli_show_multi_hop_peer(struct vty *vty,
|
|||||||
void bfd_cli_show_peer_end(struct vty *vty,
|
void bfd_cli_show_peer_end(struct vty *vty,
|
||||||
struct lyd_node *dnode __attribute__((__unused__)))
|
struct lyd_node *dnode __attribute__((__unused__)))
|
||||||
{
|
{
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
vty_out(vty, " !\n");
|
vty_out(vty, " !\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2400,6 +2400,8 @@ static int bmp_config_write(struct bgp *bgp, struct vty *vty)
|
|||||||
frr_each (bmp_actives, &bt->actives, ba)
|
frr_each (bmp_actives, &bt->actives, ba)
|
||||||
vty_out(vty, " bmp connect %s port %u min-retry %u max-retry %u\n",
|
vty_out(vty, " bmp connect %s port %u min-retry %u max-retry %u\n",
|
||||||
ba->hostname, ba->port, ba->minretry, ba->maxretry);
|
ba->hostname, ba->port, ba->minretry, ba->maxretry);
|
||||||
|
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -932,7 +932,7 @@ static int config_write(struct vty *vty)
|
|||||||
|
|
||||||
vty_out(vty, "preference %hhu\n", cache->preference);
|
vty_out(vty, "preference %hhu\n", cache->preference);
|
||||||
}
|
}
|
||||||
vty_out(vty, " exit\n");
|
vty_out(vty, "exit\n");
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -17213,6 +17213,7 @@ int bgp_config_write(struct vty *vty)
|
|||||||
bgp_rfapi_cfg_write(vty, bgp);
|
bgp_rfapi_cfg_write(vty, bgp);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -96,6 +96,7 @@ void eigrp_cli_show_header(struct vty *vty, struct lyd_node *dnode,
|
|||||||
|
|
||||||
void eigrp_cli_show_end_header(struct vty *vty, struct lyd_node *dnode)
|
void eigrp_cli_show_end_header(struct vty *vty, struct lyd_node *dnode)
|
||||||
{
|
{
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1290,7 +1290,7 @@ static int isis_interface_config_write(struct vty *vty)
|
|||||||
write += hook_call(isis_circuit_config_write,
|
write += hook_call(isis_circuit_config_write,
|
||||||
circuit, vty);
|
circuit, vty);
|
||||||
}
|
}
|
||||||
vty_endframe(vty, "!\n");
|
vty_endframe(vty, "exit\n!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return write;
|
return write;
|
||||||
|
@ -146,6 +146,11 @@ void cli_show_router_isis(struct vty *vty, struct lyd_node *dnode,
|
|||||||
vty_out(vty, "\n");
|
vty_out(vty, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cli_show_router_isis_end(struct vty *vty, struct lyd_node *dnode)
|
||||||
|
{
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XPath: /frr-interface:lib/interface/frr-isisd:isis/
|
* XPath: /frr-interface:lib/interface/frr-isisd:isis/
|
||||||
* XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
|
* XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
|
||||||
|
@ -32,6 +32,7 @@ const struct frr_yang_module_info frr_isisd_info = {
|
|||||||
.xpath = "/frr-isisd:isis/instance",
|
.xpath = "/frr-isisd:isis/instance",
|
||||||
.cbs = {
|
.cbs = {
|
||||||
.cli_show = cli_show_router_isis,
|
.cli_show = cli_show_router_isis,
|
||||||
|
.cli_show_end = cli_show_router_isis_end,
|
||||||
.create = isis_instance_create,
|
.create = isis_instance_create,
|
||||||
.destroy = isis_instance_destroy,
|
.destroy = isis_instance_destroy,
|
||||||
},
|
},
|
||||||
|
@ -415,6 +415,7 @@ void isis_instance_segment_routing_prefix_sid_map_prefix_sid_apply_finish(
|
|||||||
/* Optional 'cli_show' callbacks. */
|
/* Optional 'cli_show' callbacks. */
|
||||||
void cli_show_router_isis(struct vty *vty, struct lyd_node *dnode,
|
void cli_show_router_isis(struct vty *vty, struct lyd_node *dnode,
|
||||||
bool show_defaults);
|
bool show_defaults);
|
||||||
|
void cli_show_router_isis_end(struct vty *vty, struct lyd_node *dnode);
|
||||||
void cli_show_ip_isis_ipv4(struct vty *vty, struct lyd_node *dnode,
|
void cli_show_ip_isis_ipv4(struct vty *vty, struct lyd_node *dnode,
|
||||||
bool show_defaults);
|
bool show_defaults);
|
||||||
void cli_show_ip_isis_ipv6(struct vty *vty, struct lyd_node *dnode,
|
void cli_show_ip_isis_ipv6(struct vty *vty, struct lyd_node *dnode,
|
||||||
|
@ -3011,6 +3011,8 @@ static int isis_config_write(struct vty *vty)
|
|||||||
|
|
||||||
write += area_write_mt_settings(area, vty);
|
write += area_write_mt_settings(area, vty);
|
||||||
write += fabricd_write_settings(area, vty);
|
write += fabricd_write_settings(area, vty);
|
||||||
|
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,6 +133,8 @@ ldp_af_iface_config_write(struct vty *vty, int af)
|
|||||||
ia->hello_interval != 0)
|
ia->hello_interval != 0)
|
||||||
vty_out (vty, " discovery hello interval %u\n",
|
vty_out (vty, " discovery hello interval %u\n",
|
||||||
ia->hello_interval);
|
ia->hello_interval);
|
||||||
|
|
||||||
|
vty_out (vty, " exit\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,6 +316,7 @@ ldp_config_write(struct vty *vty)
|
|||||||
ldp_af_config_write(vty, AF_INET, ldpd_conf, &ldpd_conf->ipv4);
|
ldp_af_config_write(vty, AF_INET, ldpd_conf, &ldpd_conf->ipv4);
|
||||||
ldp_af_config_write(vty, AF_INET6, ldpd_conf, &ldpd_conf->ipv6);
|
ldp_af_config_write(vty, AF_INET6, ldpd_conf, &ldpd_conf->ipv6);
|
||||||
vty_out (vty, " !\n");
|
vty_out (vty, " !\n");
|
||||||
|
vty_out (vty, "exit\n");
|
||||||
vty_out (vty, "!\n");
|
vty_out (vty, "!\n");
|
||||||
|
|
||||||
return (1);
|
return (1);
|
||||||
@ -353,6 +356,8 @@ ldp_l2vpn_pw_config_write(struct vty *vty, struct l2vpn_pw *pw)
|
|||||||
" ! Incomplete config, specify a neighbor lsr-id\n");
|
" ! Incomplete config, specify a neighbor lsr-id\n");
|
||||||
if (missing_pwid)
|
if (missing_pwid)
|
||||||
vty_out (vty," ! Incomplete config, specify a pw-id\n");
|
vty_out (vty," ! Incomplete config, specify a pw-id\n");
|
||||||
|
|
||||||
|
vty_out (vty, " exit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -383,6 +388,7 @@ ldp_l2vpn_config_write(struct vty *vty)
|
|||||||
ldp_l2vpn_pw_config_write(vty, pw);
|
ldp_l2vpn_pw_config_write(vty, pw);
|
||||||
|
|
||||||
vty_out (vty, " !\n");
|
vty_out (vty, " !\n");
|
||||||
|
vty_out (vty, "exit\n");
|
||||||
vty_out (vty, "!\n");
|
vty_out (vty, "!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
lib/if.c
6
lib/if.c
@ -1291,6 +1291,11 @@ static void cli_show_interface(struct vty *vty, struct lyd_node *dnode,
|
|||||||
vty_out(vty, "\n");
|
vty_out(vty, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cli_show_interface_end(struct vty *vty, struct lyd_node *dnode)
|
||||||
|
{
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XPath: /frr-interface:lib/interface/description
|
* XPath: /frr-interface:lib/interface/description
|
||||||
*/
|
*/
|
||||||
@ -1652,6 +1657,7 @@ const struct frr_yang_module_info frr_interface_info = {
|
|||||||
.create = lib_interface_create,
|
.create = lib_interface_create,
|
||||||
.destroy = lib_interface_destroy,
|
.destroy = lib_interface_destroy,
|
||||||
.cli_show = cli_show_interface,
|
.cli_show = cli_show_interface,
|
||||||
|
.cli_show_end = cli_show_interface_end,
|
||||||
.get_next = lib_interface_get_next,
|
.get_next = lib_interface_get_next,
|
||||||
.get_keys = lib_interface_get_keys,
|
.get_keys = lib_interface_get_keys,
|
||||||
.lookup_entry = lib_interface_lookup_entry,
|
.lookup_entry = lib_interface_lookup_entry,
|
||||||
|
@ -1044,6 +1044,7 @@ static int keychain_config_write(struct vty *vty)
|
|||||||
|
|
||||||
vty_out(vty, " exit\n");
|
vty_out(vty, " exit\n");
|
||||||
}
|
}
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1156,6 +1156,7 @@ static int nexthop_group_write(struct vty *vty)
|
|||||||
nexthop_group_write_nexthop_internal(vty, nh);
|
nexthop_group_write_nexthop_internal(vty, nh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,6 +125,7 @@ void route_map_instance_show(struct vty *vty, struct lyd_node *dnode,
|
|||||||
|
|
||||||
void route_map_instance_show_end(struct vty *vty, struct lyd_node *dnode)
|
void route_map_instance_show_end(struct vty *vty, struct lyd_node *dnode)
|
||||||
{
|
{
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3040,7 +3040,7 @@ DEFPY (log_commands,
|
|||||||
/* Display current configuration. */
|
/* Display current configuration. */
|
||||||
static int vty_config_write(struct vty *vty)
|
static int vty_config_write(struct vty *vty)
|
||||||
{
|
{
|
||||||
vty_out(vty, "line vty\n");
|
vty_frame(vty, "line vty\n");
|
||||||
|
|
||||||
if (vty_accesslist_name)
|
if (vty_accesslist_name)
|
||||||
vty_out(vty, " access-class %s\n", vty_accesslist_name);
|
vty_out(vty, " access-class %s\n", vty_accesslist_name);
|
||||||
@ -3058,6 +3058,8 @@ static int vty_config_write(struct vty *vty)
|
|||||||
if (no_password_check)
|
if (no_password_check)
|
||||||
vty_out(vty, " no login\n");
|
vty_out(vty, " no login\n");
|
||||||
|
|
||||||
|
vty_endframe(vty, "exit\n");
|
||||||
|
|
||||||
if (do_log_commands)
|
if (do_log_commands)
|
||||||
vty_out(vty, "log commands\n");
|
vty_out(vty, "log commands\n");
|
||||||
|
|
||||||
|
@ -1225,7 +1225,7 @@ static int interface_config_write(struct vty *vty)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vty_endframe(vty, "!\n");
|
vty_endframe(vty, "exit\n!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2593,7 +2593,7 @@ static int config_write_ospf6_interface(struct vty *vty, struct vrf *vrf)
|
|||||||
|
|
||||||
ospf6_bfd_write_config(vty, oi);
|
ospf6_bfd_write_config(vty, oi);
|
||||||
|
|
||||||
vty_endframe(vty, "!\n");
|
vty_endframe(vty, "exit\n!\n");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2237,6 +2237,8 @@ static int config_write_ospf6(struct vty *vty)
|
|||||||
ospf6_distribute_config_write(vty, ospf6);
|
ospf6_distribute_config_write(vty, ospf6);
|
||||||
ospf6_asbr_summary_config_write(vty, ospf6);
|
ospf6_asbr_summary_config_write(vty, ospf6);
|
||||||
config_write_ospf6_gr_helper(vty, ospf6);
|
config_write_ospf6_gr_helper(vty, ospf6);
|
||||||
|
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -11970,7 +11970,7 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf)
|
|||||||
|
|
||||||
ospf_opaque_config_write_if(vty, ifp);
|
ospf_opaque_config_write_if(vty, ifp);
|
||||||
|
|
||||||
vty_endframe(vty, NULL);
|
vty_endframe(vty, "exit\n!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return write;
|
return write;
|
||||||
@ -12546,6 +12546,8 @@ static int ospf_config_write_one(struct vty *vty, struct ospf *ospf)
|
|||||||
/* LDP-Sync print */
|
/* LDP-Sync print */
|
||||||
ospf_ldp_sync_write_config(vty, ospf);
|
ospf_ldp_sync_write_config(vty, ospf);
|
||||||
|
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
|
|
||||||
write++;
|
write++;
|
||||||
return write;
|
return write;
|
||||||
}
|
}
|
||||||
|
@ -305,6 +305,11 @@ void cli_show_srte_segment_list(struct vty *vty, struct lyd_node *dnode,
|
|||||||
yang_dnode_get_string(dnode, "./name"));
|
yang_dnode_get_string(dnode, "./name"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cli_show_srte_segment_list_end(struct vty *vty, struct lyd_node *dnode)
|
||||||
|
{
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
|
}
|
||||||
|
|
||||||
static int segment_list_has_src_dst(
|
static int segment_list_has_src_dst(
|
||||||
struct vty *vty, char *xpath, long index, const char *index_str,
|
struct vty *vty, char *xpath, long index, const char *index_str,
|
||||||
struct in_addr adj_src_ipv4, struct in_addr adj_dst_ipv4,
|
struct in_addr adj_src_ipv4, struct in_addr adj_dst_ipv4,
|
||||||
@ -662,6 +667,11 @@ void cli_show_srte_policy(struct vty *vty, struct lyd_node *dnode,
|
|||||||
yang_dnode_get_string(dnode, "./endpoint"));
|
yang_dnode_get_string(dnode, "./endpoint"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cli_show_srte_policy_end(struct vty *vty, struct lyd_node *dnode)
|
||||||
|
{
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XPath: /frr-pathd:pathd/srte/policy/name
|
* XPath: /frr-pathd:pathd/srte/policy/name
|
||||||
*/
|
*/
|
||||||
@ -1233,6 +1243,15 @@ void cli_show_srte_policy_candidate_path(struct vty *vty,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cli_show_srte_policy_candidate_path_end(struct vty *vty,
|
||||||
|
struct lyd_node *dnode)
|
||||||
|
{
|
||||||
|
const char *type = yang_dnode_get_string(dnode, "./type");
|
||||||
|
|
||||||
|
if (strmatch(type, "dynamic"))
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
|
}
|
||||||
|
|
||||||
static int config_write_dnode(const struct lyd_node *dnode, void *arg)
|
static int config_write_dnode(const struct lyd_node *dnode, void *arg)
|
||||||
{
|
{
|
||||||
struct vty *vty = arg;
|
struct vty *vty = arg;
|
||||||
@ -1256,6 +1275,9 @@ int config_write_segment_routing(struct vty *vty)
|
|||||||
|
|
||||||
hook_call(pathd_srte_config_write, vty);
|
hook_call(pathd_srte_config_write, vty);
|
||||||
|
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,6 +56,7 @@ const struct frr_yang_module_info frr_pathd_info = {
|
|||||||
.cbs = {
|
.cbs = {
|
||||||
.create = pathd_srte_segment_list_create,
|
.create = pathd_srte_segment_list_create,
|
||||||
.cli_show = cli_show_srte_segment_list,
|
.cli_show = cli_show_srte_segment_list,
|
||||||
|
.cli_show_end = cli_show_srte_segment_list_end,
|
||||||
.destroy = pathd_srte_segment_list_destroy,
|
.destroy = pathd_srte_segment_list_destroy,
|
||||||
.get_next = pathd_srte_segment_list_get_next,
|
.get_next = pathd_srte_segment_list_get_next,
|
||||||
.get_keys = pathd_srte_segment_list_get_keys,
|
.get_keys = pathd_srte_segment_list_get_keys,
|
||||||
@ -136,6 +137,7 @@ const struct frr_yang_module_info frr_pathd_info = {
|
|||||||
.cbs = {
|
.cbs = {
|
||||||
.create = pathd_srte_policy_create,
|
.create = pathd_srte_policy_create,
|
||||||
.cli_show = cli_show_srte_policy,
|
.cli_show = cli_show_srte_policy,
|
||||||
|
.cli_show_end = cli_show_srte_policy_end,
|
||||||
.destroy = pathd_srte_policy_destroy,
|
.destroy = pathd_srte_policy_destroy,
|
||||||
.get_next = pathd_srte_policy_get_next,
|
.get_next = pathd_srte_policy_get_next,
|
||||||
.get_keys = pathd_srte_policy_get_keys,
|
.get_keys = pathd_srte_policy_get_keys,
|
||||||
@ -169,6 +171,7 @@ const struct frr_yang_module_info frr_pathd_info = {
|
|||||||
.cbs = {
|
.cbs = {
|
||||||
.create = pathd_srte_policy_candidate_path_create,
|
.create = pathd_srte_policy_candidate_path_create,
|
||||||
.cli_show = cli_show_srte_policy_candidate_path,
|
.cli_show = cli_show_srte_policy_candidate_path,
|
||||||
|
.cli_show_end = cli_show_srte_policy_candidate_path_end,
|
||||||
.destroy = pathd_srte_policy_candidate_path_destroy,
|
.destroy = pathd_srte_policy_candidate_path_destroy,
|
||||||
.get_next = pathd_srte_policy_candidate_path_get_next,
|
.get_next = pathd_srte_policy_candidate_path_get_next,
|
||||||
.get_keys = pathd_srte_policy_candidate_path_get_keys,
|
.get_keys = pathd_srte_policy_candidate_path_get_keys,
|
||||||
|
@ -112,10 +112,12 @@ void pathd_apply_finish(struct nb_cb_apply_finish_args *args);
|
|||||||
/* Optional 'cli_show' callbacks. */
|
/* Optional 'cli_show' callbacks. */
|
||||||
void cli_show_srte_segment_list(struct vty *vty, struct lyd_node *dnode,
|
void cli_show_srte_segment_list(struct vty *vty, struct lyd_node *dnode,
|
||||||
bool show_defaults);
|
bool show_defaults);
|
||||||
|
void cli_show_srte_segment_list_end(struct vty *vty, struct lyd_node *dnode);
|
||||||
void cli_show_srte_segment_list_segment(struct vty *vty, struct lyd_node *dnode,
|
void cli_show_srte_segment_list_segment(struct vty *vty, struct lyd_node *dnode,
|
||||||
bool show_defaults);
|
bool show_defaults);
|
||||||
void cli_show_srte_policy(struct vty *vty, struct lyd_node *dnode,
|
void cli_show_srte_policy(struct vty *vty, struct lyd_node *dnode,
|
||||||
bool show_defaults);
|
bool show_defaults);
|
||||||
|
void cli_show_srte_policy_end(struct vty *vty, struct lyd_node *dnode);
|
||||||
void cli_show_srte_policy_name(struct vty *vty, struct lyd_node *dnode,
|
void cli_show_srte_policy_name(struct vty *vty, struct lyd_node *dnode,
|
||||||
bool show_defaults);
|
bool show_defaults);
|
||||||
void cli_show_srte_policy_binding_sid(struct vty *vty, struct lyd_node *dnode,
|
void cli_show_srte_policy_binding_sid(struct vty *vty, struct lyd_node *dnode,
|
||||||
@ -123,6 +125,8 @@ void cli_show_srte_policy_binding_sid(struct vty *vty, struct lyd_node *dnode,
|
|||||||
void cli_show_srte_policy_candidate_path(struct vty *vty,
|
void cli_show_srte_policy_candidate_path(struct vty *vty,
|
||||||
struct lyd_node *dnode,
|
struct lyd_node *dnode,
|
||||||
bool show_defaults);
|
bool show_defaults);
|
||||||
|
void cli_show_srte_policy_candidate_path_end(struct vty *vty,
|
||||||
|
struct lyd_node *dnode);
|
||||||
|
|
||||||
/* Utility functions */
|
/* Utility functions */
|
||||||
typedef void (*of_pref_cp_t)(enum objfun_type type, void *arg);
|
typedef void (*of_pref_cp_t)(enum objfun_type type, void *arg);
|
||||||
|
@ -1443,6 +1443,7 @@ int pcep_cli_pcep_config_write(struct vty *vty)
|
|||||||
pcep_cli_pcep_pce_config_write(vty);
|
pcep_cli_pcep_pce_config_write(vty);
|
||||||
pcep_cli_pce_config_write(vty);
|
pcep_cli_pce_config_write(vty);
|
||||||
pcep_cli_pcc_config_write(vty);
|
pcep_cli_pcc_config_write(vty);
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1467,7 +1468,7 @@ int pcep_cli_pcc_config_write(struct vty *vty)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pce_connections_g.num_connections == 0) {
|
if (pce_connections_g.num_connections == 0) {
|
||||||
return lines;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf[0] = 0;
|
buf[0] = 0;
|
||||||
@ -1494,6 +1495,8 @@ int pcep_cli_pcc_config_write(struct vty *vty)
|
|||||||
lines++;
|
lines++;
|
||||||
buf[0] = 0;
|
buf[0] = 0;
|
||||||
}
|
}
|
||||||
|
exit:
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
|
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
@ -1654,6 +1657,8 @@ int pcep_cli_pce_config_write(struct vty *vty)
|
|||||||
|
|
||||||
vty_out(vty, "%s", buf);
|
vty_out(vty, "%s", buf);
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
|
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return lines;
|
return lines;
|
||||||
@ -1678,6 +1683,8 @@ int pcep_cli_pcep_pce_config_write(struct vty *vty)
|
|||||||
pcep_cli_print_pce_config(group_opts, buf, sizeof(buf));
|
pcep_cli_print_pce_config(group_opts, buf, sizeof(buf));
|
||||||
vty_out(vty, "%s", buf);
|
vty_out(vty, "%s", buf);
|
||||||
buf[0] = 0;
|
buf[0] = 0;
|
||||||
|
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return lines;
|
return lines;
|
||||||
|
@ -1118,7 +1118,7 @@ static int pbr_interface_config_write(struct vty *vty)
|
|||||||
|
|
||||||
pbr_map_write_interfaces(vty, ifp);
|
pbr_map_write_interfaces(vty, ifp);
|
||||||
|
|
||||||
vty_endframe(vty, "!\n");
|
vty_endframe(vty, "exit\n!\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1184,6 +1184,7 @@ static int pbr_vty_map_config_write_sequence(struct vty *vty,
|
|||||||
pbrms_nexthop_group_write_individual_nexthop(vty, pbrms);
|
pbrms_nexthop_group_write_individual_nexthop(vty, pbrms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -220,7 +220,7 @@ static int pim_vrf_config_write(struct vty *vty)
|
|||||||
pim_global_config_write_worker(pim, vty);
|
pim_global_config_write_worker(pim, vty);
|
||||||
|
|
||||||
if (vrf->vrf_id != VRF_DEFAULT)
|
if (vrf->vrf_id != VRF_DEFAULT)
|
||||||
vty_endframe(vty, " exit-vrf\n!\n");
|
vty_endframe(vty, "exit-vrf\n!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -451,7 +451,7 @@ int pim_interface_config_write(struct vty *vty)
|
|||||||
pim_bfd_write_config(vty, ifp);
|
pim_bfd_write_config(vty, ifp);
|
||||||
++writes;
|
++writes;
|
||||||
}
|
}
|
||||||
vty_endframe(vty, "!\n");
|
vty_endframe(vty, "exit\n!\n");
|
||||||
++writes;
|
++writes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3281,6 +3281,8 @@ static int config_write_rip(struct vty *vty)
|
|||||||
/* Interface routemap configuration */
|
/* Interface routemap configuration */
|
||||||
config_write_if_rmap(vty, rip->if_rmap_ctx);
|
config_write_if_rmap(vty, rip->if_rmap_ctx);
|
||||||
|
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
|
|
||||||
write = 1;
|
write = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2270,6 +2270,8 @@ static int ripng_config_write(struct vty *vty)
|
|||||||
config_write_distribute(vty, ripng->distribute_ctx);
|
config_write_distribute(vty, ripng->distribute_ctx);
|
||||||
config_write_if_rmap(vty, ripng->if_rmap_ctx);
|
config_write_if_rmap(vty, ripng->if_rmap_ctx);
|
||||||
|
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
|
|
||||||
write = 1;
|
write = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,7 +164,7 @@ static int static_vrf_config_write(struct vty *vty)
|
|||||||
SAFI_UNICAST, "ipv6 route");
|
SAFI_UNICAST, "ipv6 route");
|
||||||
|
|
||||||
if (vrf->vrf_id != VRF_DEFAULT)
|
if (vrf->vrf_id != VRF_DEFAULT)
|
||||||
vty_endframe(vty, " exit-vrf\n!\n");
|
vty_endframe(vty, "exit-vrf\n!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -315,7 +315,6 @@ domainname test.domain
|
|||||||
!
|
!
|
||||||
!
|
!
|
||||||
!
|
!
|
||||||
line vty
|
|
||||||
!
|
!
|
||||||
end
|
end
|
||||||
test# conf t
|
test# conf t
|
||||||
@ -332,7 +331,6 @@ domainname test.domain
|
|||||||
!
|
!
|
||||||
!
|
!
|
||||||
!
|
!
|
||||||
line vty
|
|
||||||
!
|
!
|
||||||
end
|
end
|
||||||
foohost(config)#
|
foohost(config)#
|
||||||
|
@ -277,11 +277,6 @@ void vtysh_config_parse_line(void *arg, const char *line)
|
|||||||
== 0) {
|
== 0) {
|
||||||
config_add_line(config->line, line);
|
config_add_line(config->line, line);
|
||||||
config->index = INTERFACE_NODE;
|
config->index = INTERFACE_NODE;
|
||||||
} else if (config->index == VRF_NODE
|
|
||||||
&& strncmp(line, " exit-vrf",
|
|
||||||
strlen(" exit-vrf"))
|
|
||||||
== 0) {
|
|
||||||
config_add_line_uniq_end(config->line, line);
|
|
||||||
} else if (!strncmp(line, " vrrp", strlen(" vrrp"))
|
} else if (!strncmp(line, " vrrp", strlen(" vrrp"))
|
||||||
|| !strncmp(line, " no vrrp",
|
|| !strncmp(line, " no vrrp",
|
||||||
strlen(" no vrrp"))) {
|
strlen(" no vrrp"))) {
|
||||||
@ -300,7 +295,10 @@ void vtysh_config_parse_line(void *arg, const char *line)
|
|||||||
config_add_line(config_top, line);
|
config_add_line(config_top, line);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (strncmp(line, "interface", strlen("interface")) == 0)
|
if (strncmp(line, "exit", strlen("exit")) == 0) {
|
||||||
|
if (config)
|
||||||
|
config_add_line_uniq_end(config->line, line);
|
||||||
|
} else if (strncmp(line, "interface", strlen("interface")) == 0)
|
||||||
config = config_get(INTERFACE_NODE, line);
|
config = config_get(INTERFACE_NODE, line);
|
||||||
else if (strncmp(line, "pseudowire", strlen("pseudowire")) == 0)
|
else if (strncmp(line, "pseudowire", strlen("pseudowire")) == 0)
|
||||||
config = config_get(PW_NODE, line);
|
config = config_get(PW_NODE, line);
|
||||||
@ -496,7 +494,9 @@ void vtysh_config_dump(void)
|
|||||||
* are not under the VRF node.
|
* are not under the VRF node.
|
||||||
*/
|
*/
|
||||||
if (config->index == INTERFACE_NODE
|
if (config->index == INTERFACE_NODE
|
||||||
&& list_isempty(config->line)) {
|
&& (listcount(config->line) == 1)
|
||||||
|
&& (line = listnode_head(config->line))
|
||||||
|
&& strmatch(line, "exit")) {
|
||||||
config_del(config);
|
config_del(config);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -4188,7 +4188,7 @@ static int if_config_write(struct vty *vty)
|
|||||||
zebra_evpn_mh_if_write(vty, ifp);
|
zebra_evpn_mh_if_write(vty, ifp);
|
||||||
link_params_config_write(vty, ifp);
|
link_params_config_write(vty, ifp);
|
||||||
|
|
||||||
vty_endframe(vty, "!\n");
|
vty_endframe(vty, "exit\n!\n");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -836,6 +836,7 @@ static int zebra_pw_config(struct vty *vty)
|
|||||||
if (!(pw->flags & F_PSEUDOWIRE_CWORD))
|
if (!(pw->flags & F_PSEUDOWIRE_CWORD))
|
||||||
vty_out(vty, " control-word exclude\n");
|
vty_out(vty, " control-word exclude\n");
|
||||||
|
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
write = 1;
|
write = 1;
|
||||||
}
|
}
|
||||||
|
@ -320,10 +320,14 @@ static int zebra_sr_config(struct vty *vty)
|
|||||||
vty_out(vty, " locator %s\n", locator->name);
|
vty_out(vty, " locator %s\n", locator->name);
|
||||||
vty_out(vty, " prefix %s/%u\n", str,
|
vty_out(vty, " prefix %s/%u\n", str,
|
||||||
locator->prefix.prefixlen);
|
locator->prefix.prefixlen);
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
vty_out(vty, " !\n");
|
vty_out(vty, " !\n");
|
||||||
}
|
}
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
vty_out(vty, " !\n");
|
vty_out(vty, " !\n");
|
||||||
|
vty_out(vty, " exit\n");
|
||||||
vty_out(vty, " !\n");
|
vty_out(vty, " !\n");
|
||||||
|
vty_out(vty, "exit\n");
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -521,7 +521,7 @@ static int vrf_config_write(struct vty *vty)
|
|||||||
router_id_write(vty, zvrf);
|
router_id_write(vty, zvrf);
|
||||||
|
|
||||||
if (zvrf_id(zvrf) != VRF_DEFAULT)
|
if (zvrf_id(zvrf) != VRF_DEFAULT)
|
||||||
vty_endframe(vty, " exit-vrf\n!\n");
|
vty_endframe(vty, "exit-vrf\n!\n");
|
||||||
else
|
else
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user