4. 消息服务模型
4.1 NVMe-MI 消息
图23展示了NVMe-MI消息的分类。NVMe-MI消息的两个主要类别是请求消息和响应消息。当使用带外机制时,请求消息由管理控制器发送到管理端点。在使用带内隧道机制时,请求消息由主机软件发送到NVMe控制器。发送请求消息的实体统称为请求者,接收请求消息的实体统称为响应者。在接收到请求消息后,响应者处理请求消息。当处理完成时,响应者向请求者发送一个响应消息。
请求消息可以分类为命令消息或控制原语。命令消息指定响应者要执行的操作,可以进一步分类为NVMe-MI命令、NVMe管理命令或PCIe命令。控制原语在带外机制中使用。
响应消息可分为成功响应和错误响应。
4.1.1 请求消息
请求消息是由请求者生成并发送给响应者的NVMe-MI消息。请求消息指定响应者要执行的操作。请求消息一共有两种类型:Command Message、Control Primitive。
其中Command Message命令消息的消息体格式与命令集相关,由消息头中的NMIMT字段指定。NVMe-MI支持三种命令集:
- 管理接口命令集:Management Interface Command Set,协议第5章;
- NVM Express管理命令集:NVM Express Admin Command Set,协议第6章;
- PCIe命令集:PCIe Command Set,协议第6章。
4.1.2 响应消息
响应消息是当响应者完成先前发出的请求消息后,生成的NVMe-MI消息。
响应消息的格式如图24和图25所示。第一个dword包含消息头Message Header。Status字段对响应消息关联的状态进行编码。接下来是Response Body,其格式跟NVMe-MI消息类型和特定的消息状态有关,最后如果完整性检查(IC)位设置为“1”,则响应消息以NVMe-MI消息完整性检查字段结束。
在带外机制中,消息头中的CSI位指定了响应消息与之关联的请求消息的命令槽位。NVMe-MI消息类型(Msg Type)字段跟请求消息中相同字段的值保持一致。
在带内隧道机制中,Message Header中的CSI位是保留的。
响应消息Status状态表:
4.1.2.1 通用错误响应
如果在响应消息状态Status之外,未提供其他信息的错误,将生成通用错误响应。Byte7:5被保留,通用错误响应的格式如图27所示。
4.1.2.2 无效参数错误响应
当Status字段设置为无效参数 Invalid Parameter(04h),无效参数响应格式如图28所示,响应特定字段汇总在图29中。
该字段表示请求消息中包含的第一个无效参数的Byte位置和Bit位。
4.2 带外消息服务模型
本规范中的带外机制使用请求和响应服务模型。管理控制器向管理端点发送请求消息,管理端点处理请求消息,当处理完成时,将响应消息发送回管理控制器。在任何情况下,管理端点都不会生成未经请求的响应消息。
与可能跨越多个MCTP数据包的其他NVMe-MI消息不同,包含控制原语的NVMe-MI消息应仅包含一个MCTP数据包。
本规范利用命令槽来提供命令消息服务。管理控制器向管理端点发送命令消息,该消息以管理端点中的特定命令槽为目标。一个管理控制器还未收到上一条发布到命令槽的命令消息的响应消息时,不应该发送一个新的命令消息。每个管理端点包含两个命令槽,每个都包含状态信息和暂停标识。
Command Message 命令消息是管理端点可以接收的唯一类型的多包NVMe-MI消息。传送到管理端点的命令消息的最大数量等于命令槽的数量。每个命令槽的操作都是独立的,允许管理控制器有两个独立的命令消息流到管理端点。与每个命令槽相关的命令消息是并行服务的。如果NVM子系统实现多个管理端点,则每个管理端点的命令服务并行发生。一个实现N个管理端点的NVM子系统可能有多达2N个并行服务的命令消息。
图30是命令服务状态图用于描述功能需求,并不强制执行。
- Idle 空闲:这是命令服务状态机的默认状态(例如,在复位之后)。当接收到命令消息的第一个MCTP包(MCTP包头中的SOM位为1且消息类型MT为4h的MCTP包)时,命令服务从Idle状态转换到Receive状态。
- Receive 接收: 当命令消息的第一个数据包已经被接收并且正在被组装或验证时的状态。当接收到Abort Control Primitive或消息完整性check失败时,命令服务从Receive转换为Idle状态;当命令消息完整性检查成功时,命令服务从Receive转换为Process状态。
- Process 处理:处理命令消息时的状态。命令消息的处理包括检查命令消息的错误并执行命令消息指定的操作或中止命令消息。当需要发送响应消息时,命令服务从Process状态转换成Transmit状态(即,暂停标志被清除为0)。当接收到Abort Control Primitive,命令服务从Process状态转换到Idle状态。
- Transmit 传输:命令消息的响应消息被传输到管理控制器的状态。一旦与命令消息的响应相关联的整个NVMe-MI消息已经在物理层传输或由于接收到Abort Control Primitive,命令服务从Transmit状态转换到Idle状态。
注意:将两个或多个重叠命令消息接收到同一命令槽的行为是不允许的,如果这样导致管理端点丢弃命令消息,则这认为是接收到非空闲命令槽(CMNICS)的命令消息。
4.2.1 控制原语
Control Primitives控制原语是从管理控制器发送到管理端点的请求消息。作用是:
- 影响先前发出的命令消息的服务(Pause 、Resume、 Abort、 Replay);
- 获取命令槽的状态和管理端点(Get State)。
控制原语仅适用于带外机制,在带内隧道机制中被禁止。控制原语以命令槽为目标,与Command Message 命令消息不同,Control Primitives控制原语可以在命令槽处于任何命令服务状态时发送,并由管理端点立即处理。除非另有说明,否则控制原语不会更改命令槽的命令服务状态。
Control Primitives 控制原语的格式如图31所示,字段描述如32中描述。
- CPO控制原语操作码:该字段指定要执行的控制原语的操作码,如图33。
- TAG 标签:该字段是一个不确定的值,由管理控制器发送并由管理端点返回到相应的响应消息中,管理控制器可以使用此字段中的任何值。
- CPSP:此字段用于传递Control Primitive特定参数信息。
控制原语关联的成功响应的格式如图34所示,字段在图35中描述。
当与该控制原语相关联的动作完成时,管理端点向管理控制器发送响应消息。与Command Message不同 ,管理控制器可以向命令槽发出控制原语,而无需等待对先前向该命令槽发出的控制原语的响应。如果发送多个控制原语而不等待来自管理端点的响应,则仅保证与最后一个控制原语相关联的动作和响应(即,与先前发出但未确认的控制原语相关联的动作可能会或可能不会执行,并且响应)。控制原语的接收永远不会破坏与命令槽关联的先前控制原语。响应消息要么被完全传输,要么被丢弃。
TAG字段是从控制原语请求消息复制到响应消息中的不透明值。通过使用唯一的TAG值,管理控制器可以将响应消息与请求消息链接起来(例如,使用序列号?)。
4.2.1.1 Pause
Pause控制码用于暂停响应传输和暂停管理端点中两个命令槽的超时等待数据包。暂停控制原始码中的CSI位不使用,应清除为0h。
与每个命令槽相关的是一个暂停标志,它决定槽是否被”暂停“。暂停标志的状态包括在成功响应中,也可使用获取状态原语读取。
暂停原语的CPSP字段为预留。控制原语成功响应中CPSR字段的格式如图36所示。
命令槽上的暂停控制原始码的结果取决于收到暂停控制原始码时命令槽的命令服务状态,如下所述。
服务状态 | 响应结果 |
Idle | 暂停原语无效,暂停标志也不会改变 |
Receive | 暂停单元将暂停标志设置为1,并提醒管理端点,与该命令相关的其余MCTP数据包可能被延迟。在暂停标志被设置时,发送到该命令槽的进一步数据包被正常接收。 |
Process | 暂停单元将暂停标志设置为1,命令槽将会保持在Process状态,直到收到Resume控制原语。暂停对命令槽中的命令处理没有影响。尽管命令处理可以完成,但命令槽不应该过渡到传输状态。 |
Transmit | 暂停原语将暂停标志设置为1,暂停传输与命令槽中的命令相关的数据包边界上的MCTP响应数据包。 |
管理端点在收到暂停原始语后应发送一个具有成功状态的响应消息。当一个命令槽已经暂停时, 再发出一个暂停控制原语不是一个错误的行为。
当暂停标志被设置为 "1 "时,管理端点禁用超时等待数据包计时器,并且不传输对命令的响应。等待数据包的超时时间是100毫秒或适当的MCTP传输绑定规范中定义的时间, 以两者中较小者为准。在管理端点暂停时,管理控制器不应发送命令。
4.2.1.2 Resume
Resume控制原语用于从Pause的状态中恢复。这是对Pause控制原语的补充。与Pause控制原语一样,Resume控制原语影响两个槽,Resume控制原语中的CSI位应被清空为'0'。如果一个命令槽在收到Resume原始码之前没有暂停,则Resume原始码会成功完成,没有任何影响。
Resume原语的CPSP字段被保留。控制原语成功响应中的CPSR字段被保留。
Resume控制原语的结果是基于收到Resume控制原语时命令槽的命令服务状态,如下所述。
服务状态 | 响应结果 |
Idle | 暂停原语无效。 |
Receive | Resume原语提醒管理端点,与该命令相关的任何剩余MCTP数据包的传输正在恢复。暂停标志被清除为’0‘ |
Process | Resume原语允许先前暂停的命令槽在处理完成后过渡到发送状态,并在对恢复原语做出响应后开始发送一个响应。暂停标志被清除为‘0’ |
Transmit | 管理端点在对恢复原语作出响应后,恢复传输与该时隙相关的命令所对应的响应。暂停标志被清除为‘0’ |
管理端点在收到恢复原语后,应发送一个带有成功状态的控制原语响应消息。
4.2.1.3 Abort
Abort控制原语用于将一个命令槽重新初始化为空闲状态,将与该命令槽相关的暂停标志清除为‘0’,并尝试中止与该命令槽相关的命令服务。
中止一个命令信息对管理端点的其他命令槽、其他管理端点或NVMe子系统中的NVMe控制器没有影响。命令槽中的后续命令服务不受中止的影响。管理控制器可以发出一个中止原语,以清理处于未知状态的命令槽相关的资源。
中止原语的CPSP字段为预留。控制原语成功响应中的CPSR字段格式如图37所示。
Abort控制原语的结果是基于收到Abort控制原语时命令槽的命令服务状态,如下所述。
服务状态 | 响应结果 |
Idle | 中止原语无效。管理端点应发送一个具有成功状态的响应信息,CPAS字段被清除为0h。 |
Receive | 管理端点丢弃命令槽的内容并过渡到空闲状态。管理端点应发送一个带有成功状态的响应信息,CPAS字段设置为1h。 |
Process | 中止原语使命令槽中的命令的处理被中止。 (a)如果在命令处理开始之前收到中止原语,则管理端点会丢弃命令槽的内容并过渡到空闲状态。管理端点应发送一个成功的响应,CPAS字段设置为1h;或 (b)如果在处理命令时收到了中止原语,则管理端点会丢弃命令槽的内容并过渡到空闲状态。管理端点试图中止该命令。 1. 如果命令被中止,并且对NVM子系统没有影响,那么管理端点应发送一个成功响应,CPAS字段设置为1h。 2. 如果管理端点无法中止命令,那么管理端点应发送一个成功响应,并将CPAS字段设置为2h;或 3. 如果命令已经完成处理(例如,管理端点暂停),那么管理端点应发送一个成功响应,CPAS字段被清除为0h。 |
Transmit | 管理端点丢弃命令槽的内容并过渡到空闲状态。管理端点传送一个带有成功状态的响应信息,CPAS字段被清除为0h。 |
向一个暂停的槽发出中止控制原语不是错误。槽的状态被重新初始化,将暂停标志清除为‘0’。
4.2.1.4 Get State
获取状态控制原语用于获取一个命令槽和管理端点的状态。请求消息中CPSP字段的格式如图38所示。
管理端点在收到获取状态原语后,应发送一个具有成功状态响应消息。控制原语成功响应中的CPSR字段的格式如图39所示。其中CS ‘Yes’表示该字段的值在管理端点内每个命令槽是独立的。
4.2.1.5 Replay
Replay控制原语用于重传在一个命令槽中处理的最后一个命令信息的响应信息。Replay的响应信息形成一个新的MCTP响应信息,其信息数据从原始响应信息的响应Replay偏移量开始,一直到响应信息的末尾,包括原始MIC。
4.2.2 带外错误处理
本节描述了NVMe-MI带外消息处理模型的特定错误处理。
4.2.2.1 命令超时
MCTP定义了MCTP控制消息的最大响应时间(参考相应的MCTP传输绑定规范)。
如果管理端点确定命令处理可能无法在100ms或适当的MCTP传输绑定规范中规定的请求-响应时间(以较短者为准)内完成,管理端点应利用“需要更多处理”响应机制。当传输繁忙或不可用时,来自管理端点的响应消息允许延迟到该超时之外。
管理端点应该只对预计需要超过规定时间的命令(例如,格式化NVM)使用更多处理要求的响应。强烈不鼓励实施者在处理所需时间小于或等于所需时间的命令信息时使用该响应。
4.2.2.2 控制原语超时
管理端点应尝试在100ms或适当的MCTP传输绑定规范中指定的请求-响应时间(以较短者为准)内对控制原语作出响应。当传输繁忙或不可用时,来自管理端点的响应消息允许延迟超过这个超时。