Active, Hold, Sniff & Park Modes + Link Manager Protocol

 

 

📡 Wireless Systems Engineering — Lecture Series  |  Module 3 · Continued
🔋 Module 3.3–3.4 · Power Modes & Link Manager | Bluetooth Classic

Active, Hold, Sniff & Park Modes
+ Link Manager Protocol

From POLL packets in active mode to duty-cycle engineering in sniff mode — plus a full walkthrough of LMP PDU structure, roles, and the BlueZ implementation layer.

3Connection Modes
7Active Slaves Max
3PDU Fields
4LMP Functions

🔑 Key Terms in This Lecture

Active Mode Hold Mode Sniff Mode Park State AM_ADDR PM_ADDR POLL Packet Duty Cycle Scatternet Link Manager Protocol LMP PDU TID / OpCode ACL-C / ACL-U Role Switch Clock Drift

Where We Are in the Stack

Hello students in this lecture i will explain what is Active, Hold, Sniff & Park Modes + Link Manager Protocol In the previous lecture we established how devices discover each other and create a piconet connection. This lecture picks up from that point: the connection is active, and now we need to manage it efficiently. The central problem is power consumption vs. responsiveness. A device that listens at full power every slot drains its battery in hours; a device that sleeps too aggressively becomes unresponsive.

The Bluetooth specification defines a structured set of solutions: three in-connection modes (Active, Hold, Sniff) and one deeper standby variant (Park state). We examine all four in detail, including their real-world use cases and the engineering trade-offs each one involves.

We also step one layer up from the Baseband to introduce the Link Manager — the software entity that negotiates these modes, exchanges security credentials, and lets devices discover each other’s capabilities. Its protocol (LMP) is the control plane of every Bluetooth Classic connection.

Lecture Outline

§ 1 — Active Mode & the POLL Mechanism

Active mode is the baseline: Master and Slaves exchange packets every two slots. We study how the Master uses POLL packets to keep Slaves synchronised and how AM_ADDR identifies each Slave within the piconet.

POLL PacketNULL Response AM_ADDR (3-bit)Piconet Scheduling 7-Slave Limit
§ 2 — Hold Mode: Temporary ACL Suspension

Hold mode suspends ACL traffic for a negotiated duration. The Slave may use that window to scan, page, or join another piconet. Voice links continue unaffected.

Hold DurationVoice Continuity Scatternet UseWake-on-Expiry
§ 3 — Sniff Mode: Duty-Cycle Power Saving

The most widely deployed low-power mode. A sniff interval defines a periodic listening window — the device is absent between windows. Clock drift management over long sniff periods is a subtle but critical engineering concern.

Sniff IntervalDuty Cycle Headset ExampleKeyboard Example Clock Drift RiskScatternet Bridge
§ 4 — Park State: Deep Synchronisation

Park state releases the AM_ADDR (freeing piconet capacity) while keeping the device synchronised via periodic beacon wakeups. Used when more than seven Slaves must share a single Master.

PM_ADDRBroadcast Beacon AM_ADDR Reclamation>7 Slave Scenario
§ 5 — Link Manager Protocol (LMP)

LMP is the control plane riding on top of the baseband. We study its PDU structure (TID, OpCode, Payload), the four major functional areas it covers, and how BlueZ implements it.

TID FieldOpCode Connection ControlSecurity Informational PDUsRole Switch

Figure 3.8 — Link Controller State Machine

Reproduced in structured text form from the Bluetooth Baseband specification. Arrows represent permitted transitions between states and substates.

Fig. 3.8 · Link Controller States & Substates
Device Discovery Substates
Inquiry Scan
Inquiry
Inquiry Response
↑↓ via STANDBY
Major States
STANDBY
CONNECTION
Active Mode
Sniff Mode
Hold Mode
PARK
Connection Establishment Substates
Page Scan
Page
Slave Response
Master Response
↑↓ via STANDBY
Legend: Major States  |  Discovery/Connection Substates  |  In-Connection Modes (sub-modes of CONNECTION)

Figure 3.9 — Inquiry State Messages & Transitions

This sequence diagram shows the packet types and state transitions on both the Master (inquiring) and Slave (discoverable) devices during the inquiry procedure.

