From 4e3a540025e395cd338ee2d2e3ae04f34460b805 Mon Sep 17 00:00:00 2001 From: Andreas Karis Date: Wed, 22 Jan 2025 20:18:37 +0100 Subject: [PATCH] Add basic tests for VLAN Signed-off-by: Andreas Karis --- tests/conftest.py | 67 +++++++++++++++++++ tests/test_skb.py | 160 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 6c46d1c48..8c1a8bdce 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -83,6 +83,73 @@ def two_ns_simple(netns): yield netns +@pytest.fixture +def two_ns_vlan(netns): + """Fixture that creates two netns connected through VLAN interfaces on top of a + veth pair.""" + ipr = IPRoute() + + # Create netns & a veth pair + ns0 = netns.add("ns0") + ns1 = netns.add("ns1") + ipr.link("add", ifname="veth01", peer="veth10", kind="veth") + + # Wait until links appear + peer, veth = ipr.poll( + ipr.link, "dump", timeout=5, ifname=lambda x: x in ("veth01", "veth10") + ) + + # Move ifaces to netns + ipr.link("set", ifname="veth01", net_ns_fd="ns0") + ipr.link("set", ifname="veth10", net_ns_fd="ns1") + + # Setup ifaces + ns0.link("set", ifname="veth01", state="up") + ns1.link("set", ifname="veth10", state="up") + + # Create VLANs + ns0.link( + "add", + ifname="veth01.123", + link=ns0.link_lookup(ifname="veth01")[0], + kind="vlan", + vlan_id=123, + ) + ns1.link( + "add", + ifname="veth10.123", + link=ns1.link_lookup(ifname="veth10")[0], + kind="vlan", + vlan_id=123, + ) + + # Set VLANs up + ns0.link("set", ifname="veth01.123", state="up") + ns1.link("set", ifname="veth10.123", state="up") + + # Assign IP addresses to VLANs + ns0.addr( + "add", + index=ns0.link_lookup(ifname="veth01.123")[0], + address="10.0.42.1", + prefixlen=24, + ) + ns1.addr( + "add", + index=ns1.link_lookup(ifname="veth10.123")[0], + address="10.0.42.2", + prefixlen=24, + ) + + netns.run("ns0", "ip", "link", "set", "veth01.123", "type", "vlan", + "egress", "0:0", "1:1", "2:2", "3:3", "4:4", "5:5", "6:6", "7:7") + netns.run("ns0", "iptables", "-t", "mangle", "-I", "OUTPUT", "-o", "veth01.123", + "-j", "CLASSIFY", "--set-class", "0:6") + + ipr.close() + yield netns + + @pytest.fixture def three_ns_nat(netns): """Fixture that creates three netns connected through veth pairs, a VIP and DNATing diff --git a/tests/test_skb.py b/tests/test_skb.py index b6ae24c7b..6f403918c 100644 --- a/tests/test_skb.py +++ b/tests/test_skb.py @@ -304,3 +304,163 @@ def test_skb_tcp_cc(two_ns_simple): ] events = retis.events() assert_events_present(events, expected_events) + + +def test_skb_vlan(two_ns_vlan): + ns = two_ns_vlan + retis = Retis() + + retis.collect( + "-c", + "skb", + "--skb-sections", + "arp,dev,eth,vlan", + "-f", + "tcp port 80 or arp", + "-p", + "tp:net:netif_rx", + ) + print(ns.run_bg("ns1", "socat", "TCP-LISTEN:80", "STDOUT")) + print(ns.run("ns0", "socat", "-T", "1", "-", "TCP:10.0.42.2:80")) + retis.stop() + + expected_events = [ + # ARP req + { + "common": { + "task": { + "comm": "socat", + }, + }, + "kernel": { + "probe_type": "raw_tracepoint", + "symbol": "net:netif_rx", + }, + "skb": { + "arp": { + "operation": "Request", + "spa": "10.0.42.1", + "tpa": "10.0.42.2", + }, + "dev": { + "name": "veth10", + }, + "eth": { + "etype": 2054, + }, + "vlan": { + "acceleration": True, + "dei": False, + "pcp": 0, + "vid": 123, + }, + }, + }, + # ARP rep + { + "common": { + "task": { + "comm": "socat", + }, + }, + "kernel": { + "probe_type": "raw_tracepoint", + "symbol": "net:netif_rx", + }, + "skb": { + "arp": { + "operation": "Reply", + "spa": "10.0.42.2", + "tpa": "10.0.42.1", + }, + "dev": { + "name": "veth01", + }, + "eth": { + "etype": 2054, + }, + "vlan": { + "acceleration": True, + "dei": False, + "pcp": 0, + "vid": 123, + }, + }, + }, + # SYN + { + "common": { + "task": { + "comm": "socat", + }, + }, + "kernel": { + "probe_type": "raw_tracepoint", + "symbol": "net:netif_rx", + }, + "skb": { + "dev": { + "name": "veth10", + }, + "eth": { + "etype": 2048, + }, + "vlan": { + "acceleration": True, + "dei": False, + "pcp": 6, + "vid": 123, + }, + "ip": { + "daddr": "10.0.42.2", + "ecn": 0, + "protocol": 6, + "saddr": "10.0.42.1", + "ttl": 64, + }, + "tcp": { + "dport": 80, + "flags": 2, + }, + }, + }, + # SYN,ACK + { + "common": { + "task": { + "comm": "socat", + }, + }, + "kernel": { + "probe_type": "raw_tracepoint", + "symbol": "net:netif_rx", + }, + "skb": { + "dev": { + "name": "veth01", + }, + "eth": { + "etype": 2048, + }, + "vlan": { + "acceleration": True, + "dei": False, + "pcp": 0, + "vid": 123, + }, + "ip": { + "daddr": "10.0.42.1", + "ecn": 0, + "protocol": 6, + "saddr": "10.0.42.2", + "ttl": 64, + }, + "tcp": { + "flags": 18, + "sport": 80, + }, + }, + }, + ] + events = retis.events() + assert_events_present(events, expected_events)