diff options
Diffstat (limited to 'bgpd/bgp_route.c')
| -rw-r--r-- | bgpd/bgp_route.c | 1034 |
1 files changed, 473 insertions, 561 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 9acfd32b48..716ba26305 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -88,9 +88,6 @@ #include "bgpd/bgp_flowspec.h" #include "bgpd/bgp_flowspec_util.h" #include "bgpd/bgp_pbr.h" -#include "northbound.h" -#include "northbound_cli.h" -#include "bgpd/bgp_nb.h" #ifndef VTYSH_EXTRACT_PL #include "bgpd/bgp_route_clippy.c" @@ -3605,6 +3602,7 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, afi_t nh_afi; uint8_t pi_type = 0; uint8_t pi_sub_type = 0; + bool force_evpn_import = false; if (frrtrace_enabled(frr_bgp, process_update)) { char pfxprint[PREFIX2STR_BUFFER]; @@ -3918,6 +3916,14 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, } bgp_path_info_restore(dest, pi); + + /* + * If the BGP_PATH_REMOVED flag is set, then EVPN + * routes would have been unimported already when a + * prior BGP withdraw processing happened. Such routes + * need to be imported again, so flag accordingly. + */ + force_evpn_import = true; } /* Received Logging. */ @@ -4140,7 +4146,7 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, #endif /* If this is an EVPN route and some attribute has changed, - * process + * or we are explicitly told to perform a route import, process * route for import. If the extended community has changed, we * would * have done the un-import earlier and the import would result @@ -4151,7 +4157,8 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, * updating * the attributes for the route in the VNI(s). */ - if (safi == SAFI_EVPN && !same_attr && + if (safi == SAFI_EVPN && + (!same_attr || force_evpn_import) && CHECK_FLAG(pi->flags, BGP_PATH_VALID)) bgp_evpn_import_route(bgp, afi, safi, p, pi); @@ -6027,16 +6034,28 @@ static void bgp_static_update_safi(struct bgp *bgp, const struct prefix *p, /* Configure static BGP network. When user don't run zebra, static route should be installed as valid. */ -int bgp_static_set(struct bgp *bgp, const char *negate, struct prefix *pfx, - afi_t afi, safi_t safi, const char *rmap, int backdoor, - uint32_t label_index, char *errmsg, size_t errmsg_len) +static int bgp_static_set(struct vty *vty, const char *negate, + const char *ip_str, afi_t afi, safi_t safi, + const char *rmap, int backdoor, uint32_t label_index) { + VTY_DECLVAR_CONTEXT(bgp, bgp); + int ret; struct prefix p; struct bgp_static *bgp_static; struct bgp_dest *dest; uint8_t need_update = 0; - prefix_copy(&p, pfx); + /* Convert IP prefix string to struct prefix. */ + ret = str2prefix(ip_str, &p); + if (!ret) { + vty_out(vty, "%% Malformed prefix\n"); + return CMD_WARNING_CONFIG_FAILED; + } + if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL(&p.u.prefix6)) { + vty_out(vty, "%% Malformed prefix (link-local address)\n"); + return CMD_WARNING_CONFIG_FAILED; + } + apply_mask(&p); if (negate) { @@ -6045,27 +6064,26 @@ int bgp_static_set(struct bgp *bgp, const char *negate, struct prefix *pfx, dest = bgp_node_lookup(bgp->route[afi][safi], &p); if (!dest) { - snprintf(errmsg, errmsg_len, - "Can't find static route specified\n"); - return -1; + vty_out(vty, "%% Can't find static route specified\n"); + return CMD_WARNING_CONFIG_FAILED; } bgp_static = bgp_dest_get_bgp_static_info(dest); if ((label_index != BGP_INVALID_LABEL_INDEX) && (label_index != bgp_static->label_index)) { - snprintf(errmsg, errmsg_len, - "label-index doesn't match static route\n"); + vty_out(vty, + "%% label-index doesn't match static route\n"); bgp_dest_unlock_node(dest); - return -1; + return CMD_WARNING_CONFIG_FAILED; } if ((rmap && bgp_static->rmap.name) && strcmp(rmap, bgp_static->rmap.name)) { - snprintf(errmsg, errmsg_len, - "route-map name doesn't match static route\n"); + vty_out(vty, + "%% route-map name doesn't match static route\n"); bgp_dest_unlock_node(dest); - return -1; + return CMD_WARNING_CONFIG_FAILED; } /* Update BGP RIB. */ @@ -6086,9 +6104,8 @@ int bgp_static_set(struct bgp *bgp, const char *negate, struct prefix *pfx, /* Configuration change. */ /* Label index cannot be changed. */ if (bgp_static->label_index != label_index) { - snprintf(errmsg, errmsg_len, - "cannot change label-index\n"); - return -1; + vty_out(vty, "%% cannot change label-index\n"); + return CMD_WARNING_CONFIG_FAILED; } /* Check previous routes are installed into BGP. */ @@ -6150,7 +6167,7 @@ int bgp_static_set(struct bgp *bgp, const char *negate, struct prefix *pfx, bgp_static_update(bgp, &p, bgp_static, afi, safi); } - return 0; + return CMD_SUCCESS; } void bgp_static_add(struct bgp *bgp) @@ -6602,27 +6619,25 @@ DEFUN (no_bgp_table_map, argv[idx_word]->arg); } -DEFPY_YANG (bgp_network, bgp_network_cmd, - "[no] network \ - <A.B.C.D/M$prefix|A.B.C.D$address [mask A.B.C.D$netmask]> \ - [{route-map WORD$map_name|label-index (0-1048560)$label_index| \ - backdoor$backdoor}]", - NO_STR - "Specify a network to announce via BGP\n" - "IPv4 prefix\n" - "Network number\n" - "Network mask\n" - "Network mask\n" - "Route-map to modify the attributes\n" - "Name of the route map\n" - "Label index to associate with the prefix\n" - "Label index value\n" - "Specify a BGP backdoor route\n") -{ - char addr_prefix_str[PREFIX_STRLEN]; - char base_xpath[XPATH_MAXLEN]; - afi_t afi; - safi_t safi; +DEFPY(bgp_network, + bgp_network_cmd, + "[no] network \ + <A.B.C.D/M$prefix|A.B.C.D$address [mask A.B.C.D$netmask]> \ + [{route-map WORD$map_name|label-index (0-1048560)$label_index| \ + backdoor$backdoor}]", + NO_STR + "Specify a network to announce via BGP\n" + "IPv4 prefix\n" + "Network number\n" + "Network mask\n" + "Network mask\n" + "Route-map to modify the attributes\n" + "Name of the route map\n" + "Label index to associate with the prefix\n" + "Label index value\n" + "Specify a BGP backdoor route\n") +{ + char addr_prefix_str[BUFSIZ]; if (address_str) { int ret; @@ -6636,102 +6651,27 @@ DEFPY_YANG (bgp_network, bgp_network_cmd, } } - afi = bgp_node_afi(vty); - safi = bgp_node_safi(vty); - - if (no) { - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } else { - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - - if (map_name) - nb_cli_enqueue_change(vty, "./rmap-policy-export", - NB_OP_CREATE, map_name); - else - nb_cli_enqueue_change(vty, "./rmap-policy-export", - NB_OP_DESTROY, NULL); - - if (label_index_str) - nb_cli_enqueue_change(vty, "./label-index", - NB_OP_MODIFY, label_index_str); - - nb_cli_enqueue_change(vty, "./backdoor", NB_OP_MODIFY, - backdoor ? "true" : "false"); - } - - snprintf( - base_xpath, sizeof(base_xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/network-config[prefix='%s']", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi), - address_str ? addr_prefix_str : prefix_str); - - return nb_cli_apply_changes(vty, base_xpath); -} - -DEFPY_YANG (ipv6_bgp_network, - ipv6_bgp_network_cmd, - "[no] network X:X::X:X/M$prefix \ - [{route-map WORD$map_name|label-index (0-1048560)$label_index}]", - NO_STR - "Specify a network to announce via BGP\n" - "IPv6 prefix\n" - "Route-map to modify the attributes\n" - "Name of the route map\n" - "Label index to associate with the prefix\n" - "Label index value\n") -{ - char base_xpath[XPATH_MAXLEN]; - afi_t afi; - safi_t safi; - - afi = bgp_node_afi(vty); - safi = bgp_node_safi(vty); - - if (no) { - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } else { - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - - if (map_name) - nb_cli_enqueue_change(vty, "./rmap-policy-export", - NB_OP_MODIFY, map_name); - else - nb_cli_enqueue_change(vty, "./rmap-policy-export", - NB_OP_DESTROY, NULL); - - if (label_index_str) - nb_cli_enqueue_change(vty, "./label-index", - NB_OP_MODIFY, label_index_str); - } - - snprintf( - base_xpath, sizeof(base_xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/network-config[prefix='%s']", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi), prefix_str); - - return nb_cli_apply_changes(vty, base_xpath); + return bgp_static_set( + vty, no, address_str ? addr_prefix_str : prefix_str, AFI_IP, + bgp_node_safi(vty), map_name, backdoor ? 1 : 0, + label_index ? (uint32_t)label_index : BGP_INVALID_LABEL_INDEX); } -void cli_show_bgp_global_afi_safi_network_config(struct vty *vty, - struct lyd_node *dnode, - bool show_defaults) +DEFPY(ipv6_bgp_network, + ipv6_bgp_network_cmd, + "[no] network X:X::X:X/M$prefix \ + [{route-map WORD$map_name|label-index (0-1048560)$label_index}]", + NO_STR + "Specify a network to announce via BGP\n" + "IPv6 prefix\n" + "Route-map to modify the attributes\n" + "Name of the route map\n" + "Label index to associate with the prefix\n" + "Label index value\n") { - vty_out(vty, " network %s", yang_dnode_get_string(dnode, "./prefix")); - - if (yang_dnode_exists(dnode, "./label-index")) - vty_out(vty, " label-index %s", - yang_dnode_get_string(dnode, "./label-index")); - - if (yang_dnode_exists(dnode, "./rmap-policy-export")) - vty_out(vty, " route-map %s", - yang_dnode_get_string(dnode, "./rmap-policy-export")); - - if (yang_dnode_get_bool(dnode, "./backdoor")) - vty_out(vty, " backdoor"); - - vty_out(vty, "\n"); + return bgp_static_set( + vty, no, prefix_str, AFI_IP6, bgp_node_safi(vty), map_name, 0, + label_index ? (uint32_t)label_index : BGP_INVALID_LABEL_INDEX); } static struct bgp_aggregate *bgp_aggregate_new(void) @@ -7807,32 +7747,35 @@ static const char *bgp_rpki_validation2str(enum rpki_states v_state) return "ERROR"; } -int bgp_aggregate_unset(struct bgp *bgp, struct prefix *prefix, afi_t afi, - safi_t safi, char *errmsg, size_t errmsg_len) +static int bgp_aggregate_unset(struct vty *vty, const char *prefix_str, + afi_t afi, safi_t safi) { + VTY_DECLVAR_CONTEXT(bgp, bgp); + int ret; + struct prefix p; struct bgp_dest *dest; struct bgp_aggregate *aggregate; - /* If the bgp instance is being deleted or self peer is deleted - * then do not create aggregate route - */ - if (CHECK_FLAG(bgp->flags, BGP_FLAG_DELETE_IN_PROGRESS) - || (bgp->peer_self == NULL)) - return 0; + /* Convert string to prefix structure. */ + ret = str2prefix(prefix_str, &p); + if (!ret) { + vty_out(vty, "Malformed prefix\n"); + return CMD_WARNING_CONFIG_FAILED; + } + apply_mask(&p); - apply_mask(prefix); /* Old configuration check. */ - dest = bgp_node_lookup(bgp->aggregate[afi][safi], prefix); + dest = bgp_node_lookup(bgp->aggregate[afi][safi], &p); if (!dest) { - snprintf(errmsg, errmsg_len, - "There is no aggregate-address configuration.\n"); - return -1; + vty_out(vty, + "%% There is no aggregate-address configuration.\n"); + return CMD_WARNING_CONFIG_FAILED; } aggregate = bgp_dest_get_bgp_aggregate_info(dest); - bgp_aggregate_delete(bgp, prefix, afi, safi, aggregate); - bgp_aggregate_install(bgp, afi, safi, prefix, 0, NULL, NULL, NULL, NULL, - 0, aggregate); + bgp_aggregate_delete(bgp, &p, afi, safi, aggregate); + bgp_aggregate_install(bgp, afi, safi, &p, 0, NULL, NULL, + NULL, NULL, 0, aggregate); /* Unlock aggregate address configuration. */ bgp_dest_set_bgp_aggregate_info(dest, NULL); @@ -7893,53 +7836,55 @@ int bgp_aggregate_unset(struct bgp *bgp, struct prefix *prefix, afi_t afi, bgp_dest_unlock_node(dest); bgp_dest_unlock_node(dest); - return 0; + return CMD_SUCCESS; } -int bgp_aggregate_set(struct bgp *bgp, struct prefix *prefix, afi_t afi, - safi_t safi, const char *rmap, uint8_t summary_only, - uint8_t as_set, uint8_t origin, bool match_med, - const char *suppress_map, - char *errmsg, size_t errmsg_len) +static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi, + safi_t safi, const char *rmap, + uint8_t summary_only, uint8_t as_set, + uint8_t origin, bool match_med, + const char *suppress_map) { + VTY_DECLVAR_CONTEXT(bgp, bgp); int ret; + struct prefix p; struct bgp_dest *dest; struct bgp_aggregate *aggregate; uint8_t as_set_new = as_set; - char buf[PREFIX2STR_BUFFER]; if (suppress_map && summary_only) { - snprintf(errmsg, errmsg_len, + vty_out(vty, "'summary-only' and 'suppress-map' can't be used at the same time\n"); - return -1; + return CMD_WARNING_CONFIG_FAILED; } - apply_mask(prefix); + /* Convert string to prefix structure. */ + ret = str2prefix(prefix_str, &p); + if (!ret) { + vty_out(vty, "Malformed prefix\n"); + return CMD_WARNING_CONFIG_FAILED; + } + apply_mask(&p); - if ((afi == AFI_IP && prefix->prefixlen == IPV4_MAX_BITLEN) - || (afi == AFI_IP6 && prefix->prefixlen == IPV6_MAX_BITLEN)) { - snprintf( - errmsg, errmsg_len, - "Specified prefix: %s will not result in any useful aggregation, disallowing\n", - prefix2str(prefix, buf, PREFIX_STRLEN)); - return -1; + if ((afi == AFI_IP && p.prefixlen == IPV4_MAX_BITLEN) || + (afi == AFI_IP6 && p.prefixlen == IPV6_MAX_BITLEN)) { + vty_out(vty, "Specified prefix: %s will not result in any useful aggregation, disallowing\n", + prefix_str); + return CMD_WARNING_CONFIG_FAILED; } /* Old configuration check. */ - dest = bgp_node_get(bgp->aggregate[afi][safi], prefix); + dest = bgp_node_get(bgp->aggregate[afi][safi], &p); aggregate = bgp_dest_get_bgp_aggregate_info(dest); if (aggregate) { - snprintf(errmsg, errmsg_len, - "There is already same aggregate network.\n"); + vty_out(vty, "There is already same aggregate network.\n"); /* try to remove the old entry */ - ret = bgp_aggregate_unset(bgp, prefix, afi, safi, errmsg, - errmsg_len); + ret = bgp_aggregate_unset(vty, prefix_str, afi, safi); if (ret) { - snprintf(errmsg, errmsg_len, - "Error deleting aggregate.\n"); + vty_out(vty, "Error deleting aggregate.\n"); bgp_dest_unlock_node(dest); - return -1; + return CMD_WARNING_CONFIG_FAILED; } } @@ -7962,8 +7907,7 @@ int bgp_aggregate_set(struct bgp *bgp, struct prefix *prefix, afi_t afi, zlog_warn( "%s: Ignoring as-set because `bgp reject-as-sets` is enabled.", __func__); - snprintf( - errmsg, errmsg_len, + vty_out(vty, "Ignoring as-set because `bgp reject-as-sets` is enabled.\n"); } } @@ -8000,40 +7944,39 @@ int bgp_aggregate_set(struct bgp *bgp, struct prefix *prefix, afi_t afi, bgp_dest_set_bgp_aggregate_info(dest, aggregate); /* Aggregate address insert into BGP routing table. */ - bgp_aggregate_route(bgp, prefix, afi, safi, aggregate); + bgp_aggregate_route(bgp, &p, afi, safi, aggregate); - return 0; + return CMD_SUCCESS; } -DEFPY_YANG( - aggregate_addressv4, aggregate_addressv4_cmd, - "[no] aggregate-address <A.B.C.D/M$prefix|A.B.C.D$addr A.B.C.D$mask> [{" - "as-set$as_set_s" - "|summary-only$summary_only" - "|route-map WORD$rmap_name" - "|origin <egp|igp|incomplete>$origin_s" - "|matching-MED-only$match_med" - "|suppress-map WORD$suppress_map" - "}]", - NO_STR - "Configure BGP aggregate entries\n" - "Aggregate prefix\n" - "Aggregate address\n" - "Aggregate mask\n" - "Generate AS set path information\n" - "Filter more specific routes from updates\n" - "Apply route map to aggregate network\n" - "Route map name\n" - "BGP origin code\n" - "Remote EGP\n" - "Local IGP\n" - "Unknown heritage\n" - "Only aggregate routes with matching MED\n" - "Suppress the selected more specific routes\n" - "Route map with the route selectors\n") -{ - char base_xpath[XPATH_MAXLEN]; +DEFPY(aggregate_addressv4, aggregate_addressv4_cmd, + "[no] aggregate-address <A.B.C.D/M$prefix|A.B.C.D$addr A.B.C.D$mask> [{" + "as-set$as_set_s" + "|summary-only$summary_only" + "|route-map WORD$rmap_name" + "|origin <egp|igp|incomplete>$origin_s" + "|matching-MED-only$match_med" + "|suppress-map WORD$suppress_map" + "}]", + NO_STR + "Configure BGP aggregate entries\n" + "Aggregate prefix\n" "Aggregate address\n" "Aggregate mask\n" + "Generate AS set path information\n" + "Filter more specific routes from updates\n" + "Apply route map to aggregate network\n" + "Route map name\n" + "BGP origin code\n" + "Remote EGP\n" + "Local IGP\n" + "Unknown heritage\n" + "Only aggregate routes with matching MED\n" + "Suppress the selected more specific routes\n" + "Route map with the route selectors\n") +{ + const char *prefix_s = NULL; safi_t safi = bgp_node_safi(vty); + uint8_t origin = BGP_ORIGIN_UNSPECIFIED; + int as_set = AGGREGATE_AS_UNSET; char prefix_buf[PREFIX2STR_BUFFER]; if (addr_str) { @@ -8043,158 +7986,78 @@ DEFPY_YANG( vty_out(vty, "%% Inconsistent address and mask\n"); return CMD_WARNING_CONFIG_FAILED; } - } else { - strlcpy(prefix_buf, prefix_str, sizeof(prefix_buf)); - } - - if (!no && origin_s) - nb_cli_enqueue_change(vty, "./origin", NB_OP_MODIFY, origin_s); - - if (!no && as_set_s) - nb_cli_enqueue_change(vty, "./as-set", NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, "./as-set", NB_OP_MODIFY, "false"); - - if (!no && summary_only) - nb_cli_enqueue_change(vty, "./summary-only", NB_OP_MODIFY, - "true"); - else - nb_cli_enqueue_change(vty, "./summary-only", NB_OP_MODIFY, - "false"); - - if (!no && match_med) - nb_cli_enqueue_change(vty, "./match-med", NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, "./match-med", NB_OP_MODIFY, - "false"); - - if (rmap_name) - nb_cli_enqueue_change(vty, "./rmap-policy-export", NB_OP_MODIFY, - rmap_name); - else - nb_cli_enqueue_change(vty, "./rmap-policy-export", - NB_OP_DESTROY, NULL); + prefix_s = prefix_buf; + } else + prefix_s = prefix_str; - if (suppress_map) - nb_cli_enqueue_change(vty, "./suppress-map", NB_OP_MODIFY, - suppress_map); - else - nb_cli_enqueue_change(vty, "./suppress-map", NB_OP_DESTROY, - NULL); + if (origin_s) { + if (strcmp(origin_s, "egp") == 0) + origin = BGP_ORIGIN_EGP; + else if (strcmp(origin_s, "igp") == 0) + origin = BGP_ORIGIN_IGP; + else if (strcmp(origin_s, "incomplete") == 0) + origin = BGP_ORIGIN_INCOMPLETE; + } - snprintf( - base_xpath, sizeof(base_xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/aggregate-route[prefix='%s']", - yang_afi_safi_value2identity(AFI_IP, safi), - bgp_afi_safi_get_container_str(AFI_IP, safi), prefix_buf); + if (as_set_s) + as_set = AGGREGATE_AS_SET; + /* Handle configuration removal, otherwise installation. */ if (no) - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - else - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - - return nb_cli_apply_changes(vty, base_xpath); -} - -DEFPY_YANG(aggregate_addressv6, aggregate_addressv6_cmd, - "[no] aggregate-address X:X::X:X/M$prefix [{" - "as-set$as_set_s" - "|summary-only$summary_only" - "|route-map WORD$rmap_name" - "|origin <egp|igp|incomplete>$origin_s" - "|matching-MED-only$match_med" - "|suppress-map WORD$suppress_map" - "}]", - NO_STR - "Configure BGP aggregate entries\n" - "Aggregate prefix\n" - "Generate AS set path information\n" - "Filter more specific routes from updates\n" - "Apply route map to aggregate network\n" - "Route map name\n" - "BGP origin code\n" - "Remote EGP\n" - "Local IGP\n" - "Unknown heritage\n" - "Only aggregate routes with matching MED\n" - "Suppress the selected more specific routes\n" - "Route map with the route selectors\n") -{ - char base_xpath[XPATH_MAXLEN]; - safi_t safi = bgp_node_safi(vty); - - if (!no && origin_s) - nb_cli_enqueue_change(vty, "./origin", NB_OP_MODIFY, origin_s); - - if (!no && as_set_s) - nb_cli_enqueue_change(vty, "./as-set", NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, "./as-set", NB_OP_MODIFY, "false"); - - if (!no && summary_only) - nb_cli_enqueue_change(vty, "./summary-only", NB_OP_MODIFY, - "true"); - else - nb_cli_enqueue_change(vty, "./summary-only", NB_OP_MODIFY, - "false"); - - if (!no && match_med) - nb_cli_enqueue_change(vty, "./match-med", NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, "./match-med", NB_OP_MODIFY, - "false"); - - if (rmap_name) - nb_cli_enqueue_change(vty, "./rmap-policy-export", NB_OP_MODIFY, - rmap_name); - - if (suppress_map) - nb_cli_enqueue_change(vty, "./suppress-map", NB_OP_MODIFY, - suppress_map); - else - nb_cli_enqueue_change(vty, "./suppress-map", NB_OP_DESTROY, - NULL); - - snprintf( - base_xpath, sizeof(base_xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/aggregate-route[prefix='%s']", - yang_afi_safi_value2identity(AFI_IP6, safi), - bgp_afi_safi_get_container_str(AFI_IP6, safi), prefix_str); - + return bgp_aggregate_unset(vty, prefix_s, AFI_IP, safi); + + return bgp_aggregate_set(vty, prefix_s, AFI_IP, safi, rmap_name, + summary_only != NULL, as_set, origin, + match_med != NULL, suppress_map); +} + +DEFPY(aggregate_addressv6, aggregate_addressv6_cmd, + "[no] aggregate-address X:X::X:X/M$prefix [{" + "as-set$as_set_s" + "|summary-only$summary_only" + "|route-map WORD$rmap_name" + "|origin <egp|igp|incomplete>$origin_s" + "|matching-MED-only$match_med" + "|suppress-map WORD$suppress_map" + "}]", + NO_STR + "Configure BGP aggregate entries\n" + "Aggregate prefix\n" + "Generate AS set path information\n" + "Filter more specific routes from updates\n" + "Apply route map to aggregate network\n" + "Route map name\n" + "BGP origin code\n" + "Remote EGP\n" + "Local IGP\n" + "Unknown heritage\n" + "Only aggregate routes with matching MED\n" + "Suppress the selected more specific routes\n" + "Route map with the route selectors\n") +{ + uint8_t origin = BGP_ORIGIN_UNSPECIFIED; + int as_set = AGGREGATE_AS_UNSET; + + if (origin_s) { + if (strcmp(origin_s, "egp") == 0) + origin = BGP_ORIGIN_EGP; + else if (strcmp(origin_s, "igp") == 0) + origin = BGP_ORIGIN_IGP; + else if (strcmp(origin_s, "incomplete") == 0) + origin = BGP_ORIGIN_INCOMPLETE; + } + + if (as_set_s) + as_set = AGGREGATE_AS_SET; + + /* Handle configuration removal, otherwise installation. */ if (no) - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - else - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - - return nb_cli_apply_changes(vty, base_xpath); -} - -void cli_show_bgp_global_afi_safi_unicast_aggregate_route( - struct vty *vty, struct lyd_node *dnode, bool show_defaults) -{ - uint8_t origin; - - vty_out(vty, " aggregate-address %s", - yang_dnode_get_string(dnode, "./prefix")); - - if (yang_dnode_get_bool(dnode, "./as-set")) - vty_out(vty, " as-set"); - - if (yang_dnode_get_bool(dnode, "./summary-only")) - vty_out(vty, " summary-only"); - - if (yang_dnode_exists(dnode, "./rmap-policy-export")) - vty_out(vty, " route-map %s", - yang_dnode_get_string(dnode, "./rmap-policy-export")); - - origin = yang_dnode_get_enum(dnode, "./origin"); - if (origin != BGP_ORIGIN_UNSPECIFIED) - vty_out(vty, " origin %s", bgp_origin2str(origin)); - - if (yang_dnode_get_bool(dnode, "./match-med")) - vty_out(vty, " matching-MED-only"); + return bgp_aggregate_unset(vty, prefix_str, AFI_IP6, + SAFI_UNICAST); - vty_out(vty, "\n"); + return bgp_aggregate_set(vty, prefix_str, AFI_IP6, SAFI_UNICAST, + rmap_name, summary_only != NULL, as_set, + origin, match_med != NULL, suppress_map); } /* Redistribute route treatment. */ @@ -14302,21 +14165,28 @@ static void bgp_distance_free(struct bgp_distance *bdistance) XFREE(MTYPE_BGP_DISTANCE, bdistance); } -int bgp_distance_set(uint8_t distance, const char *ip_str, - const char *access_list_str, afi_t afi, safi_t safi, - char *errmsg, size_t errmsg_len) +static int bgp_distance_set(struct vty *vty, const char *distance_str, + const char *ip_str, const char *access_list_str) { int ret; + afi_t afi; + safi_t safi; struct prefix p; + uint8_t distance; struct bgp_dest *dest; struct bgp_distance *bdistance; + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); + ret = str2prefix(ip_str, &p); if (ret == 0) { - snprintf(errmsg, errmsg_len, "Malformed prefix\n"); + vty_out(vty, "Malformed prefix\n"); return CMD_WARNING_CONFIG_FAILED; } + distance = atoi(distance_str); + /* Get BGP distance node. */ dest = bgp_node_get(bgp_distance_table[afi][safi], &p); bdistance = bgp_dest_get_bgp_distance_info(dest); @@ -14339,32 +14209,37 @@ int bgp_distance_set(uint8_t distance, const char *ip_str, return CMD_SUCCESS; } -int bgp_distance_unset(uint8_t distance, const char *ip_str, - const char *access_list_str, afi_t afi, safi_t safi, - char *errmsg, size_t errmsg_len) +static int bgp_distance_unset(struct vty *vty, const char *distance_str, + const char *ip_str, const char *access_list_str) { int ret; + afi_t afi; + safi_t safi; struct prefix p; + int distance; struct bgp_dest *dest; struct bgp_distance *bdistance; + afi = bgp_node_afi(vty); + safi = bgp_node_safi(vty); + ret = str2prefix(ip_str, &p); if (ret == 0) { - snprintf(errmsg, errmsg_len, "Malformed prefix\n"); + vty_out(vty, "Malformed prefix\n"); return CMD_WARNING_CONFIG_FAILED; } dest = bgp_node_lookup(bgp_distance_table[afi][safi], &p); if (!dest) { - snprintf(errmsg, errmsg_len, "Can't find specified prefix\n"); + vty_out(vty, "Can't find specified prefix\n"); return CMD_WARNING_CONFIG_FAILED; } bdistance = bgp_dest_get_bgp_distance_info(dest); + distance = atoi(distance_str); if (bdistance->distance != distance) { - snprintf(errmsg, errmsg_len, - "Distance does not match configured\n"); + vty_out(vty, "Distance does not match configured\n"); bgp_dest_unlock_node(dest); return CMD_WARNING_CONFIG_FAILED; } @@ -14452,8 +14327,9 @@ uint8_t bgp_distance_apply(const struct prefix *p, struct bgp_path_info *pinfo, * we should tell ZEBRA update the routes for a specific * AFI/SAFI to reflect changes in RIB. */ -void bgp_announce_routes_distance_update(struct bgp *bgp, afi_t update_afi, - safi_t update_safi) +static void bgp_announce_routes_distance_update(struct bgp *bgp, + afi_t update_afi, + safi_t update_safi) { afi_t afi; safi_t safi; @@ -14473,228 +14349,237 @@ void bgp_announce_routes_distance_update(struct bgp *bgp, afi_t update_afi, } } -DEFUN_YANG(bgp_distance, bgp_distance_cmd, - "distance bgp (1-255) (1-255) (1-255)", - "Define an administrative distance\n" - "BGP distance\n" - "Distance for routes external to the AS\n" - "Distance for routes internal to the AS\n" - "Distance for local routes\n") +DEFUN (bgp_distance, + bgp_distance_cmd, + "distance bgp (1-255) (1-255) (1-255)", + "Define an administrative distance\n" + "BGP distance\n" + "Distance for routes external to the AS\n" + "Distance for routes internal to the AS\n" + "Distance for local routes\n") { + VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_number = 2; int idx_number_2 = 3; int idx_number_3 = 4; + int distance_ebgp = atoi(argv[idx_number]->arg); + int distance_ibgp = atoi(argv[idx_number_2]->arg); + int distance_local = atoi(argv[idx_number_3]->arg); afi_t afi; safi_t safi; - char xpath[XPATH_MAXLEN]; afi = bgp_node_afi(vty); safi = bgp_node_safi(vty); - snprintf( - xpath, sizeof(xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/external", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi)); - nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, argv[idx_number]->arg); - snprintf( - xpath, sizeof(xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/internal", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi)); - nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, - argv[idx_number_2]->arg); - snprintf( - xpath, sizeof(xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/local", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi)); - - nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, - argv[idx_number_3]->arg); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFUN_YANG(no_bgp_distance, no_bgp_distance_cmd, - "no distance bgp [(1-255) (1-255) (1-255)]", - NO_STR - "Define an administrative distance\n" - "BGP distance\n" - "Distance for routes external to the AS\n" - "Distance for routes internal to the AS\n" - "Distance for local routes\n") -{ - afi_t afi; - safi_t safi; - char xpath[XPATH_MAXLEN]; - - afi = bgp_node_afi(vty); - safi = bgp_node_safi(vty); + if (bgp->distance_ebgp[afi][safi] != distance_ebgp + || bgp->distance_ibgp[afi][safi] != distance_ibgp + || bgp->distance_local[afi][safi] != distance_local) { + bgp->distance_ebgp[afi][safi] = distance_ebgp; + bgp->distance_ibgp[afi][safi] = distance_ibgp; + bgp->distance_local[afi][safi] = distance_local; + bgp_announce_routes_distance_update(bgp, afi, safi); + } + return CMD_SUCCESS; +} - snprintf( - xpath, sizeof(xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/external", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi)); - nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, NULL); - snprintf( - xpath, sizeof(xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/internal", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi)); - nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, NULL); - snprintf( - xpath, sizeof(xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/admin-distance/local", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi)); - - nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -void cli_show_bgp_global_afi_safi_admin_distance_config(struct vty *vty, - struct lyd_node *dnode, - bool show_defaults) -{ - uint8_t distance_ebgp, distance_ibgp, distance_local; - - distance_ebgp = yang_dnode_get_uint8(dnode, "./external"); - distance_ibgp = yang_dnode_get_uint8(dnode, "./internal"); - distance_local = yang_dnode_get_uint8(dnode, "./local"); - - vty_out(vty, " distance bgp %d %d %d\n", distance_ebgp, distance_ibgp, - distance_local); -} - -DEFPY_YANG(bgp_distance_source, - bgp_distance_source_cmd, - "[no] distance (1-255) <A.B.C.D/M | X:X::X:X/M>$prefix [WORD$acl]", - NO_STR - "Define an administrative distance\n" - "Distance value\n" - "IPv4 source prefix\n" - "IPv6 source prefix\n" - "Access list name\n") +DEFUN (no_bgp_distance, + no_bgp_distance_cmd, + "no distance bgp [(1-255) (1-255) (1-255)]", + NO_STR + "Define an administrative distance\n" + "BGP distance\n" + "Distance for routes external to the AS\n" + "Distance for routes internal to the AS\n" + "Distance for local routes\n") { + VTY_DECLVAR_CONTEXT(bgp, bgp); afi_t afi; safi_t safi; - char xpath[XPATH_MAXLEN]; afi = bgp_node_afi(vty); safi = bgp_node_safi(vty); - 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); + if (bgp->distance_ebgp[afi][safi] != 0 + || bgp->distance_ibgp[afi][safi] != 0 + || bgp->distance_local[afi][safi] != 0) { + bgp->distance_ebgp[afi][safi] = 0; + bgp->distance_ibgp[afi][safi] = 0; + bgp->distance_local[afi][safi] = 0; + bgp_announce_routes_distance_update(bgp, afi, safi); } + return CMD_SUCCESS; +} - 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), prefix_str); - return nb_cli_apply_changes(vty, xpath); +DEFUN (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") +{ + int idx_number = 1; + int idx_ipv4_prefixlen = 2; + bgp_distance_set(vty, argv[idx_number]->arg, + argv[idx_ipv4_prefixlen]->arg, NULL); + return CMD_SUCCESS; } -void cli_show_bgp_global_afi_safi_unicast_admin_distance_route( - struct vty *vty, struct lyd_node *dnode, bool show_defaults) +DEFUN (no_bgp_distance_source, + no_bgp_distance_source_cmd, + "no distance (1-255) A.B.C.D/M", + NO_STR + "Define an administrative distance\n" + "Administrative distance\n" + "IP source prefix\n") { - vty_out(vty, " distance %d %s %s\n", - yang_dnode_get_uint8(dnode, "./distance"), - yang_dnode_get_string(dnode, "./prefix"), - (yang_dnode_exists(dnode, "./access-list-policy-export")) - ? yang_dnode_get_string(dnode, - "./access-list-policy-export") - : ""); + int idx_number = 2; + int idx_ipv4_prefixlen = 3; + bgp_distance_unset(vty, argv[idx_number]->arg, + argv[idx_ipv4_prefixlen]->arg, NULL); + return CMD_SUCCESS; } -DEFPY_YANG( - bgp_dampening, bgp_dampening_cmd, - "[no] bgp dampening [(1-45)$halflife [(1-20000)$reuse (1-20000)$suppress (1-255)$max_suppress]]", - NO_STR - "BGP Specific commands\n" - "Enable route-flap dampening\n" - "Half-life time for the penalty\n" - "Value to start reusing a route\n" - "Value to start suppressing a route\n" - "Maximum duration to suppress a stable route\n") +DEFUN (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" + "IP source prefix\n" + "Access list name\n") { - afi_t afi; - safi_t safi; - char xpath[XPATH_MAXLEN]; + int idx_number = 1; + int idx_ipv4_prefixlen = 2; + int idx_word = 3; + bgp_distance_set(vty, argv[idx_number]->arg, + argv[idx_ipv4_prefixlen]->arg, argv[idx_word]->arg); + return CMD_SUCCESS; +} - afi = bgp_node_afi(vty); - safi = bgp_node_safi(vty); +DEFUN (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") +{ + int idx_number = 2; + int idx_ipv4_prefixlen = 3; + int idx_word = 4; + bgp_distance_unset(vty, argv[idx_number]->arg, + argv[idx_ipv4_prefixlen]->arg, argv[idx_word]->arg); + return CMD_SUCCESS; +} - if (!no) { - nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); - if (argc == 6) { - nb_cli_enqueue_change(vty, "./reach-decay", - NB_OP_MODIFY, halflife_str); - nb_cli_enqueue_change(vty, "./reuse-above", - NB_OP_MODIFY, reuse_str); - nb_cli_enqueue_change(vty, "./suppress-above", - NB_OP_MODIFY, suppress_str); - nb_cli_enqueue_change(vty, "./unreach-decay", - NB_OP_MODIFY, max_suppress_str); - } if (argc == 3) { - nb_cli_enqueue_change(vty, "./reach-decay", - NB_OP_MODIFY, halflife_str); - } - } else { - nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "false"); - } +DEFUN (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") +{ + bgp_distance_set(vty, argv[1]->arg, argv[2]->arg, NULL); + return CMD_SUCCESS; +} - snprintf( - xpath, sizeof(xpath), - "./global/afi-safis/afi-safi[afi-safi-name='%s']/%s/route-flap-dampening", - yang_afi_safi_value2identity(afi, safi), - bgp_afi_safi_get_container_str(afi, safi)); +DEFUN (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") +{ + bgp_distance_unset(vty, argv[2]->arg, argv[3]->arg, NULL); + return CMD_SUCCESS; +} - return nb_cli_apply_changes(vty, xpath); +DEFUN (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") +{ + bgp_distance_set(vty, argv[1]->arg, argv[2]->arg, argv[3]->arg); + return CMD_SUCCESS; } -void cli_show_bgp_global_afi_safi_route_flap_dampening(struct vty *vty, - struct lyd_node *dnode, - bool show_defaults) +DEFUN (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") { - if (!yang_dnode_get_bool(dnode, "./enable")) - return; + bgp_distance_unset(vty, argv[2]->arg, argv[3]->arg, argv[4]->arg); + return CMD_SUCCESS; +} +DEFUN (bgp_damp_set, + bgp_damp_set_cmd, + "bgp dampening [(1-45) [(1-20000) (1-20000) (1-255)]]", + "BGP Specific commands\n" + "Enable route-flap dampening\n" + "Half-life time for the penalty\n" + "Value to start reusing a route\n" + "Value to start suppressing a route\n" + "Maximum duration to suppress a stable route\n") +{ + VTY_DECLVAR_CONTEXT(bgp, bgp); + int idx_half_life = 2; + int idx_reuse = 3; + int idx_suppress = 4; + int idx_max_suppress = 5; int half = DEFAULT_HALF_LIFE * 60; int reuse = DEFAULT_REUSE; int suppress = DEFAULT_SUPPRESS; - int max; - - half = yang_dnode_get_uint8(dnode, "../reach-decay"); - reuse = yang_dnode_get_uint16(dnode, "../reuse-above"); - suppress = yang_dnode_get_uint16(dnode, "../suppress-above"); - max = yang_dnode_get_uint8(dnode, "../unreach-decay"); - - if (half == DEFAULT_HALF_LIFE * 60 && reuse == DEFAULT_REUSE - && suppress == DEFAULT_SUPPRESS && max == half * 4) - vty_out(vty, " bgp dampening\n"); - else if (half != DEFAULT_HALF_LIFE * 60 && reuse == DEFAULT_REUSE - && suppress == DEFAULT_SUPPRESS && max == half * 4) - vty_out(vty, " bgp dampening %u\n", half); - else - vty_out(vty, " bgp dampening %u %d %d %d\n", half, reuse, - suppress, max); + int max = 4 * half; + + if (argc == 6) { + half = atoi(argv[idx_half_life]->arg) * 60; + reuse = atoi(argv[idx_reuse]->arg); + suppress = atoi(argv[idx_suppress]->arg); + max = atoi(argv[idx_max_suppress]->arg) * 60; + } else if (argc == 3) { + half = atoi(argv[idx_half_life]->arg) * 60; + max = 4 * half; + } + + /* + * These can't be 0 but our SA doesn't understand the + * way our cli is constructed + */ + assert(reuse); + assert(half); + if (suppress < reuse) { + vty_out(vty, + "Suppress value cannot be less than reuse value \n"); + return 0; + } + + return bgp_damp_enable(bgp, bgp_node_afi(vty), bgp_node_safi(vty), half, + reuse, suppress, max); +} + +DEFUN (bgp_damp_unset, + bgp_damp_unset_cmd, + "no bgp dampening [(1-45) [(1-20000) (1-20000) (1-255)]]", + NO_STR + "BGP Specific commands\n" + "Enable route-flap dampening\n" + "Half-life time for the penalty\n" + "Value to start reusing a route\n" + "Value to start suppressing a route\n" + "Maximum duration to suppress a stable route\n") +{ + VTY_DECLVAR_CONTEXT(bgp, bgp); + return bgp_damp_disable(bgp, bgp_node_afi(vty), bgp_node_safi(vty)); } /* Display specified route of BGP table. */ @@ -15225,27 +15110,54 @@ 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, &bgp_distance_source_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_IPV6M_NODE, &bgp_distance_cmd); install_element(BGP_IPV6M_NODE, &no_bgp_distance_cmd); - install_element(BGP_IPV6M_NODE, &bgp_distance_source_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); /* BGP dampening */ - install_element(BGP_NODE, &bgp_dampening_cmd); - install_element(BGP_IPV4_NODE, &bgp_dampening_cmd); - install_element(BGP_IPV4M_NODE, &bgp_dampening_cmd); - install_element(BGP_IPV4L_NODE, &bgp_dampening_cmd); - install_element(BGP_IPV6_NODE, &bgp_dampening_cmd); - install_element(BGP_IPV6M_NODE, &bgp_dampening_cmd); - install_element(BGP_IPV6L_NODE, &bgp_dampening_cmd); + install_element(BGP_NODE, &bgp_damp_set_cmd); + install_element(BGP_NODE, &bgp_damp_unset_cmd); + install_element(BGP_IPV4_NODE, &bgp_damp_set_cmd); + install_element(BGP_IPV4_NODE, &bgp_damp_unset_cmd); + install_element(BGP_IPV4M_NODE, &bgp_damp_set_cmd); + install_element(BGP_IPV4M_NODE, &bgp_damp_unset_cmd); + install_element(BGP_IPV4L_NODE, &bgp_damp_set_cmd); + install_element(BGP_IPV4L_NODE, &bgp_damp_unset_cmd); + install_element(BGP_IPV6_NODE, &bgp_damp_set_cmd); + install_element(BGP_IPV6_NODE, &bgp_damp_unset_cmd); + install_element(BGP_IPV6M_NODE, &bgp_damp_set_cmd); + install_element(BGP_IPV6M_NODE, &bgp_damp_unset_cmd); + install_element(BGP_IPV6L_NODE, &bgp_damp_set_cmd); + install_element(BGP_IPV6L_NODE, &bgp_damp_unset_cmd); /* Large Communities */ install_element(VIEW_NODE, &show_ip_bgp_large_community_list_cmd); |
