网卡适配指南
更新时间:2025/07/01
在Gitcode上查看源码

本篇文章介绍如何在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整体调速策略。

第一步:了解需要配置的网卡

  • 查看网卡型号(通常在网卡上会标注)
  • 确认网卡类型(PCIeOCP、板载等)
  • 记录网卡的基本信息(四元组等)
  • 热设计文档,指导调速策略
  • 传感器、事件设计

第二步:配置网卡基础信息配置

配置网卡基础配置即可保证网卡可加载起来。

  • 配置正确的文件名称,根据BOM+四元组信息组成对应网卡的文件名
  • 填写网卡名称和型号
  • 选择正确的网卡类型
  • 输入厂商和设备ID

PCIe设备对象 (PCIeDevice_1)

定义PCIe设备的基本属性和类型

  • 设备名称
  • 功能类型
  • 设备类型
  • 插槽类型
json
{
    "PCIeDevice_1": {
        "DeviceName": "PCIe Card $ (设备型号)",
        "FunctionClass": 2,  // 功能类型
        "PCIeDeviceType": "MultiFunction",  // 设备类型
        "SlotType": "FullLength",  // 插槽类型
        "FunctionProtocol": "PCIe",  // 协议类型
        "FunctionType": "Physical"  // 功能类型
    }
}

网卡对象 (PCIeCard_1)

定义网卡的基本信息和属性

  • 名称
  • 描述
  • 厂商ID
  • 设备ID
  • 制造商信息
json
{
    "PCIeCard_1": {
        "Name": "设备型号",
        "Description": "设备描述",
        "VendorID": "厂商ID",
        "DeviceID": "设备ID",
        "Manufacturer": "制造商",
        "PartNumber": "部件号",
        "Model": "型号",
        "FirmwareVersion": "固件版本",
        "SerialNumber": "序列号"
    }
}

网络适配器对象 (NetworkAdapter_1)

定义网络适配器的功能和特性

  • 名称
  • 描述
  • 端口数量
  • 支持特性
json
{
    "NetworkAdapter_1": {
        "Name": "适配器名称",
        "Description": "适配器描述",
        "NetworkPortCount": "端口数量",
        "VendorID": "厂商ID",
        "DeviceID": "设备ID",
        "SupportedMctp": true,  // 是否支持MCTP
        "SupportedLLDP": true,  // 是否支持LLDP
        "HotPluggable": false,  // 是否支持热插拔
        "LinkWidth": "链路宽度",
        "LinkSpeed": "链路速度"
    }
}

网卡类型对象

根据网卡类型的不同,会使用不同的对象类型:

  1. 标准PCIe网卡 (BoardPCIeCard_1)

    • 适用于独立的PCIe网卡
  2. OCP网卡 (OCPCard_1)

    • 适用于OCP规格的网卡
  3. 板载网卡 (BoardNICCard_1)

    • 适用于主板集成的网卡

标准PCIe网卡对象 (BoardPCIeCard_1) 用于标准PCIe网卡

  • 插槽信息
  • 链路能力
  • 板卡类型
  • FRU信息
