STP

MST and PVST+ Interoperation: The Boundary, the CIST, and the Gotchas

MST/PVST boundary - a PVST simulation inconsistency blocking the boundary port on Cisco IOS XE
In: STP, VLAN, Labs, CCIE

Two switching standards, both trying to prevent loops, neither aware the other exists. That is what an MST-to-PVST+ boundary is, and it is one of the most misunderstood corners of Layer 2 - which is a problem, because you meet it every time an MST core touches an access layer that someone left running Rapid-PVST.

Get the boundary right and it is invisible. Get it wrong and you get blocked ports, a "PVST simulation inconsistency" you have never heard of, and a VLAN that mysteriously will not pass traffic across the seam. This article builds a real MST/PVST boundary in a CML lab, shows the CIST, and deliberately triggers the inconsistency so you can recognise it. For the fundamentals, start at the complete spanning tree guide.

Why the boundary exists at all

Rapid-PVST+ runs one spanning tree per VLAN. A hundred VLANs means a hundred independent trees, a hundred sets of BPDUs, and a hundred separate root elections. It is simple to reason about and it does not scale.

MST (802.1s) runs a handful of trees, each carrying many VLANs. You map VLANs to instances, and each instance is one tree. A hundred VLANs might collapse into three instances. Far less BPDU overhead, far less CPU - but you have to design the VLAN-to-instance mapping deliberately.

When these two meet, the MST switch has to present something a PVST switch can understand, and vice versa. The mechanism it uses is the CIST.

The CIST: the tree that speaks to everyone

The Common and Internal Spanning Tree is MST's diplomatic layer. Think of it in two parts:

IST (Internal Spanning Tree)
This is MST instance 0. Every VLAN not explicitly mapped elsewhere lives here. It is the tree that operates inside the region.
CST (Common Spanning Tree)
The single tree that connects the whole network - every MST region and every legacy STP/PVST switch - as if each region were one giant bridge.

The crucial simplification: to the outside world, an entire MST region looks like a single switch. All the internal complexity - the instances, the mappings - is hidden. A PVST switch peering with an MST region sees one bridge, and it exchanges ordinary STP BPDUs with it via the CIST.

The lab

Four switches in a square. SW1 and SW2 form an MST region called PINGLABZ. SW3 and SW4 run Rapid-PVST. The boundary therefore runs on two links: SW2-to-SW3 and SW4-to-SW1. SW1 is configured to be the CIST root.

! MST region config, identical on SW1 and SW2
spanning-tree mode mst
spanning-tree mst configuration
 name PINGLABZ
 revision 1
 instance 1 vlan 10
 instance 2 vlan 20,99

What the MST side sees

SW2#show spanning-tree mst 0
Interface        Role Sts Cost      Prio.Nbr Type
Et0/0            Root FWD 2000000   128.1    P2p
Et0/1            Desg FWD 2000000   128.2    P2p Bound(PVST)
Et0/2            Desg FWD 2000000   128.3    P2p
Et0/3            Desg FWD 2000000   128.4    P2p

Look at Et0/1: Bound(PVST). That is the boundary port, and IOS is telling you exactly what it is - a port where the MST region meets a Rapid-PVST neighbour. This one field is the single most useful thing to check when a boundary misbehaves.

What the PVST side sees

SW3#show spanning-tree vlan 10
Interface        Role Sts Cost      Prio.Nbr Type
Et0/0            Root FWD 100       128.1    P2p Peer(STP)
Et0/1            Altn BLK 100       128.2    P2p
Et0/2            Desg FWD 100       128.3    P2p Edge

Peer(STP) on the port toward the region. SW3 has no idea it is talking to a two-switch MST region carrying three instances. It sees a single STP peer, exactly as designed.

SW1 is the root, and it says so

SW1#show spanning-tree mst 1
##### MST1    vlans mapped:   10
Bridge        address aabb.cc00.4d00  priority      4097  (4096 sysid 1)
Root          this switch for MST1

How the MST region decides two switches belong together

Three things must match exactly for two switches to be in the same MST region:

  1. The region name.
  2. The revision number.
  3. The complete VLAN-to-instance mapping table.

All three are hashed into a single 16-byte digest that switches exchange in their BPDUs. If the digests match, same region. If they differ, different region - and the link between them becomes a boundary, whether you intended it or not.

SW1#show spanning-tree mst configuration digest
Name      [PINGLABZ]
Revision  1     Instances configured 3
Digest          0xE05029508B8AC96367E964B97EE7DA9B

This is the diagnostic that solves the most common MST mystery. In the lab, we moved a single VLAN from one instance to another on just one switch:

