3 """Test raw socket device support."""
6 import subprocess as subp
8 from testlib import check, util
9 from testlib.log import log
10 from testlib.const import EXIT_SKIP
11 from testlib.proc import Script
12 from testlib.test import Test
13 from testlib.external import veth_add, move_dev, ping
16 util.require_command("ip", "link")
18 FAKE_DEV = "cqhqdr7knaLzYeMSdy"
20 IP_NETNS = "10.198.96.1"
21 IP_HOST = "10.198.96.2"
24 def test_device_raw_socket(ctx: Test) -> None:
25 """Test raw socket device."""
27 foo = ctx.node(init="set DeviceType raw_socket")
28 foo_log = foo.sub("log")
30 log.info("test with a bad Interface")
31 _, err = foo.cmd("start", "-o", f"Interface={FAKE_DEV}", code=1)
32 if "Raw socket device not supported" in err:
34 check.is_in(f"Can't find interface {FAKE_DEV}", err)
36 log.info("create a veth pair")
37 dev0, dev1 = util.random_string(10), util.random_string(10)
40 log.info("configure the veth pair")
41 move_dev(dev1, dev1, f"{IP_NETNS}/30")
42 subp.run(["ip", "addr", "add", f"{IP_HOST}/30", "dev", dev0], check=True)
43 subp.run(["ip", "link", "set", dev0, "up"], check=True)
45 log.info("set Interface and Device")
46 foo.cmd("set", "Interface", dev0)
47 foo.cmd("set", "Device", f"dev_{dev0}")
48 foo.add_script(Script.TINC_UP)
50 log.info("start tincd")
51 _, err = foo.cmd("start", "--logfile", foo_log, "-d10")
52 check.is_in(f"dev_{dev0} is a raw_socket", err)
54 log.info("send some data to tincd interface")
55 foo[Script.TINC_UP].wait()
58 log.info("stop tincd")
59 foo.add_script(Script.TINC_DOWN)
61 foo[Script.TINC_DOWN].wait()
63 log.info("check that tincd received some data")
64 check.in_file(foo_log, "Writing packet of")
65 check.in_file(foo_log, "Read packet of")
68 with Test("test raw socket device") as context:
69 test_device_raw_socket(context)