Fig. 3.9 · Inquiry Procedure — Message Sequence
Master (Inquiring Device)
Slave (Discoverable Device)
StateSTANDBY
StateSTANDBY
Transitions to →INQUIRY Substate
Transitions to →INQUIRY SCAN Substate
Master sends →
Packet Type: ID Message: Inquiry
→→→→
— awaiting response —
Transitions to →INQUIRY RESPONSE Substate
←←←←
Packet Type: FHS Message: Inquiry Response
← Slave responds
Optional: Extended Inquiry Response (EIR) — Slave may follow FHS with additional device info (name, services, TX power)
Master has captured BD_ADDR + clock offset of Slave. ACL data packets (DM1, DM3, DM5, DH1, DH3, DH5) now possible after connection.
Returns toSTANDBY
Returns toSTANDBY

Figure 3.10 — Connection & Disconnection Messages

This sequence diagram traces the full lifecycle: from STANDBY through the paging procedure to active data exchange and finally detach on either side.

Fig. 3.10 · Connection & Disconnection — Full Message Sequence
Master (Paging Device)
Slave (Page-Scan Device)
StateSTANDBY
StateSTANDBY
Transitions to →PAGE Substate
Transitions to →PAGE SCAN Substate
Master →
Packet Type: ID Message: Page
→→→→
— awaiting response —
Transitions to →SLAVE RESPONSE Substate
←←←←
Packet Type: ID Message: Slave Page Response
← Slave
Transitions to →MASTER RESPONSE Substate
— awaiting FHS —
Master →
Packet Type: FHS Message: Master Page Response
(BD_ADDR + Clock for hop sync)
→→→→
Enters →CONNECTION State (Master)
Enters →CONNECTION State (Slave)
Master →
Packet Type: POLL Message: Master Packet
(First packet after connection)
→→→→
Data Exchange Phase
Any ACL packet type (DM1, DH1, DH3, DH5, 2-DH5, 3-DH5 …)   ⇆   bidirectional
• • •
Either side →
Packet Type: DM1 Message: Detach
(Reason code included in LMP payload)
↔ ↔ ↔
Returns toSTANDBY
Returns toSTANDBY

§ 1 — Active Mode & the POLL Mechanism

Active mode is the default operating condition of a Bluetooth piconet in the CONNECTION state. At its core it is a simple time-division polling scheme: the Master owns the channel and decides which Slave gets to transmit in which slot.

Piconet Capacity: 1 Master + 7 Slaves

At any point in time, a piconet can have at most one Master and seven simultaneously active Slaves. The Master maintains this by assigning each active Slave a 3-bit Active Member Address (AM_ADDR). Since a 3-bit field can represent values 0–7 and value 0 is reserved for broadcast, only seven non-zero values remain — hence the hard limit of seven active Slaves.

💡 Why 3 Bits? The AM_ADDR is embedded inside every baseband packet header. A 3-bit field was chosen to keep header overhead minimal — at the time Bluetooth was designed, squeezing extra bits into a radio packet header had a measurable cost in air-time. Seven concurrent Slaves was deemed sufficient for the target use cases (phone + headset + keyboard + mouse + printer …).

POLL Packets: Keeping Slaves Synchronised

Even when the Master has no user data to send, it cannot simply go silent — if it does, Slaves will lose channel synchronisation and start to drift. Instead, the Master continuously transmits POLL packets addressed to each Slave in round-robin fashion. A POLL packet carries no user payload; its sole function is to probe a Slave and give it a transmission opportunity.

When polled, a Slave must respond within one slot. If the Slave has data queued, it sends the appropriate ACL data packet. If it has nothing to send, it responds with a NULL packet — a zero-payload acknowledgement that simply says “I received your poll and I am still here.”

Scheduling SCO/eSCO Alongside ACL

If one or more SCO or eSCO connections are active, the Master must reserve specific slots for them at the intervals they require (every 2 slots for HV3, every 1 slot for HV1). The remaining slots are available for ACL POLL/data exchanges. The Master’s scheduling function must balance these constraints without starving any Slave.

🔗 BlueZ: hci_conn.c — AM_ADDR assignment and active connection tracking


§ 2 — Hold Mode: Negotiated ACL Suspension

Hold mode allows the Master to tell a Slave: “we both agree to suspend ACL packet exchange for the next T slots.” During that window the Slave is freed from listening for POLL packets and can use its radio for other purposes.

What Continues During Hold

Hold mode only affects the ACL logical transport. Voice links — SCO and eSCO — are not interrupted. A phone call in progress continues without any audible gap even while the ACL control channel is frozen. This is a key design choice: voice is the latency-sensitive priority; data control traffic can wait.

