3. 消息传输
该规范定义了一个支持多种消息传输的接口。消息格式与带外机制和带内隧道机制相同。
3.1 NVMe-MI消息
NVMe-MI消息在带外机制和带内隧道机制中都有使用。NVMe-MI消息的格式如图17和图18所示。
在带外机制中,NVMe-MI消息由一个或多个MCTP包的有效负载组成。NVMe-MI消息的最大大小为4224Byte(即:4KB + 128Byte)。请参考MCTP绑定规范上的NVMe管理消息。长度大于4224Byte的NVMe-MI消息被认为是无效的。
在带内隧道机制中,NVMe-MI消息不拆分为MCTP报文,且NVMe-MI消息的最大大小等于最大数据传输大小(MDTS),可以参考NVM Express规范。
3.1.1 NVMe-MI消息字段
NVMe-MI消息的格式由:Message Header(1dword) + Message Data + Message Integrity Check(1dword)。如果完整性检查(IC)bit设置为“1”,则NVMe-MI消息以IC结束。
消息头包含MCTP基本规范定义的消息类型(MT)字段和完整性检查(IC)位。消息类型字段指定消息体中包含的有效负载类型,在所有NVMe-MI消息中需要设置为4h(参考MCTP id和代码规范)。完整性检查(IC)字段表示NVMe-MI消息是否受消息完整性检查保护。
- 带外机制中所有的NVMe-MI消息都有32位CRC保护,IC字段应该设置为“1”
- 带内隧道机制中所有的NVMe-MI消息没有CRC保护,IC字段应该设置为“0”
消息头中的(POR)位指定了NVMe-MI消息是请求消息还是响应消息。消息类型(NMIMT)字段指定消息是控制原语还是命令消息的特定类型。命令槽标识符(CSI)位指定了在带外机制中NVMe-MI消息与之关联的命令槽。
消息头中的管理端点缓冲区(MEB)位指定消息数据是包含在NVMe-MI消息的相关消息数据字段中,还是包含在管理端点缓冲区中。这个位应该只在支持管理端点缓冲区操作的命令消息中设置。在任何其他命令消息中设置此位都是错误的,当发生此情况时,将响应无效参数命令消息。
3.2 带外消息传输
本规范中定义的带外机制利用MCTP作为管理控制器和管理端点之间可靠的有序消息传输。
3.2.1 MCTP包
在MCTP基本规范中,数据传输的最小单位是MCTP包。将一个或多个报文组合起来创建MCTP消息。在这个规范中,MCTP消息被称为NVMe-MI消息。一个数据包总是包含至少1Byte的有效载荷,但总长度不得超过协商的MCTP传输单元大小。MCTP数据包的格式如图20所示。
MCTP规范使用大端字节排序,而NVM Express规范使用小端字节排序。本规范中所有图形都使用小端字节排序进行说明。注意:实际物理层上还是使用的大端排序。
物理介质专用的报头、报尾由端口使用的MCTP传输绑定规范定义。
管理组件传输协议(MCTP)基本规范定义了MCTP报头,MCTP包字段如图21所示。符合要求的管理端点应实现MCTP基本规范中定义的所有MCTP要求的特性。可能支持可选特性。
3.2.1.1 报文组装成消息
一个NVMe-MI消息可以被分解成多个MCTP包载荷,并作为一系列包发送。图22显示了一个NVMe-MI消息示例,它的内容被分成四个MCTP包。请参阅MCTP基本规范了解封包和消息组装规则。
NVMe-MI消息 = N个MCTP包(NVMe-MI MCTP Message)
除了MCTP基本规范和传输绑定规范中概述的要求外,该规范还有以下附加要求:
- 除消息中最后一个数据包外,给定消息中所有数据包的MCTP传输单元大小应与协商的MCTP传输单元大小相等;
- 一个完整的NVMe-MI 消息组装完成后,就需要校验消息的完整性。如果校验通过,则处理NVMe-MI消息;如果校验失败,则丢弃NVMe-MI消息。