9 MCTP 桥接
MCTP 提供的一个关键功能是它能够在多个总线之间以及不同类型的总线之间路由消息。此子句描述 MCTP 网桥和 MCTP 终端如何创建、维护和使用路由信息。关于 MCTP 网桥,请记住以下关键点:
- MCTP 网桥负责在至少两条总线之间路由 MCTP 数据包。
- MCTP 网桥通常是其中至少一条总线的总线所有者。
9.1.1 路由/桥接限制
图 7 和图 8 说明了一些受支持和不支持的桥接拓扑。如图所示,给定拓扑具有多个路径来到达给定 EID 是可以接受的。这可能是因为使用了不同的媒介,或者因为在实施中需要冗余或故障转移通信路径。
图 7 – 可接受的故障转移/冗余通信拓扑
图 8 – 路由 / 桥接限制
网桥不得路由或转发具有广播目标 ID 的数据包。
9.1.2 MCTP 网桥的 EID 选项
连接到多条总线的 MCTP 网桥可以具有单个 EID 或多个 EID,通过这些 EID 可以通过 MCTP 控制命令访问网桥的路由配置和端点功能。有三个常规选项:
- 网桥使用单个 MCTP 端点
- 网桥对连接到总线所有者的每条总线使用一个 MCTP 端点
- 网桥对其连接的每条总线使用一个 MCTP 端点
这些不同选项的示例如图 9 所示,图后提供了有关这些选项的更多详细信息。
一个网桥只有一个 EID 池。为防止从多个总线所有者处获取 EID 池分配时出现问题,可通过多个 EID 访问的网桥将仅接受来自使用 Allocate Endpoint IDs 命令接收分配的第一条总线的 EID 池分配。此行为在 Allocate Endpoint IDs 命令的规范中有更详细的介绍。
如有必要,可以使用 Get Endpoint UUID 命令来关联 EID 是否属于同一 MCTP 网桥设备。(此关联对于 MCTP 网络的正常初始化和操作不是必需的,但在调试时可能很有用。
以下是网桥的不同 EID 选项的更详细说明:
- 单个端点:单个端点用于访问网桥的路由配置和端点功能。参考图 9 中的图 (A),实现可以选择将端点功能直接与特定总线/端口(例如,P1)相关联,或者该功能可以位于路由功能后面的“虚拟总线”上。在任何一种情况下,路由功能都可确保可以通过网桥所连接的任何总线访问 EID。 尽管只有一个端点,但网桥应报告在连接到总线所有者的每条总线(例如 P1、P2)上需要为该端点分配 EID。多个公告在 EID 分配过程中提供了一定程度的故障转移功能,以防特定总线所有者变得不可用。多个公告还有助于支持总线所有者之间一致的 EID 分配流程。为了防止从多个总线所有者处获取冲突的 EID 分配,网桥将仅接受来自使用 Set Endpoint ID 命令接收分配的第一条总线的 EID 池分配。Set Endpoint ID 命令的规范中更详细地介绍了此行为。网桥不得报告网桥本身拥有的任何总线上需要分配 EID。
- 与总线所有者的每个总线连接的端点:对于连接到总线所有者的每条总线,网桥都有一个端点。如图 9 中的图 (B) 所示。没有与未连接到总线所有者的总线关联的显式端点(例如,分别连接到端口 P3 和 P4 的总线)。由于数据包路由的工作方式,可以从连接到网桥的任何端口访问 EID A 和 EID B。因此,可以通过多个 EID 访问网桥的配置功能。由于单独的端点通信终端与每个端口 (P1、P2) 相关联,因此网桥可以独立接受每个总线的 EID 分配。 网桥应仅报告在连接到总线所有者的总线上需要分配 EID,并且仅报告与特定总线关联的特定 MCTP 控制接口的需要。例如,网桥将仅通过 P1 宣布需要为与 EID A 关联的接口分配 EID,而需要仅通过 P2 为与 EID B 关联的接口分配 EID。网桥不得报告网桥本身拥有的任何总线上需要分配 EID。
- 每个总线连接的端点:网桥对于连接到它的每条总线都有一个端点,如图 6 中的图 (C) 所示。这包括连接到总线所有者的总线(例如 P1、P2)以及网桥是总线所有者的总线(例如 P3、P4)。由于数据包路由的工作方式,可以从连接到网桥的任何端口访问这些 EID 中的任何一个。 由于单独的端点通信终端与每个拥有的端口(P1、P2)相关联,因此网桥可以独立接受每个总线的总线所有者的 EID 分配。与网桥本身拥有的总线(例如 P3、P4)关联的 EID 应从分配给网桥的 EID 池中取出。 网桥应仅在连接到总线所有者的总线上报告需要分配 EID,并且仅报告与特定总线关联的特定 MCTP 控制接口的需要。例如,网桥将仅通过 P1 宣布需要为与 EID A 关联的接口分配 EID,而需要仅通过 P2 为与 EID B 关联的接口分配 EID。网桥不得报告网桥本身拥有的任何总线上需要分配 EID。
9.1.3 路由表
MCTP 网桥维护一个路由表,其中表中的每个条目都将单个 EID 或一系列 EID 与直接连接到网桥的总线上的设备的单个物理地址和总线 ID 相关联。
如果设备是网桥,则通常会有一系列与网桥的物理地址关联的 EID。也可能有一个条目,其中包含网桥本身的单个 EID。
9.1.4 桥接过程概述
当网桥收到 MCTP 数据包时,将发生以下过程:
1) 网桥检查数据包中的目标 EID 是否匹配或落在表中的 EID 范围内。
2) 如果 EID 用于网桥本身,则网桥在内部使用数据包。
3) 如果与路由表中的条目匹配,则执行以下步骤:
- 网桥更改数据包中的物理地址,并根据目标总线的需要重新格式化特定于介质的标头和尾部字段。
- 源总线的目标物理地址被替换为从路由表中的条目获得的目标总线的目标物理地址。
- 网桥将其收到的数据包中的源物理地址替换为网桥在目标总线上自己的物理地址。这是允许将邮件路由回发起方所必需的。
- 特定于数据包的传输标头和数据完整性字段根据特定传输绑定的需要进行更新。
4) 如果没有匹配项,则 EID 值不在路由表中的数据包将被静默丢弃。
9.1.5 使用桥接的端点操作
网桥不会跟踪端点之间的数据包传输。它只是获取收到的数据包,并根据数据包中的目标 EID 按数据包路由这些数据包。对于路由到其他端点的数据包,它不在意消息组装或反汇编或特定于消息类型的语义,例如请求/响应语义。
大多数简单的 MCTP 端点永远不需要了解网桥。通常,另一个端点将开启与它们的通信。然后,端点只需从消息中获取物理地址和源 EID 信息,并使用这些信息将消息发送回消息发起方。
需要发起到另一个 MCTP 端点的“连接”的端点确实需要知道应该使用什么物理地址来将消息传送到该端点。要获取此信息,它需要向总线所有者查询它。端点知道总线所有者的物理地址,因为它在获得 EID 分配时保存了该信息。
Resolve Endpoint ID 命令请求总线所有者返回用于将数据包路由到给定 EID 的物理地址。(这实质上是用于将 IP 地址转换为物理地址的 ARP 协议的 MCTP 等效项。Resolve Endpoint ID 命令响应中返回的地址将是实现该端点的设备的实际物理地址,或者是用于将数据包路由到所需端点的桥接的物理地址。
由于物理地址格式是特定于媒体的,因此物理地址参数的格式记录在 MCTP 的特定特定于媒体的物理传输绑定的规范中(例如,基于 SMBus/I2C 的 MCTP、基于 PCIe 供应商定义的消息传递的 MCTP 等)。
如果端点 A 收到了来自另一个端点 B 的消息,则它不需要发出 Resolve Endpoint ID 命令。相反,它可以从端点 B 的早期消息中提取源 EID 和源物理地址,然后将其用作发送到端点 B 的消息的目标 EID 和目标物理地址。
9.1.6 路由表项
每个进行桥接的 MCTP 设备都应维护一个逻辑路由表。如果多个 MCTP 设备连接到其拥有的总线,则总线所有者通常还应维护路由表。路由表是必需的,因为总线所有者也是负责将 EID 解析为物理地址的一方。
设备用于组织路由表的内部格式为依赖于实现。从逻辑角度来看,路由表中的每个条目至少由三个元素组成:EID 范围、总线标识符和总线地址。如图 10 所示。
EID range | Bus ID | Bus Address |
图10-基本路由表输入字段
EID 范围指定可通过给定总线上的特定总线地址访问的 EID 集。因为总线 ID 和总线地址可能对应于网桥上的特定“端口”,所以可能会有多个非连续范围(多个路由表条目)具有相同的总线 ID/总线地址对路由。EID 和 EID 范围可分为三种类型:下游、上游和本地。“下游”是指与路由表条目关联的 EID,这些条目适用于维护路由表的网桥所拥有的总线。“上游”是指与路由表条目关联的 EID,这些条目路由到不属于维护路由表的网桥拥有的总线。
“本地”是指位于直接连接到维护路由表的网桥的总线上的端点的路由表条目的 EID。本地 EID 条目的一个特殊特征是 Resolve Endpoint ID 命令是从端点所在的同一总线发出的。网桥/总线所有者提供该端点的物理地址,而不是与路由功能关联的物理地址。这有助于允许同一总线上的端点进行通信,而无需通过 MCTP 路由功能。
即使两个端点位于同一总线上,路由表条目也可能不是 “本地” 的。实现可能要求不同的端点通过 路由函数进行相互通信,即使端点是同一总线的一部分。
总线 ID 是一个内部标识符,允许 MCTP 设备识别与此路由相关的总线。MCTP 不需要使用特定值来识别设备上的给定物理总线连接。但是,此值通常为从 0 开始的数值。
示例:具有三条总线的设备通常会将它们标识为总线“0”、“1”和“2”。
总线地址是总线上特定设备的物理地址,通过该地址可以到达 EID 范围内指定的 EID。这可以是与目标端点对应的物理地址,也可以是设备路径中下一个网桥的物理地址。此地址的格式特定于特定的物理介质,并由物理介质传输绑定定义。
9.1.7 路由表创建
此条款说明了网桥所需的路由信息类型以及信息的来源。该条款还描述了总线所有者为给定总线传达该信息时应使用的步骤。
图 11 有助于说明完全建立网桥(网桥 Y)所需的路由信息所需的步骤。图 11 中的箭头从总线所有者向外指向总线上向内的 “拥有” 端点。
图11— 路由表填充
9.1.7.1 路由表填充示例
参考图 11,以下项目描述了网桥 Y 在所示的示例拓扑中路由消息所需的信息:
- 它需要分配一组 EID,以便自己使用并分配给其他设备(例如,EID 14:16)。这些由总线所有者(网桥X)分配给它。
- 它需要一个路由表,该表具有一个将 EID 16 映射到总线 3 上设备 E 的物理地址的条目。
- 它需要总线 1 上本地设备的路由表条目,即:网桥X (EID 11)、设备 A (EID 12)、设备 B (EID 13) 和网桥 Z (EID 17),假设设备 A 和 B 要通过网桥 Y 到达,而不必通过网桥 X。此信息应由总线所有者(网桥X )提供。
- 它需要知道 EID 8:10 是通过总线所有者/网桥 X 访问的。因此,它需要一个路由表条目,将 EID 范围 9:10 映射到总线 1 上网桥 X 的物理地址。 此信息也应由总线所有者(网桥X)提供给它。
- 需要知道 EID 17:19 是通过桥 Z 访问的。因此,它需要一个路由表条目,将 EID 范围 17:19 映射到总线 1 上网桥 Z 的物理地址。 因为总线所有者(网桥X)首先将该范围的 EID 分配给网桥 Z,所以该信息也由总线所有者(网桥 X)提供给网桥 Y。
9.1.7.2 总线初始化示例
以下任务列表从网桥 Y 所需的描述开始,显示了网桥 X 为总线 1 提供路由信息时应采取的步骤。网桥 X 应:
- 将 EID 分配给设备 A、B、C、D、网桥Y 和网桥Z。这是使用 Set Endpoint ID 命令完成的。Set Endpoint ID 命令的响应还指示设备是否需要额外的 EID 池。
- 将 EID 池分配给网桥Y 和网桥Z。这是使用 Allocate Endpoint IDs 命令完成的。
- 告诉网桥Y 总线 1 上设备 A 和 B、网桥X(自身)和网桥 Z 的物理地址和 EID。这是使用 Routing Information Update 命令完成的。
- 告诉网桥Y,EID 18:19 是通过总线 1 上网桥Z 的物理地址访问的。 这也是使用 Routing Information Update 命令完成的。(步骤 3 和 4 可以组合并包含在命令的一个实例中。)
- 告诉网桥Z 总线 1 上设备 A 和 B、网桥 X(自身)和网桥Y 的物理地址和 EID。这也是使用 Routing Information Update 命令完成的。
- 告诉网桥Z,EID 15:16 是通过总线 1 上网桥Y 的物理地址访问的。 这也是使用 Routing Information Update 命令完成的。(步骤 5 和 6 可以组合使用命令的一个实例进行覆盖。
- 告诉网桥Y和网桥Z,EID 8:10 通过总线 1 上的网桥X 访问。这也是使用 Routing Information Update 命令完成的。此步骤还可以与网桥 Y 的步骤 3 和 4 以及网桥 Z 的步骤 5 和 6 结合使用。
9.1.8 路由表更新总线所有者的责任
为所有网桥初始化后,路由表信息通常不需要在运行期间更新。但是,如果将网桥添加作为热插拔设备,则可能需要更新。在这种情况下,当网桥添加到系统时,它将触发总线所有者为其分配 EID 的需求,这将导致 EID 池分配的请求,依此类推。此时,总线所有者只需选择重新运行总线初始化步骤,如 9.1.7.2 中所述。
9.1.9 合并路由表条目
MCTP 要求在将 EID 池分配给设备时,EID 的范围是连续的,并遵循网桥本身的 EID。因此,当网桥识别到它已收到与同一物理地址和总线的现有条目相邻的 EID 或 EID 范围时,可以选择将路由表信息合并到一个条目中。(EID 分配和路由信息更新未使用同一命令作为一个范围完成的原因是,设备可能已经收到了来自不同总线所有者的分配。
9.2 网桥和路由表示例
以下示例说明了不同的网桥和 MCTP 网络配置,以及网桥应保留的相应信息,以便进行 MCTP 数据包路由,并支持 Resolve Endpoint ID 和 Query Hop 等命令。
以下条款(包括表 4 到表 6)说明了可能的拓扑和桥保留的组织信息的方法。可以选择以不同的方式组织和存储相同的信息来实现。这些示例的重要方面是显示为每个 EID 保留哪些信息,显示哪些操作会导致创建条目,以及显示 EID 或 EID 范围在某些情况下如何映射到多个物理地址。
示例显示了创建表项的可能时间顺序。请注意,相同示例拓扑的给定实现可以以不同的顺序填充条目。例如,如果有两个总线所有者连接到网桥,则没有固定的顺序要求总线所有者初始化下游网桥。此外,不要求总线所有者按特定顺序执行EID分配或EID池分配。一个实现可以选择在为网桥分配EID后立即将EID池分配给单个网桥。另一种实现可能选择先将所有EID分配给设备,然后将EID池分配给网桥。
9.2.1 示例 1:网桥 D2每个“所有者”端口都有一个 EID
图 12 显示了网桥 (D2) 中的路由表,其中 D2 有一个与连接到总线所有者的每条总线关联的 EID。在此示例中,D1 未在其 P1 和 P2 之间实现任何内部桥接。因此,无法通过 EID1 桥接到达 EID2,反之亦然(见表 4,创建时间从上到下递增)。
注意:如果存在内部桥接,则 D1 需要提供路由信息,表明可以通过 EID1 到达 EID2,反之亦然。在这种情况下,D1 将提供 EID 范围 (EID1...EID2) 将通过 SMBus 上的 D1P1a1 和 PCIe 上的 D1P1a2 访问。
密钥:D = 设备,P = 端口,a = 物理地址
图 12 — 示例 1:路由拓扑
表 4 – 示例 1:D2 的路由表
EID | EID接入端口 | 介质类型 | 接入物理地址 | 设备/条目类型 | 条目的创建和填充方式 |
EID10 | P1 | SMBus | D1P1a2 | 网桥,自身 | D1分配D2 EID时自行创建 |
EID11 | P2 | PCIe | D1P2a2 | 网桥,自身 | D1分配D2 EID时自行创建 |
EID12 | P3 | SMBus | D2P3a2 | 端点 | D1分配D2 EID池之后自行创建(通常,在网桥D2将EID12分配给D3之前,不会创建条目) |
EID13 | P3 | SMBus | D2P3a3 | 端点 | D1分配D2 EID池之后自行创建(通常,在网桥D2将EID12分配给D4之前,不会创建条目) |
EID14 | P4 | USB | D2P4a2 | 端点 | D1分配D2 EID池之后自行创建(通常,在网桥D2将EID12分配给D5之前,不会创建条目) |
EID8 | P1 | SMBus | D1P1a1 | 网桥 | D1 通过 Routing Information Update 命令 |
EID9 | P2 | PCIe | D1P2a1 | 网桥 | D1 通过 Routing Information Update 命令 |
9.2.2 例 2:最顶层的总线所有者 D1
图 13 假设以下条件:
- D1 首先分配其内部 EID。
- 总线按顺序 D1P1、D1P2、D1P3 处理。
- D1 在将 EID 分配给设备后立即将 EID 池分配给网桥。
与示例 1 类似,此示例假定 D1 中 P1、P2 和 P3 之间没有内部桥接。表 5 反映了这种情况。
图 13 — 示例 2:路由拓扑
表 5 – 示例 2:D1 的路由表
EID | EID接入端口 | 介质类型 | 接入物理地址 | 设备/条目类型 | 条目的创建和填充方式 |
EID8 | P1 | SMBus | D1P1a1 | 网桥,自身 | 自行创建 |
EID9 | P2 | SMBus | D1P2a1 | 网桥,自身 | 自行创建 |
EID10 | P3 | PCIe | D1P3a1 | 网桥,自身 | 自行创建 |
EID11 | P1 | SMBus | D1P1a2 | 端点 | 将 EID 分配给设备 D2 时自行创建 |
EID12 | P2 | SMBus | D1P2a2 | 网桥 | 将 EID 5 分配给网桥 D3 时自行创建 |
EID13:14 | P2 | SMBus | D1P2a2 | 网桥池 | 将 EID 池分配给网桥 D3 时自行创建 |
EID15 | P3 | PCIe | D1P3a2 | 网桥 | 将 EID 8 分配给网桥 D3 时自行创建 |
EID13:14 | P3 | PCIe | D1P3a2 | 网桥池 | 在发出 Allocate Endpoint IDs 命令并发现网桥 D3 已分配池时,D1 通过从对 Allocate Endpoint IDs 命令的响应中提取此条目的 EID 来创建此条目 |
9.2.3 示例 3:具有单个 EID的网桥 D2
图 14 假设网桥 D2 有一个 EID,并首先通过总线 D1P1 获取其 EID赋值和 EID 分配,然后该总线 D1P2 被初始化。表 6 反映了这种情况。
表 6 – 示例 3:D2 的路由表
目标EID | 目标端点接入端口 | 目标EID接入物理地址 | 设备/条目类型 | 条目的创建和填充方式 |
EID10 | P1 | D1P1a2 | 网桥,自身 | 在接收到从D1到P1的初始EID分配时,自行 (bridge)创建的所有四个条目 |
EID10 | P2 | D1P2a2 | 网桥,自身 | |
EID10 | P3 | D2P3a1 | 网桥,自身 | |
EID10 | P4 | D2P4a1 | 网桥,自身 | |
EID11 | P3 | D2P3a2 | 端点 | 在 D1 分配 EID 池后自行创建(通常,在网桥 D2 将 EID 11 分配给 D3 之前,不会创建条目) |
EID12 | P3 | D2P3a3 | 端点 | 在 D1 分配 EID 池后自行创建(通常,在网桥 D2 将 EID 12 分配给 D4 之前,不会创建条目) |
EID13 | P4 | D2P4a2 | 端点 | 在 D1 分配 EID 池后自行创建(通常,在网桥 D2 将 EID 13 分配给 D5 之前,不会创建条目) |
EID8:9 | P1 | D1P1a1 | 网桥 | D1 通过 Routing Information Update 命令 |
EID8:9 | P2 | D1P2a1 | 网桥 | D1 通过 Routing Information Update 命令 |
9.2.4 网桥跟踪的其他信息
除了在不同端口之间路由消息所需的信息外,网桥还必须跟踪信息以处理与桥接的配置和操作相关的 MCTP 控制命令(如表 7 所示)。
表 7 – 网桥跟踪的其他信息
what | why |
哪些总线连接到总线所有者 | 这个信息告诉网桥应该从哪个总线请求EID分配。这通常通过网桥的非易失性配置或硬件绑定选项来实现。 |
网桥通过 Set Endpoint ID 命令接收其 EID 分配的总线 | 如果网桥使用多个“所有者”总线共享的单个EID,则该信息用于跟踪请求来自哪个总线,以便网桥可以拒绝来自其他总线的EID分配请求。 |
哪个总线接收路由信息更新命令以创建特定的路由表项 | 此信息是必需的,因此如果将来收到 Routing Information Update 命令,网桥将仅更新与该总线对应的条目。 |
哪条总线通过 Allocate Endpoint IDs 命令接收其 EID 池分配 | 此信息用于跟踪请求传入的总线,以便网桥可以拒绝来自其他总线的 EID 池分配。 |
用于每个端口的物理介质和物理寻址格式 | 此信息用于为Resolve Endpoint ID等命令提供格式正确的响应,并用于在网桥支持的不同总线之间桥接MCTP数据包。因为这与网桥的物理端口和硬件相关,所以这些信息通常会被“硬编码”到网桥中。 |
9.3 端点 ID 解析
当设备使用Resolve Endpoint ID命令请求将给定端点解析为物理地址时,网桥应根据请求的总线进行响应。
例如,考虑图 15。如果设备 A 希望获取向设备 C 发送消息所需的物理地址,则它会通过地址 Ax1 向总线所有者网桥 X 发送 Resolve Endpoint ID 命令。由于设备 A 应通过网桥 X 到达设备 C,因此网桥 X 使用其物理地址 Ax1 进行响应。
当设备 B 希望知道用于与设备 C 通信的地址时,它会通过地址 Ax2 向桥接 X 发送 Resolve Endpoint ID 请求。在这种情况下,网桥 X 可以通过向设备 B 提供总线 2 上设备 C 的直接物理地址 Ac2 来做出响应。
因此,Resolve Endpoint ID 命令可以根据从中接收 Resolve Endpoint ID 命令的总线返回不同的响应。
图 15 – 端点 ID 解析(Ab2 = physical Address of device b on bus 2.)
9.3.1 解析多路径
在某些情况下,可能有多个可能的路径可以到达给定的 EID。图 16 显示了一个可能的场景。在图 16 中,假设系统拓扑支持通过SMBus、PCIe 或都能连接到 Card。网桥X 是两条总线的总线所有者。
注意:这是 MCTP 总线的逻辑表示。从物理上讲,总线可能由多个物理段组成,如果其中一个 MCTP 总线是使用 PCIe 构建的,就会出现这种情况。
如图所示,Card C 包含一个连接到两条总线的网桥。因此,可以从总线 1 或总线 2 到达EID 100 的设备。
如果设备 D 希望向 EID 100 发送消息,则网桥 X 可以选择通过总线 1 或总线 2 路由该消息。MCTP 对如何完成此操作没有要求。一般建议是网桥优先选择更快的可用介质。在此示例中是 PCIe。
注意:在某些拓扑中,该简单规则可能无法产生到设备的首选路径。但是,在 PC 系统中的大多数常见实现中,此方法应该是有效的。制造网桥设备的供应商可以考虑提供配置选项以启用替代策略。
图 16 – 解析多条路径
9.4 网桥和总线所有者的实现建议
此条款提供有关实现网桥和总线所有者功能的设备的 EID 池和路由表大小的建议。
9.4.1 端点 ID 池建议
系统设计应尽量减少需要将 EID 池分配给热插拔设备或附加卡设备的数量。如果可行,系统设计应具有单个设备拥有的支持热插拔设备/附加卡的所有总线。
如果只有一个设备处理热插拔设备和附加卡,则系统集成商配置设备和分配 EID 池将更加简单。由于系统中不处理热插拔设备的任何其他网桥,只需要处理固定数量的 MCTP 设备,因此在设计时将知道需要多大的 EID 池。然后,可以将剩余数量的 EID 简单地分配给处理热插拔设备和附加卡的单个设备。
为了支持这一点,建议作为网桥运行的设备包括一个非易失性配置选项,使系统集成商能够配置他们请求的 EID 池的大小。
9.4.2 路由表大小建议
此条款提供了有关如何确定在设备中提供的目标路由表条目支持的一些初始建议和方法。
PCIe 插槽
要提供支持插入 PCIe 插槽的设备,假设每个插槽可以同时支持 PCIe 和 SMBus 端点,并为每种总线类型至少两个端点提供支持。
这意味着每张卡至少支持 4 个直接连接的端点。(其他端点可能位于卡上的网桥后面,但这不会影响总线所有者的路由表大小。这意味着每个 PCIe 插槽至少有四个路由表条目。因此,设计为支持具有 8 个 PCIe 插槽的系统实现的设备应该支持 32 个 路由表条目。
平面 PCIe 设备
在大多数 PC 系统中,PCIe 通常被实现为单个 MCTP 总线,该总线由作为总线所有者的单个设备拥有。因此,静态设备的数量应与主板中内置的 PCIe 设备的数量成正比。
通常,这少于 8 个设备。因此,建议为静态 PCIe 设备至少支持 8 个条目。
静态 SMBus/I2C MCTP 设备
路由表的大小也应支持自有总线上额外数量的 “static” 设备。目前,在给定的 SMBus/I2C 总线上不太可能使用多个 MCTP 器件。大多数设备将是非智能传感器和 I/O 设备。保守地建议为器件拥有的每个 SMBus/I2C 总线至少提供四个 entry。
示例 1:支持“客户端”的设备
4 个 PCIe 插槽 -> 16 个路由表项 。
2 个自有 SMBus/I2C 总线 -> +8 个条目
静态 PCIe 设备支持 -> +8 个条目。
~32 个条目或更多
示例 2:卷服务器 capable
8 个 PCIe 插槽 -> 32 个路由表项
4 个自有 SMBus/I2C 总线 -> +16 个条目
静态 PCIe 设备支持 -> +8 个条目
~56 个条目或更多
9.5 路径和传输单元发现
传输单元定义为支持在给定消息的 MCTP 消息组合中使用的 MCTP 数据包有效载荷的大小。支持的传输单元大小允许根据每条消息类型而变化。
中间桥和物理介质可以限制终端节点之间的传输单元大小。因此,MCTP 控制协议指定了一种机制,当端点之间的路径中存在一个或多个网桥时,该机制用于发现端点之间路径的传输单元支持。
路径传输单元发现机制还支持发现用于将 MCTP 数据包从一个端点路由到另一个端点的网桥和“跃点”数量。
9.5.1 路径传输单元协商
MCTP 控制协议仅指定如何发现端点之间路径的路径传输单元大小。MCTP 控制协议没有指定用于发现特定端点为给定消息类型支持的传输单元大小的通用机制。终端节点的传输单元大小的发现和协商(如果支持)由特定消息类型的定义指定。
9.5.2 路径传输单元发现过程概述
此子句描述了用于路径传输单元发现的过程。此处描述的发现过程旨在使一个端点能够发现访问特定“目标”端点的路径和传输单元支持。它没有定义使终端节点能够发现任意两个任意终端节点之间的路径的通用机制。例如,参考图 17,该过程为 EID 9 的端点定义了一种方法,以发现到 EID 14 端点的路由上的路径/传输单元支持。但此过程未定义 EID 9 发现 EID 11 和 EID 14 之间的路径/传输单元支持的流程。
以下示例概述了 path/transmission unit 发现过程。该示例假定 MCTP 网络已初始化。参考图 17,具有 EID 9 的终端节点希望发现用于访问 EID 为 14 的终端节点的路径。 此发现仅使用两个命令(Resolve Endpoint ID 和 Query Hop)即可完成,如下所示:
1) EID 9 首先向总线所有者 EID 8 发出 Resolve Endpoint ID 命令,并将 EID 14 作为要解决的 EID。
2) EID 8 在 Resolve Endpoint ID 命令响应中返回网桥的物理地址和 EID,即 EID 10。
3) EID 9 使用查询跃点命令查询网桥 EID 10,并将 EID 14(“目标”EID)作为请求参数。请注意,EID 2 不需要执行另一个 Resolve Endpoint ID 命令,因为它已经从原始 Resolve Endpoint ID 命令收到了 EID 3 的物理地址。
4) 网桥 EID 10 通过返回 EID 12 来响应 Query Hop 命令,EID 12 是访问 EID 14 所需的下一个网桥的 EID。网桥 EID 10 还返回它提供的传输单元支持,用于路由到目标 EID。
5) 然后,EID 9 向 EID 12 的网桥发送 Query Hop 命令。请注意,EID 9 不需要执行另一个 Resolve Endpoint ID 命令,因为它已经从原始 Resolve Endpoint ID 命令收到了 EID 12 的物理地址。
6) 网桥 EID 12 通过返回 EID 14 来响应查询跃点命令,因为它是目标终端节点的 EID,所以告诉 EID 9 网桥 EID 12 是通往 EID 6 的路径中的最后一个“跃点”。网桥 EID 5 还返回它为路由到目标 EID 提供的传输单元支持。
7) 此时,随后发现了通往 EID 14 的路径上的桥梁,并返回了它们各自的传输单元支持。通往 EID 14 的路径的有效传输单元支持将是两个网桥返回的传输单元支持值中较小的一个。
9.5.3 路径传输单元发现流程图
以程图(图 15)显示了一种通用算法,用于发现从一个端点到给定目标端点的路径中的网桥以及路径传输单元支持。流程图已被有意简化。请注意,虽然 Query Hop 命令实际上支持为传输和接收路径返回单独的传输单元大小,但为了便于说明,流程图进行了简化,仅指用于传输和接收的单个传输单元。
此外,图 18 没有显示任何明确的错误处理步骤,也没有显示处理命令重试的过程。通常,错误很可能是由于向网桥发送了无效的 EID(可能是由于请求者的编程错误)或 EID 不存在于网桥的路由表中。例如,如果请求者没有意识到由于热插拔更新而发生了路由表更新,则在正常操作下可能会出现后一种情况。此错误情况将由 bridge 以 ERROR_INVALID_DATA 完成代码进行响应来指示。
9.6 网桥的路径传输单元要求
MCTP 网桥在不同总线之间路由数据包,但它通常不解释数据包的有效内容,也不组装这些数据包。例外情况是,当网桥处理寻址到其自己的 EID 的数据包时,接收广播 EID 时,以及网桥根据消息类型支持不同的传输单元时。有关更多信息,请参阅 表 32 。
11 MCTP 控制协议
MCTP 控制消息用于在 MCTP 网络内设置和初始化 MCTP 通信。此条款定义用于 MCTP 上的 MCTP 控制消息的协议和格式。
11.1 术语
表 8 中所示的术语用于描述 MCTP 控制协议。
表 8 – MCTP 控制协议术语
术语 | 描述 |
Requester | “请求者”用于指代发起 MCTP 控制请求消息的端点。 |
Responder | “响应者”用于指代发起 MCTP 控制响应消息的端点(即返回对 MCTP 控制请求消息的响应的端点)。 |
Originator or Sourse | “源”用于指代发起任何 MCTP 控制消息(请求、响应或数据报)的端点。 |
Target or Destination | “目标”或“目的”用于指代作为任何 MCTP 控制消息(请求、响应或数据报)的预期接收者的端点。 |
Asynchronous Notification | “异步通知”用于指代 MCTP 端点向另一个 MCTP 端点发出未请求数据报时的情况。 |
Broadcast | 当使用广播 EID 将 MCTP 控制数据报发送到总线上时,将使用“广播”。 |
11.1.1 控制消息类
表 9 中所示的不同类型的消息在 MCTP 控制消息类型下使用。
表 9 - MCTP 控制消息类型
术语 | 描述 |
Request | 此类控制消息请求端点执行特定的 MCTP 控制操作。所有 MCTP 控制请求消息都使用相应的响应消息进行确认。(在本规范中,术语“command”和“request”可互换使用,作为 MCTP 控制请求消息的简写。 |
Response | 此类 MCTP 控制消息是为响应 MCTP 控制请求消息而发送的。该消息包含一个 “Completion Code” 字段,用于指示响应是否正常完成。响应还可以返回其他数据,具体取决于发出的特定 MCTP 控制请求。 |
Datagram | 数据报是 “unacknowledged” 消息(即 Datagram 没有相应的 Response 消息)。此类 MCTP 控制消息用于在不需要也不可取 MCTP 控制响应消息时传输消息。 |
Broadcast Request | 广播请求是一种特殊类型的 Request,面向给定总线上的所有端点。接收消息的所有端点都应解释 Request。 |
Broadcast Datagram | 广播到总线上所有端点的数据报。广播数据报是“未确认”的消息(即广播数据报没有相应的 Response 消息)。 |
11.2 MCTP 控制消息格式
MCTP 控制消息使用 MCTP 控制消息类型(请参阅表 3)。使用此消息类型发送的任何消息都将对应于此条款中规定的定义。MCTP 控制消息的基本格式如图 20 所示。请注意,图 20 中所示的字节偏移量是相对于 MCTP 消息正文的开头,而不是物理数据包的开头。
11.2.1 使用消息完整性检查
MCTP 控制消息不使用消息完整性检查字段。因此,MCTP 控制消息中的 IC 位应始终为 0b。
图 20 – MCTP 控制消息格式
11.3 MCTP 控制消息字段
表 10 列出了 MCTP 控制消息的常用字段。
表 10 – MCTP 控制消息字段
字段名 | 描述 |
IC* | 消息完整性检查位 = 0b。MCTP 控制消息不包括整个消息完整性检查字段。 |
消息类型* | MCTP control = 0x00 (000_0000b)。此字段将 MCTP 消息标识为 MCTP 控制消息。 |
Rq bit | 请求位。此位用于帮助区分 MCTP 控制请求消息和其他消息类。请参阅 11.5。 |
D bit | 数据报位。此位用于指示 Instance ID 字段是用于跟踪和匹配请求和响应,还是仅用于标识重新传输的消息。请参阅 11.5。 |
实例 ID | Instance ID 字段用于标识 MCTP 控制请求或数据报的新实例,以区分发送到给定消息终端的新请求或数据报与发送到同一消息终端的重试消息。实例 ID 字段还用于将 MCTP 响应消息的特定实例与 MCTP 请求消息的相应实例进行匹配。 |
命令码 | 对于请求消息,此字段是一个命令代码,指示数据包请求的 MCTP 操作类型。命令代码值在 表 12 中定义。第 12 条中给出了命令的请求和响应参数的格式和定义。在 Request 中发送的命令代码应在相应的 Response 中返回。 |
完成码 | 此字段仅存在于响应消息中。此字段包含一个值,该值指示响应是否正常完成。如果命令未正常完成,则该值可以提供有关错误情况的其他信息。表 13 中指定了完成代码的值。 |
消息数据 | 特定于特定命令代码的零个或多个字节的参数数据,以及消息是 Request 或 Datagram,还是 Response。 |
11.4 MCTP 控制消息传输单元大小
所有 MCTP 控制消息的数据包有效载荷要求都不大于基线传输单元大小 64 字节。
MCTP 控制消息在单个 MCTP 数据包中传输。如果操作需要传输的数据多于单个消息中可以携带的数据,则使用多条消息。
11.5 标记所有者 (TO)、请求 (Rq) 和数据报 (D) 位使用情况
对于 MCTP 控制消息,如果消息是“命令”或请求消息,则 Rq 位应设置为 1b,如果消息是响应消息,则 Rq 位应设置为 0b。对于数据报和广播消息,Rq 位应始终设置为 1b。具有意外或不正确的标志位值的 MCTP 控制消息应由消息的接收者以静默方式丢弃。
对于当前规范,请求和数据报仅由标记所有者 ( TO bit = 1b) 发出。为可能的未来数据报的定义留出了规定,这些 Datagram 不是由标记所有者颁发的(参见表 11)。
表 11 – 标记所有者 (TO)、请求 (Rq) 和数据报 (D) 位使用情况
MCTP控制消息类 | 目标EID值 | TO位 | Rq位 | D位 |
命令/请求 响应是预期的,并按请求方的实例 ID 进行跟踪。 | 目标 EID | 1b | 1b | 0b |
响应 | 目标 EID | 0b | 0b | 0b |
广播请求 响应是请求方的预期结果,并按实例 ID 进行跟踪。 | 广播 EID | 1b | 1b | 0b |
数据报 未确认请求 – 请求者的实例 ID 既不需要也不跟踪响应。重复数据包的处理方式与重试的命令/请求数据包相同。 | 目标 EID | 1b | 1b | 1b |
广播数据报(广播的未确认控制命令。) | 广播 EID | 1b | 1b | 1b |
保留供将来定义 | 所有其他 |
11.6 并发命令处理
本条款描述了端点处理并发重叠 MCTP 控制请求的规范和要求。
11.6.1 对响应方的要求
端点不需要一次处理多个请求(也就是说,它可以是“单线程的”,并且在完成对任何先前请求的响应之前不必接受和处理新请求)。
尚未准备好接受新请求的响应方可以静默放弃该请求,也可以使用 ERROR_NOT_READY 消息完成代码进行响应。
可以一次接受和处理多个请求的响应方不需要按照收到请求的顺序返回响应。
11.6.2 对请求者的要求
向另一个端点发出 MCTP 控制请求的端点应等待,直到它收到对特定请求的响应,或者在等待响应时超时,然后再发出新的请求、数据报或广播数据报。
允许发出 MCTP 控制请求的端点同时向不同的响应方端点发送多个未完成的请求。
发出 MCTP 控制请求的端点应准备好处理可能与请求不匹配的响应(即,它不应自动假定它收到的响应是针对特定请求的)。在对响应中返回的任何参数执行操作之前,它应检查响应中的命令码和源 EID 值是否与相应的未完成命令匹配。
11.6.3 网桥的附加要求
通过网桥的路由功能路由的数据包不会由网桥解释,因此不被视为构成并发请求。
网桥应支持每个总线连接(端口)的至少一个未完成的 MCTP 控制请求,通过该请求,MCTP 控制消息可用于访问网桥的配置和控制功能。
网桥应保留从一个消息终端转发到另一个消息终端的数据包的时间顺序。
12 MCTP 控制消息
此条款包含每个 MCTP 控制消息的详细说明。命令表中给出的 Request 和 Response 参数信息的字节偏移量表示消息数据的字节偏移量,从 Command 字段后面的字节开始。
12.1 MCTP 控制消息命令代码
表 12 列出了 MCTP 控制消息及其相应的命令代码值。命令及其关联参数将在此条款的后面指定。对于网桥,这些要求同样适用于网桥设备中用于配置和控制网桥路由功能的所有端点。
表12——MCTP 控制命令编号
命令码 | 命令名 | 解释 | E | B |
0x00 | 保留 | - | - | - |
0x01 | Set Endpoint ID | 将 EID 分配给位于给定物理地址的端点 | Ma Ng | Ca1 Mg |
0x02 | Get Endpoint ID | 返回当前分配给端点的 EID。此外,还会返回有关端点的类型及其静态 EID 使用级别的信息。 | Ma Og | Ma Og |
0x03 | Get Endpoint UUID | 检索与端点关联的每个设备的唯一 UUID | Ca2 Og9 | Ca2 Og |
0x04 | Get MCTP Version Support | 列出端点支持的 MCTP 控制协议版本 | Ma Og | Ma Og5 |
0x05 | Get Message Type Support | 列出端点支持的消息类型 | Ma Og | Ma Og |
0x06 | Get Vendor Defined Message Support | 用于发现 MCTP 端点的供应商特定的 MCTP 扩展和功能 | Oa Og | Oa Og |
0x07 | Resolve Endpoint ID | 用于获取与给定 EID 关联的物理地址 | Na Og | Ma Og |
0x08 | Allocate Endpoint IDs | 由总线所有者用于将 EID 池分配给 MCTP 网桥 | Na Ng | Ma6 Mg6 |
0x09 | Routing Information Update | 由总线所有者用于扩展或更新由 MCTP 桥接器维护的路由信息 | Oa8 Og8 | Ma4 Mg4 |
0x0A | Get Routing Table Entries | 用于请求 MCTP 网桥返回与其当前路由表条目对应的数据 | Na Og | Ma Og |
0x0B | Prepare for Endpoint Discovery | 用于指示端点清除其“已发现”标志,以使其能够响应端点发现命令 | Ca3 Ng | Ca3 Cg3 |
0x0C | Endpoint Discovery | 用于在总线上发现支持 MCTP 的设备,前提是没有为特定物理介质定义其他发现机制 | Ca3 Cg3 | Ca3 Cg3 |
0x0D | Discovery Notify | 用于通知总线所有者 MCTP 设备已在总线上可用 | Na Cg3 | Ca3 Cg3 |
0x0E | Get Network ID | 用于获取 MCTP 网络 ID | Ca7 | Ca7 |
0x0F | Query Hop | 用于发现到给定目标端点的路径中有哪些桥(如果有),以及在路由到目标端点时,桥将为给定消息类型传递的传输单元大小 | Na Og | Ma Og |
0x10 | Resolve UUID | 由端点用于查找与使用特定 UUID 的端点匹配的另一个端点。 | Na Og | Oa Og |
0x11 | Query rate limit | 用于发现传入消息的给定目标的数据速率限制设置。 | Oa Og | Oa Og |
0x12 | Request TX rate limit | 用于为传出消息的给定端点请求允许的传输数据速率限制。 | Oa Og | Oa Og |
0x13 | Update rate limit | 用于在接收方未请求的发送数据速率更改时更新接收方 | Oa Og | Oa Og |
0x14 | Query Supported Interfaces | 用于发现现有设备 MCTP 接口。 | Oa Og | Oa Og |
0xF0-0xFF | Transport Specific | 此控制命令编号范围保留供各个 MCTP 传输绑定规范定义。传输特定命令旨在根据需要在给定媒体上设置和配置 MCTP。特定于传输的命令编号具有许多不同的定义,具体取决于绑定规范。传输特定的命令只能发送到同一介质上的端点。允许网桥阻止将传输特定命令桥接到不同的媒体。传输特定消息的一般格式在条款 12.17 中指定。 | - | - |
OMC(可选/强制/有条件)列的键: E = 非网桥、非总线所有者端点(简单端点) B = 网桥/总线所有者端点 Ma = 必须(必需)接受。端点应接受请求,并根据以下命令描述生成响应。 Mg = 必须生成。端点应生成此请求,作为其 MCTP 操作职责的一部分。 Oa = 可选接受 Og = 可选生成 Ca = 有条件接受(见注释) Cg = 有条件生成(见注释) Na = 不适用于接受。此命令不适用于设备类型,不得接受 Ng = not suitable to generate。此命令用于 MCTP 配置和初始化,不应生成。 | ||||
1. 最顶层的总线所有者不需要支持 Set Endpoint ID 命令。 2. 热插拔和附加设备以及连接到多个总线的非桥接设备需要支持 Get Endpoint UUID 命令。有关详细信息,请参阅 8.17.7 和 8.17.8。 3. 如果用于特定总线类型的物理传输绑定需要,则每个总线都必须支持端点发现。请参阅相应的 MCTP 物理传输绑定规范。 4. 最上面的总线所有者不需要接受此命令。当下游网桥需要来自它们所连接的总线所有者的动态路由信息时,需要生成该命令。某些实现可以配置,其中所有路由信息都已静态配置到网桥中,并且不需要动态提供的信息,在这种情况下,当端点以这种方式配置时,不需要支持该命令。 5. 网桥应使用此命令来验证它们是否正在初始化与其 MCTP 控制协议版本兼容的设备。 6. 如果此命令指示支持动态 EID 池,则端点需要接受此命令。如果配置要求端点支持将 EID 池分配给下游网桥,则该命令应由端点生成。 7. 有关此命令的实施要求的信息,请参阅第 9 条 MCTP 网络 ID。 8. 虽然端点可以选择接收路由信息更新,但 MCTP Base 规范并未指定将此类更新发送到特定端点的网桥或总线所有者函数。 9. 虽然端点支持此命令是可选的,但对于支持速率限制的设备,生成和接受此命令都是强制性的。 |
12.2 MCTP 控制消息完成代码
命令/结果代码字段用于返回响应消息的管理操作结果。如果返回 SUCCESS 完成代码,则响应中还应返回指定的响应参数(如果有)。如果响应方返回错误完成代码(非 SUCCESS),除非另有说明,否则响应方不应返回任何其他参数数据,并且请求方应忽略响应中提供的任何其他参数数据(如果有)。有关完成代码,请参阅 表 13。
表 13 – MCTP 控制消息完成代码
值 | 名字 | 描述 |
0x00 | SUCCESS | 请求已被接受并正常完成。 |
0x01 | ERROR | 这是一条通用的失败消息。(当应用更具体的结果代码时,不应使用它) |
0x02 | ERROR_INVALID_DATA | 数据包有效载荷包含无效数据或非法参数值。 |
0x03 | ERROR_INVALID_LENGTH | 消息长度无效。(Message body 大于或小于特定请求的预期大小。 |
0x04 | ERROR_NOT_READY | 接收方处于临时状态,尚未准备好接收相应的消息。 |
0x05 | ERROR_UNSUPPORTED_CMD | 此端点未指定或不支持已接收消息的控件类型中的 command 字段。对于在 MCTP 控制请求消息中收到的任何不支持的命令值,应返回此完成代码。 |
0x80-0xFF | COMMAND_SPECIFIC | 此完成代码值范围保留给特定于特定 MCTP 控制消息的值。特定值(如果有)及其定义在特定命令的规范中提供。 |
所有其他 | Reserved | 保留 |
12.3 设置端点 ID
设置端点 ID 命令为端点分配 EID。此命令只能由总线所有者发出,以将 EID 分配给特定物理地址的端点。由于假定端点尚未为其分配 EID,或者由于 EID 未知,因此消息中的目标 EID 通常会设置为特殊的空目标 EID 值。
Set Endpoint ID 命令还用于向端点提供总线所有者的物理地址和 EID。需要与总线所有者通信的端点可能会捕获用于传递Set Endpoint ID消息的物理地址和EID。
注: 不是总线所有者的端点不应发出 Set Endpoint ID 命令,因为这可能会导致消息的接收方捕获 错误的总线所有者地址信息。
MCTP 网桥可以选择使用单个 EID 来实现其功能,而不是为连接到不同总线所有者的每个端口(总线连接)使用 EID。有关更多信息,请参见 9.1.2 。在这种情况下,网桥将接受来自“第一”总线的 EID 分配,以将 Set Endpoint ID 请求传送到网桥。
众所周知,如果通过多个总线收到重叠请求,则网桥内不同的内部处理延迟可能会导致请求的临时顺序发生切换。因此,实现接受的请求不一定与网桥上首先收到的请求相关联,而是基于哪个请求是网桥首先处理的请求。
如果已分配 EID,并且从其他总线发出 Set Endpoint ID 命令,但未强制分配 EID,则该命令应返回 SUCCESSFUL 完成代码,但响应参数应返回“EID rejected”的 EID 分配状态。
Set Endpoint ID 命令的功能与端点是否使用静态 EID 无关。唯一的区别是,如果端点具有静态 EID,则它会使用该 EID 作为其初始“默认”EID 值。端点不会将此初始 EID 视为由其他总线所有者分配给它。也就是说,端点应接受来自接收命令的第一条总线的 EID 分配,并应将该总线跟踪为 Set Endpoint ID 命令的后续实例的 EID 的原始总线。有关更多信息,请参见 8.17.2。请求和响应参数如表 14 所示。
表 14 — 设置端点 ID 消息
Byte | 描述 | |
Request data | 1 | [7:2] – 保留 [1:0] – 操作: 00b 设置 EID。提交 EID 进行分配。给定的 EID 将被接受,条件是设备从哪条总线接收 EID(参见上文)。只能通过一条总线到达端点的设备应始终接受此操作(前提是 EID 值合法)。 01b 强制 EID。强制分配 EID。无论 EID 是否已通过其他总线分配,都将接受给定的 EID。请注意,如果端点是强制的,则 EID 分配会更改作为 Set Endpoint ID 命令的发起方跟踪的总线。仅通过一条总线到达端点的设备应始终接受此操作(前提是 EID 值合法),在这种情况下,设置 EID 和强制 EID 操作是等效的。 10b 重置 EID(可选)。此选项仅适用于支持静态 EID 的端点。如果支持静态 EID,端点会将 EID 恢复为静态配置的 EID 值。字节 2 中的 EID 值将被忽略。如果不支持此操作,则应返回 ERROR_INVALID_DATA 完成代码。 11b 设置 Discovered 标志。将 Discovered 标志仅设置为 “discovered” 状态。请勿更改当前的 EID 设置。字节 2 中的 EID 值将被忽略。请注意,Discovered 标志仅用于某些物理传输绑定。如果选择了此操作,并且特定传输绑定不支持 Discovered 标志,则应返回 ERROR_INVALID_DATA 完成代码。 |
2 | 端点 ID 0xFF,0x00 = 非法。 不允许为端点分配广播 EID 或空 EID。如果端点收到这些值中的任何一个,建议端点返回 ERROR_INVALID_DATA 完成代码。 | |
Response data | 1 | 完成代码 |
2 | [7:6] – 保留 [5:4] – EID 分配状态: 00b = EID 分配已接受。 01b = EID 分配被拒绝。EID 已由另一总线所有者分配,并且未强制分配。 10b = 保留。11b = 保留。 [3:2] – 保留。 [1:0] – 端点 ID 分配状态(有关其他信息,请参阅 12.10): 00b = 设备不使用 EID 池。 01b = 端点需要分配 EID 池。 10b = 端点使用 EID 池,并且已经收到了该池的分配。 11b = 保留 | |
3 | EID 设置。如果接受了 EID 设置,则此值将与请求中传递的 EID 匹配。否则,此值将返回当前的 EID 设置。 | |
4 | EID 池大小。这是网桥可用于将 EID 或 EID 池分配给其他端点或网桥的动态 EID 池的大小。它不包括网桥可能维护的任何其他静态 EID 的计数。有关更多信息,请参见 8.17.2。请注意,网桥始终返回其池大小,无论它是否已收到分配。0x00 = 无动态 EID 池。 |
12.4 获取端点 ID
获取端点 ID 命令返回端点的 EID。此命令通常仅由总线所有者发出,用于检索分配给特定物理地址的 EID。因此,消息中的目标 EID 通常会设置为特殊的 Physically Addressing Only EID 值(0x00)。请求和响应参数如表 15 所示。
表 15 — 获取端点 ID 消息
Byte | 描述 | |
Request data | - | - |
Response data | 1 | 完成代码。 |
2 | 端点 ID 0x00 = 尚未分配 EID。 | |
3 | 端点类型。 [7:6] = 保留 [5:4] = 端点类型: 00b = 简单端点 01b = 总线所有者/网桥 10b = 保留 11b = 保留 [3:2] = 保留 [1:0] = 端点 ID 类型: 00b = 动态 EID。端点仅使用动态 EID。 01b = 支持静态 EID。端点配置了静态 EID。此命令返回的 EID 反映当前设置,可能与静态 EID 值匹配,也可能不匹配。以下两个 status 返回值是可选的。如果提供,则应将它们作为一对支持,以代替静态 EID 支持状态返回。如果支持 Set Endpoint ID 命令中的 Reset EID 选项,建议实施此选项。 10b = 支持静态 EID。当前 EID 与静态 EID 匹配。端点已配置静态 EID。当前值与静态值相同。 11b = 支持静态 EID。当前 EID 与静态 EID 不匹配。端点已配置静态 EID。当前值与静态值不同。有关更多信息,请参见 8.17.2。 | |
4 | 特定于媒体的信息。此字节可以保存有关给定介质上端点的可选配置的其他信息,例如是否支持某些类型的 timing 或 arbitration。这只能用于报告静态信息。除非传输绑定另有指定,否则此字节应作为 0x00 返回。 |
12.5 获取端点 UUID
“获取端点 UUID”命令返回管理控制器或管理设备的通用唯一标识符 (UUID),也称为全局唯一 ID (GUID)。该命令可用于将设备与一个或多个 EID 相关联。ID 的格式遵循 RFC4122中指定的字节(八位字节)格式。RFC4122 指定了四种不同版本的 UUID 格式和生成算法,适用于在 IPMI 中使用设备 UUID。它们是版本 1 (0001b) “基于时间”和三个 “基于名称” 版本:版本 3 (0011b) “MD5 哈希”、版本 4 (0100b) “伪随机”和版本 5 “SHA1 哈希”。建议使用版本 1 格式。但是,版本 3、4 或 5 格式也是允许的。设备 UUID 在设备的生命周期内不应更改。请求和响应参数如表 16 所示。
有关使用 Get Endpoint UUID 命令的其他要求,请参见 8.17.7 和 8.17.8。
表 16 – 获取端点 UUID 消息格式
Byte | 描述 | |
Request data | - | - |
Response data | 1 | 完成代码 |
2-17 | 分别为UUID 1:16字节(请参阅 表 17) |
UUID 中的各个字段首先按照 RFC4122中描述的约定存储最高有效字节 (MSB)。有关示例格式,请参阅 表 17。
表 17 – 示例 UUID 格式
字段 | UUID字节 | MSB |
time low | 1 | MSB |
2 | ||
3 | ||
4 | ||
time mid | 5 | MSB |
6 | ||
time high and version | 7 | MSB |
8 | ||
clock seq and reserved | 9 | MSB |
10 | ||
node | 11 | MSB |
12 | ||
13 | ||
14 | ||
15 | ||
16 |
12.6 获取 MCTP 版本支持
此命令可用于检索端点支持的 MCTP 基本规范版本,以及每种消息类型支持的消息类型规范版本。表 18 中给出了此消息的请求和响应参数的格式。
Get MCTP Version Support 命令可以为给定的消息类型返回多个版本号。这使得该命令可用于报告不同级别的兼容性以及与不同规范版本的向后兼容性。给定消息类型的各个规范定义了该消息类型应使用哪些版本号值的要求。这些文件定义了还应列出哪些早期版本号(如果有)。
该命令返回一个完成代码,该代码指示是否支持请求中传递的消息类型编号。这样,该命令还可用于查询端点,了解它是否支持给定的消息类型。
NOTE 版本号按从旧到新的顺序列出。供应商定义的消息类型(0x7E 和 0x7F)的版本控制命令和版本格式是特定于供应商的,并被视为超出本规范的范围。
表 18 – 获取 MCTP 版本支持消息
Byte | 描述 | |
Request data | 1 | 消息类型编号 要检索其版本信息的消息类型编号:0xFF = 返回 MCTP 基本规范版本信息。0x00 = 返回 MCTP 控制协议消息版本信息。other = 返回给定消息类型的版本信息。有关消息类型编号,请参阅 MCTP ID 和 表 3。 |
Response data | 1 | 完成代码。 0x80 = 不支持消息类型编号 |
2 | 版本号条目计数 此响应中返回的 32 位版本号的从 1 开始的计数。首先返回数字较低的版本号。 | |
3:6 | 版本号条目 1:以下描述仅供参考。有关 DMTF 规范版本编号的规范定义,请参阅 DSP4004。 [31:24] = 主要版本号。此字段用于标识规范的版本,该版本包含的更改使其与在具有较旧(较小)主版本号的规范版本中定义的一个或多个函数不兼容。 [23:16] = 次要版本号。此字段用于标识规范中与共享相同主版本号的较旧(较小)次要版本号向后兼容的功能添加。 [15:8] = 更新版本号。此字段用于对规范的编辑更新,这些更新既不定义新功能,也不更改给定 major.minor 版本的现有功能。此字段仅供参考,在检查版本的互操作性时应忽略此字段。 [7:0] = “alpha” 字节。此值用于规范的预发布 (progress-in-progress) 版本。规范的预发布版本向后兼容具有共享相同主版本号的较旧(较小)次要版本号的规范版本。但是,由于 alpha 值表示当前正在开发的规范版本,因此共享相同主要和次要版本号但具有不同“alpha”版本的版本可能无法完全互操作。 版本号和 alpha 字段的编码在 10.6.1 中提供。 | |
(7:x) | 版本号 条目 2 到 N。其他 32 位主要/次要版本号(如果有)。 |
10.6.1 版本字段编码
version 字段由四个字节组成,称为 “major”、“minor”、“update” 和 “alpha” 字节。这些字节应按如下方式编码:
“major”、“minor” 和 “update” 字节是 BCD 编码的,每个字节包含两个 BCD 数字。“alpha” 字节包含使用 ISO/IEC 8859-1 字符集编码的可选字母数字字符扩展名。这些字段的语义遵循 DSP4004 中指定的语义。
alpha 字段中的值 0x00 表示未使用 alpha 字段。显示版本号的软件或实用程序不应为此字段显示任何字符
BCD 编码值的最高有效半字节中0xF的值表示应忽略最高有效半字节,并将整个字段视为个位数值。显示数字的软件或实用程序应仅显示单个数字,并且在显示数字时不应输入前导“0”。
如果 “update” 字段中的值为 0xFF ,则表示要忽略该字段。显示版本号的软件或实用程序不应显示字段的任何字符。0xFF不允许作为 “major” 或 “minor” 字段的值。
示例:版本 1.1.0 → 0xF1F1F000
版本 3.1 → 0xF3F1FF00
版本 1.0a → 0xF1F0FF61
版本 3.7.10a → 0xF3F71061
版本 10.11.7 → 0x1011F700
10.6.2 MCTP 基本规范版本号
版本号条目 1 字段应用于指示与基本规范 1.0 版的向后兼容性,如下所示:
1.0 [Major version 1, minor version 0, no update version, no alpha)]
使用编码报告为:0xF1F0FF00
本规范的 MCTP 基本规范版本应在版本号条目 2 中报告为:
1.1.0 [Major version 1, minor version 1, update version 0, no alpha)]
使用编码报告此情况:0xF1F1F000
12.7 获取消息类型支持
“获取消息类型支持”命令使管理控制器能够发现其他 MCTP 端点支持的 MCTP 控制协议功能,并获取端点支持的 MCTP 消息类型的列表。表 19 中列出了此消息的请求和响应参数。
对此命令的响应可能特定于接收请求的总线(即,支持给定消息类型的设备可能无法在连接到该设备的所有总线上平等地支持该消息类型)。
表 19 – 获取消息类型支持消息
Byte | 描述 | |
Request data | - | - |
Response data | 1 | 完成代码 |
2 | MCTP 消息类型计数。从 1 开始。 除此端点支持的 MCTP 控制消息类型之外的消息类型数 | |
(3:N) | 消息类型编号列表。每个数字一个字节。请参阅 表 3 和 MCTP ID。 |
12.8 获取供应商定义的消息支持
“获取供应商定义的消息支持”操作使管理控制器能够发现端点是否支持供应商定义的消息,如果支持,则发现定义这些消息的供应商或组织。表 20 中给出了此消息的请求和响应参数的格式和定义。
表 20 — 获取供应商定义的消息支持消息
Byte | 描述 | |
Request data | 1 | 供应商 ID 集选择器 指示请求的特定功能集。索引从 0x00 开始,单调增加 1。如果响应端点具有一个或多个索引大于请求索引的功能集,则会将请求的索引增加 1,并在响应消息中返回结果值。请求端点使用返回的值请求下一个功能集。 |
Response data | 1 | 完成代码 |
2 | 供应商 ID 集选择器 0xFF = 没有更多功能集。 | |
Var | 供应商 ID 一个长度可变的结构化字段,用于标识供应商 ID 格式(目前为 PCI 或 IANA)和定义功能集的供应商的 ID。此字段的结构在图 21 — 获取供应商定义的功能消息的供应商 ID 字段的结构中指定。 | |
2 bytes | 16 位数值或位字段,由供应商 ID 标识的供应商或组织指定。此值通常用于标识给定供应商 ID 下的特定命令集类型或主要版本。 |
12.9 解析端点 ID
此命令将发送给总线所有者,以将 EID 解析为物理地址,该地址将用于将 MCTP 消息传送到目标端点。该命令将 EID 作为请求中的输入参数,并在响应中返回 EID 和用于路由到该 EID 的物理地址(如果有)。响应数据还将指示是否没有可用的映射。
端点通过跟踪用 Set Endpoint ID 命令接收其 EID 分配时使用的物理地址,从而知道总线所有者的物理地址。端点可以使用 null 目标 EID 值将此命令发送给总线所有者。这样,端点就无需跟踪总线所有者的 EID。request 和 response 参数如 表 22 中指定。
表 22 — 解析端点 ID 消息
Byte | 描述 | |
Request data | 1 | 目标端点ID 这是要求总线所有者解析的 EID。 |
Response data | 1 | 完成代码 |
2 | 桥接端点ID 这是提供访问目标端点所需的桥接服务器(如果有)的端点的 EID。如果返回的 EID 与目标 EID 匹配相同的值,则表示访问目标端点不需要桥接函数(即,目标 EID 是发出 Resolve Endpoint ID 请求的总线的本地总线)。 | |
(3:N) | 物理地址。此字段的大小取决于用于提供此数据的总线的特定 MCTP 物理传输绑定。此字段的大小和格式定义为相应物理传输绑定规范的一部分。 |
12.10 分配端点 IDs
总线所有者负责将 EID 池分配给总线层次结构中较低级别的 MCTP 网桥。这是使用 Allocate Endpoint IDs 命令完成的。网桥本身的 EID 是单独分配的,不属于此命令提供的池的一部分。
总线所有者通常会将此命令用作总线 EID 分配过程的一部分。使用 Set Endpoint ID 命令为设备分配 EID 后,对该命令的响应将指示端点是否支持 EID 池。如果设备指示它支持 EID 池,则总线所有者可以发出 Allocate Endpoint IDs 命令,向设备提供 EID 池。
注意:分配端点 IDs命令还可能导致网桥重建其路由表。有关更多信息,请参见 12.11.2。
当之前分配的 EID 或 EID 池变得未使用时(例如,由于热插拔删除),总线所有者应回收端点的 EID 或 EID 池分配。有关更多详细信息,请参见 8.17。
参考图 22,处理 EID 分配存在潜在的争用条件。在此图所示的场景中,设备 X 和设备 Z 可能同时将 EID 分配给设备 Y。这也意味着,除非采取步骤,否则设备 Z 可以将端点分配给设备 Y,但只能将其被设备 X 分配的一组端点覆盖。
为防止这种情况,仅接受来自向设备提供 EID 池的“第一”总线的 Allocate Endpoint IDs 命令。如果另一总线所有者尝试通过另一总线交付 EID 池,则除非有意超售,否则该请求将被拒绝。
表 23 中介绍了 Allocate Endpoint IDs 消息字段。
表 23 — 分配端点 IDs 消息
Byte | 描述 | |
Request data | 1 | Operation Flags: [7:2] – 保留。 [1:0] – 操作: 00b = 分配 EID。提交 EID 池分配。不要强制分配。如果网桥已经从另一条总线接收到其 EID 池,则允许拒绝分配。(请参阅以下条款中的其他信息。 01b = 强制分配。强制网桥接受此 EID 池,无论它是否已从另一条总线收到其 EID 池。这也将导致网桥重建其路由表。有关更多信息,请参见 12.11.2。 10b = 获取分配信息 返回响应参数,而不更改当前分配。这可用于查询当前分配给终端的 EID 动态池(如果有)的信息。如果选择该项,则忽略请求中的 Number of Endpoint ID 和 Starting Endpoint ID 参数。 11b = 保留 |
2 | 端点 ID 数量 (分配的池大小) 指定池中可供此端点使用的 EID 数量 指定 0x00 计数是合法的。如果接受或强制0x00(并且网桥缺少静态 EID 池)则特定网桥不得分发任何 EID。 | |
3 | 起始端点ID 指定池中分配的 EID 范围的起始 EID。当提供多个 EID 时,ID 是连续的,从此值开始作为范围内的第一个 EID。 | |
Response data | 1 | 完成代码 如果分配的 EID 数量(端点 ID 数量)超过动态端点 ID 池大小,则应返回错误完成代码(应返回 ERROR_INVALID_DATA)。(当请求中传递的端点 ID 数量为 0x00 时,此错误情况不适用)。 |
2 | [7:2] – 保留 [1:0] – 00b = 已接受分配。如果网桥具有完全静态的 EID 池,则网桥不应跟踪哪个总线提供了命令,如果端点 ID 数(分配的池大小)为 0x00,则网桥应接受分配。 01b = 分配被拒绝。Allocate Endpoint IDs 命令仅从向设备提供 EID 池的“第一”总线接受。如果另一总线所有者尝试通过另一总线交付 EID 池,则除非有意超售,否则该请求将被拒绝。(此行为的基本原理在本条款的文本中进行了解释。) 10b、11b = 保留 | |
3 | 端点 ID 池大小(动态) 此值是此端点使用的 EID 池的大小。这是网桥可用于将 EID 或 EID 池分配给其他端点或网桥的动态 EID 池的大小。它不包括网桥可能维护的任何其他静态 EID 的计数。有关更多信息,请参见 8.17.2。 | |
4 | 第一个端点ID 此字段指定分配给此端点的池的第一个 EID。如果没有为池分配 EID,则该值为 0x00。 |
12.11 路由信息更新
总线所有者使用 Routing Information Update 消息向接收消息的总线的网桥提供路由信息。
由于物理地址格式基于传递请求的总线,因此总线所有者应将特定于介质的物理地址格式用于使用此命令发送的地址。
MCTP 网桥可以发送此命令的多个实例来传输更新信息。命令中应提供整数个路由信息更新条目(即,路由信息更新条目不能在命令实例之间拆分)。
12.11.1 添加和替换条目
此命令的接收者应检查请求中的信息是否与接收命令的总线的现有条目的 EID 相对应。如果是这样,它应用新信息替换该条目。如果给定 EID 或 EID 范围的条目尚不存在,则应为给定的 EID 创建新条目。在某些情况下,这可能需要网桥将现有条目拆分为多个条目。
注意:总线所有者只能更新与其总线对应的条目。对于通过 Routing Information Update 消息创建或更新的每个路由表条目,网桥应跟踪它从哪条总线接收 Routing Information Update。这是必要的,这样当从特定总线接收到 Routing Information Update 时,桥接器只更新与最初从该总线提供给它的条目相对应的条目。
12.11.2 重建路由表
接收并接受设置了“强制分配”位 (1b) 的 Allocate Endpoint IDs 命令的网桥应清除并重建其路由表信息。网桥应发出命令以重新分配 EID 并将 EID 池重新分配给所有下游设备。请求和响应参数如表 24 所示,格式信息如表 25 所示。
表 24 — 路由信息更新消息
Byte | 描述 | |
Request data | 1 | 更新条目计数(从 1 开始) |
see text | 一个或多个更新条目,基于给定的计数,如 表 25 所示 | |
Response data | 1 | 完成代码 0x80 = 空间不足,无法将请求的条目添加到内部路由表 |
表 25 – 路由信息更新条目格式
Byte | 描述 |
1 | [7:4] – 保留 [3:0] – 条目类型: 00b = 条目对应于不用作 MCTP 网桥的单个端点 01b = 条目反映网桥的 EID 范围,其中起始 EID 是网桥本身的 EID,范围中的其他 EID 由网桥路由 10b = 条目用于用作 MCTP 网桥的单个端点 11b = 条目是网桥的 EID 范围, 但不包括网桥本身的 EID |
2 | [7:0] EID 范围的大小。范围内的 EID 计数。 |
3 | EID 范围内的第一个 EID。EID 范围是连续的(例如,如果 EID 范围的大小为 3,并且此参数中给出的第一个 EID 值为 21,则条目涵盖 EID 21、22 和 23)。 |
4:N | 物理地址。此字段的大小和格式定义为提供此数据的总线的相应物理传输绑定规范的一部分。 |
12.12 获取路由表条目
此命令可用于请求 MCTP 网桥或总线所有者返回与其当前路由表条目对应的数据。此数据用于启用路由表配置的故障排除,并使软件能够绘制 MCTP 网络的逻辑图。通常需要发出此命令的多个实例来传输整个路由表内容。
在对此命令的响应中,应提供整数个路由表条目(即,不能在命令的实例之间拆分路由表条目)。请求和响应参数如表 26 所示,格式信息如表 27 所示。
表 26 — 获取路由表条目消息
Byte | 描述 | |
Request data | 1 | 条目句柄(0x00用于访问表中的第一个条目) |
Response data | 1 | 完成代码 |
2 | 下一个条目句柄 (使用此值请求下一组条目,如果有。如果路由表数据超过单个 MCTP 控制响应中可以携带的数据。0xFF = 没有更多条目 | |
3 | 此响应中返回的路由表条目数 | |
4:N | 一个或多个路由表条目,格式根据表 27.如果路由表条目数为 0x00,则此字段将不存在。 |
表 27 – 路由表条目格式
Byte | 描述 |
1 | 与此条目关联的 EID 范围的大小 |
2 | 起始 EID |
3 | 条目类型/端口号 [7:6] – 条目类型: 00b = 条目对应于不作为 MCTP 网桥运行的单个端点 01b = 条目反映了网桥的 EID 范围,其中起始 EID 是网桥本身的 EID,该范围内的其他 EID 由网桥路由 10b = 条目用于用作 MCTP 网桥的单个端点 11b = 条目是网桥的 EID 范围, 但不包括网桥本身的 EID [5] – 动态/静态入口。指示条目是动态创建的还是静态配置的。请注意,使用此命令报告条目信息时,静态配置的路由信息不应与动态信息合并。虽然 implementation 可以以这种方式在内部组织其数据,但 dynamic 和 static configured routing 应作为单独的条目报告。动态创建的条目包括从 Routing Information Update 命令生成的条目,以及由于网桥作为总线所有者执行 EID 分配和 EID 池分配而创建的条目。0b = 条目是动态创建的 1b = 条目是静态配置的 [4:0] – 端口号 此值由桥接设备供应商选择,用于标识定义条目的物理地址的特定总线连接。在某些情况下,此数字可能对应于不直接连接到外部物理总线的内部 “logical” 总线。端口号必须是静态的。建议但不是必需的,桥接上的端口 (总线连接) 从 0x00 开始按顺序编号。本规范未定义有关如何将端口号分配给设备上相应物理连接的任何要求或建议。 |
4 | 物理传输绑定标识符,根据 DSP0239。 |
5 | 物理介质类型标识符,根据 DSP0239。此值用于指示以下物理地址数据的格式。 |
6 | 物理地址大小。以下 Physical Address 字段的大小(以字节为单位):大小定义为由物理媒体类型标识符标识的相应物理传输绑定规范的一部分。 |
7:N | 物理地址。此字段的大小和格式定义为相应物理传输绑定规范的一部分。此字段中提供的信息首先给出 MSB。任何未使用的位都应设置为 0b。 |
12.13 准备端点发现
端点发现消息用于确定总线上的设备是否与 MCTP 通信(参见表 28)。是否需要此消息取决于特定的介质。目前,只有特定传输绑定(如 PCI Express (PCIe) VDM)才需要此消息,因为其他绑定(如 SMBus/I2C)可能使用其他机制来确定此信息。
总线上的每个端点(总线所有者除外)都维护着一个名为 “Discovered” 标志的内部标志。
准备端点发现命令作为广播请求消息在给定总线上发出,该消息使总线上的每个端点将其各自的 Discovered 标志设置为“未发现”状态。 随后,当端点收到 Set Endpoint ID 命令时,该标志将设置为“discovered”状态。
端点还会在以下时间将标志设置为“未发现”状态:
- 每当与端点关联的物理地址发生变化或被分配时
- 每当端点首次出现在总线上并需要分配 EID 时
- 在运行期间,如果端点进入需要重新分配其 EID 的状态
- 对于热插拔端点: 退出热插拔端点无法响应 MCTP 控制请求超过 TRECLAIM 秒的任何临时状态后(其中 TRECLAIM 在用于访问端点的介质的物理传输绑定规范中指定)。有关更多信息,请参见 8.17.5。
只有 Discovered 标志设置为 “undiscovered” 的端点才会响应 Endpoint Discovery 消息。将标志设置为 “discovered” 的端点将不会响应。
准备端点发现消息的目标 EID 在请求消息中设置为广播 EID 值(请参阅表 2),以指示这是广播消息。响应消息将目标 EID 设置为请求消息源的 ID,通常是总线所有者的 EID。request 和 response 参数在 表 28 中指定。
准备端点发现消息对现有 EID 分配没有影响。也就是说,端点通常应保留其 EID,直到通过 Set Endpoint ID 命令明确更改它们,并且在收到“Prepare for Endpoint Discovery”命令后不应清除它们。(请注意,端点在其他情况下可能会丢失其 EID,例如电源状态更改等,如本规范其他部分所述。)
Endpoint Discovery 和 Prepare for Endpoint Discovery 命令可能仅在特定传输绑定(例如基于 PCIe 供应商定义的消息传递的 MCTP)上受支持。如果绑定不使用此发现方法(例如 SMBus/I2C),则端点应返回这些命令的ERROR_UNSUPPORTED_CMD完成状态。
表 28 — 准备端点发现消息
Byte | 描述 | |
Request data | - | - |
Response data | 1 | 完成代码 |
12.14 端点发现
此命令用于发现其Discovered标志设置为“未被发现”的端点。只有 Discovered 标志设置为 “undiscovered” 的端点才会响应此消息。将标志设置为 “discovered” 的端点将不会响应。(“undiscovered” ->"discovered")
此消息通常由总线所有者使用广播 EID 作为目标 EID 作为广播请求消息发送,但出于测试目的,端点也应接受此命令并将其作为非广播请求处理。此外,请求可以作为数据报发送,具体取决于传输绑定要求。请求和响应(如果有)参数在 表 29 中指定。
表 29 – 端点发现消息
Byte | 描述 | |
Request data | - | - |
Response data | 1 | 完成代码 |
12.15 发现通知
此消息可用作通用消息,使端点能够向总线所有者宣布其存在。当 MCTP 设备热插拔到 MCTP 总线上或在 MCTP 总线上通电时,这通常用作端点发现过程的一部分。
是否以及如何将此消息用于端点发现取决于特定的物理传输绑定规范。例如,SMBus/I2C 传输绑定不会将此消息用于终结点来宣布自身,因为它利用了已为 SMBus 定义的机制。
此消息应仅从端点发送到端点所在总线的总线所有者,以便它可以通知总线所有者端点已上线,可能需要 EID 分配或更新。此外,请求可以作为数据报发送,具体取决于传输绑定要求。请求和响应(如果有)参数在表 30 中指定。
表 30 – 发现通知消息
Byte | 描述 | |
Request data | - | - |
Response data | 1 | 完成代码 |
12.16 获取网络 ID
获取网络 ID 命令返回给定 MCTP 网络的通用唯一标识符 (UUID),也称为全局唯一 ID (GUID)。通常,此命令会发送给最顶层的 MCTP 总线所有者,因为最顶层的总线所有者拥有此知识。插件 MCTP 网络需要网络 ID(例如,插件卡或模块上的 MCTP 网络)。如果系统实施中只有一个网络,则固定(非加载项)MCTP 网络不需要网络 ID。当系统实现中存在多个固定网络,并且可由公共实体(如系统软件)同时访问时,固定 MCTP 网络需要网络 ID。
ID 的格式遵循 RFC4122中指定的字节(八位字节)格式。RFC4122 指定了四种不同版本的 UUID 格式和生成算法,适用于在 IPMI 中使用设备 UUID。它们是版本 1 (0001b) “基于时间”和三个 “基于名称” 版本:版本 3 (0011b) “MD5 哈希”、版本 4 (0100b) “伪随机”和版本 5 “SHA1 哈希”。建议使用版本 1 格式。但是,版本 3、4 或 5 格式也是允许的。设备 UUID 在设备的生命周期内不应更改。请求和响应参数如表 16 所示。
表 31 – 获取网络 ID 消息格式
Byte | 描述 | |
Request data | - | - |
Response data | 1 | 完成代码 |
2:17 | 网络 ID 字节 1:16(请参阅 表 17) |
UUID 中的各个字段首先按照 RFC4122中描述的约定存储最高有效字节 (MSB)。有关示例格式,请参阅 表 17。
12.17 查询跳点
此命令可用于查询网桥,以确定是否应通过该网桥访问给定的 EID,如果是,是否应在通往该网桥的路径中通过另一座网桥,或者该终端是否位于直接连接到该网桥的总线上。
该命令还返回有关网桥在从接收请求的总线路由到给定目标端点时支持的传输单元信息的信息。有关更多信息,请参阅第 9.5 条。
注意 MCTP 的物理传输绑定可能会对可用于传输 MCTP 数据包负载的物理数据包大小提出额外要求,例如要求物理数据包大小以 32 字节或 64 字节为增量,或以 2 个增量的特定幂为增量(例如,128、256、512 等)。
请求和响应参数在表 32 中指定。
表 32 — 查询跃点消息
Byte | 描述 | |
Request data | 1 | 目标端点ID 0x00,0xFF = 预留。(应返回 ERROR_INVALID_DATA 完成代码。) |
2 | 请求发送单元信息的消息类型。除非对其他消息类型感兴趣,否则请使用 MCTP 控制消息类型编号。 | |
Response data | 1 | 完成代码 如果网桥路由表中的任何条目未覆盖目标 EID,则应返回 ERROR_INVALID_DATA 完成代码。 |
2 | 用于访问目标端点的下一个网桥的 EID(如果有) 注意:此响应取决于接收 Query Hop 请求的总线端口。 如果此 EID 为 00h:EID 被网桥的路由表覆盖,但目标 EID 不需要从接收请求的端口通过此网桥进行访问。如果目标 EID 已经是接收请求的总线的本地 ID,则将返回此响应。当目标 EID 是网桥本身的 EID 时,也会返回此响应。 如果此 EID 不为零,并且与请求中传递的目标 EID 不同:提供的 EID 是目标 EID 路径中“下一个网桥”的 EID。 如果此 EID 等于在请求中传递的目标 EID:目标 EID 通过此桥访问,并且无需通过其他桥即可到达目标。 | |
3 | 消息类型。此值返回请求中给定的消息类型,或者返回 0xFF 以指示该信息适用于桥接支持的所有消息类型。 | |
4:5 | 支持的最大传入传输单元大小(以 16 字节为增量),从基准传输单元大小(0x0000 = 64 字节,0x0001 = 80 字节,依此类推)。 | |
5:6 | 支持的最大传出传输单元大小(以 16 字节为增量,从基准传输单元开始(0x0000 = 64 字节,0x0001 = 80 字节,依此类推)。响应方将返回它为给定消息类型传输的 MCTP 数据包是否支持此传输单元大小。 |
12.18 解析 UUID
此命令用于根据端点的 UUID 获取有关该端点的信息。此命令可以从任何端点发送给总线所有者。此命令将 UUID 作为请求中的参数,并返回与此 UUID 匹配的 EID 和物理地址的列表。
支持此命令的总线所有者应在路由表条目中保留每个端点的 UUID。可以使用 “Get Endpoint UUID” 命令找到 UUID 值。 端点通过跟踪端点通过 Set Endpoint ID 命令接收其 EID 分配时使用的物理地址,从而知道总线所有者的物理地址。端点可以使用 null 目标 EID 值将此命令发送给总线所有者。这样,端点就无需跟踪总线所有者的 EID。请求和响应参数如表 33 所示。
表 33 – 解析 UUID 消息
Byte | 描述 | |
Request data | 1:16 | 请求的 UUID |
17 | 条目句柄(0x00用于访问表中的第一个条目) | |
Response data | 1 | 完成代码 |
2 | 下一个条目句柄 (使用此值请求下一组条目(如果有)。如果 EID 表数据超过单个 MCTP 控制响应中可以携带的数据。0xFF = 没有更多条目 | |
3 | 此响应中返回的 EID 条目数。 | |
4:N | 一个或多个路由表条目,格式根据表34.如果EID条目数为 0x00,则此字段将不存在。 |
表 34 — 解析 UUID 消息条目格式
Byte | 描述 |
0 | EID |
1 | 物理传输绑定类型标识符,符合 MCTP ID 规范 (DSP0239)。 |
2 | 物理介质类型标识符,根据 MCTP ID 规范(DSP0239)。此值用于指示物理地址数据的格式。 |
3 | 物理地址大小。 |
4:N | 物理地址。 |
12.19 查询速率限制
此命令可用于查询 EID 的传输速率限制能力和接收数据速率要求。
消息发起方可以使用此命令来确定此 EID 接受的数据速率。该命令还可用于查询 EID 的传输数据速率功能和当前设置。
请求和响应参数在表 35 中指定。
表 35 – 查询速率限制消息
Byte | 描述 | |
Request data | - | - |
Response data | 1 | 完成代码 |
2:5 | 接收信息:接收缓冲区大小(以字节为单位)。 | |
6:9 | 接收信息:最大接收数据速率限制,以基准传输单位数据包/秒为单位。值 0x0 表示接收方未请求限制流量。 注意:除非另有说明,否则应假定已为两个 EID 与接收器在最典型操作模式下的通信定义了限制。该值不是保证。瞬态负载和典型设备状态等因素可能意味着接收器将暂时无法以此响应中给定的速率接收。 | |
10:13 | 传输速率限制器功能:支持的最大速率限制,以基准传输单元数据包/秒为单位。值 0x0 表示设备无法限制其流量。 | |
14:17 | 传输速率限制器功能:支持的最小速率限制,以基准传输单位数据包/秒为单位。值 0x0 表示设备无法限制其流量。 | |
18:20 | 传输速率限制器功能:支持的最大突发大小。 | |
21:23 | 当前传输速率限制突发设置:允许一次从此 EID 发送的最大突发大小。 | |
24:27 | 当前设置:EID 最大传输数据速率限制,以基线传输单位数据包/秒为单位。值 0x0 表示速率限制器未处于活动状态(当 Rate Limiting 处于非活动状态时,EID 将以其当前状态的最大速率传输)。 | |
28 | 传输速率限制器功能: [7:2] – 保留 [1] – 传输速率限制操作功能 0b – 此 EID 的传输速率限制同时应用于请求和未请求的消息 1b – 此 EID 的传输速率限制仅应用于未请求的消息 [0] - EID 的速率限制支持 0b – 不支持传输速率限制 1b – 支持传输速率限制 |
12.20 请求 TX 速率限制
此命令可用于配置 EID 的最大传输速率限制设置。
数据接收设备应使用此命令,请求将发送 EID 配置为从发送端点到该数据接收 EID 的最大允许数据速率。
请求和响应参数在表 36 中指定。
表 36 — 请求 TX 速率限制消息
Byte | 描述 | |
Request data | 1:3 | EID 在 MCTP 数据包中传输最大突发大小。此值定义允许从接收 EID 支持的此终端节点发送的背靠背连续数据包的最大数量。术语“背靠背”是指数据包之间的最小延迟传输。此值应至少设置为 1 个数据包以启用速率限制。此字段中的值为 0 时,应仅用于禁用速率限制。 |
4:7 | EID 最大传输数据速率限制,以基准传输单元数据包/秒为单位。 | |
Response data | 1 | 完成代码 如果不支持请求的速率限制,则应返回 ERROR_INVALID_DATA。 |
2:5 | EID 传输 MCTP 数据包中的突发大小。此值定义当前允许一次从此终端节点发送的最大总突增大小。 | |
6:9 | EID 传输数据速率限制(当前使用),以基准传输单元数据包/秒为单位。 |
MCTP 数据包中 EID 传输突发大小的响应值和 EID 传输数据速率限制可能与请求的值不同。当收到来自多个源 EID 的多个请求时,可能会发生这种情况,这些请求具有不同的请求值,共享相同的速率限制器。请参阅 10.1.5 中的描述。
当新速率生效时、执行更改时或未执行任何更改时,将立即发送对此命令的响应。在首次从任何 EID 发送对 Request TX rate limit 命令的响应后,建议接收此命令的端点将向发送 Request TX rate limit 命令的 EID 发送 Get Endpoint UUID 命令。这允许任何设备识别何时使用不同的 EID 枚举端点,以便正确计算其速率限制设置。
12.21 更新速率限制
该命令从发送方 EID 发送到接收方 EID,以更新发送方速率设置的任何变化,这些变化不是来自接收方的请求。此命令将发送到任何连接的接收 EID,该 EID 不是发起速率更改的 EID。
该命令只能在 EID 发送突发大小和/或 EID 传输数据速率限制更改后使用。
请求和响应参数如表 37 所示。
表 37 – 更新速率限制消息
Byte | 描述 | |
Request data | 1:3 | EID 传输 MCTP 数据包中的突发大小。此值定义当前允许一次从此端点发送的最大总突增大小。 |
4:7 | EID 传输数据速率限制(当前使用),以基准传输单元数据包/秒为单位。 | |
Response data | 1 | 完成代码 |
如果发送方上发生错误,导致速率限制设置为不支持的速率,则接收方EID 应向发送方 EID 发出新的 Request TX rate limit 命令。
12.22 查询支持的接口
此命令可用于查询端点的 MCTP 接口功能。
MCTP 设备 A 可以使用此命令来查询 MCTP 设备 B 上可用于在设备 A 和 B 之间通信 MCTP 消息的不同接口。
表 38 中指定了请求和响应参数。
表 38 — 查询支持的接口
Byte | 描述 | |
Request data | - | - |
Response data | 1 | 完成代码 |
2 | 支持的接口数(应为 ≥ 1) | |
3 | 第一个接口类型(请参阅 MCTP ID) | |
4 | 第一个接口 EID | |
... | ||
... | ||
N-1 | 最后一个接口类型(请参阅 MCTP ID) | |
N | 最后一个接口 EID |
12.23 传输特定
传输特定命令是一系列可供传输绑定规范使用的命令,用于执行由特定传输绑定定义的其他 MCTP 控制功能。传输特定的命令只能发送到同一介质上的端点。允许网桥阻止将传输特定命令桥接到不同的媒体。
请求和响应参数在表 39 中指定。
表 39 – 传输特定消息
Byte | 描述 | |
Request data | 1 | MCTP 物理传输绑定标识符 定义传输特定消息的物理传输规范的 ID。此 ID 在本规范的 MCTP ID 配套文档中定义。 |
2 | MCTP 物理介质标识符 邮件所针对的物理介质的 ID。此 ID 在本规范的 MCTP ID 配套文档中定义。 | |
3:N | 传输特定于命令的数据。由传输绑定规范定义,该规范由字节 1 中给出的 MCTP 物理传输绑定标识符标识。如果物理传输绑定标识符 = 供应商定义:数据的前四个字节应为供应商的 IANA Enterprise ID。MSB 优先。有关本规范中使用的 IANA Enterprise ID 的信息,请参阅 12.8.1。 | |
Response data | 1 | 完成代码 |