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

Cisco IOS XE 17.18.x — Configuring Spanning Tree Protocol (Catalyst 9300) §Spanning-Tree Modes and ProtocolsCisco IOS XE 17.18.x — Configuring Spanning Tree Protocol (Catalyst 9300) §Spanning-Tree Modes and ProtocolsIEEE 802.1D-2004 §9.3.1IEEE 802.1Q-2022 §13.4

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.

SW1 · root VLAN 10One instance per VLANVLAN 10: root · pri 4096SW2 · root VLAN 20VLAN 20: root · pri 4096Access
  • Link
  • Blocking
  • Packet in flight
  • Discarded
  • Emphasis
Select a device to read its state. Arrow keys walk the topology.
Text equivalent of this diagram
Devices and links at this step
ElementKindState
SW1 · root VLAN 10switchVLAN 10: root · pri 4096
SW2 · root VLAN 20switchVLAN 20: root · pri 4096
Accessswitch
SW1 · root VLAN 10Accesslinkforwarding
SW2 · root VLAN 20Accesslinkforwarding
SW1 · root VLAN 10SW2 · root VLAN 20linkup
1 / 3

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.

The BPDU SW1 sends once it believes it is root: root identifier equals its own bridge identifier, and the root path cost is zero.

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

Rapid-PVST+ with SW1 root for VLAN 10 and a secondary role for VLAN 20 — the split that makes both uplinks carry traffic.

Cisco IOS-XE 17.18 · Catalyst 9300, Catalyst 9200draft

  1. spanning-tree mode rapid-pvst

    Per-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

  2. spanning-tree vlan 10 priority 4096

    One 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

  3. spanning-tree vlan 20 priority 28672

    Above 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

  4. ! on SW2 (peer):
    ! spanning-tree mode rapid-pvst
    ! spanning-tree vlan 20 priority 4096
    ! spanning-tree vlan 10 priority 28672

    The 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.

  1. 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

    1. Check what the non-Cisco switch is running — almost certainly MSTP or RSTP, with one instance.
    2. Compare which VLAN carries a standard BPDU the neighbour understands.
    3. 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 Protocols
  2. Switch CPU rises steadily as VLANs are added, and topology changes make the switch unresponsive.

    Narrow it down

    1. Count VLANs times spanning-tree-enabled ports against the platform’s logical port limit.
    2. Check CPU during a topology change rather than at rest.
    3. 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.

  3. Load sharing across two uplinks was configured per VLAN and only one uplink carries traffic.

    Narrow it down

    1. Check whether the root bridge differs per VLAN, or only the port cost.
    2. Confirm priorities were set per VLAN rather than left at the global default.
    3. 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 VLAN
  4. CPU high with hundreds of VLANs and Rapid-PVST+.

    Narrow it down

    1. Count active VLAN trees
    2. 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.

  5. VLAN 20 still roots on the wrong switch after priority change.

    Narrow it down

    1. show spanning-tree vlan 20
    2. 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.

Priorities were left at the default on every VLAN. SW1 wins every election. PVST+ still maintains an instance per VLAN — they all reach the same answer. SW1 · root all VLANs: Root for VLAN 10, 20, 30…. SW2. Access.

SW1 · root all VLANsRoot for: VLAN 10, 20, 30…SW2AccessNo per-VLAN splitBlocked · all VLANs
  • Link
  • Blocking
  • Packet in flight
  • Discarded
  • Emphasis
Select a device to read its state. Arrow keys walk the topology.
Text equivalent of this diagram
Devices and links at this step
ElementKindState
SW1 · root all VLANsswitchRoot for: VLAN 10, 20, 30…
SW2switch
Accessswitch
SW1 · root all VLANsAccesslinkforwarding
SW2Accesslinkblocking
SW1 · root all VLANsSW2linkup
1 / 3

Priorities were left at the default on every VLAN. SW1 wins every election. PVST+ still maintains an instance per VLAN — they all reach the same answer.

What changed

  • SW1 · root all VLANs: Root for → VLAN 10, 20, 30…
  • Emphasis: Blocked · all VLANs
  • No per-VLAN split

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).

Cisco · Rapid-PVST+IEEE · RSTP/MSTPUnderstands native onlySees: one tree (native)
  • Link
  • Blocking
  • Packet in flight
  • Discarded
  • Emphasis
Select a device to read its state. Arrow keys walk the topology.
Text equivalent of this diagram
Devices and links at this step
ElementKindState
Cisco · Rapid-PVST+switch
IEEE · RSTP/MSTPswitchSees: one tree (native)
Cisco · Rapid-PVST+IEEE · RSTP/MSTPlinkup
1 / 3

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.

Check yourself

  • What does PVST+ run per VLAN?
  • How does PVST+ interoperate with a switch running only RSTP or MSTP?
  • Per-VLAN load sharing is configured and only one uplink is used. What is missing?
  • What is the standards-based alternative to PVST+ for multiple topologies?
  • What resource does PVST+ consume as VLANs and trunks grow?
  • Bridge priority under PVST+ is configured:
  • How does Rapid-PVST+ relate to PVST+?
  • At a PVST+/IEEE boundary, which VLAN carries a standard BPDU the neighbour understands?