]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd:support tcp-mss for neighbor group
authorhanyu.zly <hanyu.zly@alibaba-inc.com>
Mon, 4 Nov 2024 08:21:09 +0000 (16:21 +0800)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Fri, 8 Nov 2024 07:12:55 +0000 (07:12 +0000)
Signed-off-by: hanyu.zly <hanyu.zly@alibaba-inc.com>
(cherry picked from commit 9fa56a03c7568cb9b74f31386baef5252c5b66ce)

bgpd/bgp_vty.c
bgpd/bgpd.c
tests/topotests/bgp_tcp_mss/r1/bgpd.conf
tests/topotests/bgp_tcp_mss/r1/zebra.conf
tests/topotests/bgp_tcp_mss/r2/bgpd.conf
tests/topotests/bgp_tcp_mss/r2/zebra.conf
tests/topotests/bgp_tcp_mss/test_bgp_tcp_mss.py

index f47189d5a4e83fcab55004a6863a89b98fa3145d..68ced14de23167e7d1b6a8826ca9b58093b5bdd3 100644 (file)
@@ -18762,7 +18762,7 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
        }
 
        /* TCP max segment size */
-       if (CHECK_FLAG(peer->flags, PEER_FLAG_TCP_MSS))
+       if (peergroup_flag_check(peer, PEER_FLAG_TCP_MSS))
                vty_out(vty, " neighbor %s tcp-mss %d\n", addr, peer->tcp_mss);
 
        /* passive */
index d3be38db697a38792866df8900a8e01e704415eb..5818381809b0ff2865bca045714ee5a42d9a5a38 100644 (file)
@@ -3030,6 +3030,9 @@ static void peer_group2peer_config_copy(struct peer_group *group,
                bgp_peer_configure_bfd(peer, false);
                bgp_peer_config_apply(peer, group);
        }
+       /* peer tcp-mss */
+       if (!CHECK_FLAG(peer->flags_override, PEER_FLAG_TCP_MSS))
+               PEER_ATTR_INHERIT(peer, group, tcp_mss);
 }
 
 /* Peer group's remote AS configuration.  */
