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