1# This test predominantly tests systemd-networkd DHCP server, by
2# setting up a DHCP server and client, and ensuring they are mutually
3# reachable via the DHCP allocated address.
4# Two DHCP servers are set up on bridge VLANs, testing to make sure that
5# bridge VLAN settings are correctly applied.
6#
7# br0 ----untagged---v
8# +---PVID 1+VLAN 2---[bridge]---PVID 2---eth1
9# vlan2 ---VLAN 2----^
10import ./make-test-python.nix ({pkgs, ...}: {
11 name = "systemd-networkd-dhcpserver";
12 meta = with pkgs.lib.maintainers; {
13 maintainers = [ ];
14 };
15 nodes = {
16 router = { config, pkgs, ... }: {
17 virtualisation.vlans = [ 1 ];
18 systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug";
19 networking = {
20 useNetworkd = true;
21 useDHCP = false;
22 firewall.enable = false;
23 };
24 systemd.network = {
25 netdevs = {
26 br0 = {
27 enable = true;
28 netdevConfig = {
29 Name = "br0";
30 Kind = "bridge";
31 };
32 extraConfig = ''
33 [Bridge]
34 VLANFiltering=yes
35 DefaultPVID=none
36 '';
37 };
38 vlan2 = {
39 enable = true;
40 netdevConfig = {
41 Name = "vlan2";
42 Kind = "vlan";
43 };
44 vlanConfig.Id = 2;
45 };
46 };
47 networks = {
48 # systemd-networkd will load the first network unit file
49 # that matches, ordered lexiographically by filename.
50 # /etc/systemd/network/{40-eth1,99-main}.network already
51 # exists. This network unit must be loaded for the test,
52 # however, hence why this network is named such.
53 "01-eth1" = {
54 name = "eth1";
55 networkConfig.Bridge = "br0";
56 bridgeVLANs = [
57 { bridgeVLANConfig = { PVID = 2; EgressUntagged = 2; }; }
58 ];
59 };
60 "02-br0" = {
61 name = "br0";
62 networkConfig = {
63 DHCPServer = true;
64 Address = "10.0.0.1/24";
65 VLAN = ["vlan2"];
66 };
67 dhcpServerConfig = {
68 PoolOffset = 100;
69 PoolSize = 1;
70 };
71 bridgeVLANs = [
72 { bridgeVLANConfig = { PVID = 1; EgressUntagged = 1; }; }
73 { bridgeVLANConfig = { VLAN = 2; }; }
74 ];
75 };
76 "02-vlan2" = {
77 name = "vlan2";
78 networkConfig = {
79 DHCPServer = true;
80 Address = "10.0.2.1/24";
81 };
82 dhcpServerConfig = {
83 PoolOffset = 100;
84 PoolSize = 1;
85 };
86 };
87 };
88 };
89 };
90
91 client = { config, pkgs, ... }: {
92 virtualisation.vlans = [ 1 ];
93 systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug";
94 networking = {
95 useNetworkd = true;
96 useDHCP = false;
97 firewall.enable = false;
98 interfaces.eth1.useDHCP = true;
99 };
100 };
101 };
102 testScript = { ... }: ''
103 start_all()
104
105 router.systemctl("start network-online.target")
106 client.systemctl("start network-online.target")
107 router.wait_for_unit("systemd-networkd-wait-online.service")
108 client.wait_for_unit("systemd-networkd-wait-online.service")
109 client.wait_until_succeeds("ping -c 5 10.0.2.1")
110 router.wait_until_succeeds("ping -c 5 10.0.2.100")
111 '';
112})