@@ -4791,6 +4794,7 @@ static const struct peer_flag_action peer_flag_action_list[] = {
        {PEER_FLAG_AS_LOOP_DETECTION, 0, peer_change_none},
        {PEER_FLAG_EXTENDED_LINK_BANDWIDTH, 0, peer_change_none},
        {PEER_FLAG_LONESOUL, 0, peer_change_reset_out},
+       {PEER_FLAG_TCP_MSS, 0, peer_change_none},
        {0, 0, 0}};
 
 static const struct peer_flag_action peer_af_flag_action_list[] = {
@@ -6092,9 +6096,27 @@ void peer_port_unset(struct peer *peer)
  */
 void peer_tcp_mss_set(struct peer *peer, uint32_t tcp_mss)
 {
+       struct peer *member;
+       struct listnode *node, *nnode;
+
+       peer_flag_set(peer, PEER_FLAG_TCP_MSS);
        peer->tcp_mss = tcp_mss;
-       SET_FLAG(peer->flags, PEER_FLAG_TCP_MSS);
-       bgp_tcp_mss_set(peer);
+
+       if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+               bgp_tcp_mss_set(peer);
+               return;
+       }
+
+       for (ALL_LIST_ELEMENTS(peer->group->peer, node, nnode, member)) {
+               /* Skip peers with overridden configuration. */
+               if (CHECK_FLAG(member->flags_override, PEER_FLAG_TCP_MSS))
+                       continue;
+
+               /* Set flag and configuration on peer-group member. */
+               SET_FLAG(member->flags, PEER_FLAG_TCP_MSS);
+               PEER_ATTR_INHERIT(member, peer->group, tcp_mss);
+               bgp_tcp_mss_set(member);
+       }
 }
 
 /* Reset the TCP-MSS value in the peer structure,
@@ -6103,9 +6125,39 @@ void peer_tcp_mss_set(struct peer *peer, uint32_t tcp_mss)
  */
 void peer_tcp_mss_unset(struct peer *peer)
 {
-       UNSET_FLAG(peer->flags, PEER_FLAG_TCP_MSS);
-       peer->tcp_mss = 0;
-       bgp_tcp_mss_set(peer);
+       struct peer *member;
+       struct listnode *node, *nnode;
+
+       /* Inherit configuration from peer-group if peer is member. */
+       if (peer_group_active(peer)) {
+               peer_flag_inherit(peer, PEER_FLAG_TCP_MSS);
+               PEER_ATTR_INHERIT(peer, peer->group, tcp_mss);
+       } else {
+               /* Otherwise remove flag and configuration from peer. */
+               peer_flag_unset(peer, PEER_FLAG_TCP_MSS);
+               peer->tcp_mss = 0;
+       }
+
+       /* Skip peer-group mechanics for regular peers. */
+       if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+               bgp_tcp_mss_set(peer);
+               return;
+       }
+
+       /*
+        * Remove flag and configuration from all peer-group members, unless
+        * they are explicitely overriding peer-group configuration.
+        */
+       for (ALL_LIST_ELEMENTS(peer->group->peer, node, nnode, member)) {
+               /* Skip peers with overridden configuration. */
+               if (CHECK_FLAG(member->flags_override, PEER_FLAG_TCP_MSS))
+                       continue;
+
+               /* Remove flag and configuration on peer-group member. */
+               UNSET_FLAG(member->flags, PEER_FLAG_TCP_MSS);
+               member->tcp_mss = 0;
+               bgp_tcp_mss_set(member);
+       }
 }
 
 /*
index 07cfe2e2f1c3665f1df04422583d826af7cc2e6a..12e5df28ee0f204db2f1e5898186743d6b27ffb4 100644 (file)
@@ -1,5 +1,8 @@
 router bgp 65000
   no bgp ebgp-requires-policy
+  neighbor aaa peer-group
+  neighbor aaa remote-as 65001
+  neighbor 192.168.254.2 peer-group aaa
   neighbor 192.168.255.2 remote-as 65001
   neighbor 192.168.255.2 timers 3 10
   exit-address-family
index 6e9b0b4a7e0988b4621727ee98b8351377cc4827..57958c442006686ed16c133e3f5051dcfb533bcb 100644 (file)
@@ -2,5 +2,8 @@
 interface r1-eth0
   ip address 192.168.255.1/24
 !
+interface r1-eth1
+  ip address 192.168.254.1/24
+!
 ip forwarding
 !
index b2d945583c8cd1f59f0b1c194fb036e5fa66f766..8a5a4062a4c5db21524243524fc20584ccc93c8e 100644 (file)
@@ -1,5 +1,8 @@
 router bgp 65001
   no bgp ebgp-requires-policy
+  neighbor aaa peer-group
+  neighbor aaa remote-as 65000
+  neighbor 192.168.254.1 peer-group aaa
   neighbor 192.168.255.1 remote-as 65000
   neighbor 192.168.255.1 timers 3 10
   exit-address-family
index 6c14de583b4a6149d55297b6c67493d973065825..f2daa523acdd7e2455ea04d9535b9eee6d2e6992 100644 (file)
@@ -2,5 +2,8 @@
 interface r2-eth0
   ip address 192.168.255.2/24
 !
+interface r2-eth1
+  ip address 192.168.254.2/24
+!
 ip forwarding
 !
index 37949cdc99671196e3bae6cadb2294fb177b159b..30449a39209d20f8cd0ca699487d14b335fd22a8 100644 (file)
@@ -45,6 +45,10 @@ def build_topo(tgen):
     switch.add_link(tgen.gears["r1"])
     switch.add_link(tgen.gears["r2"])
 
+    switch = tgen.add_switch("s2")
+    switch.add_link(tgen.gears["r1"])
+    switch.add_link(tgen.gears["r2"])
+
 
 def setup_module(mod):
     tgen = Topogen(build_topo, mod.__name__)
@@ -78,12 +82,16 @@ def test_bgp_tcp_mss():
     router2 = tgen.gears["r2"]
 
     def _bgp_converge(router):
-        output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.2 json"))
+        output = json.loads(router.vtysh_cmd("show ip bgp neighbor json"))
         expected = {
             "192.168.255.2": {
                 "bgpState": "Established",
                 "addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 0}},
-            }
+            },
+            "192.168.254.2": {
+                "bgpState": "Established",
+                "addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 0}},
+            },
         }
         return topotest.json_cmp(output, expected)
 
@@ -108,7 +116,7 @@ def test_bgp_tcp_mss():
 
     logger.info("Check if neighbor sessions are up in {}".format(router1.name))
     test_func = functools.partial(_bgp_converge, router1)
-    _, result = topotest.run_and_expect(test_func, None, count=15, wait=0.5)
+    _, result = topotest.run_and_expect(test_func, None, count=15, wait=1)
     assert result is None, 'Failed to see BGP convergence in "{}"'.format(router1.name)
 
     logger.info("BGP neighbor session is up in {}".format(router1.name))
@@ -117,19 +125,21 @@ def test_bgp_tcp_mss():
         "Configure tcp-mss 500 on {} and reset the session".format(router1.name)
     )
     _bgp_conf_tcp_mss(router1, "65000", "192.168.255.2")
+    _bgp_conf_tcp_mss(router1, "65000", "aaa")
     _bgp_clear_session(router1)
 
     logger.info(
         "Configure tcp-mss 500 on {} and reset the session".format(router2.name)
     )
     _bgp_conf_tcp_mss(router2, "65001", "192.168.255.1")
+    _bgp_conf_tcp_mss(router2, "65001", "aaa")
     _bgp_clear_session(router2)
 
     logger.info(
         "Check if neighbor session is up after reset in {}".format(router1.name)
     )
     test_func = functools.partial(_bgp_converge, router1)
-    _, result = topotest.run_and_expect(test_func, None, count=15, wait=0.5)
+    _, result = topotest.run_and_expect(test_func, None, count=15, wait=1)
     assert result is None, 'Failed to see BGP convergence after reset in "{}"'.format(
         router1.name
     )
@@ -138,7 +148,13 @@ def test_bgp_tcp_mss():
         "Verify if TCP MSS value is synced with neighbor in {}".format(router1.name)
     )
     test_func = functools.partial(_bgp_check_neighbor_tcp_mss, router1, "192.168.255.2")
-    _, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5)
+    _, result = topotest.run_and_expect(test_func, None, count=15, wait=1)
+    assert (
+        result is None
+    ), 'Failed to sync TCP MSS value over BGP session in "{}"'.format(router1.name)
+
+    test_func = functools.partial(_bgp_check_neighbor_tcp_mss, router1, "192.168.254.2")
+    success, result = topotest.run_and_expect(test_func, None, count=15, wait=1)
     assert (
         result is None
     ), 'Failed to sync TCP MSS value over BGP session in "{}"'.format(router1.name)
@@ -148,7 +164,13 @@ def test_bgp_tcp_mss():
         "Verify if TCP MSS value is synced with neighbor in {}".format(router2.name)
     )
     test_func = functools.partial(_bgp_check_neighbor_tcp_mss, router2, "192.168.255.1")
-    _, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5)
+    _, result = topotest.run_and_expect(test_func, None, count=15, wait=1)
+    assert (
+        result is None
+    ), 'Failed to sync TCP MSS value over BGP session in "{}"'.format(router2.name)
+
+    test_func = functools.partial(_bgp_check_neighbor_tcp_mss, router2, "192.168.254.1")
+    success, result = topotest.run_and_expect(test_func, None, count=15, wait=1)
     assert (
         result is None
     ), 'Failed to sync TCP MSS value over BGP session in "{}"'.format(router2.name)