SW1: Digest 0xE05029508B8AC96367E964B97EE7DA9B
SW2: Digest 0xDA7E3D01C232F1CFDB7F72C25D414BAA   <-- differs

Two switches you thought were one region are now two regions, and the link between them stopped being internal and became a boundary. The VLAN mapping only has to differ by one VLAN. When someone reports "MST is behaving strangely after a change", compare the digests first. It is almost always this.

The PVST simulation inconsistency

Now the failure mode that has its own name and that nobody recognises the first time.

MST can only present one view of the tree to the PVST side (through the CIST). But PVST runs a separate tree per VLAN. So there is an inherent tension: what if the PVST region tries to make itself the root for one VLAN but not another? MST has no way to represent that - it only has the CIST to offer.

The MST boundary handles this with a safety check called PVST simulation. If a PVST neighbour advertises a superior BPDU for an individual VLAN - trying to become root of a per-VLAN tree - the boundary port refuses, and blocks. We triggered it by making the PVST switch claim VLAN 10 root:

SW3(config)#spanning-tree vlan 10 priority 0

Immediately, on the MST boundary:

SW2#show spanning-tree mst 0
Et0/1            Desg BKN*2000000   128.2    P2p Bound(PVST) *PVST_Inc

SW2#show spanning-tree inconsistentports
Name                 Interface                      Inconsistency
-------------------- ------------------------------ ------------------
MST0                 Ethernet0/1                    PVST Sim. Inconsistent
MST1                 Ethernet0/1                    PVST Sim. Inconsistent
MST2                 Ethernet0/1                    PVST Sim. Inconsistent

Number of inconsistent ports (segments) in the system : 3

Read that carefully. Desg BKN* - the port is blocked. *PVST_Inc - because of a PVST inconsistency. And it is inconsistent in all three MST instances at once, because the boundary is a single physical port shared by every instance. One VLAN's misbehaviour on the PVST side has just blocked the entire boundary link, for every VLAN.

The rule the boundary enforces: the CIST root must be inside the MST region, or the boundary blocks. A PVST switch is not allowed to win the root election for a VLAN that crosses into MST. Remove spanning-tree vlan 10 priority 0 and the port un-blocks and returns to forwarding.

The design rules that prevent all of this

1
Make the MST region the root for every VLAN that crosses the boundary. Set the CIST root and the relevant instance roots to a low priority on an MST switch. This is what stops PVST simulation inconsistencies before they start.
2
Keep the region config byte-identical. Name, revision, VLAN-to-instance map - copy-paste it, do not retype it. One typo makes a switch its own region.
3
Map every VLAN deliberately. Any VLAN you do not explicitly map lands in instance 0 (the IST). Forgetting to map a new VLAN is a classic way to get it following the wrong tree.
4
Migrate one side fully, not halfway. The boundary is a fine permanent state, but if you are converting an access layer to MST, do a whole switch at a time, matching the core's region config.

Troubleshooting checklist

  1. A VLAN will not pass across the seam? Check for Bound(PVST) and then show spanning-tree inconsistentports. A PVST_Inc blocks the whole link.
  2. Two switches you expected to be one region are not? show spanning-tree mst configuration digest on both. Different digest = different region. Then diff the name, revision, and VLAN map.
  3. Unexpected blocking after adding a VLAN? You probably added it on one switch's MST map but not the other, splitting the region.
  4. The PVST side keeps winning root? Lower the priority on an MST switch so the CIST root sits inside the region. The boundary requires it.
  5. Suboptimal paths? Remember the whole region is one bridge to the outside. The CST cannot see internal paths, so tune costs at the boundary if the external topology chooses badly.

Key takeaways

  • MST runs few trees carrying many VLANs; PVST+ runs one tree per VLAN. The CIST is how MST presents a single, PVST-compatible view of the whole region.
  • To the outside world, an entire MST region looks like one bridge. That is the CST.
  • Bound(PVST) marks a boundary port. It is the first thing to check on a misbehaving seam.
  • Region membership is decided by an exact match of name, revision, and the full VLAN-to-instance map, hashed into a digest. Different digest = different region. Diff the digests to find a split.
  • A PVST simulation inconsistency (*PVST_Inc, Desg BKN*) blocks the entire boundary link, in all instances, when the PVST side tries to become root for a VLAN crossing into MST.
  • Prevent it by making the MST region the root for every boundary-crossing VLAN.

Next: UDLD, which catches the one physical fault spanning tree cannot see. The full cluster index lives on the spanning tree pillar.

Written by
More from Ping Labz
Great! You’ve successfully signed up.
Welcome back! You've successfully signed in.
You've successfully subscribed to Ping Labz.
Your link has expired.
Success! Check your email for magic link to sign-in.
Success! Your billing info has been updated.
Your billing was not updated.