一、协议定义
- 定位:
专为平台管理子系统设计的通信协议,用于管理控制器(如BMC)与其他管理控制器或管理设备之间的标准化通信。
核心设计目标
-
跨总线兼容性
- 协议设计支持多种物理总线类型(如I2C、PCIe、SMBus等),实现异构传输层统一管理。
-
分层架构
- 消息格式:标准化数据封装规则,确保端到端语义一致性。
- 传输描述:定义不同总线的适配层,抽象物理差异。
- 消息交换模式:支持请求-响应、异步通知等交互机制。
- 配置与初始化:提供设备发现、参数协商等基础服务。
典型应用场景
平台类型 | 管理用例 |
---|---|
移动设备/嵌入式系统 | 低功耗传感器监控、远程诊断 |
桌面/工作站 | 硬件状态上报、固件热更新 |
服务器/数据中心 | 多节点BMC协同管理、带外大规模设备监控 |
二、数据帧简介
MCTP报文结构概览
报文层次 | 字段组成 | 功能定位 |
---|---|---|
物理介质相关部分 | Medium-specific Header + Trailer | 适配底层总线特性(如SMBus地址、PCIe TLP封装) |
通用传输头 | MCTP Transport Header (32 bits) | 跨介质通用控制信息(版本、路由、分片控制) |
消息体 | Message Body (含IC标志、消息类型、数据、完整性校验等) | 应用层负载与协议扩展能力 |
MCTP Transport Header字段详解
字段名 | 位数 | 描述 | 关键作用 |
---|---|---|---|
RSVD | 4 bits | 保留字段,未来扩展使用 | 为协议演进预留空间 |
Hdr Version | 4 bits | 头部版本标识,由物理介质绑定规范定义(如SMBus与PCIe可能版本不同) | 支持多版本介质适配 |
Destination EID | 8 bits | 目标端点ID(EID),用于路由 | 确定报文接收方,支持广播/组播(特殊EID值) |
Source EID | 8 bits | 源端点ID(EID),标识发送方 | 用于响应路由与消息跟踪 |
SOM | 1 bit | 置1表示当前包为消息的第一个分片 | 多包消息起始标志,触发接收方重组缓冲区初始化 |
EOM | 1 bit | 置1表示当前包为消息的最后一个分片 | 指示消息结束,触发接收方处理完整消息 |
Pkt Seq # | 2 bits | 包序列号(模4递增),用于检测丢包 | 允许检测最多连续3个包丢失(如序列0→1→2→3→0...) |
Msg Tag | 3 bits | 消息标签,结合Source EID和TO字段唯一标识消息 | 支持同一源到目标的多消息并发传输(不同标签区分) |
TO (Tag Owner) | 1 bit | 标签所有者标识: • 0: 目标端点生成标签(如响应) • 1: 源端点生成标签(如请求) | 区分请求/响应消息,避免标签冲突 |
Message Body字段解析
字段名 | 位置/大小 | 描述 | 交互逻辑 |
---|---|---|---|
IC (Integrity Check) | 1 bit (消息体首字节最高位) | 指示是否包含消息完整性校验(如CRC) | 若置1,消息体末尾需携带校验字段,校验范围由消息类型定义 |
Message Type | 7 bits (消息体首字节最低7位) | 定义消息类型(如控制命令、传感器数据、错误报告) | 决定后续Message Header/Data的解析规则 |
Message Header | 0-M bytes | 消息类型专用头部(如事务ID、优先级标志) | 仅首包携带,部分消息类型可能无此字段 |
Message Data | 0-N bytes | 应用层数据(如传感器读数、固件块、配置参数) | 跨包传输时按分片顺序重组 |
Msg Integrity Check | 可变 | 消息类型特定的完整性校验字段(如CRC32),位于消息体末尾 | 校验失败触发重传(可靠模式)或丢弃(非可靠模式) |
三、发现与寻址流程
MCTP网络通过五步标准化流程实现设备发现与通信准备,确保异构总线环境中设备可互操作:
步骤 | 目标 | 关键活动 |
---|---|---|
1. 总线枚举 | 识别物理总线上连接的设备 | - 总线控制器扫描物理连接(如PCIe枚举、I2C地址探测) - 生成设备物理拓扑图 |
2. 总线地址分配 | 为设备分配物理层通信地址 | - 静态分配(预定义地址)或动态分配(如SMBus ARP) - 确保总线内地址唯一性 |
3. MCTP能力发现 | 确认设备支持MCTP协议并获取其能力参数 | - 发送Get MCTP Version控制消息 - 解析设备响应的支持特性(如消息类型、最大传输单元) |
4. 端点ID分配(EID) | 为每个MCTP设备分配逻辑端点ID,用于网络层路由 | - 中央控制器(如BMC)通过Set Endpoint ID消息分配EID - 避免EID冲突(如使用位掩码保留范围) |
5. 路由信息分发与使用 | 构建网络路由表,确保跨总线、跨桥接设备的消息可达性 | - 桥接设备上报路由表(如通过Update Routing Table消息) - 控制器聚合拓扑信息并同步至相关设备 |
四、MCTP控制协议核心概念
角色定义
术语 | 描述 |
---|---|
Requester | 发起控制请求(Request)的端点(例如BMC请求设备状态) |
Responder | 响应请求的端点(如设备返回状态数据) |
Originator/Source | 任何控制消息的发起者(包括Request/Response/Datagram) |
Target/Destination | 控制消息的接收方 |
Asynchronous Notification | 端点主动发送的非请求型数据报(如事件告警) |
Broadcast | 使用广播EID(0xFF)发送到总线所有端点的消息 |
控制消息类型
消息类型 | 特征 | 应用场景 |
---|---|---|
Request | - 需响应(Response) - 包含 Command Code (操作类型)- 示例: Get Device ID | 主动查询设备能力或状态 |
Response | - 包含Completion Code (执行结果)- 携带请求返回数据 | 响应请求(成功/失败及附加信息) |
Datagram | - 无响应 - 单向传输(如事件通知) | 异步事件上报(如温度超阈值告警) |
Broadcast Request | - 广播发送到所有端点 - 需响应(各端点独立回复) | 总线范围设备发现(如Get Endpoint List ) |
Broadcast Datagram | - 广播发送且无响应 | 全局配置下发(如时间同步广播) |
关键字段详解
字段 | 位宽/值 | 作用 |
---|---|---|
IC | 1bit (0b) | 固定为0(控制消息不启用消息完整性校验) |
Message Type | 7bit (0x00) | 标识为MCTP控制消息 |
Rq bit | 1bit | - 1: Request消息 - 0: Response/Datagram消息 |
D-bit | 1bit | - 0: 用Instance ID匹配请求与响应 - 1: 仅标识重传消息(Datagram专用) |
Instance ID | 1字节 | 标识消息实例: - 防止重复处理(如重传时ID不变) - 匹配请求与响应 |
Command Code | 1字节 | 定义请求操作类型(如0x01=Get Endpoint ID ,详见规范表12) |
Completion Code | 1字节 | 响应状态码(如0x00=成功 ,0x80=无效参数 ,详见规范表13) |
Message Data | 可变长度 | 携带请求参数或响应结果(格式由Command Code 定义) |
五、 MCTP控制命令概览
关键命令分类
命令码 | 命令名称 | 核心功能 | 适用设备 | 强制/可选性 |
---|---|---|---|---|
0x01 | Set Endpoint ID | 为指定物理地址的端点分配EID | 总线所有者(非顶级) | 端点:Mandatory to accept (Ma) |
0x02 | Get Endpoint ID | 查询端点的当前EID、类型及静态EID使用状态 | 所有端点 | 端点:Mandatory to accept (Ma) |
0x03 | Get Endpoint UUID | 获取端点的唯一UUID(热插拔设备必须支持) | 支持热插拔的端点 | 条件性支持 (Ca2) |
0x07 | Resolve Endpoint ID | 解析目标EID的物理地址和下一跳桥接信息 | 桥接/总线所有者 | 桥接:Mandatory to accept (Ma) |
0x0F | Query Hop | 发现目标端点的路径桥接及传输单元限制 | 桥接 | 桥接:Mandatory to accept (Ma) |
0x0B | Prepare for Endpoint Discovery | 清空端点的“已发现”标志,准备响应发现命令 | 支持动态发现的设备 | 条件性生成 (Cg3) |
0x0C | Endpoint Discovery | 主动发现总线上的MCTP设备(若物理层无其他发现机制) | 总线所有者 | 条件性生成 (Cg3) |
命令适用性规则
OMC列解读
标识符 | 含义 |
---|---|
Ma | 必须接受(端点必须处理该命令并生成响应) |
Mg | 必须生成(端点需主动发起该命令) |
Oa/Og | 可选接受/生成(根据实现需求决定是否支持) |
Ca/Cg | 条件性接受/生成(需满足特定条件,如物理层绑定规范要求) |
Na/Ng | 不适用(设备类型不支持该命令) |
关键条件注释
- Set Endpoint ID
- 顶级总线所有者无需支持此命令(EID分配由上层协议完成)。
- Routing Information Update
- 若桥接静态配置路由表,可不支持此命令。
- Transport Specific Commands (0xF0-0xFF)
- 传输层绑定专用命令(如PCIe/SMBus特有配置),禁止跨桥接转发。
完成代码(Completion Codes)
代码 | 名称 | 场景示例 |
---|---|---|
0x00 | SUCCESS | 命令执行成功(如Get Endpoint ID 返回有效EID)。 |
0x02 | ERROR_INVALID_DATA | 请求参数非法(如Set Endpoint ID 中EID超出范围)。 |
0x03 | ERROR_INVALID_LENGTH | 消息长度不符(如Query Hop 请求缺少必要字段)。 |
0x05 | ERROR_UNSUPPORTED_CMD | 接收方不支持该命令(如向简单端点发送Allocate Endpoint IDs )。 |
0x80-0xFF | COMMAND_SPECIFIC_ERROR | 命令特定错误(如Prepare for Discovery 在非发现阶段调用返回0x81)。 |