PLDM协议深度解析:28种PDR类型实战抓包与逆向分析指南
在数据中心和嵌入式系统管理领域,PLDM(Platform Level Data Model)协议已成为硬件管理的事实标准。作为PLDM协议的核心组件,PDR(Platform Description Record)定义了平台硬件资源的描述、配置和监控方式。本文将基于Wireshark抓包实战,深入解析28种PDR数据帧的结构特点与逆向分析方法。
1. PLDM协议与PDR基础架构
PLDM协议栈构建在MCTP(Management Component Transport Protocol)之上,采用请求-响应模型实现带外管理。PDR作为PLDM的元数据引擎,其核心价值在于:
- 硬件抽象:将传感器、执行器等物理设备抽象为标准化数据结构
- 动态发现:支持管理控制器(BMC)在运行时获取平台配置
- 跨厂商兼容:通过标准类型定义(1-24)和OEM扩展类型(126-127)实现灵活扩展
典型的PDR交互流程包含三个阶段:
- 终结点发现:通过MCTP Endpoint Discovery定位PLDM设备
- PDR仓库同步:使用GetPDR命令获取平台描述记录
- 实时监控:基于PDR定义的阈值触发事件通知
# 典型PLDM over MCTP通信示例 tcpdump -i eth0 -nn -s0 -w pldm.pcap 'port 623'提示:在数据中心环境中,PLDM通信通常发生在BMC与各个硬件组件之间,使用IANA分配的623端口(IPMI标准端口)
2. PDR通用头部结构与类型体系
所有PDR类型共享相同的8字节头部结构,这是逆向分析的起点:
| 字段名 | 类型 | 大小(字节) | 描述 | 示例值 |
|---|---|---|---|---|
| recordHandle | uint32 | 4 | 唯一标识PDR的句柄 | 0x00010001 |
| PDRHeaderVersion | uint8 | 1 | 头部版本号 | 0x01 |
| PDRType | uint8 | 1 | PDR类型代码 | 0x02(Numeric Sensor) |
| recordChangeNumber | uint16 | 2 | 变更计数器 | 0x0001 |
| dataLength | uint16 | 2 | 数据部分长度 | 0x0040 |
28种标准PDR类型可分为五大类:
终结点管理类
- Type 1: Terminus Locator PDR
- Type 126: OEM Device PDR
传感器监控类
- Type 2: Numeric Sensor PDR
- Type 4: State Sensor PDR
- Type 21: Compact Numeric Sensor PDR
执行器控制类
- Type 9: Numeric Effecter PDR
- Type 11: State Effecter PDR
实体关联类
- Type 15: Entity Association PDR
- Type 23: Redfish Entity Association PDR
OEM扩展类
- Type 126: OEM Device PDR
- Type 127: OEM PDR
3. 关键PDR类型逆向实战
3.1 Terminus Locator PDR(Type 1)分析
作为终结点拓扑的锚点,Type 1 PDR包含以下关键字段:
# Terminus Locator PDR结构示例 struct terminus_locator_pdr: common_header # 标准8字节头部 PLDMTerminusHandle # 2字节终结点句柄 validity # 1字节有效性标志 TID # 1字节终结点ID containerID # 2字节容器ID terminusLocatorType # 1字节定位类型 terminusLocatorValue # 变长定位数据定位类型决定terminusLocatorValue的解析方式:
| 类型值 | 类型名称 | 典型应用场景 |
|---|---|---|
| 0x01 | UID | 基于UUID的设备标识 |
| 0x02 | MCTP_EID | MCTP终结点ID寻址 |
| 0x03 | SMBusRelative | SMBus从设备地址 |
| 0x04 | systemSoftware | 系统软件代理 |
Wireshark过滤技巧:
pldm.type == 0x01 && pldm.pdr_header.pdr_type == 13.2 Numeric Sensor PDR(Type 2)解析
数值型传感器PDR是硬件监控的核心,其字段结构呈现多层嵌套:
// Numeric Sensor PDR关键字段 typedef struct { uint16_t sensorID; uint16_t entityType; // 关联实体类型 uint16_t entityInstance; uint16_t containerID; uint8_t baseUnit; // 基础单位代码 int8_t unitModifier; // 单位缩放因子(10^N) float resolution; // 单位转换系数 float offset; // 单位转换偏移 uint16_t accuracy; // 精度(0.01%单位) } NumericSensorPDR;单位转换公式:
物理值 = (原始值 × resolution) + offset阈值字段位图分析:
| 位位置 | 阈值类型 | 对应字段 |
|---|---|---|
| 0 | Upper Warning | warningHigh |
| 1 | Upper Critical | criticalHigh |
| 2 | Upper Fatal | fatalHigh |
| 3 | Lower Warning | warningLow |
| 4 | Lower Critical | criticalLow |
| 5 | Lower Fatal | fatalLow |
3.3 Entity Association PDR(Type 15)拓扑构建
实体关联PDR描述硬件组件的层次结构,其核心是容器-包含模型:
# 实体关联关系示例 entity_association = { "containerID": 0x1000, "containerEntity": { "type": 0x2001, # 机箱 "instance": 1, "container": 0 # 顶层容器 }, "containedEntities": [ {"type": 0x3001, "instance": 1}, # 电源模块1 {"type": 0x3001, "instance": 2} # 电源模块2 ] }常见实体类型代码:
| 类型值 | 实体名称 | 规范章节 |
|---|---|---|
| 0x2001 | 机箱 | DSP0249 9.1.2 |
| 0x3001 | 电源模块 | DSP0249 9.1.3 |
| 0x4001 | 处理器 | DSP0249 9.1.4 |
4. Wireshark高级分析技巧
4.1 解码PLDM over MCTP报文
在Wireshark中正确解析PLDM需要以下步骤:
- 确保启用MCTP协议解析
- 设置PLDM作为MCTP的有效载荷类型
- 应用显示过滤器
mctp.payload_type == 1
关键字段定位技巧:
- PLDM头部:
pldm.header - PDR类型:
pldm.pdr_header.pdr_type - 终结点ID:
pldm.terminus_id
4.2 常见PDR问题排查
记录句柄冲突
- 症状:GetPDR响应返回
PLDM_ERROR_INVALID_RECORD_HANDLE - 分析:检查recordHandle字段是否在PDR仓库内唯一
- 症状:GetPDR响应返回
单位转换异常
- 症状:传感器读数与物理值偏差大
- 验证:检查resolution和offset字段的字节序
阈值触发失效
- 诊断:确认supportedThresholds位图与实际阈值字段匹配
5. OEM扩展与自定义PDR开发
厂商自定义PDR开发需遵循以下规范:
类型分配
- 标准类型范围:1-24
- OEM类型范围:126-127
字段设计原则
- 前8字节保持标准头部
- OEM数据区以vendorIANA开头
- 总长度不超过64KB
# OEM PDR设计示例 class OEM_PDR: def __init__(self): self.common_header = { 'recordHandle': 0x80000001, 'PDRType': 126 } self.vendor_specific = { 'vendorIANA': 0x000012D, # 华为IANA 'OEMRecordID': 0x01, 'data': b'\x01\x02\x03' # 自定义数据 }兼容性建议:
- 为关键字段保留向后兼容空间
- 在PDR描述中包含版本标识
- 避免与标准类型语义冲突
通过深度解析PDR数据帧结构,工程师可以更高效地开发PLDM管理功能,快速诊断硬件通信问题。在实际项目中,建议结合厂商文档和协议分析工具,逐步构建完整的平台管理解决方案。