队列模型 - 📘 一、NVMe In-band 认证与队列使用 (第98页)
NVME2.0协议解读 1 min read

队列模型 - 📘 一、NVMe In-band 认证与队列使用 (第98页)

Blog Author

继续分析 NVM Express® Base Specification, revision 2.0b 第 87 页 的内容,重点包括 NVMe in-band 认证队列初始化和队列状态管理I/O 队列删除 机制等关键概念。


📘 一、NVMe In-band 认证与队列使用

在 NVMe over Fabrics 中,NVMe in-band 认证 是连接队列之前的必要步骤。认证是确保通信安全的一部分,并且在某些情况下是强制要求的。

认证顺序和条件:

  1. 认证前的限制:
  2. 在执行 Fabrics 命令Admin 命令I/O 命令 之前,必须先完成 NVMe in-band 认证(如果需要的话)。

  3. 连接命令执行:

  4. Admin Queue 的 Connect 命令 执行成功后,如果认证通过,控制器才会允许提交 Fabrics 命令
  5. 控制器准备就绪(CSTS.RDY = 1)后,才可以同时提交 Fabrics 命令Admin 命令
  6. I/O Queue 的 Connect 命令 可以在控制器就绪后执行成功并开始提交 I/O 命令。

  7. 连接响应内容:

  8. Connect 响应 包含了分配给主机的控制器 ID。
  9. 所有后续针对该控制器创建 I/O 队列的 Connect 命令必须来自同一主机,并使用相同的 NVMe 传输连接、主机标识符(Host Identifier)、主机 NQN 和 NVM 子系统 NQN。
  10. 如果这些条件不匹配,Connect 命令将失败

📘 二、队列初始化与队列状态(Queue Initialization and Queue State)

队列创建过程:

  1. Connect 命令成功完成 后,相关的 Admin 提交队列完成队列I/O 提交队列完成队列 会被创建。

  2. 重复创建检查

  3. 如果主机发送一个 Queue ID 已经存在的 Connect 命令,则会返回 Command Sequence Error 错误码。

认证要求字段:

  • AUTHREQ 字段:在 Connect 响应中,AUTHREQ 字段表示是否需要进行 NVMe in-band 认证

  • AUTHREQ = 0:表示认证不需要,队列创建成功后即可使用。

  • AUTHREQ ≠ 0:需要进行认证。此时,队列将等待 Authentication SendAuthentication 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 队列的删除可能由以下两种情况触发:

  1. Disconnect 命令:主机和控制器之间交换 Disconnect 命令 和响应,触发 I/O 队列删除。

  2. 传输错误:在 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 匹配控制器并管理队列)

我可以继续为你逐项分析。你希望接下来深入哪部分内容?