队列模型 - 📘 一、NVMe In-band 认证与队列使用 (第98页)
继续分析 NVM Express® Base Specification, revision 2.0b 第 87 页 的内容,重点包括 NVMe in-band 认证、队列初始化和队列状态管理、I/O 队列删除 机制等关键概念。
📘 一、NVMe In-band 认证与队列使用
在 NVMe over Fabrics 中,NVMe in-band 认证 是连接队列之前的必要步骤。认证是确保通信安全的一部分,并且在某些情况下是强制要求的。
✅ 认证顺序和条件:
- 认证前的限制:
-
在执行 Fabrics 命令、Admin 命令 或 I/O 命令 之前,必须先完成 NVMe in-band 认证(如果需要的话)。
-
连接命令执行:
- Admin Queue 的 Connect 命令 执行成功后,如果认证通过,控制器才会允许提交 Fabrics 命令。
- 控制器准备就绪(
CSTS.RDY = 1)后,才可以同时提交 Fabrics 命令 和 Admin 命令。 -
I/O Queue 的 Connect 命令 可以在控制器就绪后执行成功并开始提交 I/O 命令。
-
连接响应内容:
- Connect 响应 包含了分配给主机的控制器 ID。
- 所有后续针对该控制器创建 I/O 队列的 Connect 命令必须来自同一主机,并使用相同的 NVMe 传输连接、主机标识符(Host Identifier)、主机 NQN 和 NVM 子系统 NQN。
- 如果这些条件不匹配,Connect 命令将失败。
📘 二、队列初始化与队列状态(Queue Initialization and Queue State)
✅ 队列创建过程:
-
Connect 命令成功完成 后,相关的 Admin 提交队列 和 完成队列 或 I/O 提交队列 和 完成队列 会被创建。
-
重复创建检查:
- 如果主机发送一个 Queue ID 已经存在的 Connect 命令,则会返回 Command Sequence Error 错误码。
✅ 认证要求字段:
-
AUTHREQ 字段:在 Connect 响应中,AUTHREQ 字段表示是否需要进行 NVMe in-band 认证。
-
AUTHREQ = 0:表示认证不需要,队列创建成功后即可使用。
- AUTHREQ ≠ 0:需要进行认证。此时,队列将等待 Authentication Send 和 Authentication Receive 过程完成认证。
✅ 认证命令的处理:
- 如果控制器要求或正在进行 NVMe in-band 认证,则它会中止所有除认证命令外的命令,并返回 Authentication Required 错误码。
- 一旦认证成功,控制器会 中止所有认证命令,并返回 Command Sequence Error 错误码,表示认证已完成。
📘 三、I/O 队列删除(I/O Queue Deletion)
在 NVMe over Fabrics 环境下,I/O 队列的删除过程与传统的 PCIe 队列删除机制有所不同。I/O 队列的删除涉及到 Disconnect 命令 或 传输错误 的处理。
✅ I/O 队列删除条件:
I/O 队列的删除可能由以下两种情况触发:
-
Disconnect 命令:主机和控制器之间交换 Disconnect 命令 和响应,触发 I/O 队列删除。
-
传输错误:在 NVMe Transport 连接上检测到错误,也会导致 I/O 队列的删除。
✅ 删除支持的标识:
-
主机支持 I/O 队列删除:通过在 Connect 命令 中设置 CATTR 字段的第 3 位为
1来表示。 -
控制器支持 I/O 队列删除:通过在 Identify Controller 数据结构中的 OFCS 字段的第 0 位为
1来表示。
✅ 删除后的影响:
-
如果 主机和控制器都支持删除,删除 单个 I/O 队列 只会影响该队列及其关联的 NVMe 传输连接,不会影响其他队列。
-
如果 主机或控制器不支持删除 I/O 队列,则删除 单个 I/O 队列 或 NVMe Transport 连接终止 会导致 所有队列的关联关系被终止。
🧠 四、总结与关键点
| 概念 | 说明 |
|---|---|
| NVMe In-band 认证 | 在执行其他命令之前,必须完成认证。认证成功后,才可提交 Admin 命令、I/O 命令。 |
| 队列初始化 | Connect 命令成功后,创建 Admin 或 I/O 队列,若队列已存在,则返回 Command Sequence Error。 |
| 认证要求(AUTHREQ) | 控制器响应中指示是否需要认证,若需要,则队列在认证完成后才能使用。 |
| 认证命令处理 | 控制器在认证过程中中止非认证命令,认证完成后中止所有认证命令,防止重复认证。 |
| I/O 队列删除 | 通过 Disconnect 命令 或 传输错误 删除 I/O 队列,需主机和控制器都支持。 |
| I/O 队列删除的影响 | 删除单个 I/O 队列时,若主机和控制器都支持删除,则不影响其他队列。 |
如果你希望继续探索:
- NVMe In-band 认证的实现流程和命令(如 Authentication Send/Receive)
- Disconnect 命令 和 I/O 队列删除 的详细操作步骤与状态码分析
- Queue ID 与 Controller ID 的匹配关系(如何通过队列 ID 匹配控制器并管理队列)
我可以继续为你逐项分析。你希望接下来深入哪部分内容?