高级特性与优化 - 第338页
NVME2.0协议解读 1 min read

高级特性与优化 - 第338页

Blog Author

我们继续深入分析《NVM Express® Base Specification, Revision 2.0b》中的 Figure 383 - Connect Response 状态码解释 及进入第 6.4 节 Disconnect Command 断开连接命令机制,帮助你完全掌握 NVMe-oF 的连接和断连过程。


🧩 一、Figure 383: Connect Response – Dword 0 字段详解(根据不同 Status Code)


✅ 1. 成功连接 (Status: Successful Completion)

📦 Bytes 01:00 – Controller ID (CNTLID)

  • 指定分配给主机的控制器 ID。
  • 若 Connect 命令中请求了特定控制器,则此字段返回相同的值。
  • ✅ 若使用 FFFFh(动态分配),此处返回系统分配的控制器 ID。

🔐 Bytes 03:02 – Authentication and Security Requirements (AUTHREQ)

  • 表示该连接所需的 身份验证与安全协议要求,每一位含义如下:
Bit 名称 含义
2 ASCR (Authentication and Secure Channel Required) 若设为 1,需执行身份验证 + 安全通道建立(Secure Channel);ATR 应为 0
1 ATR (Authentication Transaction Required) 若设为 1,需执行身份验证;若为 0,不需。
0 Obsolete 废弃位,无意义。
15:3 Reserved 保留,必须为 0。

📌 判断是否需要安全认证与加密通道通信的重要依据!


❌ 2. 连接参数无效 (Status: Connect Invalid Parameters)

🧭 Bytes 01:00 – Invalid Parameter Offset (IPO)

  • 表示无效参数在 SQ Entry 或 Data Buffer 中的 偏移地址(单位:字节)。

⚙️ Byte 02 – Invalid Attributes (IATTR)

  • Bit 0:
  • 0:IPO 是从 命令结构体 SQE 起始偏移。
  • 1:IPO 是从 数据区起始偏移。
  • Bit 7:1:保留。

Byte 03 – Reserved(保留)


❗ 3. 其它错误状态(例如认证失败等)

  • Bytes 03:00:全部为保留字段(Reserved)。
  • 不返回任何额外信息。

🔄 二、6.4 Disconnect Command(断开命令)


🧨 功能

  • 用于 删除当前 I/O Queue 对应的 Submission 和 Completion Queue
  • 💥 不能在 Admin Queue 上使用此命令。

🔍 使用规则:

条件 行为
若在 Admin Queue 上执行 Disconnect 控制器返回 Invalid Queue Type
若控制器此时 无法删除队列(资源冲突) 返回 Controller Busy
执行成功 当前 I/O Queue 被完全删除,不再接收新命令。

📝 命令行为约束:

  • Disconnect 后控制器将不再处理该队列的任何命令。
  • 完成队列中该命令对应的 Completion Entry 是该队列的最后一个 Entry
  • 断开命令本身不会删除 NVMe Transport 层的连接,需主机和控制器在所有 Queue 删除后再清理 Transport 连接资源(参考第 3.3.2.4 节)。

📘 小总结:Fabrics Connect + Disconnect 机制理解图

+--------------------------+
|   Host / Fabrics Driver  |
+-----------+--------------+
            ↓ Connect (7Fh, 01h)
        +---+---+  ← CID, NQN, HOSTID, etc.
        | Ctrl  |  ← 分配 CNTLID, 返回 AuthReq
        +---+---+

     创建 I/O Queues 后
            ↓ Disconnect (7Fh, ...)
        +---+---+
        | Ctrl  | → 删除 SQ/CQ,释放资源
        +-------+

📌 下节预告: 你想继续学习第 6.5 节 Property Set/Get 命令机制 吗?我们将进入 NVMe-oF 中实现远程寄存器读写与控制器属性操作的部分。如果你有任何场景想结合(如多主机、容器化存储等),也可以一起分析~