NVMe over Fabrics 协议Discovery服务交互过程跟踪
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子系统的过程是一样的,只是连接Discovery子系统时,请求的NQN是固定的nqn.2014-08.org.nvmexpress.discovery |
2. 获取property属性(CAP)
此命令归属Fabric命令。
查询property属性(此属性对应PCIe场景下的register map for the controller),opcode用0x7f,Fabric命令类型为0x04(即表示property Get),如下示例中的查询property属性,Attribute为1表示读取8个字节,offset为0表示从property空间的偏移0开始读取。
从propert属性定义可以看出,此命令请求目的是获取CAP(Controller Capabilities):
补充说明:对于Discovery子系统的控制器来说,只支持如下属性,其他的被Reserved:
对应的回应如下,此Response回应对应的是命令ID 14,查询出来的内容是CAP属性,值为十六进制ff 03 00 0f 20 00 00 00。
从NVMe规格说明书中查询CAP的8字节(64 bit)中各bit位表示的意思如下:
对照可以得出:
15:00对应的值ff 03,表示MQES队列深度可以支持1023(0x03ff=1023)。
23:16对应的值是00,表示CQR不是物理连续的,AMS仲裁机制支持也为0不支持。
31:24对应的值是0f,表示TO,从CC.EN使能到等待CSTS.RDY就绪的最坏超时时间。
37bit设置了1,表示CSS命令集支持,1表示支持NVM command Set。
3. 设置property属性(CC.EN)
此命令归属Fabric命令。
下边截图中,Attributes值为0表示设置4字节,offset是0x14,从前边截图Figure 30 Discovery Controller -properties可以得出是在设置CC(Controller Configuration)。
参照NVMe规格说明书,Controller Configuration对应bit位的意思,如下边截图Figure 78: Offset 14h: CC - Controller Configuration
本例子中的设置property属性目的是Enable使能controller。
回应的response如下:
4. 查询property属性(CSTS.RDY)
本次查询property属性时填写的offset偏移量0x1c,Attribute为0即读取4个字节,参照property属性表可知,本次查询的是CSTS(Controller STATUS)。
接下来,看回应response的内容:
对应查询命令ID 23的回复值是Value为1。
参照CSTS对应bit位的意思,可知,本次查询的CSTS.RDY为1,表示Controller已经ready。
5. 查询property属性(VS)
此命令归属Fabric命令,查询property属性中的offset偏移0x08位置,参照Figue 30即可得知查询的是version版本号。
回应此命令24的response内容为:
参照property属性表解释,可得知,Controller使用的NVMe协议版本是1.3.0。
附加说明:
对于主机端,查询此版本号,可以区分1.1.0版本及以后的版本,CAP中有NSSRC功能,此bit位的意思如下:
在linux系统中,主机就用查询版本号判断是不是1.1.0版本及以后的版本,来区分是否支持CAP.NSSRC功能。其他的当前还未看到主机端用版本区分功能的地方。
6. 获取property属性(CAP)
获取CAP,本次查询到的信息与使能前查询的到的信息一样。
这里出现了重复查询。本例子是使用的NVMe over TCP方式抓包的,是Linux系统下的操作,相关代码:
nvme_tcp_configure_admin_queue()
--> ctrl->ops->reg_read64(ctrl, NVME_REG_CAP, &ctrl->cap); //读一次
--> nvme_enable_ctrl(ctrl, ctrl->cap);
--> nvme_init_identify(ctrl);
--> ctrl->ops->reg_read32(ctrl, NVME_REG_VS, &ctrl->vs);
--> ctrl->ops->reg_read64(ctrl, NVME_REG_CAP, &cap); //又读一次
回应如下:
以上完成了主机与target端Discovery服务的Fabric连接过程。
接下来开始进行Admin Command处理分析。
7. Identify查询命令id-ctrl(Admin Command)
此命令归属Admin Command。
执行nvme id-ctrl命令的结果。
这里Identify查询命令,opcode为0x06,CNS字段填充0x01,表示查询controller Identify,注意:Discovery只定义了CNS为0x01的处理,其他情况未定义。
结合上边Figure 33: DiscoveryController - Identify Controller Data Structure回应内容解析,可知回应的内容大小为3072字节。
本例子操作时获取到的回应数据为:
Completion Queue Entry对应的16字节内容为:
接下来数据参照Figure 33分析:
Firmware Revision (FR): 5.0.7
Maximum Data Transfer Size (MDTS): 0 //固定填写0
Controller ID (CNTLID): 1
Version (VER): 1.3.0
Log Page Attributes (LPA): 0x04
Error Log Page Attributes (ELPE): 0x00
Maximum Outstanding Commands (MAXCMD): 0x00000000
SGL Support (SGLS): 0x00000000
NVM Subsystem NVMe Qualified Name (SUBNQN): 固定字符串
备注:
测试时使用了NVMe over TCP,分析截图使用了wirshark,需要wirshark 3.0.3之后的版本。
NVMe over Fabrics 协议Discovery服务交互过程跟踪的更多相关文章
- HTTPS协议,SSL协议及完整交互过程
文章转自 https://blog.csdn.net/dfsaggsd/article/details/50910999 SSL 1. 安全套接字(Secure Socket Layer ...
- SSH协议、HTTPS中SSL协议的完整交互过程
1.(SSH)公私钥认证原理 服务器建立公钥:每一次启动sshd服务时,该服务会主动去找/etc/ssh/ssh_host*的文件 客户端通过ssh工具进行连接,如Xshell,SecureCRT 服 ...
- DHCP协议格式、DHCP服务搭建、DHCP协商交互过程入门学习
相关学习资料 http://www.rfc-editor.org/rfc/rfc2131.txt http://baike.baidu.com/view/7992.htm?fromtitle=DHCP ...
- 802.11协议帧格式、Wi-Fi连接交互过程、无线破解入门研究
相关学习资料 Linux黑客大曝光: 第8章 无线网络 无线网络安全攻防实战进阶 无线网络安全 黑客大曝光 第2版 http://zh.wikipedia.org/wiki/IEEE_802.11 h ...
- NVMe over Fabrics又让RDMA技术火了一把
RDMA是个什么鬼?相信大部分不关心高性能网络的童鞋都不太了解.但是NVMe over Fabrics的出现让搞存储的不得不抽出时间来看看这个东西,这篇文章就来介绍下我所了解的RDMA. RDMA(R ...
- NVMe over Fabrics:概念、应用和实现
对于大部分人来说,NVMe over Fabrics(简称NVMf)还是个新东西,因为其第一个正式版本的协议在今年6月份才发布.但是这并不影响人们对NVMf的关注,因为这项依托于NVMe的技术很可能继 ...
- 转:简单的RTSP消息交互过程
简单的RTSP消息交互过程 C表示RTSP客户端,S表示RTSP服务端 1. 第一步:查询服务器端可用方法 1.C->S:OPTION request //询问S有哪些方法可用 ...
- ASP.NET运行机制原理 ---浏览器与IIS的交互过程 自己学习 网上查了下别人写的总结的很好 就转过来了 和自己写的还好里嘻嘻
一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问 ...
- client和nginx简易交互过程
# client和nginx简易交互过程- step1:client发起http请求- step2:dns服务器解析域名得到主机ip- step3:默认端口为80,通过ip+port建立tcp/ip链 ...
随机推荐
- MQ日常命令
假设队列管理器为QMgrName,以下所有使用QMgrName的地方您都可以替换成您维护的mq队列管理器名称. 一.MQ的启动与停止 用root用户启/停需要root用户包含在mqm组中. 1.MQ的 ...
- Linux内核本地提权漏洞(CVE-2019-13272)
漏洞描述 kernel / ptrace.c中的ptrace_link错误地处理了想要创建ptrace关系的进程的凭据记录,这允许本地用户通过利用父子的某些方案来获取root访问权限 进程关系,父进程 ...
- 数据结构(集合)学习之List
集合 框架关系图: Collection接口下面有三个子接口:List.Set.Queue.此篇是关于List<E>的简单学习总结. 补充:HashTable父类是Dictionary,不 ...
- 【笔记】机器学习 - 李宏毅 - 1 - Introduction & next step
Machine Learning == Looking for a Function AI过程的解释:用户输入信息,计算机经过处理,输出反馈信息(输入输出信息的形式可以是文字.语音.图像等). 因为从 ...
- H5_0023:html页面禁止放大缩小页面
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scal ...
- 【Thread】java线程之对象锁、类锁、线程安全
说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来 ...
- elasticsearch学习(1)
安装 elasticsearch ,操作elasticsearch的工具kibana, (1)在kibana中输入GET _cluster/health查看es的健康状况(2)在kibana中输入 G ...
- pandas学习笔记之删除指定列
删除指定 def df["列名"] del df4["韩国地震影响"] 直接删除,df4中不在含有"韩国地震影响"这一列了 drop 不改变 ...
- super().__init__()方法
class first(object): def __init__(self,age,name): self.age = age self.name = name class second(first ...
- 使用Dockerfile构建镜像命令自己的理解
1.FROM 基于那个基础命令开始构建镜像,我的理解就是选择一个操作系统 2.CMD 里面放的是指定一个容器启动时要运行的命令 3.ENTRYPOINT 类似于CDM命令,不过 docker run ...