at 25.11-pre 5.0 kB view raw
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}