From 8cc7152af8b10761bd13ccaa0b8c2043bf378bda Mon Sep 17 00:00:00 2001 From: Chirag Shah Date: Tue, 13 Oct 2020 17:57:33 -0700 Subject: [PATCH] bgpd: convert distance bgp source cmd to defpy Consolidate v4/v6 prefix with/without acl name distance source command to DEFPY. Signed-off-by: Chirag Shah --- bgpd/bgp_route.c | 178 ++++++----------------------------------------- 1 file changed, 22 insertions(+), 156 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index a86374b677..826cd4b998 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -13766,108 +13766,15 @@ void cli_show_bgp_global_afi_safi_admin_distance_config(struct vty *vty, distance_local); } -static int bgp_nb_distance_source_set(struct vty *vty, struct cmd_token **argv, - int argc) -{ - int idx_number = 1; - int idx_ip_prefixlen = 2; - int idx_word = 3; - afi_t afi; - safi_t safi; - char xpath[XPATH_MAXLEN]; - - afi = bgp_node_afi(vty); - safi = bgp_node_safi(vty); - - nb_cli_enqueue_change(vty, "./distance", NB_OP_MODIFY, - argv[idx_number]->arg); - - if (argv_find(argv, argc, "WORD", &idx_word)) - nb_cli_enqueue_change(vty, "./access-list-policy-export", - NB_OP_CREATE, argv[idx_word]->arg); - - snprintf( - xpath, sizeof(xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance-route[prefix='%s']", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi), - argv[idx_ip_prefixlen]->arg); - - return nb_cli_apply_changes(vty, xpath); -} - -static int bgp_nb_distance_source_unset(struct vty *vty, - struct cmd_token **argv, int argc) -{ - int idx_ip_prefixlen = 3; - afi_t afi; - safi_t safi; - char xpath[XPATH_MAXLEN]; - - afi = bgp_node_afi(vty); - safi = bgp_node_safi(vty); - - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - - snprintf( - xpath, sizeof(xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance-route[prefix='%s']", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi), - argv[idx_ip_prefixlen]->arg); - - return nb_cli_apply_changes(vty, xpath); -} - -DEFUN_YANG(bgp_distance_source, bgp_distance_source_cmd, - "distance (1-255) A.B.C.D/M", - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n") -{ - return bgp_nb_distance_source_set(vty, argv, argc); -} - -DEFUN_YANG(no_bgp_distance_source, no_bgp_distance_source_cmd, - "no distance (1-255) A.B.C.D/M", +DEFPY_YANG(bgp_distance_source, + bgp_distance_source_cmd, + "[no] distance (1-255) $prefix [WORD$acl]", NO_STR "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n") -{ - return bgp_nb_distance_source_unset(vty, argv, argc); -} - -DEFUN_YANG(bgp_distance_source_access_list, bgp_distance_source_access_list_cmd, - "distance (1-255) A.B.C.D/M WORD", - "Define an administrative distance\n" - "Administrative distance\n" + "Distance value\n" "IP source prefix\n" "Access list name\n") { - return bgp_nb_distance_source_set(vty, argv, argc); -} - -DEFUN_YANG(no_bgp_distance_source_access_list, - no_bgp_distance_source_access_list_cmd, - "no distance (1-255) A.B.C.D/M WORD", - NO_STR - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n" - "Access list name\n") -{ - return bgp_nb_distance_source_unset(vty, argv, argc); -} - -DEFUN_YANG(ipv6_bgp_distance_source, ipv6_bgp_distance_source_cmd, - "distance (1-255) X:X::X:X/M", - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n") -{ - int idx_number = 1; - int idx_ip_prefixlen = 2; afi_t afi; safi_t safi; char xpath[XPATH_MAXLEN]; @@ -13875,52 +13782,31 @@ DEFUN_YANG(ipv6_bgp_distance_source, ipv6_bgp_distance_source_cmd, afi = bgp_node_afi(vty); safi = bgp_node_safi(vty); - nb_cli_enqueue_change(vty, "./distance", NB_OP_MODIFY, - argv[idx_number]->arg); + if (!no) { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./distance", NB_OP_MODIFY, + distance_str); + if (acl) + nb_cli_enqueue_change(vty, + "./access-list-policy-export", + NB_OP_CREATE, acl); + else + nb_cli_enqueue_change(vty, + "./access-list-policy-export", + NB_OP_DESTROY, NULL); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } snprintf( xpath, sizeof(xpath), "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance-route[prefix='%s']", yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi), - argv[idx_ip_prefixlen]->arg); + bgp_afi_safi_get_container_str(afi, safi), prefix_str); return nb_cli_apply_changes(vty, xpath); } -DEFUN_YANG(no_ipv6_bgp_distance_source, no_ipv6_bgp_distance_source_cmd, - "no distance (1-255) X:X::X:X/M", - NO_STR - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n") -{ - return bgp_nb_distance_source_unset(vty, argv, argc); -} - -DEFUN_YANG(ipv6_bgp_distance_source_access_list, - ipv6_bgp_distance_source_access_list_cmd, - "distance (1-255) X:X::X:X/M WORD", - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n" - "Access list name\n") -{ - return bgp_nb_distance_source_set(vty, argv, argc); -} - -DEFUN_YANG(no_ipv6_bgp_distance_source_access_list, - no_ipv6_bgp_distance_source_access_list_cmd, - "no distance (1-255) X:X::X:X/M WORD", - NO_STR - "Define an administrative distance\n" - "Administrative distance\n" - "IP source prefix\n" - "Access list name\n") -{ - return bgp_nb_distance_source_unset(vty, argv, argc); -} - void cli_show_bgp_global_afi_safi_unicast_admin_distance_route( struct vty *vty, struct lyd_node *dnode, bool show_defaults) { @@ -14534,38 +14420,18 @@ void bgp_route_init(void) install_element(BGP_NODE, &bgp_distance_cmd); install_element(BGP_NODE, &no_bgp_distance_cmd); install_element(BGP_NODE, &bgp_distance_source_cmd); - install_element(BGP_NODE, &no_bgp_distance_source_cmd); - install_element(BGP_NODE, &bgp_distance_source_access_list_cmd); - install_element(BGP_NODE, &no_bgp_distance_source_access_list_cmd); install_element(BGP_IPV4_NODE, &bgp_distance_cmd); install_element(BGP_IPV4_NODE, &no_bgp_distance_cmd); install_element(BGP_IPV4_NODE, &bgp_distance_source_cmd); - install_element(BGP_IPV4_NODE, &no_bgp_distance_source_cmd); - install_element(BGP_IPV4_NODE, &bgp_distance_source_access_list_cmd); - install_element(BGP_IPV4_NODE, &no_bgp_distance_source_access_list_cmd); install_element(BGP_IPV4M_NODE, &bgp_distance_cmd); install_element(BGP_IPV4M_NODE, &no_bgp_distance_cmd); install_element(BGP_IPV4M_NODE, &bgp_distance_source_cmd); - install_element(BGP_IPV4M_NODE, &no_bgp_distance_source_cmd); - install_element(BGP_IPV4M_NODE, &bgp_distance_source_access_list_cmd); - install_element(BGP_IPV4M_NODE, - &no_bgp_distance_source_access_list_cmd); install_element(BGP_IPV6_NODE, &bgp_distance_cmd); install_element(BGP_IPV6_NODE, &no_bgp_distance_cmd); - install_element(BGP_IPV6_NODE, &ipv6_bgp_distance_source_cmd); - install_element(BGP_IPV6_NODE, &no_ipv6_bgp_distance_source_cmd); - install_element(BGP_IPV6_NODE, - &ipv6_bgp_distance_source_access_list_cmd); - install_element(BGP_IPV6_NODE, - &no_ipv6_bgp_distance_source_access_list_cmd); + install_element(BGP_IPV6_NODE, &bgp_distance_source_cmd); install_element(BGP_IPV6M_NODE, &bgp_distance_cmd); install_element(BGP_IPV6M_NODE, &no_bgp_distance_cmd); - install_element(BGP_IPV6M_NODE, &ipv6_bgp_distance_source_cmd); - install_element(BGP_IPV6M_NODE, &no_ipv6_bgp_distance_source_cmd); - install_element(BGP_IPV6M_NODE, - &ipv6_bgp_distance_source_access_list_cmd); - install_element(BGP_IPV6M_NODE, - &no_ipv6_bgp_distance_source_access_list_cmd); + install_element(BGP_IPV6M_NODE, &bgp_distance_source_cmd); /* BGP dampening */ install_element(BGP_NODE, &bgp_dampening_cmd); -- 2.39.5