--- /dev/null
+fc00:1:1:1::/64 dev r1-stubnet proto kernel metric 256 pref medium
+fc00:2:2:2::/64 via fe80::__(r2-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium
+fc00:3:3:3::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium
+fc00:4:4:4::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium
+fc00:a:a:a::/64 dev r1-sw5 proto kernel metric 256 pref medium
+fc00:b:b:b::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium
+fc00:1111:1111:1111::/64 via fc00:1:1:1::1234 dev r1-stubnet proto zebra metric 20 pref medium
+fc00:2222:2222:2222::/64 via fe80::__(r2-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium
+fc00:3333:3333:3333::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium
+fc00:4444:4444:4444::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium
+unreachable fe80::/64 dev lo proto kernel metric 256 error -101 pref medium
+fe80::/64 dev r1-stubnet proto kernel metric 256 pref medium
+fe80::/64 dev r1-sw5 proto kernel metric 256 pref medium
--- /dev/null
+fc00:1:1:1::/64 via fe80::__(r1-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium
+fc00:2:2:2::/64 dev r2-stubnet proto kernel metric 256 pref medium
+fc00:3:3:3::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium
+fc00:4:4:4::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium
+fc00:a:a:a::/64 dev r2-sw5 proto kernel metric 256 pref medium
+fc00:b:b:b::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium
+fc00:1111:1111:1111::/64 via fe80::__(r1-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium
+fc00:2222:2222:2222::/64 via fc00:2:2:2::1234 dev r2-stubnet proto zebra metric 20 pref medium
+fc00:3333:3333:3333::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium
+fc00:4444:4444:4444::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium
+unreachable fe80::/64 dev lo proto kernel metric 256 error -101 pref medium
+fe80::/64 dev r2-stubnet proto kernel metric 256 pref medium
+fe80::/64 dev r2-sw5 proto kernel metric 256 pref medium
--- /dev/null
+fc00:1:1:1::/64 via fe80::__(r1-sw5)__ dev r3-sw5 proto zebra metric 20 pref medium
+fc00:2:2:2::/64 via fe80::__(r2-sw5)__ dev r3-sw5 proto zebra metric 20 pref medium
+fc00:3:3:3::/64 dev r3-stubnet proto kernel metric 256 pref medium
+fc00:4:4:4::/64 via fe80::__(r4-sw6)__ dev r3-sw6 proto zebra metric 20 pref medium
+fc00:a:a:a::/64 dev r3-sw5 proto kernel metric 256 pref medium
+fc00:b:b:b::/64 dev r3-sw6 proto kernel metric 256 pref medium
+fc00:1111:1111:1111::/64 via fe80::__(r1-sw5)__ dev r3-sw5 proto zebra metric 20 pref medium
+fc00:2222:2222:2222::/64 via fe80::__(r2-sw5)__ dev r3-sw5 proto zebra metric 20 pref medium
+fc00:3333:3333:3333::/64 via fc00:3:3:3::1234 dev r3-stubnet proto zebra metric 20 pref medium
+fc00:4444:4444:4444::/64 via fe80::__(r4-sw6)__ dev r3-sw6 proto zebra metric 20 pref medium
+unreachable fe80::/64 dev lo proto kernel metric 256 error -101 pref medium
+fe80::/64 dev r3-stubnet proto kernel metric 256 pref medium
+fe80::/64 dev r3-sw5 proto kernel metric 256 pref medium
+fe80::/64 dev r3-sw6 proto kernel metric 256 pref medium
--- /dev/null
+fc00:1:1:1::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium
+fc00:2:2:2::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium
+fc00:3:3:3::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium
+fc00:4:4:4::/64 dev r4-stubnet proto kernel metric 256 pref medium
+fc00:a:a:a::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium
+fc00:b:b:b::/64 dev r4-sw6 proto kernel metric 256 pref medium
+fc00:1111:1111:1111::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium
+fc00:2222:2222:2222::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium
+fc00:3333:3333:3333::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium
+fc00:4444:4444:4444::/64 via fc00:4:4:4::1234 dev r4-stubnet proto zebra metric 20 pref medium
+unreachable fe80::/64 dev lo proto kernel metric 256 error -101 pref medium
+fe80::/64 dev r4-stubnet proto kernel metric 256 pref medium
+fe80::/64 dev r4-sw6 proto kernel metric 256 pref medium
fatal_error = "%s: Daemon %s not running" % (self.name, daemon)
assert False, "%s: Daemon %s not running" % (self.name, daemon)
+ def get_ipv6_linklocal(self):
+ "Get LinkLocal Addresses from interfaces"
+
+ linklocal = []
+
+ ifaces = self.cmd('ip -6 address')
+ # Fix newlines (make them all the same)
+ ifaces = ('\n'.join(ifaces.splitlines()) + '\n').splitlines()
+ interface=""
+ ll_per_if_count=0
+ for line in ifaces:
+ m = re.search('[0-9]+: ([^:@]+)[@if0-9:]+ <', line)
+ if m:
+ interface = m.group(1)
+ ll_per_if_count = 0
+ m = re.search('inet6 (fe80::[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+)[/0-9]* scope link', line)
+ if m:
+ local = m.group(1)
+ ll_per_if_count += 1
+ if (ll_per_if_count > 1):
+ linklocal += [["%s-%s" % (interface, ll_per_if_count), local]]
+ else:
+ linklocal += [[interface, local]]
+ return linklocal
class LegacySwitch(OVSSwitch):
pytest.skip(fatal_error)
# Wait for OSPF6 to converge (All Neighbors in either Full or TwoWay State)
- print("\n\n** Verify for OSPF6 daemons to converge")
+ print("\n\n** Verify OSPF6 daemons to converge")
print("******************************************\n")
timeout = 60
while timeout > 0:
print("\nwaiting 15s for routes to populate")
sleep(15)
-def test_ospf6_routingTable():
+def test_ospfv3_routingTable():
global fatal_error
global net
actual = ('\n'.join(actual.splitlines()) + '\n').splitlines(1)
# Generate Diff
- diff = ''.join(difflib.unified_diff(actual, expected))
+ diff = ''.join(difflib.context_diff(actual, expected,
+ fromfile="actual OSPFv3 IPv6 routing table",
+ tofile="expected OSPFv3 IPv6 routing table"))
+
# Empty string if it matches, otherwise diff contains unified diff
+ if diff:
+ sys.stderr.write('r%s failed OSPFv3 (IPv6) Routing Table Check:\n%s\n' % (i, diff))
+ failures += 1
+ else:
+ print("r%s ok" % i)
+
+ assert failures == 0, "OSPFv3 (IPv6) Routing Table verification failed for router r%s:\n%s" % (i, diff)
+
+ # For debugging after starting Quagga daemons, uncomment the next line
+ # CLI(net)
+
+def test_linux_ipv6_kernel_routingTable():
+ global fatal_error
+ global net
+
+ # Skip if previous fatal error condition is raised
+ if (fatal_error != ""):
+ pytest.skip(fatal_error)
+
+ thisDir = os.path.dirname(os.path.realpath(__file__))
+ # Verify Linux Kernel Routing Table
+ print("\n\n** Verifing Linux IPv6 Kernel Routing Table")
+ print("******************************************\n")
+ failures = 0
+
+ # Get a list of all current link-local addresses first as they change for
+ # each run and we need to translate them
+ linklocals = []
+ for i in range(1, 5):
+ linklocals += net['r%s' % i].get_ipv6_linklocal()
+
+ # Now compare the routing tables (after substituting link-local addresses)
+ for i in range(1, 5):
+ refTableFile = '%s/r%s/ip_6_address.ref' % (thisDir, i)
+ if os.path.isfile(refTableFile):
+
+ expected = open(refTableFile).read().rstrip()
+ # Fix newlines (make them all the same)
+ expected = ('\n'.join(expected.splitlines())).splitlines(1)
+
+ # Actual output from router
+ actual = net['r%s' % i].cmd('ip -6 route').rstrip()
+ # Mask out Link-Local mac addresses
+ for ll in linklocals:
+ actual = actual.replace(ll[1], "fe80::__(%s)__" % ll[0])
+
+ # Fix newlines (make them all the same)
+ actual = ('\n'.join(actual.splitlines())).splitlines(1)
+
+ # Print Actual table
+ # print("Router r%s table" % i)
+ # for line in actual:
+ # print(line.rstrip())
+
+ # Generate Diff
+ diff = ''.join(difflib.context_diff(actual, expected,
+ fromfile="actual IPv6 kernel routing table",
+ tofile="expected IPv6 kernel routing table"))
+
+ # Empty string if it matches, otherwise diff contains unified diff
if diff:
- sys.stderr.write('r%s failed Routing Table Check:\n%s\n' % (i, diff))
+ sys.stderr.write('r%s failed Linux IPv6 Kernel Routing Table Check:\n%s\n' % (i, diff))
failures += 1
else:
print("r%s ok" % i)
- assert failures == 0, "Routing Table verification failed for router r%s:\n%s" % (i, diff)
+ assert failures == 0, "Linux Kernel IPv6 Routing Table verification failed for router r%s:\n%s" % (i, diff)
# For debugging after starting Quagga daemons, uncomment the next line
# CLI(net)