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 时自行创建 |