L2 · switching · reviewed
LACP
Link Aggregation Control Protocol
A standard handshake that binds parallel links into one logical port — and refuses to forward on a member the far end has not agreed to.
Presenter modeEmbed this figure
Why it exists
Parallel Ethernet links between two switches are a loop unless something collapses them into one logical port. Spanning tree’s answer is to block; aggregation’s answer is to forward on all of them as one.
Static bundling forwards on a member as soon as the interface is up, with no confirmation the far end agrees. LACP exchanges identity and state first, and refuses members that do not match — which is how it tells a one-way failure or a crossed cable from a working extra link. IEEE 802.1AX-2020 §5
Two cables become one port
Active LACP on both ends exchanges LACPDUs, matches system ID and key, and moves both members into one aggregator. Spanning tree then sees a single logical link.
Two switches have two cables. Without a bundle, spanning tree must block one — parallel links at layer 2 are a loop until something collapses them into one logical port. SW1: Members not bundled. SW2.
- Link
- Blocking
- Packet in flight
- Discarded
- Emphasis
Text equivalent of this diagram
| Element | Kind | State |
|---|---|---|
| SW1 | switch | Members: not bundled |
| SW2 | switch | — |
| SW1 — SW2 | link | blocking |
| SW1 — SW2 | link | blocking |
Two switches have two cables. Without a bundle, spanning tree must block one — parallel links at layer 2 are a loop until something collapses them into one logical port.
What changed
- Emphasis: Individual
- SW1: Members → not bundled
How it works
Each end advertises an Actor System identifier, an operational key, port priority, port number, and state flags. It also mirrors what it believes about the partner. Matching Actor and Partner information is what moves a member into the aggregator. IEEE 802.1AX-2020 §5
Activity is a flag: active transmits LACPDUs unsolicited; passive waits to be asked. Two passive ends wait forever. Prefer active on both.
Hashing is a local transmit decision. Each end independently chooses which member to send a flow on. A bundle distributes flows, not packets — one conversation is capped at one member’s speed.
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:02 (Slow Protocols multicast), EtherType 0x8809. IEEE 802.1AX-2020
- Slow Protocols subtype
- Subtype 0x01 identifies LACP; Marker is 0x02. IEEE 802.1AX-2020
- LACPDU body
- Version, then Actor Information and Partner Information TLVs. Collector and Terminator TLVs follow and are not laid out here. IEEE 802.1AX-2020
Configure it
interface Port-channel1 description uplink-bundle switchport mode trunkThe logical interface spanning tree and the rest of the network will see.
interface range GigabitEthernet1/0/1-2 channel-group 1 mode activeActive transmits LACPDUs without waiting. Prefer active on both ends; two passives never start, and `mode on` facing LACP is a loop risk.
Common mistake: Using `mode on` on one end and LACP on the other. The static end forwards before the protocol end agrees.
IEEE 802.1AX-2020 §5
port-channel load-balance src-dst-ipHash on fields that vary for your traffic. Source-destination MAC alone often pins router-to-router flows onto one member.
Cisco IOS XE — Configuring EtherChannels §Load balancing
Verify
show etherchannel summary- Po1 with both members (P) and protocol LACP.
show lacp neighbor- Partner System and key matching the far end on each member.
show etherchannel load-balance- The hash fields in use for transmit.
Caveats
- Member speeds and media should match; mixing can leave a member out or skew the hash.
- min-links can take the whole Port-channel down when too few members remain — intentional for some designs, surprising for others.
When it breaks
Symptom first, because that is what you have when it happens.
A bundle is configured on both ends but only one member is passing traffic, or the bundle never forms.
Narrow it down
- Check the mode on each end: active, passive, or on.
- Confirm both ends are not passive — two passive ends never start.
- Look for one end configured statically while the other speaks LACP.
Cause
Passive waits to be asked. Two passive ends wait forever. A static bundle facing an LACP bundle is worse: the static end forwards immediately on every member while the other end has not agreed, which is a loop rather than a bundle.
Fix
Use active on at least one end, and prefer active on both. Never configure a static bundle facing a protocol one.
IEEE 802.1AX-2020 §5Traffic is unevenly distributed across members — one link saturated, the rest nearly idle.
Narrow it down
- Read the hashing policy in use on the transmitting device.
- Characterise the traffic: how many distinct flows, and do they vary in the fields being hashed?
- Check whether the heavy traffic is a single flow.
Cause
A bundle distributes flows, not packets. A hash over source and destination MAC address puts everything between two routers on one member, and a single large transfer is one flow no matter how the hash is configured.
Fix
Hash on fields that actually vary — usually including layer 4 ports. Accept that one flow cannot exceed one member; a bundle adds capacity for many conversations, not for one.
A member fails but traffic on the bundle keeps being blackholed.
Narrow it down
- Check whether the failure was detected — a dark fibre with light on one strand keeps the interface up.
- Look at whether LACP is still receiving on that member.
- Check the configured min-links.
Cause
The interface never went down, so the member stayed in the bundle. LACP would have noticed the missing protocol packets, but a static bundle has nothing to notice with.
Fix
Run LACP rather than static bundling, and consider micro-BFD on the members where sub-second detection matters.
IEEE 802.1AX-2020 §5Members stay individual or show partner information that does not match the neighbour you expect.
Narrow it down
- Compare Actor System and Actor Key on each end of every member.
- Trace cables — a crossed member lands on the wrong partner System.
- Confirm channel-group numbers and keys are consistent for the intended aggregator.
Cause
LACP only bundles when Actor and Partner information agree. A crossed cable or a key mismatch leaves the member out of the aggregator by design.
Fix
Fix the cabling or the key. Do not switch the member to static to “make it come up” — that removes the check that caught the mistake.
IEEE 802.1AX-2020 §5show etherchannel lists a member as standby and operators treat it as a fault.
Narrow it down
- Check max-bundle and port-priority configuration.
- Confirm the member is exchanging LACPDUs and shows a matched partner.
- Distinguish hot-standby from independent (mismatch) state.
Cause
Under a max-bundle limit, lower-priority members are intentionally standby. That is not the same as a member that never matched Partner Information.
Fix
If standby is unintended, raise the member’s port priority or raise max-bundle. If the member is independent, fix the Actor/Partner mismatch instead.
IEEE 802.1AX-2020 §5
Design notes
A static bundle facing an LACP bundle is a loop risk: the static end forwards immediately while the other end has not agreed. The overhead being avoided is one small frame per second.
PAgP is Cisco-proprietary and is not this protocol. Mixed PAgP/LACP ends do not form a standard bundle. Cisco IOS XE — Configuring EtherChannels §LACP vs PAgP
Misconceptions
- “A four-member bundle gives one host four times the throughput.”
- It gives the bundle four times the aggregate capacity across many flows. Any single flow is hashed to one member and is capped at that member’s speed — which is why a bundle is a poor answer to "this one backup job is too slow".
- “Static bundling is the same thing with less overhead.”
- A static bundle forwards on a member as soon as the interface is up, with no confirmation the far end agrees. Miscabling that LACP would refuse to bundle becomes a forwarding loop. The overhead being avoided is one small frame per second.
- “Both ends must use the same hashing policy.”
- Hashing is a local transmit decision. Each end independently chooses which member to send on, and the two need not match — which also means an imbalance can exist in one direction only.
More walkthroughs
Actor and partner do not agreefailure
Cables are crossed between two port-channels, or keys differ. Each end’s Partner Information fails to match the real neighbour’s Actor Information, so members stay individual — or worse, a static face meets an LACP face.
SW1 expects both members to land on SW2 with the same Actor Key. LACP will only bundle ports whose Actor and Partner information line up. SW1 · key 1: Expects SW2 · key 1. SW2 · key 2. SW3 · unexpected.
- Link
- Blocking
- Packet in flight
- Discarded
- Emphasis
Text equivalent of this diagram
| Element | Kind | State |
|---|---|---|
| SW1 · key 1 | switch | Expects: SW2 · key 1 |
| SW2 · key 2 | switch | — |
| SW3 · unexpected | switch | — |
| SW1 · key 1 — SW2 · key 2 | link | blocking |
| SW1 · key 1 — SW3 · unexpected | link | up |
SW1 expects both members to land on SW2 with the same Actor Key. LACP will only bundle ports whose Actor and Partner information line up.
What changed
- SW1 · key 1: Expects → SW2 · key 1
- Emphasis on SW1 · key 1 ↔ SW2 · key 2
Active and standby membersdesign-choice
A max-bundle limit or hot-standby policy keeps some members out of distributing. Port priority decides who forwards and who waits — standby is intentional, not a failure.
Three members are configured, but max-bundle is two. LACP still forms the channel; it will not put every physical link into distributing. SW1: max-bundle 2. SW2.
- Link
- Blocking
- Packet in flight
- Discarded
- Emphasis
Text equivalent of this diagram
| Element | Kind | State |
|---|---|---|
| SW1 | switch | max-bundle: 2 |
| SW2 | switch | — |
| SW1 — SW2 | link | forwarding |
| SW1 — SW2 | link | forwarding |
| SW1 — SW2 | link | blocking |
Three members are configured, but max-bundle is two. LACP still forms the channel; it will not put every physical link into distributing.
What changed
- SW1: max-bundle → 2
- Emphasis on SW1 ↔ SW2
- Emphasis: Standby
Terms
- vPC peer-link
- The Cisco MLAG link between two peers. It is not a member of the downstream vPC. If it fails while keepalive is alive, the secondary suspends member ports.