From b16bcbba97d10ab4287a15f069b73ec729e71804 Mon Sep 17 00:00:00 2001 From: Trey Aspelund Date: Sat, 3 Apr 2021 05:22:17 +0000 Subject: [PATCH] bgpd: Convert to default_af[afi][safi] Introduces bgp->default_af to selectively enable various default afi/safis to be inherited by new peers. Makes default_af flag logic consistent for all address-families, i.e. instead of a "no default" flag for ipv4 and a "default" flag for ipv6, just use "default" for both and make it true for ipv4 by default. Removes old BGP_FLAG_NO_DEFAULT_IPV4 and BGP_FLAG_DEFAULT_IPV6, and cleans up bgp->flags bit definitions to avoid gaps for unused bits. Signed-off-by: Trey Aspelund --- bgpd/bgp_vty.c | 171 +++++++++++++++++++++++++++++++------------------ bgpd/bgpd.c | 19 +++--- bgpd/bgpd.h | 59 +++++++++-------- 3 files changed, 149 insertions(+), 100 deletions(-) diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index de4f5a59b6..4cd4b59b17 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -470,6 +470,74 @@ int argv_find_and_parse_safi(struct cmd_token **argv, int argc, int *index, return ret; } +/* + * Convert an afi_t/safi_t pair to matching BGP_DEFAULT_AF* flag. + * + * afi + * address-family identifier + * + * safi + * subsequent address-family identifier + * + * Returns: + * default_af string corresponding to the supplied afi/safi pair. + * If afi/safi is invalid or if flag for afi/safi doesn't exist, + * return -1. + */ +static const char *get_bgp_default_af_flag(afi_t afi, safi_t safi) +{ + switch (afi) { + case AFI_IP: + switch (safi) { + case SAFI_UNICAST: + return "ipv4-unicast"; + case SAFI_MULTICAST: + return "ipv4-multicast"; + case SAFI_MPLS_VPN: + return "ipv4-vpn"; + case SAFI_ENCAP: + return "ipv4-encap"; + case SAFI_LABELED_UNICAST: + return "ipv4-labeled-unicast"; + case SAFI_FLOWSPEC: + return "ipv4-flowspec"; + default: + return "unknown-afi/safi"; + } + break; + case AFI_IP6: + switch (safi) { + case SAFI_UNICAST: + return "ipv6-unicast"; + case SAFI_MULTICAST: + return "ipv6-multicast"; + case SAFI_MPLS_VPN: + return "ipv6-vpn"; + case SAFI_ENCAP: + return "ipv6-encap"; + case SAFI_LABELED_UNICAST: + return "ipv6-labeled-unicast"; + case SAFI_FLOWSPEC: + return "ipv6-flowspec"; + default: + return "unknown-afi/safi"; + } + break; + case AFI_L2VPN: + switch (safi) { + case SAFI_EVPN: + return "l2vpn-evpn"; + default: + return "unknown-afi/safi"; + } + case AFI_UNSPEC: + case AFI_MAX: + return "unknown-afi/safi"; + } + /* all AFIs are accounted for above, so this shouldn't happen */ + return "unknown-afi/safi"; +} + int bgp_get_vty(struct bgp **bgp, as_t *as, const char *name, enum bgp_instance_type inst_type) { @@ -3741,52 +3809,34 @@ DEFPY (no_bgp_bestpath_bw, return CMD_SUCCESS; } -/* "no bgp default ipv6-unicast". */ -DEFUN(no_bgp_default_ipv6_unicast, no_bgp_default_ipv6_unicast_cmd, - "no bgp default ipv6-unicast", NO_STR +DEFPY(bgp_default_afi_safi, bgp_default_afi_safi_cmd, + "[no] bgp default $afi_safi", + NO_STR "BGP specific commands\n" "Configure BGP defaults\n" + "Activate ipv4-unicast for a peer by default\n" "Activate ipv6-unicast for a peer by default\n") { VTY_DECLVAR_CONTEXT(bgp, bgp); - UNSET_FLAG(bgp->flags, BGP_FLAG_DEFAULT_IPV6); - return CMD_SUCCESS; -} + char afi_safi_str[strlen(afi_safi) + 1]; + char *afi_safi_str_tok; -DEFUN(bgp_default_ipv6_unicast, bgp_default_ipv6_unicast_cmd, - "bgp default ipv6-unicast", - "BGP specific commands\n" - "Configure BGP defaults\n" - "Activate ipv6-unicast for a peer by default\n") -{ - VTY_DECLVAR_CONTEXT(bgp, bgp); - SET_FLAG(bgp->flags, BGP_FLAG_DEFAULT_IPV6); - return CMD_SUCCESS; -} + strlcpy(afi_safi_str, afi_safi, sizeof(afi_safi_str)); + char *afi_str = strtok_r(afi_safi_str, "-", &afi_safi_str_tok); + char *safi_str = strtok_r(NULL, "-", &afi_safi_str_tok); + afi_t afi = bgp_vty_afi_from_str(afi_str); + safi_t safi = bgp_vty_safi_from_str(safi_str); -/* "no bgp default ipv4-unicast". */ -DEFUN (no_bgp_default_ipv4_unicast, - no_bgp_default_ipv4_unicast_cmd, - "no bgp default ipv4-unicast", - NO_STR - "BGP specific commands\n" - "Configure BGP defaults\n" - "Activate ipv4-unicast for a peer by default\n") -{ - VTY_DECLVAR_CONTEXT(bgp, bgp); - SET_FLAG(bgp->flags, BGP_FLAG_NO_DEFAULT_IPV4); - return CMD_SUCCESS; -} + if (safi != SAFI_UNICAST) { + vty_out(vty, "afi/safi combo not supported\n"); + return CMD_WARNING; + } + + if (no) + bgp->default_af[afi][safi] = false; + else + bgp->default_af[afi][safi] = true; -DEFUN (bgp_default_ipv4_unicast, - bgp_default_ipv4_unicast_cmd, - "bgp default ipv4-unicast", - "BGP specific commands\n" - "Configure BGP defaults\n" - "Activate ipv4-unicast for a peer by default\n") -{ - VTY_DECLVAR_CONTEXT(bgp, bgp); - UNSET_FLAG(bgp->flags, BGP_FLAG_NO_DEFAULT_IPV4); return CMD_SUCCESS; } @@ -17439,14 +17489,12 @@ static void bgp_config_write_peer_af(struct vty *vty, struct bgp *bgp, if ((afi == AFI_IP || afi == AFI_IP6) && safi == SAFI_UNICAST) { if (afi == AFI_IP - && CHECK_FLAG(bgp->flags, - BGP_FLAG_NO_DEFAULT_IPV4)) { + && !bgp->default_af[AFI_IP][SAFI_UNICAST]) { vty_out(vty, " neighbor %s activate\n", addr); } else if (afi == AFI_IP6 - && !CHECK_FLAG( - bgp->flags, - BGP_FLAG_DEFAULT_IPV6)) { + && !bgp->default_af[AFI_IP6] + [SAFI_UNICAST]) { vty_out(vty, " neighbor %s activate\n", addr); } @@ -17457,15 +17505,13 @@ static void bgp_config_write_peer_af(struct vty *vty, struct bgp *bgp, if ((afi == AFI_IP || afi == AFI_IP6) && safi == SAFI_UNICAST) { if (afi == AFI_IP - && !CHECK_FLAG(bgp->flags, - BGP_FLAG_NO_DEFAULT_IPV4)) { + && bgp->default_af[AFI_IP][SAFI_UNICAST]) { vty_out(vty, " no neighbor %s activate\n", addr); } else if (afi == AFI_IP6 - && CHECK_FLAG( - bgp->flags, - BGP_FLAG_DEFAULT_IPV6)) { + && bgp->default_af[AFI_IP6] + [SAFI_UNICAST]) { vty_out(vty, " no neighbor %s activate\n", addr); @@ -17796,6 +17842,8 @@ int bgp_config_write(struct vty *vty) struct peer *peer; struct listnode *node, *nnode; struct listnode *mnode, *mnnode; + afi_t afi; + safi_t safi; if (bm->rmap_update_timer != RMAP_DEFAULT_UPDATE_TIMER) vty_out(vty, "bgp route-map delay-timer %u\n", @@ -17886,13 +17934,17 @@ int bgp_config_write(struct vty *vty) ? "" : "no "); - /* BGP default ipv4-unicast. */ - if (CHECK_FLAG(bgp->flags, BGP_FLAG_NO_DEFAULT_IPV4)) - vty_out(vty, " no bgp default ipv4-unicast\n"); - - /* BGP default ipv6-unicast. */ - if (CHECK_FLAG(bgp->flags, BGP_FLAG_DEFAULT_IPV6)) - vty_out(vty, " bgp default ipv6-unicast\n"); + /* BGP default - */ + FOREACH_AFI_SAFI (afi, safi) { + if (afi == AFI_IP && safi == SAFI_UNICAST) { + if (!bgp->default_af[afi][safi]) + vty_out(vty, " no bgp default %s\n", + get_bgp_default_af_flag(afi, + safi)); + } else if (bgp->default_af[afi][safi]) + vty_out(vty, " bgp default %s\n", + get_bgp_default_af_flag(afi, safi)); + } /* BGP default local-preference. */ if (bgp->default_local_pref != BGP_DEFAULT_LOCAL_PREF) @@ -18586,13 +18638,8 @@ void bgp_vty_init(void) install_element(BGP_NODE, &bgp_bestpath_bw_cmd); install_element(BGP_NODE, &no_bgp_bestpath_bw_cmd); - /* "no bgp default ipv4-unicast" commands. */ - install_element(BGP_NODE, &no_bgp_default_ipv4_unicast_cmd); - install_element(BGP_NODE, &bgp_default_ipv4_unicast_cmd); - - /* "no bgp default ipv6-unicast" commands. */ - install_element(BGP_NODE, &no_bgp_default_ipv6_unicast_cmd); - install_element(BGP_NODE, &bgp_default_ipv6_unicast_cmd); + /* "no bgp default -" commands. */ + install_element(BGP_NODE, &bgp_default_afi_safi_cmd); /* "bgp network import-check" commands. */ install_element(BGP_NODE, &bgp_network_import_check_cmd); diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 49562e5874..2f30c92817 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -1776,19 +1776,17 @@ struct peer *peer_create(union sockunion *su, const char *conf_if, SET_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE); - /* If address family is IPv4 and `bgp default ipv4-unicast` (default), - * then activate the neighbor for this AF. - * If address family is IPv6 and `bgp default ipv6-unicast` - * (non-default), then activate the neighbor for this AF. + /* If 'bgp default -' is configured, then activate the + * neighbor for the corresponding address family. IPv4 Unicast is + * the only address family enabled by default without expliict + * configuration. */ FOREACH_AFI_SAFI (afi, safi) { if ((afi == AFI_IP || afi == AFI_IP6) && safi == SAFI_UNICAST) { if ((afi == AFI_IP - && !CHECK_FLAG(bgp->flags, - BGP_FLAG_NO_DEFAULT_IPV4)) + && bgp->default_af[AFI_IP][SAFI_UNICAST]) || (afi == AFI_IP6 - && CHECK_FLAG(bgp->flags, - BGP_FLAG_DEFAULT_IPV6))) { + && bgp->default_af[AFI_IP6][SAFI_UNICAST])) { peer->afc[afi][safi] = 1; peer_af_create(peer, afi, safi); } @@ -2598,9 +2596,9 @@ struct peer_group *peer_group_get(struct bgp *bgp, const char *name) for (afi = AFI_IP; afi < AFI_MAX; afi++) group->listen_range[afi] = list_new(); group->conf = peer_new(bgp); - if (!CHECK_FLAG(bgp->flags, BGP_FLAG_NO_DEFAULT_IPV4)) + if (bgp->default_af[AFI_IP][SAFI_UNICAST]) group->conf->afc[AFI_IP][SAFI_UNICAST] = 1; - if (CHECK_FLAG(bgp->flags, BGP_FLAG_DEFAULT_IPV6)) + if (bgp->default_af[AFI_IP6][SAFI_UNICAST]) group->conf->afc[AFI_IP6][SAFI_UNICAST] = 1; XFREE(MTYPE_BGP_PEER_HOST, group->conf->host); group->conf->host = XSTRDUP(MTYPE_BGP_PEER_HOST, name); @@ -3244,6 +3242,7 @@ static struct bgp *bgp_create(as_t *as, const char *name, atomic_store_explicit(&bgp->rpkt_quanta, BGP_READ_PACKET_MAX, memory_order_relaxed); bgp->coalesce_time = BGP_DEFAULT_SUBGROUP_COALESCE_TIME; + bgp->default_af[AFI_IP][SAFI_UNICAST] = true; QOBJ_REG(bgp, bgp); diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 776f4b0a21..d2e8cce997 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -464,38 +464,41 @@ struct bgp { #define BGP_FLAG_DETERMINISTIC_MED (1 << 1) #define BGP_FLAG_MED_MISSING_AS_WORST (1 << 2) #define BGP_FLAG_MED_CONFED (1 << 3) -#define BGP_FLAG_NO_DEFAULT_IPV4 (1 << 4) -#define BGP_FLAG_NO_CLIENT_TO_CLIENT (1 << 5) -#define BGP_FLAG_COMPARE_ROUTER_ID (1 << 7) -#define BGP_FLAG_ASPATH_IGNORE (1 << 8) -#define BGP_FLAG_IMPORT_CHECK (1 << 9) -#define BGP_FLAG_NO_FAST_EXT_FAILOVER (1 << 10) -#define BGP_FLAG_LOG_NEIGHBOR_CHANGES (1 << 11) +#define BGP_FLAG_NO_CLIENT_TO_CLIENT (1 << 4) +#define BGP_FLAG_COMPARE_ROUTER_ID (1 << 5) +#define BGP_FLAG_ASPATH_IGNORE (1 << 6) +#define BGP_FLAG_IMPORT_CHECK (1 << 7) +#define BGP_FLAG_NO_FAST_EXT_FAILOVER (1 << 8) +#define BGP_FLAG_LOG_NEIGHBOR_CHANGES (1 << 9) /* This flag is set when we have full BGP Graceful-Restart mode enable */ -#define BGP_FLAG_GRACEFUL_RESTART (1 << 12) - -#define BGP_FLAG_ASPATH_CONFED (1 << 13) -#define BGP_FLAG_ASPATH_MULTIPATH_RELAX (1 << 14) -#define BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY (1 << 15) -#define BGP_FLAG_DISABLE_NH_CONNECTED_CHK (1 << 16) -#define BGP_FLAG_MULTIPATH_RELAX_AS_SET (1 << 17) -#define BGP_FLAG_FORCE_STATIC_PROCESS (1 << 18) -#define BGP_FLAG_SHOW_HOSTNAME (1 << 19) -#define BGP_FLAG_GR_PRESERVE_FWD (1 << 20) -#define BGP_FLAG_GRACEFUL_SHUTDOWN (1 << 21) -#define BGP_FLAG_DELETE_IN_PROGRESS (1 << 22) -#define BGP_FLAG_SELECT_DEFER_DISABLE (1 << 23) -#define BGP_FLAG_GR_DISABLE_EOR (1 << 24) -#define BGP_FLAG_EBGP_REQUIRES_POLICY (1 << 25) -#define BGP_FLAG_SHOW_NEXTHOP_HOSTNAME (1 << 26) +#define BGP_FLAG_GRACEFUL_RESTART (1 << 10) + +#define BGP_FLAG_ASPATH_CONFED (1 << 11) +#define BGP_FLAG_ASPATH_MULTIPATH_RELAX (1 << 12) +#define BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY (1 << 13) +#define BGP_FLAG_DISABLE_NH_CONNECTED_CHK (1 << 14) +#define BGP_FLAG_MULTIPATH_RELAX_AS_SET (1 << 15) +#define BGP_FLAG_FORCE_STATIC_PROCESS (1 << 16) +#define BGP_FLAG_SHOW_HOSTNAME (1 << 17) +#define BGP_FLAG_GR_PRESERVE_FWD (1 << 18) +#define BGP_FLAG_GRACEFUL_SHUTDOWN (1 << 19) +#define BGP_FLAG_DELETE_IN_PROGRESS (1 << 20) +#define BGP_FLAG_SELECT_DEFER_DISABLE (1 << 21) +#define BGP_FLAG_GR_DISABLE_EOR (1 << 22) +#define BGP_FLAG_EBGP_REQUIRES_POLICY (1 << 23) +#define BGP_FLAG_SHOW_NEXTHOP_HOSTNAME (1 << 24) /* This flag is set if the instance is in administrative shutdown */ -#define BGP_FLAG_SHUTDOWN (1 << 27) -#define BGP_FLAG_SUPPRESS_FIB_PENDING (1 << 28) -#define BGP_FLAG_SUPPRESS_DUPLICATES (1 << 29) -#define BGP_FLAG_DEFAULT_IPV6 (1 << 30) -#define BGP_FLAG_PEERTYPE_MULTIPATH_RELAX (1 << 31) +#define BGP_FLAG_SHUTDOWN (1 << 25) +#define BGP_FLAG_SUPPRESS_FIB_PENDING (1 << 26) +#define BGP_FLAG_SUPPRESS_DUPLICATES (1 << 27) +#define BGP_FLAG_PEERTYPE_MULTIPATH_RELAX (1 << 29) + + /* BGP default address-families. + * New peers inherit enabled afi/safis from bgp instance. + */ + uint16_t default_af[AFI_MAX][SAFI_MAX]; enum global_mode GLOBAL_GR_FSM[BGP_GLOBAL_GR_MODE] [BGP_GLOBAL_GR_EVENT_CMD]; -- 2.39.5