HCI 功能规范【4.6. LMP transaction and LL procedure collisions】

发布时间:2026/7/5 13:36:59

HCI 功能规范【4.6. LMP transaction and LL procedure collisions】 这部分是4.6 LMP transaction and LL procedure collisions讲的是Host 发出的某些 HCI Command 已经被 Controller 接受并开始执行但在底层真正执行 LMP transaction 或 Link Layer procedure 时可能和对端设备同时发起的相同流程发生“碰撞”。这种碰撞发生后Controller 应该怎么处理。这里的重点不是 HCI Command 本身而是HCI Command 已经开始执行 ↓ Controller 在底层发起 LMP transaction 或 LL procedure ↓ 对端设备也同时发起相同 transaction / procedure ↓ 发生 collision ↓ Controller 要么等待对端流程完成并复用结果 ↓ 要么直接向 Host 上报 collision 错误1. 这部分整体表述了哪些知识这部分主要表达 4 个知识点1. 有些 HCI Command 会触发底层 LMP transaction 或 Link Layer procedure。 2. Host 收到 HCI_Command_Status Success不代表底层流程一定最终成功。 3. 如果本端和对端同时发起相同底层流程可能发生 collision。 4. 发生 collision 后Controller 有两种合法处理方式 - 等待对端发起的流程完成然后用它的结果生成本端命令的 completion event - 直接用 collision 错误码生成本端命令的 completion event。核心是Command Status 成功以后底层流程仍然可能因为 collision 失败。2. LMP transaction 和 LL procedure 分别是什么这一节同时提到两个概念LMP transaction LL procedure它们分别对应经典蓝牙和 BLE。2.1 LMP transactionLMP 是Link Manager Protocol它主要属于BR/EDR 经典蓝牙体系。LMP transaction 可以理解为经典蓝牙 Controller 之间用于链路管理的底层交互过程。例如经典蓝牙里的一些链路管理、认证、加密、角色切换等操作底层可能涉及 LMP 交互。2.2 LL procedureLL 是Link LayerLL procedure 是BLE Link Layer 过程。BLE 中很多连接状态下的链路控制不是 Host 直接通过空口完成而是 Controller 之间通过 Link Layer Control PDU 完成。常见 BLE LL procedure 包括Feature Exchange Version Exchange Connection Parameter Update PHY Update Data Length Update Channel Map Update Encryption Start Terminate也就是说Host 发一个 HCI Command 后Controller 可能需要在 Link Layer 层和对端 Controller 交互完成某个 LL procedure。3. 为什么会发生 collisioncollision 的意思是本端和对端几乎同时发起了相同或冲突的底层流程。例如 BLE 中本端 Controller 想发起某个 LL procedure对端 Controller 也刚好发起了同样的 LL procedure。可以理解为本端 Host 发 HCI Command ↓ 本端 Controller 准备发起某个 LL procedure 同时 对端 Controller 也发起了同一个 LL procedure ↓ 两个方向的底层流程撞在一起这就叫LL Procedure Collision对应错误码是LMP Error Transaction Collision / LL Procedure Collision 0x234. 这里为什么强调 HCI_Command_Status 是 successful原文开头说If the Host issues a command that returns a successful HCI_Command_Status event...意思是Host 发出一个命令后Controller 已经通过 HCI_Command_Status event 返回成功。这说明Controller 已经接受这个命令 命令已经开始执行 命令进入 pending 状态但是要注意HCI_Command_Status Success不代表最终操作成功。它只表示Controller 接受了命令并准备执行后续底层过程。后续底层过程仍然可能失败例如对端不支持 对端拒绝 超时 连接断开 LL procedure collision这一节讲的就是其中一种失败原因LMP transaction / LL procedure collision5. 错误码 0x23 表示什么这里的错误码是LMP Error Transaction Collision / LL Procedure Collision 0x23可以拆开理解BR/EDR 场景LMP Error Transaction Collision LE 场景LL Procedure Collision因为 HCI 错误码体系同时覆盖 BR/EDR 和 LE所以这个错误码在名字上同时包含 LMP 和 LL。对 BLE 来说重点看后半部分LL Procedure Collision也就是 Link Layer procedure 碰撞。6. 发生 collision 后Controller 有两种处理方式规范给了 Controller 两种合法选择。6.1 第一种等待对端发起的流程完成并使用该结果生成 completion event原文第一条The Controller shall wait until the peer-initiated transaction or procedure has completed and use the result to generate the command-specific completion event. In this case, the collision is not reported to the Host.意思是Controller 可以等待对端发起的 transaction/procedure 完成然后用这个流程的结果生成本端 HCI Command 对应的 completion event。此时 collision 不会上报给 Host。也就是说虽然底层发生了 collision但 Controller 内部处理掉了。Host 看到的是Command Status Success ↓ 后续 completion event而不会看到0x23 collision error例如本端想发起 Feature Exchange 对端也发起 Feature Exchange ↓ 本端 Controller 发现 collision ↓ 本端 Controller 不再重复发起 ↓ 等待对端发起的 Feature Exchange 完成 ↓ 用这个结果向 Host 返回 completion event这种情况下Host 不一定知道底层曾经发生 collision。6.2 第二种直接返回 command-specific completion event并带 0x23 错误码原文第二条The Controller shall generate the command-specific completion event with the error code LMP Error Transaction Collision / LL Procedure Collision (0x23).意思是Controller 也可以直接生成该命令对应的 completion event并在 Status 中返回 0x23。也就是 Host 会看到Command Status Success ↓ completion event Status 0x23这表示命令已经开始执行 但底层 LMP transaction / LL procedure 因为 collision 失败注意它不是在 Command Status 里返回错误而是在后续 completion event 里返回错误。因为命令一开始确实被接受并开始执行了只是执行过程中发生了底层碰撞。7. command-specific completion event 是什么意思这里不是说一定返回HCI_Command_Complete。command-specific completion event指的是这个命令自己的完成事件。例如某些命令流程是Host → HCI Command Controller → HCI_Command_Status Controller → 某个特定 completion event例如 BLE 建立连接HCI_LE_Create_Connection ↓ HCI_Command_Status ↓ HCI_LE_Connection_Complete再比如某些连接相关过程最终可能有自己的完成事件。所以这里的意思是发生 collision 后Controller 要通过该命令原本对应的完成事件上报结果。如果采用第二种处理方式那么这个 completion event 的 Status 就是0x238. 这部分和 4.4、4.5 的关系这一节其实是对前面两节的补充。4.4 讲过有些 HCI Command 会先返回 HCI_Command_Status 然后进入 pending 最终通过 completion event 返回结果。4.5 讲过如果 Command Status 成功后才发现错误 错误应该放在后续 completion event 的 Status 中。4.6 讲的就是一种具体的“后续执行过程中才发生的错误”LMP transaction / LL procedure collision所以完整理解是Host 发 HCI Command ↓ Controller 返回 HCI_Command_Status Success ↓ 命令进入 pending ↓ Controller 发起底层 LMP transaction / LL procedure ↓ 对端也发起相同流程 ↓ 发生 collision ↓ Controller 要么内部等待对端流程完成并用结果返回 ↓ 要么通过 completion event 返回 0x239. 用 BLE 场景理解假设 BLE 连接已经建立本端 Host 希望更新某个链路参数于是通过 HCI Command 让 Controller 发起一个 Link Layer procedure。流程可能是Host ↓ HCI Command Local Controller ↓ LL Control PDU Peer Controller但是刚好对端 Controller 也在同一时间发起类似 procedurePeer Controller ↓ LL Control PDU Local Controller这时两个 procedure 发生碰撞。Controller 有两种处理方式第一种本端 Controller 等待对端发起的 LL procedure 完成 然后把最终结果作为本端命令的结果返回 Host 不知道发生过 collision第二种本端 Controller 直接结束本端命令 通过 completion event 返回 Status 0x23 Host 能看到 collision 错误10. 对 HCI log 分析有什么意义在分析 btsnoop / HCI log 时如果看到HCI_Command_Status Status 0x00后面又看到某个 completion eventStatus 0x23就不能理解成Controller 一开始就拒绝了命令更准确的理解是Controller 一开始接受了命令 命令已经开始执行 但底层 LMP transaction 或 LL procedure 和对端发起的流程发生 collision 所以最终失败如果 Controller 采用第一种处理方式你甚至不会在 Host 侧看到 0x23Host 只会看到最终完成事件。所以没有看到 0x23不代表底层绝对没有发生 collision。只是这个 collision 可能被 Controller 内部处理掉了。11. 对 BLE App 开发有什么意义在 iOS / Android App 层一般看不到这些细节因为系统蓝牙栈和 Controller 会处理底层 LL procedure。但它能解释一些现象某些连接参数更新、PHY 更新、Data Length 更新等操作不一定每次都按预期成功 有时命令已被接受但最终 completion event 失败 不同手机、不同芯片行为可能不完全一样 底层 collision 可能被 Controller 内部消化也可能以错误码上报App 层通常只能看到较抽象的结果例如连接参数更新结果 PHY 更新结果 连接断开 GATT 操作失败但底层可能经历了HCI Command HCI_Command_Status LL procedure LL procedure collision completion event12. 这部分的关键信息总结12.1 Command Status 成功不等于底层 procedure 最终成功HCI_Command_Status Success只表示 Controller 接受了命令并开始执行。后续 LMP transaction 或 LL procedure 仍然可能失败。12.2 collision 是本端和对端同时发起相同/相关底层流程导致的碰撞对 BLE 来说重点是LL Procedure Collision对应错误码0x2312.3 发生 collision 后Controller 可以内部处理Controller 可以等待对端发起的 procedure 完成然后用该结果生成本端命令的 completion event。这种情况下collision 不上报给 Host。12.4 Controller 也可以直接向 Host 上报 0x23Controller 可以通过该命令对应的 completion event 返回LMP Error Transaction Collision / LL Procedure Collision 0x2312.5 0x23 通常出现在 completion event 中而不是 Command Status 中因为这个错误发生在Command Status Success 之后 底层 procedure 执行过程中所以它属于后续 completion event 的错误。13. 最核心的一句话这一节可以总结为当 Host 发出的 HCI Command 已经被 Controller 接受并开始执行后如果底层 LMP transaction 或 BLE Link Layer procedure 与对端同时发起的相同流程发生碰撞Controller 要么等待对端流程完成并用其结果返回给 Host要么在命令对应的 completion event 中返回 0x23因此 Command Status 成功并不代表底层流程一定最终成功。对 BLE 学习最重要的是LL procedure 是 Controller 之间的底层链路过程Host 通过 HCI Command 触发它但最终能不能成功还可能受到对端同时发起 procedure 的影响。

相关新闻