1{
2 pkgs,
3 ...
4}:
5{
6 name = "babeld";
7 meta = with pkgs.lib.maintainers; {
8 maintainers = [ hexa ];
9 };
10
11 nodes = {
12 client =
13 { lib, ... }:
14 {
15 virtualisation.vlans = [ 10 ];
16
17 networking = {
18 useDHCP = false;
19 interfaces."eth1" = {
20 ipv4.addresses = lib.mkForce [
21 {
22 address = "192.168.10.2";
23 prefixLength = 24;
24 }
25 ];
26 ipv4.routes = lib.mkForce [
27 {
28 address = "0.0.0.0";
29 prefixLength = 0;
30 via = "192.168.10.1";
31 }
32 ];
33 ipv6.addresses = lib.mkForce [
34 {
35 address = "2001:db8:10::2";
36 prefixLength = 64;
37 }
38 ];
39 ipv6.routes = lib.mkForce [
40 {
41 address = "::";
42 prefixLength = 0;
43 via = "2001:db8:10::1";
44 }
45 ];
46 };
47 };
48 };
49
50 local_router =
51 { lib, ... }:
52 {
53 virtualisation.vlans = [
54 10
55 20
56 ];
57
58 networking = {
59 useDHCP = false;
60 firewall.enable = false;
61
62 interfaces."eth1" = {
63 ipv4.addresses = lib.mkForce [
64 {
65 address = "192.168.10.1";
66 prefixLength = 24;
67 }
68 ];
69 ipv6.addresses = lib.mkForce [
70 {
71 address = "2001:db8:10::1";
72 prefixLength = 64;
73 }
74 ];
75 };
76
77 interfaces."eth2" = {
78 ipv4.addresses = lib.mkForce [
79 {
80 address = "192.168.20.1";
81 prefixLength = 24;
82 }
83 ];
84 ipv6.addresses = lib.mkForce [
85 {
86 address = "2001:db8:20::1";
87 prefixLength = 64;
88 }
89 ];
90 };
91 };
92
93 services.babeld = {
94 enable = true;
95 interfaces.eth2 = {
96 hello-interval = 1;
97 type = "wired";
98 };
99 extraConfig = ''
100 local-port-readwrite 33123
101
102 import-table 254 # main
103 export-table 254 # main
104
105 in ip 192.168.10.0/24 deny
106 in ip 192.168.20.0/24 deny
107 in ip 2001:db8:10::/64 deny
108 in ip 2001:db8:20::/64 deny
109
110 in ip 192.168.30.0/24 allow
111 in ip 2001:db8:30::/64 allow
112
113 in deny
114
115 redistribute local proto 2
116 redistribute local deny
117 '';
118 };
119 };
120 remote_router =
121 { lib, ... }:
122 {
123 virtualisation.vlans = [
124 20
125 30
126 ];
127
128 networking = {
129 useDHCP = false;
130 firewall.enable = false;
131
132 interfaces."eth1" = {
133 ipv4.addresses = lib.mkForce [
134 {
135 address = "192.168.20.2";
136 prefixLength = 24;
137 }
138 ];
139 ipv6.addresses = lib.mkForce [
140 {
141 address = "2001:db8:20::2";
142 prefixLength = 64;
143 }
144 ];
145 };
146
147 interfaces."eth2" = {
148 ipv4.addresses = lib.mkForce [
149 {
150 address = "192.168.30.1";
151 prefixLength = 24;
152 }
153 ];
154 ipv6.addresses = lib.mkForce [
155 {
156 address = "2001:db8:30::1";
157 prefixLength = 64;
158 }
159 ];
160 };
161 };
162
163 services.babeld = {
164 enable = true;
165 interfaces.eth1 = {
166 hello-interval = 1;
167 type = "wired";
168 };
169 extraConfig = ''
170 local-port-readwrite 33123
171
172 import-table 254 # main
173 export-table 254 # main
174
175 in ip 192.168.20.0/24 deny
176 in ip 192.168.30.0/24 deny
177 in ip 2001:db8:20::/64 deny
178 in ip 2001:db8:30::/64 deny
179
180 in ip 192.168.10.0/24 allow
181 in ip 2001:db8:10::/64 allow
182
183 in deny
184
185 redistribute local proto 2
186 redistribute local deny
187 '';
188 };
189
190 };
191 };
192
193 testScript = ''
194 start_all()
195
196 local_router.wait_for_unit("babeld.service")
197 remote_router.wait_for_unit("babeld.service")
198
199 local_router.wait_until_succeeds("ip route get 192.168.30.1")
200 local_router.wait_until_succeeds("ip route get 2001:db8:30::1")
201
202 remote_router.wait_until_succeeds("ip route get 192.168.10.1")
203 remote_router.wait_until_succeeds("ip route get 2001:db8:10::1")
204
205 client.succeed("ping -c1 192.168.30.1")
206 client.succeed("ping -c1 2001:db8:30::1")
207
208 remote_router.succeed("ping -c1 192.168.10.2")
209 remote_router.succeed("ping -c1 2001:db8:10::2")
210 '';
211}