json
{
    "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信息
json
{
    "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信息
json
{
    "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
  • 介质类型
  • 链路能力
json
{
    "NetworkPort_0": {
        "@Parent": "NetworkAdapter_1",
        "SystemID": 1,
        "PortID": 0,
        "NetDevFuncType": "设备功能类型",
        "MediumType": "FiberOptic",  // 介质类型
        "SupportedLinkCapability": "链路能力"
    }
}

光学模块对象 (OpticalModule_X)

定义光学模块属性和监控参数(针对支持光模块的网卡)

  • 通道号
  • 温度
  • 电源状态
  • 阈值
json
{
    "OpticalModule_0": {
        "@Parent": "NetworkPort_0",
        "ChannelNum": 1,
        "TemperatureCelsius": 0,
        "PowerState": 0,
        "IsSupportedType": 0,
        "Temp_UpperThresholdCritical": 125
    }
}

第三步:配置监控配置

传感器定制与开发请参考《传感器定制与开发》进行配置,以下仅举例网卡相关传感器。

  • 设置温度监控阈值,用于告警或调速
  • 配置电压和功率监控,如告警或传感器
  • 设置状态监控参数

阈值传感器对象 (ThresholdSensor)

  • 适用场景
    • 温度监控
    • 电压监控
    • 功率监控
  • 关键属性
    • 阈值设置
    • 滞后值
    • 线性化参数
json
{
    "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)

用于监控离散状态

  • 适用场景
    • 设备在位状态
    • 电源状态
    • 故障状态
  • 关键属性
    • 状态掩码
    • 类型定义
json
{
    "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)

定义散热控制参数

  • 目标温度
  • 最大允许温度
json
{
    "CoolingRequirement_1_50": {
        "Description": "网卡芯片调速",
        "MonitoringStatus": "监控状态",
        "TargetTemperatureCelsius": 90,
        "MaxAllowedTemperatureCelsius": 102
    }
}

第四步:配置管理特性

  • 配置故障报警条件
  • 设置LED指示灯代码
  • 定义报警级别

精细化告警开发请参考事件定制进行配置,以下仅举例网卡相关告警。

基本事件对象

定义基本事件监控

json
{
    "Event_PCIeBandWidth": {
        "EventKeyId": "PCIeCard.PCIeCardBandWidthDecreased",
        "xxx": "xxxx"
    },
    "Event_PCIeLinkSpeed": {
        "EventKeyId": "PCIeCard.PCIeCardLinkSpeedReduced",
        "xxx": "xxxx"
    },
    "Event_PCIeCardUCE": {
        "EventKeyId": "PCIeCard.PCIeCardUncorrectableErr",
        "xxx": "xxxx"
    }
}

温度相关事件

json
{
    "Event_OverTemp": {
        "EventKeyId": "PCIeCard.PCIeCardOverTemp",
        "xxx": "xxxx"
    },
    "Event_TempFail": {
        "EventKeyId": "PcieCard.PCIeCardTempFail",
        "xxx": "xxxx"
    },
    "Event_TempSensorFail": {
        "EventKeyId": "PcieCard.PCIeCardTempSensorFail",
        "xxx": "xxxx"
    }
}

电源相关事件

json
{
    "Event_PowerFail": {
        "EventKeyId": "PCIeCard.PCIeCardPowerFail",
        "xxx": "xxxx"
    },
    "Event_VoltageAlarm": {
        "EventKeyId": "PCIeCard.PCIeCardVoltageAlarm",
        "xxx": "xxxx"
    },
    "Event_PowerOverload": {
        "EventKeyId": "PCIeCard.PCIeCardPowerOverload",
        "xxx": "xxxx"
    }
}

端口相关事件

json
{
    "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"
    }
}

设备状态事件

json
{
    "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
json
{
    "Fru_PCIeCard": {
        "PcbId": "PCB ID",
        "FruId": 1,
        "FruName": "FRU名称",
        "ConnectorGroupId": "连接器组ID",
        "BoardId": 255
    }
}

第五步:配置带外信息获取

在 NetworkAdapter对象下有一个Model属性,该属性用于配合社区组件network_adapter加载并指定协议获取网卡带外信息。

芯片对象 (Chip_X)

定义芯片访问参数

  • 地址
  • 超时时间
json
{
    "Chip_Hi1822": {
        "OffsetWidth": 0,
        "AddrWidth": 1,
        "Address": 232,
        "WriteTmout": 100,
        "ReadTmout": 100
    }
}

管理总线对象

针对芯片的总线定义,确保芯片可被访问。

  • 总线类型
  • 通道
json
{
    "ManagementTopology": {
        "Anchor": {
            "Buses": [
                "I2cMux_Chan"
            ]
        }
    }
}