What the Slave Can Do During Hold

The freed slots give the Slave a clean opportunity to:

  • Enter a hardware low-power mode (clock-gate the radio, reduce CPU frequency).
  • Perform an inquiry scan — make itself discoverable to other devices.
  • Perform a page — connect to a different Master to join a second piconet.
  • Perform paging on its own, acting as a temporary Master to bring up a new connection.

Waking Up on Hold Expiry

Both devices agree on the hold duration before entering hold mode — this is negotiated via an LMP message. On expiry, the Slave wakes and immediately begins listening on the Master’s polling schedule. Since both devices know exactly when hold ends (they computed it from the same clock offset), re-synchronisation is instantaneous with no extra handshake needed.

✅ Use Case Hold mode is used in scatternet scenarios where a device needs to be a Slave in piconet A and a Master in piconet B. By putting its piconet-A ACL link on hold, it can use those slots to manage piconet B, then return to piconet A when the hold expires.

§ 3 — Sniff Mode: Duty-Cycle Power Saving

Sniff mode is by far the most widely deployed low-power mode in Bluetooth Classic devices. Unlike hold mode (which is negotiated once per hold event), sniff mode defines a recurring duty cycle — the Slave periodically wakes for a brief listening window and returns to sleep between windows.

How the Duty Cycle Works

Two parameters define the sniff duty cycle: the sniff interval (Tsniff, how often the device wakes) and the sniff attempt window (how many slots it listens each time it wakes). Between these windows the device is completely absent from the piconet — its radio is off and its controller is in a low-power sleep state.

Sniff Mode Duty Cycle — Conceptual Timing
Each cell = one sniff interval (e.g. 100 ms). ON = Slave listens. OFF = Slave radio off.
ON
OFF   zzz
ON
OFF   zzz
ON
OFF   zzz

Low sniff interval — high power saving

ON
OFF
ON
OFF
ON
OFF
ON
OFF

Tight sniff interval — low latency, higher power

Unlike Hold: SCO/eSCO Are Also Unaffected

Sniff mode, like hold mode, only affects the ACL logical transport. SCO and eSCO links continue at their normal cadence even while ACL is in sniff mode. The sniff windows are scheduled to avoid collisions with SCO slots.

Real-World Example 1: Bluetooth Headset

Consider a mono headset paired to a mobile phone. After the initial connection, there may be no active voice call for hours. Yet disconnecting and reconnecting for every call would introduce a noticeable delay (300–800 ms for connection establishment). Instead, the ACL link is left open but placed in sniff mode with a large interval (e.g., 1280 ms). The headset wakes briefly every 1.28 seconds to check for Master traffic. When an incoming call arrives, the Master sends a Connect SCO command in the next sniff window — call setup takes milliseconds rather than seconds.

Real-World Example 2: Bluetooth Keyboard

A Bluetooth keyboard may have no keystrokes for minutes at a time. After an inactivity timer expires (typically set by the host software), the HID profile driver sets the ACL link into sniff mode. The keyboard checks in at the sniff interval (e.g., every 100 ms). The moment a key is pressed, the keyboard sends a keystroke in the next available sniff window. The host exits sniff mode and returns to active polling for as long as typing continues, then re-enters sniff mode after the inactivity timer fires again.

Using Sniff Mode as a Scatternet Bridge

Sniff mode enables a device to be a member of two piconets simultaneously — a configuration called a scatternet. The device tunes its sniff parameters so that the absent-periods in piconet A align with the active-periods in piconet B. By carefully engineering both sniff intervals it can interleave participation in two completely independent piconets without either link dropping.

⚠️ Clock Drift: The Hidden Risk

Every Bluetooth device has a local crystal oscillator that drives its clock. No two crystals run at exactly the same frequency — there is always a small drift. Over short sniff periods (a few seconds) this drift is negligible. But for headsets that stay in sniff mode for hours on end, accumulated clock drift can shift the Slave’s wake window so far that it no longer aligns with the Master’s POLL slot — resulting in dropped packets or even link loss.

The specification and implementations address this by having the Slave controller periodically resynchronise with the Master even during sniff periods, using the received packet timing to re-calibrate the local clock offset. BlueZ exposes sniff resynchronisation through the HCI Sniff Subrating command.

