]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Allow peer-groups to have `ttl-security hops` configured
authorDonald Sharp <sharpd@nvidia.com>
Fri, 15 Jan 2021 13:14:49 +0000 (08:14 -0500)
committerIgor Ryzhov <iryzhov@nfware.com>
Wed, 20 Jan 2021 16:01:44 +0000 (19:01 +0300)
The command `neighbor PGROUP ttl-security hops X` was being
accepted but ignored.  Allow it to be stored.  I am still
not sure that this is applied correctly, but that is another
problem.

Fixes: #7848
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
bgpd/bgpd.c

index 561878d01dc2e710329f8b580bdd1cd8b3deea03..cb53b8805bdf8333deaff9951dd33cebe73bc36b 100644 (file)
@@ -6695,6 +6695,7 @@ int is_ebgp_multihop_configured(struct peer *peer)
 int peer_ttl_security_hops_set(struct peer *peer, int gtsm_hops)
 {
        struct peer_group *group;
+       struct peer *gpeer;
        struct listnode *node, *nnode;
        int ret;
 
@@ -6731,9 +6732,10 @@ int peer_ttl_security_hops_set(struct peer *peer, int gtsm_hops)
                                return ret;
                } else {
                        group = peer->group;
+                       group->conf->gtsm_hops = gtsm_hops;
                        for (ALL_LIST_ELEMENTS(group->peer, node, nnode,
-                                              peer)) {
-                               peer->gtsm_hops = group->conf->gtsm_hops;
+                                              gpeer)) {
+                               gpeer->gtsm_hops = group->conf->gtsm_hops;
 
                                /* Calling ebgp multihop also resets the
                                 * session.
@@ -6743,7 +6745,7 @@ int peer_ttl_security_hops_set(struct peer *peer, int gtsm_hops)
                                 * value is
                                 * irrelevant.
                                 */
-                               peer_ebgp_multihop_set(peer, MAXTTL);
+                               peer_ebgp_multihop_set(gpeer, MAXTTL);
                        }
                }
        } else {
@@ -6764,9 +6766,10 @@ int peer_ttl_security_hops_set(struct peer *peer, int gtsm_hops)
                                               MAXTTL + 1 - gtsm_hops);
                } else {
                        group = peer->group;
+                       group->conf->gtsm_hops = gtsm_hops;
                        for (ALL_LIST_ELEMENTS(group->peer, node, nnode,
-                                              peer)) {
-                               peer->gtsm_hops = group->conf->gtsm_hops;
+                                              gpeer)) {
+                               gpeer->gtsm_hops = group->conf->gtsm_hops;
 
                                /* Change setting of existing peer
                                 *   established then change value (may break
@@ -6776,17 +6779,18 @@ int peer_ttl_security_hops_set(struct peer *peer, int gtsm_hops)
                                 *   no session then do nothing (will get
                                 * handled by next connection)
                                 */
-                               if (peer->fd >= 0
-                                   && peer->gtsm_hops
+                               if (gpeer->fd >= 0
+                                   && gpeer->gtsm_hops
                                               != BGP_GTSM_HOPS_DISABLED)
                                        sockopt_minttl(
-                                               peer->su.sa.sa_family, peer->fd,
-                                               MAXTTL + 1 - peer->gtsm_hops);
-                               if ((peer->status < Established)
-                                   && peer->doppelganger
-                                   && (peer->doppelganger->fd >= 0))
-                                       sockopt_minttl(peer->su.sa.sa_family,
-                                                      peer->doppelganger->fd,
+                                               gpeer->su.sa.sa_family,
+                                               gpeer->fd,
+                                               MAXTTL + 1 - gpeer->gtsm_hops);
+                               if ((gpeer->status < Established)
+                                   && gpeer->doppelganger
+                                   && (gpeer->doppelganger->fd >= 0))
+                                       sockopt_minttl(gpeer->su.sa.sa_family,
+                                                      gpeer->doppelganger->fd,
                                                       MAXTTL + 1 - gtsm_hops);
                        }
                }