]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Convert to default_af[afi][safi]
authorTrey Aspelund <taspelund@nvidia.com>
Sat, 3 Apr 2021 05:22:17 +0000 (05:22 +0000)
committerTrey Aspelund <taspelund@nvidia.com>
Mon, 28 Jun 2021 20:53:59 +0000 (20:53 +0000)
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 <taspelund@nvidia.com>
bgpd/bgp_vty.c
bgpd/bgpd.c
bgpd/bgpd.h

index de4f5a59b646a22879b2037143dce70a00a6ea41..4cd4b59b173f283a33f41449466c53003f4143a8 100644 (file)
@@ -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 <ipv4-unicast|ipv6-unicast>$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 <afi>-<safi> */
+               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 <afi>-<safi>" commands. */
+       install_element(BGP_NODE, &bgp_default_afi_safi_cmd);
 
        /* "bgp network import-check" commands. */
        install_element(BGP_NODE, &bgp_network_import_check_cmd);
index 49562e587467da16e402ae7634cc28841a20ea95..2f30c92817b4cfda9cff64a080dfd8a8a46dbf3b 100644 (file)
@@ -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 <afi>-<safi>' 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);
 
index 776f4b0a21c8ed7a98e37fe8e594a0d1444f49d1..d2e8cce997b9aab54e2bc27262ecdd18ea4872cc 100644 (file)
@@ -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];