|
|
|
@@ -85,9 +85,22 @@ def expectedFailureIfModuleIsNotAvailable(module_name):
|
|
|
|
|
|
|
|
|
|
return f
|
|
|
|
|
|
|
|
|
|
def expectedFailureIfERSPANModuleIsNotAvailable():
|
|
|
|
|
def expectedFailureIfERSPANv0IsNotSupported():
|
|
|
|
|
# erspan version 0 is supported since f989d546a2d5a9f001f6f8be49d98c10ab9b1897 (v5.8)
|
|
|
|
|
def f(func):
|
|
|
|
|
rc = call('ip link add dev erspan99 type erspan seq key 30 local 192.168.1.4 remote 192.168.1.1 erspan_ver 1 erspan 123', stderr=subprocess.DEVNULL)
|
|
|
|
|
rc = call('ip link add dev erspan99 type erspan seq key 30 local 192.168.1.4 remote 192.168.1.1 erspan_ver 0', stderr=subprocess.DEVNULL)
|
|
|
|
|
if rc == 0:
|
|
|
|
|
call('ip link del erspan99')
|
|
|
|
|
return func
|
|
|
|
|
|
|
|
|
|
return unittest.expectedFailure(func)
|
|
|
|
|
|
|
|
|
|
return f
|
|
|
|
|
|
|
|
|
|
def expectedFailureIfERSPANv2IsNotSupported():
|
|
|
|
|
# erspan version 2 is supported since f551c91de262ba36b20c3ac19538afb4f4507441 (v4.16)
|
|
|
|
|
def f(func):
|
|
|
|
|
rc = call('ip link add dev erspan99 type erspan seq key 30 local 192.168.1.4 remote 192.168.1.1 erspan_ver 2', stderr=subprocess.DEVNULL)
|
|
|
|
|
if rc == 0:
|
|
|
|
|
call('ip link del erspan99')
|
|
|
|
|
return func
|
|
|
|
@@ -993,8 +1006,12 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
|
|
|
|
|
'25-bridge.netdev',
|
|
|
|
|
'25-bridge-configure-without-carrier.network',
|
|
|
|
|
'25-bridge.network',
|
|
|
|
|
'25-erspan-tunnel-local-any.netdev',
|
|
|
|
|
'25-erspan-tunnel.netdev',
|
|
|
|
|
'25-erspan0-tunnel-local-any.netdev',
|
|
|
|
|
'25-erspan0-tunnel.netdev',
|
|
|
|
|
'25-erspan1-tunnel-local-any.netdev',
|
|
|
|
|
'25-erspan1-tunnel.netdev',
|
|
|
|
|
'25-erspan2-tunnel-local-any.netdev',
|
|
|
|
|
'25-erspan2-tunnel.netdev',
|
|
|
|
|
'25-fou-gretap.netdev',
|
|
|
|
|
'25-fou-gre.netdev',
|
|
|
|
|
'25-fou-ipip.netdev',
|
|
|
|
@@ -1795,29 +1812,93 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
|
|
|
|
|
print(output)
|
|
|
|
|
self.assertRegex(output, '6rd-prefix 2602::/24')
|
|
|
|
|
|
|
|
|
|
@expectedFailureIfERSPANModuleIsNotAvailable()
|
|
|
|
|
def test_erspan_tunnel(self):
|
|
|
|
|
@expectedFailureIfERSPANv0IsNotSupported()
|
|
|
|
|
def test_erspan_tunnel_v0(self):
|
|
|
|
|
copy_unit_to_networkd_unit_path('12-dummy.netdev', '25-erspan.network',
|
|
|
|
|
'25-erspan-tunnel.netdev', '25-tunnel.network',
|
|
|
|
|
'25-erspan-tunnel-local-any.netdev', '25-tunnel-local-any.network')
|
|
|
|
|
'25-erspan0-tunnel.netdev', '25-tunnel.network',
|
|
|
|
|
'25-erspan0-tunnel-local-any.netdev', '25-tunnel-local-any.network')
|
|
|
|
|
start_networkd()
|
|
|
|
|
self.wait_online(['erspan99:routable', 'erspan98:routable', 'dummy98:degraded'])
|
|
|
|
|
|
|
|
|
|
output = check_output('ip -d link show erspan99')
|
|
|
|
|
print(output)
|
|
|
|
|
self.assertRegex(output, 'erspan remote 172.16.1.100 local 172.16.1.200')
|
|
|
|
|
self.assertRegex(output, 'ikey 0.0.0.101')
|
|
|
|
|
self.assertRegex(output, 'okey 0.0.0.101')
|
|
|
|
|
self.assertRegex(output, 'iseq')
|
|
|
|
|
self.assertRegex(output, 'oseq')
|
|
|
|
|
self.assertIn('erspan remote 172.16.1.100 local 172.16.1.200', output)
|
|
|
|
|
self.assertIn('erspan_ver 0', output)
|
|
|
|
|
self.assertNotIn('erspan_index 123', output)
|
|
|
|
|
self.assertNotIn('erspan_dir ingress', output)
|
|
|
|
|
self.assertNotIn('erspan_hwid 1f', output)
|
|
|
|
|
self.assertIn('ikey 0.0.0.101', output)
|
|
|
|
|
self.assertIn('iseq', output)
|
|
|
|
|
output = check_output('ip -d link show erspan98')
|
|
|
|
|
print(output)
|
|
|
|
|
self.assertRegex(output, 'erspan remote 172.16.1.100 local any')
|
|
|
|
|
self.assertRegex(output, '102')
|
|
|
|
|
self.assertRegex(output, 'ikey 0.0.0.102')
|
|
|
|
|
self.assertRegex(output, 'okey 0.0.0.102')
|
|
|
|
|
self.assertRegex(output, 'iseq')
|
|
|
|
|
self.assertRegex(output, 'oseq')
|
|
|
|
|
self.assertIn('erspan remote 172.16.1.100 local any', output)
|
|
|
|
|
self.assertIn('erspan_ver 0', output)
|
|
|
|
|
self.assertNotIn('erspan_index 124', output)
|
|
|
|
|
self.assertNotIn('erspan_dir egress', output)
|
|
|
|
|
self.assertNotIn('erspan_hwid 2f', output)
|
|
|
|
|
self.assertIn('ikey 0.0.0.102', output)
|
|
|
|
|
self.assertIn('iseq', output)
|
|
|
|
|
|
|
|
|
|
def test_erspan_tunnel_v1(self):
|
|
|
|
|
copy_unit_to_networkd_unit_path('12-dummy.netdev', '25-erspan.network',
|
|
|
|
|
'25-erspan1-tunnel.netdev', '25-tunnel.network',
|
|
|
|
|
'25-erspan1-tunnel-local-any.netdev', '25-tunnel-local-any.network')
|
|
|
|
|
start_networkd()
|
|
|
|
|
self.wait_online(['erspan99:routable', 'erspan98:routable', 'dummy98:degraded'])
|
|
|
|
|
|
|
|
|
|
output = check_output('ip -d link show erspan99')
|
|
|
|
|
print(output)
|
|
|
|
|
self.assertIn('erspan remote 172.16.1.100 local 172.16.1.200', output)
|
|
|
|
|
self.assertIn('erspan_ver 1', output)
|
|
|
|
|
self.assertIn('erspan_index 123', output)
|
|
|
|
|
self.assertNotIn('erspan_dir ingress', output)
|
|
|
|
|
self.assertNotIn('erspan_hwid 1f', output)
|
|
|
|
|
self.assertIn('ikey 0.0.0.101', output)
|
|
|
|
|
self.assertIn('okey 0.0.0.101', output)
|
|
|
|
|
self.assertIn('iseq', output)
|
|
|
|
|
self.assertIn('oseq', output)
|
|
|
|
|
output = check_output('ip -d link show erspan98')
|
|
|
|
|
print(output)
|
|
|
|
|
self.assertIn('erspan remote 172.16.1.100 local any', output)
|
|
|
|
|
self.assertIn('erspan_ver 1', output)
|
|
|
|
|
self.assertIn('erspan_index 124', output)
|
|
|
|
|
self.assertNotIn('erspan_dir egress', output)
|
|
|
|
|
self.assertNotIn('erspan_hwid 2f', output)
|
|
|
|
|
self.assertIn('ikey 0.0.0.102', output)
|
|
|
|
|
self.assertIn('okey 0.0.0.102', output)
|
|
|
|
|
self.assertIn('iseq', output)
|
|
|
|
|
self.assertIn('oseq', output)
|
|
|
|
|
|
|
|
|
|
@expectedFailureIfERSPANv2IsNotSupported()
|
|
|
|
|
def test_erspan_tunnel_v2(self):
|
|
|
|
|
copy_unit_to_networkd_unit_path('12-dummy.netdev', '25-erspan.network',
|
|
|
|
|
'25-erspan2-tunnel.netdev', '25-tunnel.network',
|
|
|
|
|
'25-erspan2-tunnel-local-any.netdev', '25-tunnel-local-any.network')
|
|
|
|
|
start_networkd()
|
|
|
|
|
self.wait_online(['erspan99:routable', 'erspan98:routable', 'dummy98:degraded'])
|
|
|
|
|
|
|
|
|
|
output = check_output('ip -d link show erspan99')
|
|
|
|
|
print(output)
|
|
|
|
|
self.assertIn('erspan remote 172.16.1.100 local 172.16.1.200', output)
|
|
|
|
|
self.assertIn('erspan_ver 2', output)
|
|
|
|
|
self.assertNotIn('erspan_index 123', output)
|
|
|
|
|
self.assertIn('erspan_dir ingress', output)
|
|
|
|
|
self.assertIn('erspan_hwid 0x1f', output)
|
|
|
|
|
self.assertIn('ikey 0.0.0.101', output)
|
|
|
|
|
self.assertIn('okey 0.0.0.101', output)
|
|
|
|
|
self.assertIn('iseq', output)
|
|
|
|
|
self.assertIn('oseq', output)
|
|
|
|
|
output = check_output('ip -d link show erspan98')
|
|
|
|
|
print(output)
|
|
|
|
|
self.assertIn('erspan remote 172.16.1.100 local any', output)
|
|
|
|
|
self.assertIn('erspan_ver 2', output)
|
|
|
|
|
self.assertNotIn('erspan_index 124', output)
|
|
|
|
|
self.assertIn('erspan_dir egress', output)
|
|
|
|
|
self.assertIn('erspan_hwid 0x2f', output)
|
|
|
|
|
self.assertIn('ikey 0.0.0.102', output)
|
|
|
|
|
self.assertIn('okey 0.0.0.102', output)
|
|
|
|
|
self.assertIn('iseq', output)
|
|
|
|
|
self.assertIn('oseq', output)
|
|
|
|
|
|
|
|
|
|
def test_tunnel_independent(self):
|
|
|
|
|
copy_unit_to_networkd_unit_path('25-ipip-tunnel-independent.netdev', '26-netdev-link-local-addressing-yes.network')
|
|
|
|
|