L2 · switching · reviewed
PVST+
Per-VLAN Spanning Tree Plus
One spanning-tree instance per VLAN — Cisco’s way to load-share uplinks where IEEE STP/RSTP would keep a single tree.
Presenter modeEmbed this figure
Why it exists
IEEE STP and RSTP compute one loop-free tree for the bridged network. Two parallel uplinks still leave one blocked for every VLAN. Campuses that want both uplinks busy need the trees to disagree somehow.
Cisco’s answer was an instance per VLAN — PVST+, later Rapid-PVST+ with 802.1w-style convergence. It is proprietary. The IEEE answer to the same problem is MSTP, which maps many VLANs onto a few instances. IEEE 802.1Q-2022 §13.4
Two VLANs, two roots
SW1 is root for VLAN 10 and SW2 is root for VLAN 20. Each instance elects independently, so the blocked uplink differs by VLAN and both links carry traffic.
PVST+ runs a separate spanning tree for every VLAN. Bridge priority, path cost, and root election are all per VLAN — not global. SW1 · root VLAN 10: VLAN 10 root · pri 4096. SW2 · root VLAN 20: VLAN 20 root · pri 4096. Access.
- Link
- Blocking
- Packet in flight
- Discarded
- Emphasis
Text equivalent of this diagram
| Element | Kind | State |
|---|---|---|
| SW1 · root VLAN 10 | switch | VLAN 10: root · pri 4096 |
| SW2 · root VLAN 20 | switch | VLAN 20: root · pri 4096 |
| Access | switch | — |
| SW1 · root VLAN 10 — Access | link | forwarding |
| SW2 · root VLAN 20 — Access | link | forwarding |
| SW1 · root VLAN 10 — SW2 · root VLAN 20 | link | up |
PVST+ runs a separate spanning tree for every VLAN. Bridge priority, path cost, and root election are all per VLAN — not global.
What changed
- SW1 · root VLAN 10: VLAN 10 → root · pri 4096
- SW2 · root VLAN 20: VLAN 20 → root · pri 4096
- One instance per VLAN
How it works
Each VLAN elects its own root and assigns its own port roles. Bridge priority and port cost are configured per VLAN. Load sharing is deliberate disagreement between those elections. Cisco IOS XE 17.18.x — Configuring Spanning Tree Protocol (Catalyst 9300) §Spanning-Tree Modes and Protocols
The BPDU payload remains an 802.1D-style configuration BPDU. What is Cisco-specific is running many instances and using a Cisco multicast destination for non-native VLAN BPDUs so IEEE bridges do not consume them as ordinary STP. IEEE 802.1D-2004 §9.3.1
Rapid-PVST+ keeps the per-VLAN model and replaces classic timer-based transitions with RSTP proposal/agreement behaviour. On modern Catalyst platforms it is the default; classic `pvst` mode is chosen only when 802.1D timing must be observed. Cisco IOS XE 17.18.x — Configuring Spanning Tree Protocol (Catalyst 9300) §Spanning-Tree Modes and Protocols
On the wire
Constructed examples, encoded from the field table below them — not captured traffic.
- IEEE 802.3 MAC frame
- Destination 01:80:C2:00:00:00, the Bridge Group Address. A length field, not an EtherType. IEEE 802.1D-2004
- IEEE 802.2 LLC
- DSAP 0x42, SSAP 0x42, control 0x03 (unnumbered information). IEEE 802.1D-2004
- Bridge Protocol Data Unit
- The fields below, in network byte order. IEEE 802.1D-2004
Configure it
spanning-tree mode rapid-pvstPer-VLAN instances with rapid convergence. This is the default on modern Catalyst platforms; stating it makes the mode explicit in the teaching config.
Common mistake: Using `spanning-tree mode pvst` when you wanted rapid convergence. Classic PVST+ keeps 802.1D timer behaviour.
Cisco IOS XE 17.18.x — Configuring Spanning Tree Protocol (Catalyst 9300) §Spanning-Tree Modes and Protocols
spanning-tree vlan 10 priority 4096One step (or more) below the 32768 default so SW1 wins VLAN 10 on priority. Priority is per VLAN — this does not move VLAN 20.
Common mistake: Setting a global-looking priority once and expecting every VLAN to load-share. Without a complementary root on the peer for other VLANs, every instance still agrees.
Cisco IOS XE 17.18.x — Configuring Spanning Tree Protocol (Catalyst 9300) §(Optional) Configuring the Device Priority of a VLAN
spanning-tree vlan 20 priority 28672Above SW2’s VLAN 20 priority (configured on the peer as 4096 in the matching design). SW1 is backup root for VLAN 20, not primary.
Cisco IOS XE 17.18.x — Configuring Spanning Tree Protocol (Catalyst 9300) §(Optional) Configuring the Device Priority of a VLAN
! on SW2 (peer): ! spanning-tree mode rapid-pvst ! spanning-tree vlan 20 priority 4096 ! spanning-tree vlan 10 priority 28672The load-share only exists when the peer is root for the complementary VLAN set. One switch cannot load-share with itself.
Verify
show spanning-tree vlan 10- This bridge is the root for VLAN 10; root port absent on SW1.
show spanning-tree vlan 20- Root ID is SW2; SW1 shows a root port toward the peer path.
show spanning-tree summary- Mode rapid-pvst and per-VLAN instance counts that match allowed VLANs.
Caveats
- Instance cost is VLANs × STP-enabled ports — prune trunks before scaling VLAN count.
- Facing a non-Cisco RSTP/MSTP neighbour, only the native VLAN is a shared spanning-tree conversation.
- Priority values must be multiples of 4096 on platforms that encode the extended system ID in the low bits.
When it breaks
Symptom first, because that is what you have when it happens.
A Cisco switch connected to a non-Cisco one blocks a VLAN, or the two disagree about the topology on every VLAN but one.
Narrow it down
- Check what the non-Cisco switch is running — almost certainly MSTP or RSTP, with one instance.
- Compare which VLAN carries a standard BPDU the neighbour understands.
- Look for asymmetric forwarding: forwarding on one side, blocking on the other, for non-native VLANs.
Cause
PVST+ runs one topology per VLAN; the neighbour runs one for all of them. Only the native VLAN carries a standard BPDU the neighbour processes; per-VLAN BPDUs use Cisco’s destination and are not that neighbour’s spanning tree.
Fix
Match the mode at the boundary, or accept that the neighbour sees one topology and design so that is safe.
Cisco IOS XE 17.18.x — Configuring Spanning Tree Protocol (Catalyst 9300) §Spanning-Tree Modes and ProtocolsSwitch CPU rises steadily as VLANs are added, and topology changes make the switch unresponsive.
Narrow it down
- Count VLANs times spanning-tree-enabled ports against the platform’s logical port limit.
- Check CPU during a topology change rather than at rest.
- Look at how many VLANs are allowed on each trunk.
Cause
PVST+ runs an instance per VLAN, so cost is VLANs × ports. Four thousand VLANs on forty-eight trunks is an outage waiting for a topology change.
Fix
Prune trunks to the VLANs actually needed, and move to MSTP where the count is genuinely large.
Load sharing across two uplinks was configured per VLAN and only one uplink carries traffic.
Narrow it down
- Check whether the root bridge differs per VLAN, or only the port cost.
- Confirm priorities were set per VLAN rather than left at the global default.
- Look at which bridge is root for each VLAN.
Cause
Without a different root or cost per VLAN, every instance computes the same topology and there is nothing to share.
Fix
Set priority per VLAN and split them so half prefer one root and half the other — or use MSTP instances for the same outcome with far fewer trees.
Cisco IOS XE 17.18.x — Configuring Spanning Tree Protocol (Catalyst 9300) §(Optional) Configuring the Device Priority of a VLANCPU high with hundreds of VLANs and Rapid-PVST+.
Narrow it down
- Count active VLAN trees
- Compare to an MST instance map
Cause
One instance per VLAN scales with VLAN count.
Fix
Collapse to MSTP instances that match the load-share intent.
VLAN 20 still roots on the wrong switch after priority change.
Narrow it down
- show spanning-tree vlan 20
- Confirm the priority was set for VLAN 20
Cause
Priority applied to the wrong VLAN.
Fix
Set and verify per-VLAN priority.
Design notes
Instance count is VLANs × STP-enabled ports. Thousands of VLANs on dense trunks is a CPU and logical-port limit problem, not a feature. Prune trunks; move to MSTP when the count is genuinely large.
PVST+ is not MSTP. There is no region digest and no mapping table. Mixing PVST+ with MSTP at a boundary needs an explicit design — it is not transparent interop. IEEE 802.1Q-2022 §13.7
Misconceptions
- “PVST+ is the standard per-VLAN spanning tree.”
- It is Cisco’s. There is no IEEE mandate for one tree per VLAN. The standards-based answer to multiple topologies is MSTP. IEEE 802.1Q-2022 §13.4
- “PVST+ interoperates with MSTP transparently.”
- It interoperates on the native VLAN and tunnels or ignores the rest from the IEEE side’s point of view. The neighbour sees one topology; PVST+ sees many. The boundary needs designing.
- “More instances means better convergence.”
- Each instance converges independently, so convergence is no faster and the CPU cost is multiplied. The benefit is load sharing across VLANs — and only when the topologies actually differ.
More walkthroughs
Many instances, one topologyfailure
PVST+ is enabled and both uplinks are trunks, but every VLAN still elects the same root. The second uplink blocks for all VLANs — the instance cost was paid for no load sharing.
PVST+ facing an IEEE neighbourfailure
A Cisco edge runs Rapid-PVST+; the neighbour runs RSTP or MSTP with one topology. Only the native VLAN carries a standard BPDU the neighbour understands — every other VLAN is invisible to it.
On the native VLAN, PVST+ sends a standard configuration BPDU to the IEEE reserved multicast address. The neighbour processes it as ordinary STP/RSTP. Cisco · Rapid-PVST+. IEEE · RSTP/MSTP: Sees one tree (native).
- Link
- Blocking
- Packet in flight
- Discarded
- Emphasis
Text equivalent of this diagram
| Element | Kind | State |
|---|---|---|
| Cisco · Rapid-PVST+ | switch | — |
| IEEE · RSTP/MSTP | switch | Sees: one tree (native) |
| Cisco · Rapid-PVST+ — IEEE · RSTP/MSTP | link | up |
On the native VLAN, PVST+ sends a standard configuration BPDU to the IEEE reserved multicast address. The neighbour processes it as ordinary STP/RSTP.
What changed
- Native VLAN · IEEE dest: Cisco · Rapid-PVST+ → IEEE · RSTP/MSTP
- IEEE · RSTP/MSTP: Sees → one tree (native)
- Understands native only
Terms
- Bridge identifier
- Eight octets identifying a bridge: a settable 16-bit priority followed by the 48-bit bridge address. Compared as a single number, priority first.
- Root bridge
- The bridge with the lowest bridge identifier. Every path in the active topology is measured as a cost back to it, and all of its ports are designated.
- MST digest
- A 16-octet HMAC-MD5 of the VID-to-MSTID table. Two bridges share a region only when name, revision, and digest all match. Matching names with different maps do not merge.