xref: /freebsd/tests/sys/netinet/carp.py (revision 5311e733)
15e2e3615SKristof Provostimport pytest
25e2e3615SKristof Provostfrom atf_python.sys.net.tools import ToolsHelper
35e2e3615SKristof Provostfrom atf_python.sys.net.vnet import VnetTestTemplate
45e2e3615SKristof Provost
55e2e3615SKristof Provostsc = None
65e2e3615SKristof Provost
75e2e3615SKristof Provost
85e2e3615SKristof Provostdef filter_f(x):
95e2e3615SKristof Provost    ip = x.getlayer(sc.IP)
105e2e3615SKristof Provost    if not ip:
115e2e3615SKristof Provost        return False
125e2e3615SKristof Provost
135e2e3615SKristof Provost    return ip.proto == 112
145e2e3615SKristof Provost
155e2e3615SKristof Provost
165e2e3615SKristof Provostclass TestCarp(VnetTestTemplate):
175e2e3615SKristof Provost    REQUIRED_MODULES = ["carp"]
185e2e3615SKristof Provost    TOPOLOGY = {
195e2e3615SKristof Provost        "vnet1": {"ifaces": ["if1"]},
205e2e3615SKristof Provost        "if1": {"prefixes4": [("192.0.2.1/24", "192.0.2.2/24")]},
215e2e3615SKristof Provost    }
225e2e3615SKristof Provost
235e2e3615SKristof Provost    def setup_method(self, method):
245e2e3615SKristof Provost        global sc
255e2e3615SKristof Provost        if sc is None:
265e2e3615SKristof Provost            import scapy.all as _sc
275e2e3615SKristof Provost
285e2e3615SKristof Provost            sc = _sc
295e2e3615SKristof Provost        super().setup_method(method)
305e2e3615SKristof Provost
315e2e3615SKristof Provost    @classmethod
325e2e3615SKristof Provost    def check_carp_src_mac(self, pkts):
335e2e3615SKristof Provost        for p in pkts:
345e2e3615SKristof Provost            if not filter_f(p):
355e2e3615SKristof Provost                continue
365e2e3615SKristof Provost
375e2e3615SKristof Provost            print("Packet src mac {}".format(p.src))
385e2e3615SKristof Provost
395e2e3615SKristof Provost            if p.src != "00:00:5e:00:01:01":
405e2e3615SKristof Provost                raise
415e2e3615SKristof Provost
425e2e3615SKristof Provost    def test_source_mac(self):
435e2e3615SKristof Provost        "Test carp packets source address"
445e2e3615SKristof Provost
455e2e3615SKristof Provost        if1 = self.vnet.iface_alias_map["if1"]
465e2e3615SKristof Provost
475e2e3615SKristof Provost        ToolsHelper.print_output(
485e2e3615SKristof Provost            "ifconfig {} add vhid 1 192.0.2.203/24".format(if1.name)
495e2e3615SKristof Provost        )
505e2e3615SKristof Provost
515e2e3615SKristof Provost        carp_pkts = sc.sniff(iface=if1.name, stop_filter=filter_f, timeout=5)
525e2e3615SKristof Provost
535e2e3615SKristof Provost        self.check_carp_src_mac(carp_pkts)
54*5311e733SKristof Provost
55*5311e733SKristof Provost    def test_source_mac_vrrp(self):
56*5311e733SKristof Provost        "Test VRRP packets source address"
57*5311e733SKristof Provost
58*5311e733SKristof Provost        if1 = self.vnet.iface_alias_map["if1"]
59*5311e733SKristof Provost
60*5311e733SKristof Provost        ToolsHelper.print_output(
61*5311e733SKristof Provost            "ifconfig {} add vhid 1 carpver 3 192.0.2.203/24".format(if1.name)
62*5311e733SKristof Provost        )
63*5311e733SKristof Provost
64*5311e733SKristof Provost        carp_pkts = sc.sniff(iface=if1.name, stop_filter=filter_f, timeout=5)
65*5311e733SKristof Provost
66*5311e733SKristof Provost        self.check_carp_src_mac(carp_pkts)
67*5311e733SKristof Provost
68