feat: router topology

This commit is contained in:
catvayor 2025-02-23 11:45:05 +01:00
parent b8acdcef16
commit e7cecbda44
Signed by: lbailly
GPG key ID: CE3E645251AC63F3

View file

@ -8,6 +8,7 @@ let
imap imap
flatten flatten
listToAttrs listToAttrs
unique
; ;
access-topology = [ access-topology = [
[ [
@ -27,6 +28,7 @@ let
client_name = sw: vni: "h-${br_name sw vni}"; client_name = sw: vni: "h-${br_name sw vni}";
vtep_name = sw: vni: "v-${toString sw}-${toString vni}"; vtep_name = sw: vni: "v-${toString sw}-${toString vni}";
sw_name = sw: "sw${toString sw}"; sw_name = sw: "sw${toString sw}";
router_vtep_name = vni: "rv-${toString vni}";
vtep_br_name = sw: vni: "br${vtep_name sw vni}"; vtep_br_name = sw: vni: "br${vtep_name sw vni}";
vtep_vxlan_name = sw: vni: "x${vtep_name sw vni}"; vtep_vxlan_name = sw: vni: "x${vtep_name sw vni}";
@ -160,10 +162,9 @@ let
}; };
vxlanConfig = { vxlanConfig = {
VNI = vni; VNI = vni;
Remote = "10.0.0.1";
Local = "10.0.0.${toString (sw + 1)}"; Local = "10.0.0.${toString (sw + 1)}";
DestinationPort = 4789; DestinationPort = 4789;
PortRange = 4789; Group = "239.0.0.1";
}; };
}; };
} }
@ -216,12 +217,67 @@ in
config = { config = {
imports = [ ./common.nix ]; imports = [ ./common.nix ];
services.resolved.enable = false; services.resolved.enable = false;
systemd.network.networks = { systemd.network =
"10-eth0" = { let
name = "eth0"; vni-list = unique <| flatten access-topology;
address = [ "10.0.0.1/24" ]; vtep-network =
listToAttrs
<| map (vni: {
name = "10-${router_vtep_name vni}";
value = {
name = router_vtep_name vni;
linkConfig.Promiscuous = true;
networkConfig = {
Bridge = "rbr0";
LinkLocalAddressing = false;
LLDP = false;
EmitLLDP = false;
IPv6AcceptRA = false;
IPv6SendRA = false;
};
bridgeConfig.Isolated = true;
};
}) vni-list;
vtep-netdevs =
listToAttrs
<| map (vni: {
name = "10-${router_vtep_name vni}";
value = {
netdevConfig = {
Name = router_vtep_name vni;
Kind = "vxlan";
};
vxlanConfig = {
VNI = vni;
Local = "10.0.0.1";
DestinationPort = 4789;
Group = "239.0.0.1";
};
};
}) vni-list;
in
{
networks = {
"10-eth0" = {
name = "eth0";
address = [ "10.0.0.1/24" ];
networkConfig.VXLAN = map router_vtep_name vni-list;
};
"10-rbr0" = {
name = "rbr0";
address = [ "10.0.100.1/16" ];
};
} // vtep-network;
netdevs = {
"10-rbr0" = {
netdevConfig = {
Name = "rbr0";
Kind = "bridge";
};
};
} // vtep-netdevs;
}; };
};
}; };
}; };
} }