⚠️ Engineering Caution When designing firmware for a Bluetooth peripheral that will use long sniff intervals (500 ms+), always validate behaviour after several hours of uninterrupted sniff-mode operation. Clock drift failures are time-delayed and intermittent, making them easy to miss in short-duration testing.
BlueZ — hci_request.c /* Set sniff mode parameters via HCI command */ static void hci_sniff_req(struct hci_request *req, unsigned long opt) { struct hci_cp_sniff_mode cp; cp.handle = cpu_to_le16(conn->handle); cp.max_interval = cpu_to_le16(conn->sniff_max_interval); cp.min_interval = cpu_to_le16(conn->sniff_min_interval); cp.attempt = cpu_to_le16(4); /* sniff attempt in slots */ cp.timeout = cpu_to_le16(1); /* sniff timeout in slots */ hci_req_add(req, HCI_OP_SNIFF_MODE, sizeof(cp), &cp); }

🔗 Kernel Source: net/bluetooth/hci_request.c — Sniff mode HCI request 🔗 BlueZ mgmt-api.txt — Connection power mode management


§ 4 — Park State: Deep Synchronisation

Park state is the lowest-power in-piconet mode. A parked Slave has completely stopped transmitting and receiving ACL or SCO/eSCO traffic, yet remains synchronised to the piconet’s frequency-hopping sequence so it can quickly re-activate when needed.

Address Swap: AM_ADDR → PM_ADDR

When a Slave is parked, the Master reclaims its Active Member Address (AM_ADDR) and instead assigns a Parked Member Address (PM_ADDR). PM_ADDR is used only in broadcast messages from the Master to identify parked devices. The freed AM_ADDR slot can now be given to a new active Slave — this is the primary mechanism for exceeding the seven-active-Slave limit.

Address Type Bits Used When Purpose
AM_ADDR 3 Active mode (CONNECTION state) Identifies Slave in packet headers; max 7 non-zero values
PM_ADDR 8 Park state Identifies parked Slave in Master broadcast; up to 255 parked devices
AR_ADDR 8 Park state (Access Request) Used by parked Slave to request unparking in the access window

How Parked Devices Stay Synchronised

A parked Slave wakes up at regular beacon intervals determined by the Master. During each beacon window it listens to a broadcast message from the Master. The Master uses these broadcasts to:

  • Provide clock information so parked Slaves can re-calibrate their local offsets.
  • Announce any messages specifically addressed to one or more parked Slaves (via their PM_ADDR).
  • Signal an unpark request for a specific Slave.

Between beacon intervals the Slave’s radio is completely off, making park state suitable for sensors that must maintain piconet membership indefinitely while consuming almost no power.

The >7 Slave Problem

A practical deployment scenario: a Bluetooth gateway managing a room full of sensors. More than seven sensors need to be logically associated with the gateway, but at any moment only a few are actively transmitting readings. The solution is to keep at most seven sensors in active mode and park the rest. When a parked sensor has data, the Master temporarily unparks it (swapping it with an active sensor that gets parked) for the duration of the transmission, then parks it again.

Slave active (AM_ADDR=3) LMP_park_req AM_ADDR freed PM_ADDR assigned Park state
Park state Master unpark broadcast New AM_ADDR assigned Active mode
⚠️ Park State in Modern Devices Park state was designed for Bluetooth 1.x when the seven-active-Slave limit was a hard constraint. In practice, very few commercial products implement park state today — most systems use sniff mode instead, and IoT deployments tend to use Bluetooth Low Energy (BLE) rather than Classic for sensor-type workloads. You should understand park state for exam purposes and for legacy system maintenance, but do not architect new designs around it.

§ 5 — Link Manager Protocol (LMP)

The Link Manager (LM) is the software layer sitting directly above the Baseband Controller. Its job is to set up, maintain, and tear down connections — negotiating everything from packet types to encryption keys. It communicates with its peer on the remote device using the Link Manager Protocol (LMP).

Transport: ACL-C Logical Link via DM1 Packets

LMP messages ride on the ACL-C (Control) logical link — a separate logical channel within the ACL connection that carries only control data. User application data travels on the ACL-U (User) logical link. This separation ensures that link management traffic can always be delivered even when the ACL-U channel is congested with application data.

By default, LMP messages are carried in DM1 packets — the 1-slot, medium-rate packet type that we studied earlier. The small payload ceiling of DM1 (17 bytes) is not a limitation for LMP because most LMP PDUs are compact control messages. The one exception: if an HV1 SCO link is active and the LMP payload fits in 9 bytes or fewer, DV packets may be used — but this is rare in practice.

LMP PDU Structure

