本篇文章介绍如何在openUBMC上适配一张网卡。
网卡介绍
网卡,即网络接口控制器 (英语:network interface controller,NIC),又称网络接口控制器 ,网络适配器 (network adapter),网络界面卡 (network interface card),或局域网接收器 (LAN adapter),是一块被设计用来允许服务器在网络上进行通信的硬件。
由于其重要性,随着基础设施的蓬勃发展,网卡的技术在不断地迭代,诞生出各式各样的形态。因此在带外管理领域,不同网卡的多样性一直是BMC面临的技术挑战。openUBMC 基于适配过的网卡,抽象了一套管理方法,便于统一管理。
网卡适配流程
与其他部件CSR一致,每张网卡拥有一个CSR文件。
NOTE
为了简化 CSR 配置,强烈推荐使用BMC Studio进行适配。
新适配一张网卡CSR需要做什么
CSR文件是用来告诉openUBMC如何识别、管理和监网卡的"说明书"。就像给电脑安装新硬件时需要驱动程序一样,这个配置文件告诉BMC:
- 网卡的名称以及型号等固定信息;
- 网卡支持什么带外协议;
- 如何监控网卡的工作状态;
- 出现什么问题时需要上报告警;
- 管理网卡的传感器。
网卡CSR包含哪些信息?
- 设备识别:网卡的静态信息,让BMC可以识别安装了什么网卡;
- 状态监控:网卡的硬件拓扑信息,用于实时监控网卡,网口,光模块的温度等信息;
- 故障上报:网卡的传感器、事件配置,当网卡状态处于什么情况时进行时间上报;
- 调速策略:网卡的调速策略配置,指导BMC整体调速策略。
第一步:了解需要配置的网卡
- 查看网卡型号(通常在网卡上会标注)
- 确认网卡类型(
PCIe
、OCP
、板载等) - 记录网卡的基本信息(四元组等)
- 热设计文档,指导调速策略
- 传感器、事件设计
第二步:配置网卡基础信息配置
配置网卡基础配置即可保证网卡可加载起来。
- 配置正确的文件名称,根据BOM+四元组信息组成对应网卡的文件名
- 填写网卡名称和型号
- 选择正确的网卡类型
- 输入厂商和设备ID
PCIe设备对象 (PCIeDevice_1)
定义PCIe设备的基本属性和类型
- 设备名称
- 功能类型
- 设备类型
- 插槽类型
{
"PCIeDevice_1": {
"DeviceName": "PCIe Card $ (设备型号)",
"FunctionClass": 2, // 功能类型
"PCIeDeviceType": "MultiFunction", // 设备类型
"SlotType": "FullLength", // 插槽类型
"FunctionProtocol": "PCIe", // 协议类型
"FunctionType": "Physical" // 功能类型
}
}
网卡对象 (PCIeCard_1)
定义网卡的基本信息和属性
- 名称
- 描述
- 厂商ID
- 设备ID
- 制造商信息
{
"PCIeCard_1": {
"Name": "设备型号",
"Description": "设备描述",
"VendorID": "厂商ID",
"DeviceID": "设备ID",
"Manufacturer": "制造商",
"PartNumber": "部件号",
"Model": "型号",
"FirmwareVersion": "固件版本",
"SerialNumber": "序列号"
}
}
网络适配器对象 (NetworkAdapter_1)
定义网络适配器的功能和特性
- 名称
- 描述
- 端口数量
- 支持特性
{
"NetworkAdapter_1": {
"Name": "适配器名称",
"Description": "适配器描述",
"NetworkPortCount": "端口数量",
"VendorID": "厂商ID",
"DeviceID": "设备ID",
"SupportedMctp": true, // 是否支持MCTP
"SupportedLLDP": true, // 是否支持LLDP
"HotPluggable": false, // 是否支持热插拔
"LinkWidth": "链路宽度",
"LinkSpeed": "链路速度"
}
}
网卡类型对象
根据网卡类型的不同,会使用不同的对象类型:
标准PCIe网卡 (BoardPCIeCard_1)
- 适用于独立的PCIe网卡
OCP网卡 (OCPCard_1)
- 适用于OCP规格的网卡
板载网卡 (BoardNICCard_1)
- 适用于主板集成的网卡
标准PCIe网卡对象 (BoardPCIeCard_1) 用于标准PCIe网卡
- 插槽信息
- 链路能力
- 板卡类型
- FRU信息
{
"BoardPCIeCard_1": {
"Slot": 1,
"UID": "N/A",
"Name": "网卡名称",
"Manufacturer": "制造商",
"Type": "PCIeCard",
"Description": "网卡描述",
"PartNumber": "部件号",
"BoardType": "BoardPCIeCard",
"Number": 1,
"DeviceName": "<=/PCIeDevice_1.DeviceName",
"Position": "<=/PCIeDevice_1.Position",
"LinkWidthCapability": "<=/NetworkAdapter_1.LinkWidthCapability",
"LinkSpeedCapability": "<=/NetworkAdapter_1.LinkSpeedCapability",
"LinkWidth": "<=/NetworkAdapter_1.LinkWidth",
"LinkSpeed": "<=/NetworkAdapter_1.LinkSpeed",
"BoardNodeId": "<=/PCIeDevice_1.DeviceName",
"FruID": "<=/Fru_PCIeCard.FruId"
}
}
OCP网卡对象 (OCPCard_1) 用于OCP网卡
- OCP特定属性
- 链路能力
- 板卡类型
- FRU信息
{
"OCPCard_1": {
"Slot": 1,
"UID": "N/A",
"Name": "OCP网卡名称",
"Manufacturer": "制造商",
"Type": "OCPCard",
"Description": "OCP网卡描述",
"PartNumber": "部件号",
"BoardType": "OCPCard",
"Number": 1,
"DeviceName": "<=/PCIeDevice_1.DeviceName",
"Position": "<=/PCIeDevice_1.Position",
"LinkWidthCapability": "<=/NetworkAdapter_1.LinkWidthCapability",
"LinkSpeedCapability": "<=/NetworkAdapter_1.LinkSpeedCapability",
"LinkWidth": "<=/NetworkAdapter_1.LinkWidth",
"LinkSpeed": "<=/NetworkAdapter_1.LinkSpeed",
"BoardNodeId": "<=/PCIeDevice_1.DeviceName",
"FruID": "<=/Fru_PCIeCard.FruId"
}
}
板载网卡对象 (BoardNICCard_1) 用于板载网卡
- 板载特定属性
- 链路能力
- 板卡类型
- FRU信息
{
"BoardNICCard_1": {
"Slot": 1,
"UID": "N/A",
"Name": "板载网卡名称",
"Manufacturer": "制造商",
"Type": "NICCard",
"Description": "板载网卡描述",
"PartNumber": "部件号",
"BoardType": "BoardNICCard",
"Number": 1,
"DeviceName": "<=/PCIeDevice_1.DeviceName",
"Position": "<=/PCIeDevice_1.Position",
"LinkWidthCapability": "<=/NetworkAdapter_1.LinkWidthCapability",
"LinkSpeedCapability": "<=/NetworkAdapter_1.LinkSpeedCapability",
"LinkWidth": "<=/NetworkAdapter_1.LinkWidth",
"LinkSpeed": "<=/NetworkAdapter_1.LinkSpeed",
"BoardNodeId": "<=/PCIeDevice_1.DeviceName",
"FruID": "<=/Fru_PCIeCard.FruId"
}
}
第二步:配置网口基础信息
网络端口对象 (NetworkPort_X)
定义网络端口属性和能力
- 端口ID
- 介质类型
- 链路能力
{
"NetworkPort_0": {
"@Parent": "NetworkAdapter_1",
"SystemID": 1,
"PortID": 0,
"NetDevFuncType": "设备功能类型",
"MediumType": "FiberOptic", // 介质类型
"SupportedLinkCapability": "链路能力"
}
}
光学模块对象 (OpticalModule_X)
定义光学模块属性和监控参数(针对支持光模块的网卡)
- 通道号
- 温度
- 电源状态
- 阈值
{
"OpticalModule_0": {
"@Parent": "NetworkPort_0",
"ChannelNum": 1,
"TemperatureCelsius": 0,
"PowerState": 0,
"IsSupportedType": 0,
"Temp_UpperThresholdCritical": 125
}
}
第三步:配置监控配置
传感器定制与开发请参考《传感器定制与开发》进行配置,以下仅举例网卡相关传感器。
- 设置温度监控阈值,用于告警或调速
- 配置电压和功率监控,如告警或传感器
- 设置状态监控参数
阈值传感器对象 (ThresholdSensor)
- 适用场景:
- 温度监控
- 电压监控
- 功率监控
- 关键属性:
- 阈值设置
- 滞后值
- 线性化参数
{
"ThresholdSensor_Temp": {
"AssertMask": 128,
"DeassertMask": 28800,
"ReadingMask": 2056,
"Linearization": 0,
"M": 100,
"RBExp": 224,
"UpperNoncritical": 105,
"PositiveHysteresis": 2,
"NegativeHysteresis": 2
},
"ThresholdSensor_Voltage": {
"AssertMask": 128,
"DeassertMask": 28800,
"ReadingMask": 2056,
"Linearization": 0,
"M": 100,
"RBExp": 224,
"LowerNoncritical": 3.0,
"UpperNoncritical": 3.6,
"PositiveHysteresis": 0.1,
"NegativeHysteresis": 0.1
},
"ThresholdSensor_Power": {
"AssertMask": 128,
"DeassertMask": 28800,
"ReadingMask": 2056,
"Linearization": 0,
"M": 100,
"RBExp": 224,
"UpperNoncritical": 25,
"PositiveHysteresis": 1,
"NegativeHysteresis": 1
}
}
离散传感器对象 (DiscreteSensor)
用于监控离散状态
- 适用场景:
- 设备在位状态
- 电源状态
- 故障状态
- 关键属性:
- 状态掩码
- 类型定义
{
"DiscreteSensor_Presence": {
"AssertMask": 1,
"DeassertMask": 2,
"ReadingMask": 3,
"Type": 0
},
"DiscreteSensor_PowerState": {
"AssertMask": 4,
"DeassertMask": 8,
"ReadingMask": 12,
"Type": 0
},
"DiscreteSensor_FaultState": {
"AssertMask": 16,
"DeassertMask": 32,
"ReadingMask": 48,
"Type": 0
}
}
散热控制对象 (CoolingRequirement_X)
定义散热控制参数
- 目标温度
- 最大允许温度
{
"CoolingRequirement_1_50": {
"Description": "网卡芯片调速",
"MonitoringStatus": "监控状态",
"TargetTemperatureCelsius": 90,
"MaxAllowedTemperatureCelsius": 102
}
}
第四步:配置管理特性
- 配置故障报警条件
- 设置LED指示灯代码
- 定义报警级别
精细化告警开发请参考事件定制进行配置,以下仅举例网卡相关告警。
基本事件对象
定义基本事件监控
{
"Event_PCIeBandWidth": {
"EventKeyId": "PCIeCard.PCIeCardBandWidthDecreased",
"xxx": "xxxx"
},
"Event_PCIeLinkSpeed": {
"EventKeyId": "PCIeCard.PCIeCardLinkSpeedReduced",
"xxx": "xxxx"
},
"Event_PCIeCardUCE": {
"EventKeyId": "PCIeCard.PCIeCardUncorrectableErr",
"xxx": "xxxx"
}
}
温度相关事件
{
"Event_OverTemp": {
"EventKeyId": "PCIeCard.PCIeCardOverTemp",
"xxx": "xxxx"
},
"Event_TempFail": {
"EventKeyId": "PcieCard.PCIeCardTempFail",
"xxx": "xxxx"
},
"Event_TempSensorFail": {
"EventKeyId": "PcieCard.PCIeCardTempSensorFail",
"xxx": "xxxx"
}
}
电源相关事件
{
"Event_PowerFail": {
"EventKeyId": "PCIeCard.PCIeCardPowerFail",
"xxx": "xxxx"
},
"Event_VoltageAlarm": {
"EventKeyId": "PCIeCard.PCIeCardVoltageAlarm",
"xxx": "xxxx"
},
"Event_PowerOverload": {
"EventKeyId": "PCIeCard.PCIeCardPowerOverload",
"xxx": "xxxx"
}
}
端口相关事件
{
"Event_Port1LinkDown": {
"EventKeyId": "Port.PortDisconnected",
"xxx": "xxxx"
},
"Event_OM1PowerAlarm": {
"EventKeyId": "Port.PortOpticalModulePowerAlarm",
"xxx": "xxxx"
},
"Event_OM1SpeedMatch": {
"EventKeyId": "Port.PortOpticalModuleSpeedMismatch",
"xxx": "xxxx"
},
"Event_Port1BWUsageMntr": {
"EventKeyId": "NICCard.SystemNetworkBandwidthUsageHigh",
"xxx": "xxxx"
}
}
设备状态事件
{
"Event_DevicePresence": {
"EventKeyId": "PCIeCard.PCIeCardPresence",
"xxx": "xxxx"
},
"Event_PowerState": {
"EventKeyId": "PCIeCard.PCIeCardPowerState",
"xxx": "xxxx"
},
"Event_FaultState": {
"EventKeyId": "PCIeCard.PCIeCardFaultState",
"xxx": "xxxx"
}
}
FRU对象 (Fru_PCIeCard)
- FRU ID
- 名称
- PCB ID
{
"Fru_PCIeCard": {
"PcbId": "PCB ID",
"FruId": 1,
"FruName": "FRU名称",
"ConnectorGroupId": "连接器组ID",
"BoardId": 255
}
}
第五步:配置带外信息获取
在 NetworkAdapter对象下有一个Model属性,该属性用于配合社区组件network_adapter加载并指定协议获取网卡带外信息。
芯片对象 (Chip_X)
定义芯片访问参数
- 地址
- 超时时间
{
"Chip_Hi1822": {
"OffsetWidth": 0,
"AddrWidth": 1,
"Address": 232,
"WriteTmout": 100,
"ReadTmout": 100
}
}
管理总线对象
针对芯片的总线定义,确保芯片可被访问。
- 总线类型
- 通道
{
"ManagementTopology": {
"Anchor": {
"Buses": [
"I2cMux_Chan"
]
}
}
}