mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-22 01:13:00 +02:00
test: add IPv6 forwarding verification to routing-basic
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
@@ -7,7 +7,7 @@ Tests verifying interface configuration and management:
|
||||
- IPv4 and IPv6 address assignment and management
|
||||
- IPv4 address auto-configuration mechanisms
|
||||
- Interface aliases and physical address configuration
|
||||
- Basic routing table configuration and operation
|
||||
- IPv4 and IPv6 forwarding between interfaces
|
||||
- Linux bridge creation, STP, and VLAN handling
|
||||
- Link aggregation (LAG) setup and failover behavior
|
||||
- IGMP multicast group management and forwarding
|
||||
|
||||
@@ -4,8 +4,11 @@ ifdef::topdoc[:imagesdir: {topdoc}../../test/case/interfaces/routing_basic]
|
||||
|
||||
==== Description
|
||||
|
||||
Verify routing between interfaces is possible. That enable/disable routing
|
||||
in configuration has the expected result.
|
||||
Verify that the ietf-ip forwarding setting controls whether IPv4
|
||||
and IPv6 traffic is routed between interfaces. When forwarding is
|
||||
enabled, hosts on separate subnets can reach each other through
|
||||
the device. When forwarding is disabled, that connectivity is
|
||||
expected to be lost.
|
||||
|
||||
==== Topology
|
||||
|
||||
@@ -14,11 +17,11 @@ image::topology.svg[Routing basic topology, align=center, scaledwidth=75%]
|
||||
==== Sequence
|
||||
|
||||
. Set up topology and attach to target DUTs
|
||||
. Setup host
|
||||
. Set up host addresses and default routes
|
||||
. Enable forwarding on target:data1 and target:data2
|
||||
. Verify ping from host:data1 to 10.0.0.10
|
||||
. Verify ping from host:data2 to 192.168.0.10
|
||||
. Verify cross-subnet IPv4 connectivity
|
||||
. Verify cross-subnet IPv6 connectivity
|
||||
. Disable forwarding on target:data1 and target:data2
|
||||
. Verify ping does not work host:data1 to 10.0.0.10 and host:data2 to 192.168.0.10
|
||||
. Verify cross-subnet connectivity is lost
|
||||
|
||||
|
||||
|
||||
@@ -1,58 +1,53 @@
|
||||
#!/usr/bin/env python3
|
||||
# ,------------------------------------------------,
|
||||
# | [TARGET] |
|
||||
# | |
|
||||
# | |
|
||||
# | target:mgmt target:data0 targetgt:data1 |
|
||||
# | [192.168.0.1] [10.0.0.1] |
|
||||
# '------------------------------------------------'
|
||||
# | | |
|
||||
# | | |
|
||||
# ,----------------------------------------------,
|
||||
# | host:mgmt host:data0 host:data1 |
|
||||
# | [192.168.0.10] [10.0.0.10] |
|
||||
# | (ns0) (ns1) |
|
||||
# | |
|
||||
# | [ HOST ] |
|
||||
# '----------------------------------------------'
|
||||
|
||||
"""
|
||||
Routing basic
|
||||
|
||||
Verify routing between interfaces is possible. That enable/disable routing
|
||||
in configuration has the expected result.
|
||||
Verify that the ietf-ip forwarding setting controls whether IPv4
|
||||
and IPv6 traffic is routed between interfaces. When forwarding is
|
||||
enabled, hosts on separate subnets can reach each other through
|
||||
the device. When forwarding is disabled, that connectivity is
|
||||
expected to be lost.
|
||||
"""
|
||||
import infamy
|
||||
|
||||
SUBNETS = [
|
||||
{"ipv4": {"gw": "192.168.0.1", "host": "192.168.0.10", "prefix": 24},
|
||||
"ipv6": {"gw": "2001:db8:0::1", "host": "2001:db8:0::10", "prefix": 64}},
|
||||
{"ipv4": {"gw": "10.0.0.1", "host": "10.0.0.10", "prefix": 24},
|
||||
"ipv6": {"gw": "2001:db8:1::1", "host": "2001:db8:1::10", "prefix": 64}},
|
||||
]
|
||||
|
||||
def iface_cfg(port, subnet, enable_fwd):
|
||||
"""Build interface config with both IPv4 and IPv6."""
|
||||
cfg = {"name": port, "enabled": True}
|
||||
for family in ("ipv4", "ipv6"):
|
||||
af = subnet[family]
|
||||
cfg[family] = {
|
||||
"forwarding": enable_fwd,
|
||||
"address": [{"ip": af["gw"], "prefix-length": af["prefix"]}],
|
||||
}
|
||||
return cfg
|
||||
|
||||
def config_target(target, tport0, tport1, enable_fwd):
|
||||
"""Configure forwarding and addresses for both address families."""
|
||||
target.put_config_dict("ietf-interfaces", {
|
||||
"interfaces": {
|
||||
"interface": [
|
||||
{
|
||||
"name": tport0,
|
||||
"enabled": True,
|
||||
"ipv4": {
|
||||
"forwarding": enable_fwd,
|
||||
"address": [{
|
||||
"ip": "192.168.0.1",
|
||||
"prefix-length": 24
|
||||
}]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": tport1,
|
||||
"enabled": True,
|
||||
"ipv4": {
|
||||
"forwarding": enable_fwd,
|
||||
"address": [{
|
||||
"ip": "10.0.0.1",
|
||||
"prefix-length": 24
|
||||
}]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
})
|
||||
"interfaces": {
|
||||
"interface": [
|
||||
iface_cfg(tport0, SUBNETS[0], enable_fwd),
|
||||
iface_cfg(tport1, SUBNETS[1], enable_fwd),
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
def setup_host(ns, subnet):
|
||||
"""Add IPv4 and IPv6 addresses and default routes."""
|
||||
v4 = subnet["ipv4"]
|
||||
ns.addip(v4["host"])
|
||||
ns.addroute("default", v4["gw"])
|
||||
|
||||
v6 = subnet["ipv6"]
|
||||
ns.addip(v6["host"], prefix_length=v6["prefix"], proto="ipv6")
|
||||
ns.addroute("default", v6["gw"], proto="ipv6")
|
||||
|
||||
with infamy.Test() as test:
|
||||
with test.step("Set up topology and attach to target DUTs"):
|
||||
@@ -65,29 +60,31 @@ with infamy.Test() as test:
|
||||
_, hport1 = env.ltop.xlate("host", "data2")
|
||||
|
||||
with infamy.IsolatedMacVlan(hport0) as ns0, \
|
||||
infamy.IsolatedMacVlan(hport1) as ns1 :
|
||||
infamy.IsolatedMacVlan(hport1) as ns1:
|
||||
|
||||
with test.step("Setup host"):
|
||||
ns0.addip("192.168.0.10")
|
||||
ns0.addroute("default", "192.168.0.1")
|
||||
|
||||
ns1.addip("10.0.0.10")
|
||||
ns1.addroute("default", "10.0.0.1")
|
||||
with test.step("Set up host addresses and default routes"):
|
||||
setup_host(ns0, SUBNETS[0])
|
||||
setup_host(ns1, SUBNETS[1])
|
||||
|
||||
with test.step("Enable forwarding on target:data1 and target:data2"):
|
||||
config_target(target, tport0, tport1, True)
|
||||
|
||||
with test.step("Verify ping from host:data1 to 10.0.0.10"):
|
||||
ns0.must_reach("10.0.0.10")
|
||||
with test.step("Verify cross-subnet IPv4 connectivity"):
|
||||
ns0.must_reach(SUBNETS[1]["ipv4"]["host"])
|
||||
ns1.must_reach(SUBNETS[0]["ipv4"]["host"])
|
||||
|
||||
with test.step("Verify ping from host:data2 to 192.168.0.10"):
|
||||
ns1.must_reach("192.168.0.10")
|
||||
with test.step("Verify cross-subnet IPv6 connectivity"):
|
||||
ns0.must_reach(SUBNETS[1]["ipv6"]["host"])
|
||||
ns1.must_reach(SUBNETS[0]["ipv6"]["host"])
|
||||
|
||||
with test.step("Disable forwarding on target:data1 and target:data2"):
|
||||
config_target(target, tport0, tport1, False)
|
||||
|
||||
with test.step("Verify ping does not work host:data1 to 10.0.0.10 and host:data2 to 192.168.0.10"):
|
||||
infamy.parallel(lambda: ns0.must_not_reach("10.0.0.10"),
|
||||
lambda: ns1.must_not_reach("192.168.0.10"))
|
||||
with test.step("Verify cross-subnet connectivity is lost"):
|
||||
infamy.parallel(
|
||||
lambda: ns0.must_not_reach(SUBNETS[1]["ipv4"]["host"]),
|
||||
lambda: ns1.must_not_reach(SUBNETS[0]["ipv4"]["host"]),
|
||||
lambda: ns0.must_not_reach(SUBNETS[1]["ipv6"]["host"]),
|
||||
lambda: ns1.must_not_reach(SUBNETS[0]["ipv6"]["host"]))
|
||||
|
||||
test.succeed()
|
||||
|
||||
@@ -19,6 +19,6 @@ graph "routing_basic" {
|
||||
];
|
||||
|
||||
host:mgmt -- target:mgmt [requires="mgmt", color="lightgray"]
|
||||
host:data1 -- target:data1 [color=black, fontcolor=black, fontsize=12, taillabel=".10", label="192.168.0.0/24", headlabel=".1"]
|
||||
host:data2 -- target:data2 [color=black, fontcolor=black, fontsize=12, taillabel=".10", label="10.0.0.0/24", headlabel=".1"]
|
||||
}
|
||||
host:data1 -- target:data1 [color=black, fontcolor=black, fontsize=12, taillabel=".10", label="192.168.0.0/24\n2001:db8:0::/64", headlabel=".1"]
|
||||
host:data2 -- target:data2 [color=black, fontcolor=black, fontsize=12, taillabel=".10", label="10.0.0.0/24\n2001:db8:1::/64", headlabel=".1"]
|
||||
}
|
||||
|
||||
@@ -3,55 +3,57 @@
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<!-- Title: routing_basic Pages: 1 -->
|
||||
<svg width="440pt" height="79pt"
|
||||
viewBox="0.00 0.00 440.03 79.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 75)">
|
||||
<svg width="440pt" height="92pt"
|
||||
viewBox="0.00 0.00 440.03 92.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 88)">
|
||||
<title>routing_basic</title>
|
||||
<polygon fill="white" stroke="transparent" points="-4,4 -4,-75 436.03,-75 436.03,4 -4,4"/>
|
||||
<polygon fill="white" stroke="transparent" points="-4,4 -4,-88 436.03,-88 436.03,4 -4,4"/>
|
||||
<!-- host -->
|
||||
<g id="node1" class="node">
|
||||
<title>host</title>
|
||||
<polygon fill="none" stroke="black" points="0,-1.5 0,-70.5 108,-70.5 108,-1.5 0,-1.5"/>
|
||||
<text text-anchor="middle" x="25" y="-32.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">host</text>
|
||||
<polyline fill="none" stroke="black" points="50,-1.5 50,-70.5 "/>
|
||||
<text text-anchor="middle" x="79" y="-55.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">mgmt</text>
|
||||
<polyline fill="none" stroke="black" points="50,-47.5 108,-47.5 "/>
|
||||
<text text-anchor="middle" x="79" y="-32.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">data1</text>
|
||||
<polyline fill="none" stroke="black" points="50,-24.5 108,-24.5 "/>
|
||||
<text text-anchor="middle" x="79" y="-9.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">data2</text>
|
||||
<polygon fill="none" stroke="black" points="0,-14.5 0,-83.5 108,-83.5 108,-14.5 0,-14.5"/>
|
||||
<text text-anchor="middle" x="25" y="-45.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">host</text>
|
||||
<polyline fill="none" stroke="black" points="50,-14.5 50,-83.5 "/>
|
||||
<text text-anchor="middle" x="79" y="-68.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">mgmt</text>
|
||||
<polyline fill="none" stroke="black" points="50,-60.5 108,-60.5 "/>
|
||||
<text text-anchor="middle" x="79" y="-45.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">data1</text>
|
||||
<polyline fill="none" stroke="black" points="50,-37.5 108,-37.5 "/>
|
||||
<text text-anchor="middle" x="79" y="-22.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">data2</text>
|
||||
</g>
|
||||
<!-- target -->
|
||||
<g id="node2" class="node">
|
||||
<title>target</title>
|
||||
<polygon fill="none" stroke="black" points="308.03,-1.5 308.03,-70.5 432.03,-70.5 432.03,-1.5 308.03,-1.5"/>
|
||||
<text text-anchor="middle" x="337.03" y="-55.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">mgmt</text>
|
||||
<polyline fill="none" stroke="black" points="308.03,-47.5 366.03,-47.5 "/>
|
||||
<text text-anchor="middle" x="337.03" y="-32.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">data1</text>
|
||||
<polyline fill="none" stroke="black" points="308.03,-24.5 366.03,-24.5 "/>
|
||||
<text text-anchor="middle" x="337.03" y="-9.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">data2</text>
|
||||
<polyline fill="none" stroke="black" points="366.03,-1.5 366.03,-70.5 "/>
|
||||
<text text-anchor="middle" x="399.03" y="-32.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">target</text>
|
||||
<polygon fill="none" stroke="black" points="308.03,-14.5 308.03,-83.5 432.03,-83.5 432.03,-14.5 308.03,-14.5"/>
|
||||
<text text-anchor="middle" x="337.03" y="-68.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">mgmt</text>
|
||||
<polyline fill="none" stroke="black" points="308.03,-60.5 366.03,-60.5 "/>
|
||||
<text text-anchor="middle" x="337.03" y="-45.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">data1</text>
|
||||
<polyline fill="none" stroke="black" points="308.03,-37.5 366.03,-37.5 "/>
|
||||
<text text-anchor="middle" x="337.03" y="-22.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">data2</text>
|
||||
<polyline fill="none" stroke="black" points="366.03,-14.5 366.03,-83.5 "/>
|
||||
<text text-anchor="middle" x="399.03" y="-45.3" font-family="DejaVu Sans Mono, Book" font-size="14.00">target</text>
|
||||
</g>
|
||||
<!-- host--target -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>host:mgmt--target:mgmt</title>
|
||||
<path fill="none" stroke="lightgray" stroke-width="2" d="M108,-59C108,-59 308.03,-59 308.03,-59"/>
|
||||
<path fill="none" stroke="lightgray" stroke-width="2" d="M108,-72C108,-72 308.03,-72 308.03,-72"/>
|
||||
</g>
|
||||
<!-- host--target -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>host:data1--target:data1</title>
|
||||
<path fill="none" stroke="black" stroke-width="2" d="M108,-36C108,-36 308.03,-36 308.03,-36"/>
|
||||
<text text-anchor="middle" x="162.52" y="-39.4" font-family="DejaVu Serif, Book" font-size="12.00">192.168.0.0/24</text>
|
||||
<text text-anchor="middle" x="302.03" y="-39.4" font-family="DejaVu Serif, Book" font-size="12.00">.1</text>
|
||||
<text text-anchor="middle" x="117.5" y="-26.4" font-family="DejaVu Serif, Book" font-size="12.00">.10</text>
|
||||
<path fill="none" stroke="black" stroke-width="2" d="M108,-49C108,-49 308.03,-49 308.03,-49"/>
|
||||
<text text-anchor="middle" x="161.02" y="-65.4" font-family="DejaVu Serif, Book" font-size="12.00">192.168.0.0/24</text>
|
||||
<text text-anchor="middle" x="161.02" y="-52.4" font-family="DejaVu Serif, Book" font-size="12.00">2001:db8:0::/64</text>
|
||||
<text text-anchor="middle" x="302.03" y="-52.4" font-family="DejaVu Serif, Book" font-size="12.00">.1</text>
|
||||
<text text-anchor="middle" x="117.5" y="-39.4" font-family="DejaVu Serif, Book" font-size="12.00">.10</text>
|
||||
</g>
|
||||
<!-- host--target -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>host:data2--target:data2</title>
|
||||
<path fill="none" stroke="black" stroke-width="2" d="M108,-13C108,-13 308.03,-13 308.03,-13"/>
|
||||
<text text-anchor="middle" x="174.02" y="-16.4" font-family="DejaVu Serif, Book" font-size="12.00">10.0.0.0/24</text>
|
||||
<text text-anchor="middle" x="302.03" y="-16.4" font-family="DejaVu Serif, Book" font-size="12.00">.1</text>
|
||||
<text text-anchor="middle" x="117.5" y="-3.4" font-family="DejaVu Serif, Book" font-size="12.00">.10</text>
|
||||
<path fill="none" stroke="black" stroke-width="2" d="M108,-26C108,-26 308.03,-26 308.03,-26"/>
|
||||
<text text-anchor="middle" x="161.02" y="-16.4" font-family="DejaVu Serif, Book" font-size="12.00">10.0.0.0/24</text>
|
||||
<text text-anchor="middle" x="161.02" y="-3.4" font-family="DejaVu Serif, Book" font-size="12.00">2001:db8:1::/64</text>
|
||||
<text text-anchor="middle" x="302.03" y="-29.4" font-family="DejaVu Serif, Book" font-size="12.00">.1</text>
|
||||
<text text-anchor="middle" x="117.5" y="-29.4" font-family="DejaVu Serif, Book" font-size="12.00">.10</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.7 KiB |
Reference in New Issue
Block a user