Merge branch 'master' into ecmp_tests

This commit is contained in:
Martin Winter 2019-10-04 15:19:17 +02:00 committed by GitHub
commit 0c7f64c5cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 1024 additions and 13 deletions

View File

@ -1234,7 +1234,8 @@ DEFPY (show_rpki_prefix,
const struct pfx_record *record = &matches[i];
if (record->max_len >= prefix->prefixlen
&& ((asn != 0 && asn == record->asn) || asn == 0)) {
&& ((asn != 0 && (uint32_t)asn == record->asn)
|| asn == 0)) {
print_record(&matches[i], vty);
}
}

View File

@ -209,7 +209,7 @@ static int bgp_ifp_destroy(struct interface *ifp)
bgp = bgp_lookup_by_vrf_id(ifp->vrf_id);
if (BGP_DEBUG(zebra, ZEBRA))
zlog_debug("Rx Intf del VRF %u IF %s", bgp->vrf_id, ifp->name);
zlog_debug("Rx Intf del VRF %u IF %s", ifp->vrf_id, ifp->name);
if (bgp)
bgp_update_interface_nbrs(bgp, ifp, NULL);

View File

@ -1140,11 +1140,8 @@ Capability Negotiation
Negotiation. Please use *dont-capability-negotiate* command to disable the
feature.
.. index:: neighbor PEER dont-capability-negotiate
.. clicmd:: neighbor PEER dont-capability-negotiate
.. index:: no neighbor PEER dont-capability-negotiate
.. clicmd:: no neighbor PEER dont-capability-negotiate
.. index:: [no] neighbor PEER dont-capability-negotiate
.. clicmd:: [no] neighbor PEER dont-capability-negotiate
Suppress sending Capability Negotiation as OPEN message optional parameter
to the peer. This command only affects the peer is configured other than
@ -1159,6 +1156,11 @@ Capability Negotiation
configured by *override-capability*, *bgpd* ignores received capabilities
then override negotiated capabilities with configured values.
Additionally the operator should be reminded that this feature fundamentally
disables the ability to use widely deployed BGP features. BGP unnumbered,
hostname support, AS4, Addpath, Route Refresh, ORF, Dynamic Capabilities,
and graceful restart.
.. index:: neighbor PEER override-capability
.. clicmd:: neighbor PEER override-capability

View File

