1
2import ./make-test-python.nix ({ pkgs, lib, ...} : {
3 name = "babeld";
4 meta = with pkgs.lib.maintainers; {
5 maintainers = [ hexa ];
6 };
7
8 nodes =
9 { client = { pkgs, lib, ... }:
10 {
11 virtualisation.vlans = [ 10 ];
12
13 networking = {
14 useDHCP = false;
15 interfaces."eth1" = {
16 ipv4.addresses = lib.mkForce [ { address = "192.168.10.2"; prefixLength = 24; } ];
17 ipv4.routes = lib.mkForce [ { address = "0.0.0.0"; prefixLength = 0; via = "192.168.10.1"; } ];
18 ipv6.addresses = lib.mkForce [ { address = "2001:db8:10::2"; prefixLength = 64; } ];
19 ipv6.routes = lib.mkForce [ { address = "::"; prefixLength = 0; via = "2001:db8:10::1"; } ];
20 };
21 };
22 };
23
24 local_router = { pkgs, lib, ... }:
25 {
26 virtualisation.vlans = [ 10 20 ];
27
28 networking = {
29 useDHCP = false;
30 firewall.enable = false;
31
32 interfaces."eth1" = {
33 ipv4.addresses = lib.mkForce [ { address = "192.168.10.1"; prefixLength = 24; } ];
34 ipv6.addresses = lib.mkForce [ { address = "2001:db8:10::1"; prefixLength = 64; } ];
35 };
36
37 interfaces."eth2" = {
38 ipv4.addresses = lib.mkForce [ { address = "192.168.20.1"; prefixLength = 24; } ];
39 ipv6.addresses = lib.mkForce [ { address = "2001:db8:20::1"; prefixLength = 64; } ];
40 };
41 };
42
43 services.babeld = {
44 enable = true;
45 interfaces.eth2 = {
46 hello-interval = 1;
47 type = "wired";
48 };
49 extraConfig = ''
50 local-port-readwrite 33123
51
52 import-table 254 # main
53 export-table 254 # main
54
55 in ip 192.168.10.0/24 deny
56 in ip 192.168.20.0/24 deny
57 in ip 2001:db8:10::/64 deny
58 in ip 2001:db8:20::/64 deny
59
60 in ip 192.168.30.0/24 allow
61 in ip 2001:db8:30::/64 allow
62
63 in deny
64
65 redistribute local proto 2
66 redistribute local deny
67 '';
68 };
69 };
70 remote_router = { pkgs, lib, ... }:
71 {
72 virtualisation.vlans = [ 20 30 ];
73
74 networking = {
75 useDHCP = false;
76 firewall.enable = false;
77
78 interfaces."eth1" = {
79 ipv4.addresses = lib.mkForce [ { address = "192.168.20.2"; prefixLength = 24; } ];
80 ipv6.addresses = lib.mkForce [ { address = "2001:db8:20::2"; prefixLength = 64; } ];
81 };
82
83 interfaces."eth2" = {
84 ipv4.addresses = lib.mkForce [ { address = "192.168.30.1"; prefixLength = 24; } ];
85 ipv6.addresses = lib.mkForce [ { address = "2001:db8:30::1"; prefixLength = 64; } ];
86 };
87 };
88
89 services.babeld = {
90 enable = true;
91 interfaces.eth1 = {
92 hello-interval = 1;
93 type = "wired";
94 };
95 extraConfig = ''
96 local-port-readwrite 33123
97
98 import-table 254 # main
99 export-table 254 # main
100
101 in ip 192.168.20.0/24 deny
102 in ip 192.168.30.0/24 deny
103 in ip 2001:db8:20::/64 deny
104 in ip 2001:db8:30::/64 deny
105
106 in ip 192.168.10.0/24 allow
107 in ip 2001:db8:10::/64 allow
108
109 in deny
110
111 redistribute local proto 2
112 redistribute local deny
113 '';
114 };
115
116 };
117 };
118
119 testScript =
120 ''
121 start_all()
122
123 client.wait_for_unit("network-online.target")
124 local_router.wait_for_unit("network-online.target")
125 remote_router.wait_for_unit("network-online.target")
126
127 local_router.wait_for_unit("babeld.service")
128 remote_router.wait_for_unit("babeld.service")
129
130 local_router.wait_until_succeeds("ip route get 192.168.30.1")
131 local_router.wait_until_succeeds("ip route get 2001:db8:30::1")
132
133 remote_router.wait_until_succeeds("ip route get 192.168.10.1")
134 remote_router.wait_until_succeeds("ip route get 2001:db8:10::1")
135
136 client.succeed("ping -c1 192.168.30.1")
137 client.succeed("ping -c1 2001:db8:30::1")
138
139 remote_router.succeed("ping -c1 192.168.10.2")
140 remote_router.succeed("ping -c1 2001:db8:10::2")
141 '';
142})