diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 6cbb0ef66f7f..65b5e05a5bb2 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -17670,7 +17670,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 */ diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index bce23930454b..4118cef87104 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -2849,6 +2849,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. */ @@ -4483,7 +4486,16 @@ static const struct peer_flag_action peer_flag_action_list[] = { {PEER_FLAG_PORT, 0, peer_change_reset}, {PEER_FLAG_AIGP, 0, peer_change_none}, {PEER_FLAG_GRACEFUL_SHUTDOWN, 0, peer_change_none}, +<<<<<<< HEAD {PEER_FLAG_CAPABILITY_SOFT_VERSION, 0, peer_change_reset}, +======= + {PEER_FLAG_CAPABILITY_SOFT_VERSION, 0, peer_change_none}, + {PEER_FLAG_CAPABILITY_FQDN, 0, peer_change_none}, + {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}, +>>>>>>> 9fa56a03c7 (bgpd:support tcp-mss for neighbor group) {0, 0, 0}}; static const struct peer_flag_action peer_af_flag_action_list[] = { @@ -5729,8 +5741,31 @@ 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; +<<<<<<< HEAD SET_FLAG(peer->flags, PEER_FLAG_TCP_MSS); +======= + + 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); + } +>>>>>>> 9fa56a03c7 (bgpd:support tcp-mss for neighbor group) } /* Reset the TCP-MSS value in the peer structure, @@ -5739,8 +5774,44 @@ void peer_tcp_mss_set(struct peer *peer, uint32_t tcp_mss) */ void peer_tcp_mss_unset(struct peer *peer) { +<<<<<<< HEAD UNSET_FLAG(peer->flags, PEER_FLAG_TCP_MSS); peer->tcp_mss = 0; +======= + 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); + } +>>>>>>> 9fa56a03c7 (bgpd:support tcp-mss for neighbor group) } /* diff --git a/tests/topotests/bgp_tcp_mss/r1/bgpd.conf b/tests/topotests/bgp_tcp_mss/r1/bgpd.conf index 07cfe2e2f1c3..12e5df28ee0f 100644 --- a/tests/topotests/bgp_tcp_mss/r1/bgpd.conf +++ b/tests/topotests/bgp_tcp_mss/r1/bgpd.conf @@ -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 diff --git a/tests/topotests/bgp_tcp_mss/r1/zebra.conf b/tests/topotests/bgp_tcp_mss/r1/zebra.conf index 6e9b0b4a7e09..57958c442006 100644 --- a/tests/topotests/bgp_tcp_mss/r1/zebra.conf +++ b/tests/topotests/bgp_tcp_mss/r1/zebra.conf @@ -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 ! diff --git a/tests/topotests/bgp_tcp_mss/r2/bgpd.conf b/tests/topotests/bgp_tcp_mss/r2/bgpd.conf index b2d945583c8c..8a5a4062a4c5 100644 --- a/tests/topotests/bgp_tcp_mss/r2/bgpd.conf +++ b/tests/topotests/bgp_tcp_mss/r2/bgpd.conf @@ -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 diff --git a/tests/topotests/bgp_tcp_mss/r2/zebra.conf b/tests/topotests/bgp_tcp_mss/r2/zebra.conf index 6c14de583b4a..f2daa523acdd 100644 --- a/tests/topotests/bgp_tcp_mss/r2/zebra.conf +++ b/tests/topotests/bgp_tcp_mss/r2/zebra.conf @@ -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 ! diff --git a/tests/topotests/bgp_tcp_mss/test_bgp_tcp_mss.py b/tests/topotests/bgp_tcp_mss/test_bgp_tcp_mss.py index e7948eaaac47..ec2ffd3e4f40 100644 --- a/tests/topotests/bgp_tcp_mss/test_bgp_tcp_mss.py +++ b/tests/topotests/bgp_tcp_mss/test_bgp_tcp_mss.py @@ -47,6 +47,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__) @@ -80,12 +84,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) @@ -110,7 +118,11 @@ def _bgp_check_neighbor_tcp_mss(router, neigh): logger.info("Check if neighbor sessions are up in {}".format(router1.name)) test_func = functools.partial(_bgp_converge, router1) +<<<<<<< HEAD success, 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) +>>>>>>> 9fa56a03c7 (bgpd:support tcp-mss for neighbor group) assert result is None, 'Failed to see BGP convergence in "{}"'.format(router1.name) logger.info("BGP neighbor session is up in {}".format(router1.name)) @@ -119,19 +131,25 @@ def _bgp_check_neighbor_tcp_mss(router, neigh): "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) +<<<<<<< HEAD success, 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) +>>>>>>> 9fa56a03c7 (bgpd:support tcp-mss for neighbor group) assert result is None, 'Failed to see BGP convergence after reset in "{}"'.format( router1.name ) @@ -140,7 +158,17 @@ def _bgp_check_neighbor_tcp_mss(router, neigh): "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") +<<<<<<< HEAD success, 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) +>>>>>>> 9fa56a03c7 (bgpd:support tcp-mss for neighbor group) assert ( result is None ), 'Failed to sync TCP MSS value over BGP session in "{}"'.format(router1.name) @@ -150,7 +178,17 @@ def _bgp_check_neighbor_tcp_mss(router, neigh): "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") +<<<<<<< HEAD success, 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) +>>>>>>> 9fa56a03c7 (bgpd:support tcp-mss for neighbor group) assert ( result is None ), 'Failed to sync TCP MSS value over BGP session in "{}"'.format(router2.name)