@ -1,13 +1,20 @@
FROM debian:buster
MAINTAINER Rob Gil (rob@rem5.com)
ENV DEBIAN_FRONTEND noninteractive
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
RUN apt-get update
RUN apt-get install -y libpcre3-dev apt-transport-https ca-certificates curl wget logrotate \
libc-ares2 libjson-c3 vim systemd procps libreadline7 gnupg2 lsb-release apt-utils
RUN apt-get update && \
apt-get install -y libpcre3-dev apt-transport-https ca-certificates curl wget logrotate \
libc-ares2 libjson-c3 vim procps libreadline7 gnupg2 lsb-release apt-utils && \
rm -rf /var/lib/apt/lists/*
RUN curl -s https://deb.frrouting.org/frr/keys.asc | apt-key add -
RUN echo deb https://deb.frrouting.org/frr $(lsb_release -s -c) frr-stable | tee -a /etc/apt/sources.list.d/frr.list
RUN apt-get update
RUN apt-get install -y frr frr-pythontools
RUN apt-get update && \
apt-get install -y frr frr-pythontools && \
rm -rf /var/lib/apt/lists/*
ADD docker-start /usr/sbin/docker-start
ENTRYPOINT ["/usr/sbin/docker-start"]

View File

@ -0,0 +1,8 @@
hostname spine1
router bgp 99
neighbor 192.168.2.1 remote-as internal
neighbor 192.168.4.2 remote-as internal
address-family ipv4 uni
redistribute connected
neighbor 192.168.2.1 route-reflector-client
neighbor 192.168.4.2 route-reflector-client

View File

@ -0,0 +1,162 @@
{
"192.168.1.0\/24":[
{
"prefix":"192.168.1.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.2.1",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"spine1-eth0",
"active":true
}
]
}
],
"192.168.2.0\/24":[
{
"prefix":"192.168.2.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":8,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"spine1-eth0",
"active":true
}
]
}
],
"192.168.3.0\/24":[
{
"prefix":"192.168.3.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.4.2",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"spine1-eth1",
"active":true
}
]
}
],
"192.168.4.0\/24":[
{
"prefix":"192.168.4.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":8,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"spine1-eth1",
"active":true
}
]
}
],
"192.168.5.0\/24":[
{
"prefix":"192.168.5.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.2.1",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"spine1-eth0",
"active":true
}
]
}
],
"192.168.6.0\/24":[
{
"prefix":"192.168.6.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.4.2",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"spine1-eth1",
"active":true
}
]
}
]
}

View File

@ -0,0 +1 @@
hostname spine1

View File

@ -0,0 +1,9 @@
hostname spine1
ip forwarding
ipv6 forwarding
int spine1-eth0
ip addr 192.168.2.3/24
int spine1-eth1
ip addr 192.168.4.3/24

View File

@ -0,0 +1,8 @@
hostname spine2
router bgp 99
neighbor 192.168.5.1 remote-as internal
neighbor 192.168.6.2 remote-as internal
address-family ipv4 uni
redistribute connected
neighbor 192.168.5.1 route-reflector-client
neighbor 192.168.6.2 route-reflector-client

View File

@ -0,0 +1,162 @@
{
"192.168.1.0\/24":[
{
"prefix":"192.168.1.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.5.1",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"spine2-eth0",
"active":true
}
]
}
],
"192.168.2.0\/24":[
{
"prefix":"192.168.2.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.5.1",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"spine2-eth0",
"active":true
}
]
}
],
"192.168.3.0\/24":[
{
"prefix":"192.168.3.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.6.2",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"spine2-eth1",
"active":true
}
]
}
],
"192.168.4.0\/24":[
{
"prefix":"192.168.4.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.6.2",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"spine2-eth1",
"active":true
}
]
}
],
"192.168.5.0\/24":[
{
"prefix":"192.168.5.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":8,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"spine2-eth0",
"active":true
}
]
}
],
"192.168.6.0\/24":[
{
"prefix":"192.168.6.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":8,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"spine2-eth1",
"active":true
}
]
}
]
}

View File

@ -0,0 +1 @@
hostname spine2

View File

@ -0,0 +1,9 @@
hostname spine2
ip forwarding
ipv6 forwarding
int spine2-eth0
ip addr 192.168.5.4/24
int spine2-eth1
ip addr 192.168.6.4/24

View File

@ -0,0 +1,245 @@
#!/usr/bin/env python
#
# test_bgp_rr_ibgp_topo1.py
#
# Copyright (c) 2019 by
# Cumulus Networks, Inc.
# Donald Sharp
#
# Permission to use, copy, modify, and/or distribute this software
# for any purpose with or without fee is hereby granted, provided
# that the above copyright notice and this permission notice appear
# in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
# OF THIS SOFTWARE.
#
"""
test_bgp_rr_ibgp_topo1.py: Testing IBGP with RR and no IGP
In a leaf/spine topology with only IBGP connections, where
the same network is being redistributed at multiple points
in the network ( say a redistribute connected at both leaf and spines )
we end up in a state where zebra gets very confused.
eva# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
F - PBR, f - OpenFabric,
> - selected route, * - FIB route, q - queued route, r - rejected route
C>* 192.168.1.0/24 is directly connected, tor1-eth0, 00:00:30
C>* 192.168.2.0/24 is directly connected, tor1-eth1, 00:00:30
B 192.168.3.0/24 [200/0] via 192.168.4.2 inactive, 00:00:25
via 192.168.6.2 inactive, 00:00:25
B>* 192.168.4.0/24 [200/0] via 192.168.2.3, tor1-eth1, 00:00:25
* via 192.168.6.2 inactive, 00:00:25
C>* 192.168.5.0/24 is directly connected, tor1-eth2, 00:00:30
B>* 192.168.6.0/24 [200/0] via 192.168.4.2 inactive, 00:00:25
* via 192.168.5.4, tor1-eth2, 00:00:25
Effectively we have ibgp routes recursing through ibgp routes
and there is no metric to discern whom to listen to.
This draft:
https://tools.ietf.org/html/draft-ietf-idr-bgp-optimal-route-reflection-19
appears to address this issue. From looking at both cisco and arista
deployments they are handling this issue by having the route reflector
prefer the localy learned routes over from their clients.
Add this topology, in a broken state, so that when we do fix this issue
it is a simple matter of touching this topology up and re-adding it
to the normal daily builds. I also wanted to add this topology
since it is in a state of `doneness` and I wanted to move onto
my normal day job without having to remember about this test.
This topology is not configured to be run as part of the normal
topotests.
"""
import os
import re
import sys
import pytest
import json
# Save the Current Working Directory to find configuration files.
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, '../'))
# pylint: disable=C0413
# Import topogen and topotest helpers
from lib import topotest
from lib.topogen import Topogen, TopoRouter, get_topogen
from lib.topolog import logger
# Required to instantiate the topology builder class.
from mininet.topo import Topo
#####################################################
##
## Network Topology Definition
##
#####################################################
class NetworkTopo(Topo):
"BGP_RR_IBGP Topology 1"
def build(self, **_opts):
"Build function"
tgen = get_topogen(self)
tgen.add_router('tor1')
tgen.add_router('tor2')
tgen.add_router('spine1')
tgen.add_router('spine2')
# First switch is for a dummy interface (for local network)
# on tor1
# 192.168.1.0/24
switch = tgen.add_switch('sw1')
switch.add_link(tgen.gears['tor1'])
# 192.168.2.0/24 - tor1 <-> spine1 connection
switch = tgen.add_switch('sw2')
switch.add_link(tgen.gears['tor1'])
switch.add_link(tgen.gears['spine1'])
# 3rd switch is for a dummy interface (for local netwokr)
# 192.168.3.0/24 - tor2
switch = tgen.add_switch('sw3')
switch.add_link(tgen.gears['tor2'])
# 192.168.4.0/24 - tor2 <-> spine1 connection
switch = tgen.add_switch('sw4')
switch.add_link(tgen.gears['tor2'])
switch.add_link(tgen.gears['spine1'])
# 192.168.5.0/24 - tor1 <-> spine2 connection
switch = tgen.add_switch('sw5')
switch.add_link(tgen.gears['tor1'])
switch.add_link(tgen.gears['spine2'])
# 192.168.6.0/24 - tor2 <-> spine2 connection
switch = tgen.add_switch('sw6')
switch.add_link(tgen.gears['tor2'])
switch.add_link(tgen.gears['spine2'])
#####################################################
##
## Tests starting
##
#####################################################
def setup_module(module):
"Setup topology"
tgen = Topogen(NetworkTopo, module.__name__)
tgen.start_topology()
# This is a sample of configuration loading.
router_list = tgen.routers()
for rname, router in router_list.iteritems():
router.load_config(
TopoRouter.RD_ZEBRA,
os.path.join(CWD, '{}/zebra.conf'.format(rname))
)
router.load_config(
TopoRouter.RD_BGP,
os.path.join(CWD, '{}/bgpd.conf'.format(rname))
)
tgen.start_router()
# tgen.mininet_cli()
def teardown_module(_mod):
"Teardown the pytest environment"
tgen = get_topogen()
# This function tears down the whole topology.
tgen.stop_topology()
def test_converge_protocols():
"Wait for protocol convergence"
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
topotest.sleep(5, 'Waiting for BGP_RR_IBGP convergence')
def test_bgp_rr_ibgp_routes():
"Test Route Reflection"
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
# Verify BGP_RR_IBGP Status
logger.info("Verifying BGP_RR_IBGP routes")
def test_zebra_ipv4_routingTable():
"Test 'show ip route'"
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
failures = 0
router_list = tgen.routers().values()
for router in router_list:
output = router.vtysh_cmd('show ip route json', isjson=True)
refTableFile = '{}/{}/show_ip_route.json_ref'.format(CWD, router.name)
expected = json.loads(open(refTableFile).read())
assertmsg = 'Zebra IPv4 Routing Table verification failed for router {}'.format(router.name)
assert topotest.json_cmp(output, expected) is None, assertmsg
def test_shutdown_check_stderr():
if os.environ.get('TOPOTESTS_CHECK_STDERR') is None:
pytest.skip('Skipping test for Stderr output and memory leaks')
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
logger.info("Verifying unexpected STDERR output from daemons")
router_list = tgen.routers().values()
for router in router_list:
router.stop()
log = tgen.net[router.name].getStdErr('bgpd')
if log:
logger.error('BGPd StdErr Log:' + log)
log = tgen.net[router.name].getStdErr('zebra')
if log:
logger.error('Zebra StdErr Log:' + log)
if __name__ == '__main__':
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))
#
# Auxiliary Functions
#

View File

@ -0,0 +1,5 @@
hostname tor1
router bgp 99
neighbor 192.168.2.3 remote-as internal
neighbor 192.168.5.4 remote-as internal
redistribute connected

View File

@ -0,0 +1,169 @@
{
"192.168.1.0\/24":[
{
"prefix":"192.168.1.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":8,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"tor1-eth0",
"active":true
}
]
}
],
"192.168.2.0\/24":[
{
"prefix":"192.168.2.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":8,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"tor1-eth1",
"active":true
}
]
}
],
"192.168.3.0\/24":[
{
"prefix":"192.168.3.0\/24",
"protocol":"bgp",
"distance":200,
"metric":0,
"table":254,
"internalStatus":0,
"internalFlags":5,
"internalNextHopNum":2,
"internalNextHopActiveNum":0,
"nexthops":[
{
"flags":0,
"ip":"192.168.4.2",
"afi":"ipv4"
},
{
"flags":0,
"ip":"192.168.6.2",
"afi":"ipv4"
}
]
}
],
"192.168.4.0\/24":[
{
"prefix":"192.168.4.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":2,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.2.3",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"tor1-eth1",
"active":true
},
{
"flags":0,
"ip":"192.168.6.2",
"afi":"ipv4"
}
]
}
],
"192.168.5.0\/24":[
{
"prefix":"192.168.5.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":8,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"directlyConnected":true,
"interfaceIndex":4,
"interfaceName":"tor1-eth2",
"active":true
}
]
}
],
"192.168.6.0\/24":[
{
"prefix":"192.168.6.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":2,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":0,
"ip":"192.168.4.2",
"afi":"ipv4"
},
{
"flags":3,
"fib":true,
"ip":"192.168.5.4",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"tor1-eth2",
"active":true
}
]
}
]
}

View File

@ -0,0 +1 @@
hostname tor1

View File

@ -0,0 +1,12 @@
hostname tor1
ip forwarding
ipv6 forwarding
int tor1-eth0
ip addr 192.168.1.1/24
int tor1-eth1
ip addr 192.168.2.1/24
int tor1-eth2
ip addr 192.168.5.1/24

View File

@ -0,0 +1,5 @@
hostname tor2
router bgp 99
neighbor 192.168.4.3 remote-as internal
neighbor 192.168.6.4 remote-as internal
redistribute connected

View File

@ -0,0 +1,169 @@
{
"192.168.1.0\/24":[
{
"prefix":"192.168.1.0\/24",
"protocol":"bgp",
"distance":200,
"metric":0,
"table":254,
"internalStatus":0,
"internalFlags":5,
"internalNextHopNum":2,
"internalNextHopActiveNum":0,
"nexthops":[
{
"flags":0,
"ip":"192.168.2.1",
"afi":"ipv4"
},
{
"flags":0,
"ip":"192.168.5.1",
"afi":"ipv4"
}
]
}
],
"192.168.2.0\/24":[
{
"prefix":"192.168.2.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":2,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.4.3",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"tor2-eth1",
"active":true
},
{
"flags":0,
"ip":"192.168.5.1",
"afi":"ipv4"
}
]
}
],
"192.168.3.0\/24":[
{
"prefix":"192.168.3.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":8,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"tor2-eth0",
"active":true
}
]
}
],
"192.168.4.0\/24":[
{
"prefix":"192.168.4.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":8,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"tor2-eth1",
"active":true
}
]
}
],
"192.168.5.0\/24":[
{
"prefix":"192.168.5.0\/24",
"protocol":"bgp",
"selected":true,
"destSelected":true,
"distance":200,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":13,
"internalNextHopNum":2,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":0,
"ip":"192.168.2.1",
"afi":"ipv4"
},
{
"flags":3,
"fib":true,
"ip":"192.168.6.4",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"tor2-eth2",
"active":true
}
]
}
],
"192.168.6.0\/24":[
{
"prefix":"192.168.6.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"internalStatus":16,
"internalFlags":8,
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthops":[
{
"flags":3,
"fib":true,
"directlyConnected":true,
"interfaceIndex":4,
"interfaceName":"tor2-eth2",
"active":true
}
]
}
]
}

View File

@ -0,0 +1 @@
hostname tor2

View File

@ -0,0 +1,13 @@
hostname tor2
ip forwarding
ipv6 forwarding
int tor2-eth0
ip addr 192.168.3.2/24
int tor2-eth1
ip addr 192.168.4.2/24
int tor2-eth2
ip addr 192.168.6.2/24

View File

@ -1,6 +1,6 @@
# Skip pytests example directory
[pytest]
norecursedirs = .git example-test example-topojson-test lib docker
norecursedirs = .git example-test example-topojson-test lib docker bgp_rr_ibgp
[topogen]
# Default configuration values

View File

@ -142,6 +142,9 @@ static void sigint(void)
zlog_notice("Terminating on signal");
atomic_store_explicit(&zrouter.in_shutdown, true,
memory_order_relaxed);
frr_early_fini();
zebra_dplane_pre_finish();

View File

@ -3208,6 +3208,7 @@ static int rib_process_dplane_results(struct thread *thread)
{
struct zebra_dplane_ctx *ctx;
struct dplane_ctx_q ctxlist;
bool shut_p = false;
/* Dequeue a list of completed updates with one lock/unlock cycle */
@ -3227,6 +3228,21 @@ static int rib_process_dplane_results(struct thread *thread)
if (ctx == NULL)
break;
/* If zebra is shutting down, avoid processing results,
* just drain the results queue.
*/
shut_p = atomic_load_explicit(&zrouter.in_shutdown,
memory_order_relaxed);
if (shut_p) {
while (ctx) {
dplane_ctx_fini(&ctx);
ctx = dplane_ctx_dequeue(&ctxlist);
}
continue;
}
while (ctx) {
switch (dplane_ctx_get_op(ctx)) {
case DPLANE_OP_ROUTE_INSTALL:

View File

@ -74,6 +74,8 @@ struct zebra_mlag_info {
};
struct zebra_router {
atomic_bool in_shutdown;
/* Thread master */
struct thread_master *master;