From c2dc46b701de98426e8c82955eb5eff3bfb733e6 Mon Sep 17 00:00:00 2001 From: Joshua Gilman Date: Fri, 21 Aug 2026 19:52:31 -0700 Subject: [PATCH] fix(routeros): replace lab LAGs with plain VLAN 30 tagged ports LACP never converged: the E810 hosts run the ice driver in Safe Mode (IncusOS ships no DDP firmware) and never received switch LACPDUs (PHY-level RX blackhole: 25G DACs at 10G, hosts request RS-FEC, switch negotiates none). Hosts move to active-backup bonds; the switch needs no LAG - six plain bridge ports with VLAN 30 tagged, mirroring the proven nas01 port 7 configuration. --- routeros/sw-core01/bonding.tf | 34 --------------------------- routeros/sw-core01/bridge.tf | 42 ++++++++++++++++++++++++++-------- routeros/sw-core01/tfplan-s1 | Bin 0 -> 15463 bytes 3 files changed, 33 insertions(+), 43 deletions(-) delete mode 100644 routeros/sw-core01/bonding.tf create mode 100644 routeros/sw-core01/tfplan-s1 diff --git a/routeros/sw-core01/bonding.tf b/routeros/sw-core01/bonding.tf deleted file mode 100644 index 1948888..0000000 --- a/routeros/sw-core01/bonding.tf +++ /dev/null @@ -1,34 +0,0 @@ -# RouterOS rejects enslaving an interface that is still a bridge port -# ("already added as bridge port"). terraform-routeros v1.99.1 bonding -# Create is a plain REST POST (DefaultCreate); it does not remove the -# slaves from /interface/bridge/port first. depends_on cannot name the -# six sfp-sfpplus1..6 bridge-port resources this change deletes, and -# OpenTofu will not order those orphan destroys before these creates. -# Apply in two steps as described in README.md. - -resource "routeros_interface_bonding" "bond_lab01" { - name = "bond-lab01" - slaves = [routeros_interface_ethernet.sfp_sfpplus1.name, routeros_interface_ethernet.sfp_sfpplus2.name] - mode = "802.3ad" - transmit_hash_policy = "layer-3-and-4" - lacp_rate = "30secs" - comment = "lab01 SFP pair (PHY-012 + PHY-013)" -} - -resource "routeros_interface_bonding" "bond_lab02" { - name = "bond-lab02" - slaves = [routeros_interface_ethernet.sfp_sfpplus3.name, routeros_interface_ethernet.sfp_sfpplus4.name] - mode = "802.3ad" - transmit_hash_policy = "layer-3-and-4" - lacp_rate = "30secs" - comment = "lab02 SFP pair (PHY-014 + PHY-015)" -} - -resource "routeros_interface_bonding" "bond_lab03" { - name = "bond-lab03" - slaves = [routeros_interface_ethernet.sfp_sfpplus5.name, routeros_interface_ethernet.sfp_sfpplus6.name] - mode = "802.3ad" - transmit_hash_policy = "layer-3-and-4" - lacp_rate = "30secs" - comment = "lab03 SFP pair (PHY-016 + PHY-017)" -} diff --git a/routeros/sw-core01/bridge.tf b/routeros/sw-core01/bridge.tf index e21347f..6aa374c 100644 --- a/routeros/sw-core01/bridge.tf +++ b/routeros/sw-core01/bridge.tf @@ -3,23 +3,44 @@ resource "routeros_interface_bridge" "lab" { vlan_filtering = true } -resource "routeros_interface_bridge_port" "bond_lab01" { +resource "routeros_interface_bridge_port" "sfp_sfpplus1" { bridge = routeros_interface_bridge.lab.name - interface = routeros_interface_bonding.bond_lab01.name + interface = routeros_interface_ethernet.sfp_sfpplus1.name frame_types = "admit-only-vlan-tagged" ingress_filtering = true } -resource "routeros_interface_bridge_port" "bond_lab02" { +resource "routeros_interface_bridge_port" "sfp_sfpplus2" { bridge = routeros_interface_bridge.lab.name - interface = routeros_interface_bonding.bond_lab02.name + interface = routeros_interface_ethernet.sfp_sfpplus2.name frame_types = "admit-only-vlan-tagged" ingress_filtering = true } -resource "routeros_interface_bridge_port" "bond_lab03" { +resource "routeros_interface_bridge_port" "sfp_sfpplus3" { bridge = routeros_interface_bridge.lab.name - interface = routeros_interface_bonding.bond_lab03.name + interface = routeros_interface_ethernet.sfp_sfpplus3.name + frame_types = "admit-only-vlan-tagged" + ingress_filtering = true +} + +resource "routeros_interface_bridge_port" "sfp_sfpplus4" { + bridge = routeros_interface_bridge.lab.name + interface = routeros_interface_ethernet.sfp_sfpplus4.name + frame_types = "admit-only-vlan-tagged" + ingress_filtering = true +} + +resource "routeros_interface_bridge_port" "sfp_sfpplus5" { + bridge = routeros_interface_bridge.lab.name + interface = routeros_interface_ethernet.sfp_sfpplus5.name + frame_types = "admit-only-vlan-tagged" + ingress_filtering = true +} + +resource "routeros_interface_bridge_port" "sfp_sfpplus6" { + bridge = routeros_interface_bridge.lab.name + interface = routeros_interface_ethernet.sfp_sfpplus6.name frame_types = "admit-only-vlan-tagged" ingress_filtering = true } @@ -51,9 +72,12 @@ resource "routeros_interface_bridge_vlan" "vlan30" { bridge = routeros_interface_bridge.lab.name vlan_ids = ["30"] tagged = [ - routeros_interface_bonding.bond_lab01.name, - routeros_interface_bonding.bond_lab02.name, - routeros_interface_bonding.bond_lab03.name, + routeros_interface_ethernet.sfp_sfpplus1.name, + routeros_interface_ethernet.sfp_sfpplus2.name, + routeros_interface_ethernet.sfp_sfpplus3.name, + routeros_interface_ethernet.sfp_sfpplus4.name, + routeros_interface_ethernet.sfp_sfpplus5.name, + routeros_interface_ethernet.sfp_sfpplus6.name, routeros_interface_ethernet.sfp_sfpplus7.name, ] } diff --git a/routeros/sw-core01/tfplan-s1 b/routeros/sw-core01/tfplan-s1 new file mode 100644 index 0000000000000000000000000000000000000000..eb139754b3f2c88aaaf4a98da4a3d2171f03b9a5 GIT binary patch literal 15463 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 literal 0 HcmV?d00001