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----^
10{ pkgs, ... }:
11{
12 name = "systemd-networkd-dhcpserver";
13 meta = with pkgs.lib.maintainers; {
14 maintainers = [ ];
15 };
16 nodes = {
17 router =
18 { config, pkgs, ... }:
19 {
20 virtualisation.vlans = [ 1 ];
21 systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug";
22 networking = {
23 useNetworkd = true;
24 useDHCP = false;
25 firewall.enable = false;
26 };
27 systemd.network = {
28 netdevs = {
29 br0 = {
30 enable = true;
31 netdevConfig = {
32 Name = "br0";
33 Kind = "bridge";
34 };
35 extraConfig = ''
36 [Bridge]
37 VLANFiltering=yes
38 DefaultPVID=none
39 '';
40 };
41 vlan2 = {
42 enable = true;
43 netdevConfig = {
44 Name = "vlan2";
45 Kind = "vlan";
46 };
47 vlanConfig.Id = 2;
48 };
49 };
50 networks = {
51 # systemd-networkd will load the first network unit file
52 # that matches, ordered lexiographically by filename.
53 # /etc/systemd/network/{40-eth1,99-main}.network already
54 # exists. This network unit must be loaded for the test,
55 # however, hence why this network is named such.
56 "01-eth1" = {
57 name = "eth1";
58 networkConfig.Bridge = "br0";
59 bridgeVLANs = [
60 {
61 PVID = 2;
62 EgressUntagged = 2;
63 }
64 ];
65 };
66 "02-br0" = {
67 name = "br0";
68 networkConfig = {
69 DHCPServer = true;
70 Address = "10.0.0.1/24";
71 VLAN = [ "vlan2" ];
72 };
73 dhcpServerConfig = {
74 PoolOffset = 100;
75 PoolSize = 1;
76 };
77 bridgeVLANs = [
78 {
79 PVID = 1;
80 EgressUntagged = 1;
81 }
82 { VLAN = 2; }
83 ];
84 };
85 "02-vlan2" = {
86 name = "vlan2";
87 networkConfig = {
88 DHCPServer = true;
89 Address = "10.0.2.1/24";
90 };
91 dhcpServerConfig = {
92 PoolOffset = 100;
93 PoolSize = 1;
94 };
95 };
96 };
97 };
98 };
99
100 client =
101 { config, pkgs, ... }:
102 {
103 virtualisation.vlans = [ 1 ];
104 systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug";
105 networking = {
106 useNetworkd = true;
107 useDHCP = false;
108 firewall.enable = false;
109 interfaces.eth1.useDHCP = true;
110 };
111 };
112 };
113 testScript =
114 { ... }:
115 ''
116 start_all()
117
118 router.systemctl("start network-online.target")
119 client.systemctl("start network-online.target")
120 router.wait_for_unit("systemd-networkd-wait-online.service")
121 client.wait_for_unit("systemd-networkd-wait-online.service")
122 client.wait_until_succeeds("ping -c 5 10.0.2.1")
123 router.wait_until_succeeds("ping -c 5 10.0.2.100")
124 '';
125}