Discovery服务过程跟踪
对于NVMe over Fabrics的subsystem,有两种类型:Discovery子系统和NVM子系统。这里介绍与Discovery子系统相关的交互内容(即:在Linux系统上使用nvme discover命令后的交互过程)。
Discovery子系统无Namespace存储空间,只响应相关的Fabric命令和Admin命令。这也就意味着主机与Discovery子系统只需要NVMe协议规格说明书中定义的Admin Submission Queue,而不需要IO Submission Queue。(之后描述Submission Queue简写SQ,描述Completion Queue简写CQ)。
参考NVMe over Fabrics协议规格说明书1.5.3 Capsules and Data Transfer章节中定义,交互内容格式如下边截图:
SQ请求使用的格式为:(其中前64字节为NVMe Command)
CQ回复使用的格式为:(其中前16字节为Completion内容)
Discovery子系统可以处理的命令包括Fabric命令和一部分Admin命令:
接下来按交互过程顺序来介绍。
1. 连接connect命令
此命令归属Fabric命令。
主机initiator端与target端Discovery子系统交互(注意:此connect命令前,需要已经存在Fabric链路作为SQ和CQ),由主机端发起connect命令。
参考下边抓包信息可以看到,connect命令包含了如下关键数值:
opcode为0x7f、命令ID为0、Fabric Command Type为0x01、QueueID为0、Queue最大值31、Keep Alive Timeout为0(不超时)。
在此交互的Capsule的数据内容大小占用1024字节,包含了主机标识、Controller ID、被请求的NQN、主机NQN,这4个主要内容。
本例子中,Controller ID填写了0xFFFF(65535),表示不指定controller。
允许连接的情况,回复如下内容:
其中Value: 1表示建立连接的controller的ID号为1。
备注:连接两种NVM子 |