Every LMP message is a PDU (Protocol Data Unit) consisting of exactly three fields:

TID
1 bit
Transaction ID — groups all PDUs of the same transaction together
OpCode
7 bits
Uniquely identifies the PDU type (e.g. host_connection_req, version_req …)
Payload
Variable
Parameters specific to this PDU type (addresses, keys, feature masks …)

What is a Transaction?

A transaction is a complete unit of LMP work — it may require multiple PDUs going back and forth between the two Link Managers. All PDUs belonging to the same transaction carry the same TID value, so each side can associate responses with their initiating requests. For example, an encryption setup transaction may involve: LMP_encryption_mode_req → LMP_accepted → LMP_encryption_key_size_req → LMP_accepted → … and all of these share one TID.

The most common response PDUs are LMP_accepted (the requested operation is permitted) and LMP_not_accepted (the requested operation is refused, with a reason code in the payload).

The Four Functional Areas of LMP

🔗

Connection Control

Creation and removal of ACL connections, SCO/eSCO setup, mode negotiation (sniff, hold, park), power control, and detach procedures.

🔐

Security

Authentication (challenge-response using the link key), pairing (legacy PIN-based and Secure Simple Pairing), and link-layer encryption setup including key exchange.

ℹ️

Informational Requests

Capability exchange: version negotiation via LMP_version_req, feature discovery via LMP_features_req / _res, clock offset requests, and timing accuracy queries.

🔄

Role Switch

Swaps Master and Slave roles after a connection is established. The new Master’s clock becomes the piconet reference; an FHS packet is exchanged to re-synchronise the hop sequence.

Role Switch: A Practical Example

Consider a Bluetooth mouse connecting to a laptop. Because the mouse initiates the page, it becomes Master. But a laptop typically wants to be Master so it can control multiple peripherals (keyboard, mouse, headset) from a single piconet. After the connection is established, the laptop’s Link Manager sends an LMP_switch_req PDU. If the mouse accepts, they execute a synchronised role-swap: the laptop’s clock takes over as the piconet reference, the frequency-hop sequence re-centres on the laptop’s BD_ADDR, and both devices resume normal operation — now with the laptop as Master.

BlueZ: LMP PDU Handling

BlueZ — hci_event.c (LMP feature exchange) /* Processing LMP_features_res: remote device’s feature bitmask */ static void hci_read_remote_features_complete_evt( struct hci_dev *hdev, struct sk_buff *skb) { struct hci_ev_remote_features *ev = (void *)skb->data; struct hci_conn *conn; conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); if (!conn) return; if (!ev->status) memcpy(conn->features[0], ev->features, sizeof(conn->features[0])); /* Features include: 3-slot packets, 5-slot packets, encryption, role switch, hold mode, sniff mode … */ hci_conn_check_pending(hdev); }

🔗 Kernel Source: net/bluetooth/hci_event.c — Remote feature event handling 🔗 BlueZ lib/bluetooth.c — Core utilities including address handling 🔗 Kernel Source: hci_conn.c — Role switch implementation


🎯 Self-Test Questions

Work through these before your next tutorial. Refer to the BlueZ source links above where relevant.

1 A Bluetooth piconet has seven active Slaves. An eighth device wants to join. Describe exactly what must happen at the baseband level for it to do so.
2 Why does hold mode not interrupt an ongoing voice call (SCO link), but sniff mode would potentially cause voice quality problems if applied to an SCO link?
3 You are designing a Bluetooth temperature sensor that sends one reading every 5 minutes. Should you use hold mode, sniff mode, or park state? Justify your choice in terms of power, latency, and implementation complexity.
4 In an LMP transaction, what happens if the remote device responds with LMP_not_accepted to a LMP_switch_req? What does the TID field tell us in this exchange?
5 Look at the BlueZ kernel source for hci_sniff_req(). What are the units of the max_interval and min_interval fields, and how would you set a sniff interval of approximately 1280 ms?

Next Up: L2CAP & the Host Protocol Stack

With the Link Manager and baseband covered, we move upward: L2CAP multiplexing, segmentation & reassembly, and how profiles ride on top.

📄 Core Spec 6.0 🐧 Linux BT Source ⚙️ BlueZ Git

so i hope you have learnt Active, Hold, Sniff & Park Modes + Link Manager Protocol in next lecture we will see more advanced topic.
Free learning to all !!
EmbeddedPatahashala.

Leave a Reply

Your email address will not be published. Required fields are marked *