Environment
- Core routers:
rt-a32andrt-a31, both CCR2116-12G-4S+ - Edge router:
rt0.edm, RouterBOARD 750Gr2 - Versions tested on
rt-a32/rt-a31: 7.11.2, 7.21.5 (long-term), 7.23.3 (stable) — identical LDP behavior across all three rt0.edm: RouterOS 6.47.10 (unchanged throughout)- Topology:
rt0.edm— (VLAN 810, direct) —rt-a32— (sfp-sfpplus2, direct, single hop,/31) —rt-a31 rt-a32's link tort0.edmrides onbonding1(active-backup, 2x SFP+); the link tort-a31is a raw physical port, no bonding- Goal: bring up LDP end-to-end so a VPLS pseudowire can carry customer bridged traffic from
rt0.edmacrossrt-a32/rt-a31into an existing, otherwise-unrelated MPLS core
Problem 1 — SOLVED: rt-a32 ↔ rt-a31
Symptom: OSPF Full, UDP hello discovery healthy and bidirectional (packet-capture confirmed), but the active-connect side never sent a TCP SYN. Neighbor stuck permanently Throttled/Passive-Wait.
Root cause 1 (necessary but not sufficient alone): accept-dynamic-neighbors=yes was missing from one of the two /mpls/ldp/interface entries on rt-a32 (present on one interface, absent on the other — an asymmetry we'd introduced without noticing). Set explicitly on all interfaces, both routers.
Root cause 2 (the actual blocker): Once accept-dynamic-neighbors was set, packet capture showed rt-a32 genuinely sending TCP SYNs — but rt-a31 received them and sent back nothing at all, not even a RST. Traced to the input-chain firewall's LDP-session accept rule (protocol=tcp dst-port=646), which was scoped to a src-address-list that had only ever been populated with the physical link IP addresses used by OSPF — never the loopback/transport addresses LDP's TCP session actually sources from. The UDP hello rule worked because it matched via a different, already-correct mechanism; the TCP rule silently never matched and fell through to a default-drop with no logging.
Fix: Added both routers' loopback addresses to the relevant firewall address-list on both ends.
Result: Confirmed DO (dynamic, operational) on both sides, stable across multiple forced restart cycles, both before and after a full RouterOS upgrade on both routers.
Problem 2 — UNSOLVED: rt-a32 ↔ rt0.edm
Symptom: Identical starting symptom to Problem 1 — OSPF Full, UDP hello healthy and bidirectional — but applying the exact same fix that solved Problem 1 (firewall address-list correction — confirmed rt0.edm has zero firewall rules of any kind, so nothing to fix there) did not resolve it. This is a distinct issue, not a repeat of the same root cause.
Everything ruled out, each verified directly, not assumed:
| Area | Test | Result |
|---|---|---|
| Firewall (both routers) | Full filter and mangle table dump on rt0.edm |
Both completely empty — zero rules |
Firewall (rt-a32) |
accept-filter/advertise-filter |
Both empty; advertise-filter later added to match a known-working pattern elsewhere on the network — no change |
| IGP routing | Direct /32 OSPF route to both loopbacks |
Confirmed, no recursion, no default-route fallback |
| Reachability | Sourced ping (src-address= set to the actual transport address) |
Clean, sub-100µs RTT, both directions |
| Transport address | Explicit at both /mpls ldp instance and /mpls ldp interface level |
Confirmed correct via print detail |
| Connection tracking | notrack rules added for port 646; FastTrack |
Confirmed FastTrack already disabled; notrack made no difference |
| VRF | /ip vrf print on rt-a32 |
Default main, confirmed |
| AFI / preferred-AFI | Forced afi=ip preferred-afi=ip at instance and interface level |
Already default; explicit setting made no difference |
| Loop-detect | Set loop-detect=no on both rt-a32 and rt0.edm |
No change |
| MPLS fast-path | /mpls/settings/set allow-fast-path=no |
No change |
| VLAN-interface acceptance | Created a throwaway test VLAN on the working raw physical port (sfp-sfpplus2), added to /mpls/ldp/interface |
Accepted identically to the real interface — rules out flat VLAN rejection |
| Bond stability | /interface bonding monitor |
Stable, single active slave, zero link-downs since last-up |
| MTU | l2mtu/mpls-mtu relationship on the bonded interface |
Consistent with the working link, ample headroom |
| ARP/neighbor resolution | /ip arp print showed stale status; cleared and forced fresh reachable entry immediately before restart |
Neighbor briefly reached active-connect (C) for the first time following this, but still fell back to Throttled within seconds |
| Version | Full upgrade both routers: 7.11.2 → 7.21.5 (long-term) → 7.23.3 (stable) | Identical behavior at every version |
Final, most precise data point: With a simultaneous packet capture running on rt0.edm's side of this link, we forced a fresh ARP resolution and LDP restart on rt-a32. The neighbor state transitioned through Throttled → Active-Connect → Throttled on rt-a32's side (confirmed via repeated /mpls/ldp/neighbor/print detail) — but zero TCP packets, in either direction, appeared in the capture at any point during this transition. This indicates the LDP state machine believes it is attempting the connection, but no SYN is actually being generated onto the wire — a failure occurring internally on rt-a32, prior to any transmission, not a firewall/receiver-side rejection.
Structural difference from the working link (Problem 1), not yet isolated as cause or coincidence:
- The working link (
rt-a32↔rt-a31) is a raw physical SFP+ port - The non-working link (
rt-a32↔rt0.edm) is a VLAN interface (vlan810-edm-fibre) riding on an active-backup bond (bonding1) of two SFP+ ports - The remote peer in the working case is another RouterOS 7.21.5+ router; in the non-working case it's RouterOS 6.47.10
Question: given active-connect is reached but no SYN is ever transmitted (confirmed via capture, not inferred), is there a known interaction between LDP's TCP session sourcing and (a) VLAN interfaces layered on active-backup bonds, or (b) RouterOS 6↔7 LDP peering specifically, that would explain a SYN being internally "attempted" per the neighbor table but never actually generated at the interface? Happy to provide full config exports, /log output with ldp debug topics enabled, or run any additional live diagnostic.
