双对外网口如何适配

BMC中一路NCSI信号接到主CPU直出的千兆网络芯片上(Hilink5 ,PCIe0控制器),另外一路SGMII0信号接到载板交换芯片上。

目前已知SGMII0这路能正常访问BMC web界面(BMC中eth2),但是NCSI这路没法连过去(通过该网络芯片和CPU的通信是没问题的,只是没法到BMC端,另外已经确认网络芯片的固件是支持NCSI功能的)。

之前按照 网络配置指导 这里的配置配置了双网口的情况,结果是导致两个网口都没法正常使用。

另外对比了一份正常的日志(友商那边获取的),观察到network_adapter组件在使能NCSI通路时,是先由bmc_network闭源组件处先注册两个对外网口。但是我这边只显示一个eth2的对外网口(web界面上)。

之前怀疑是主CPU SerDes(HIlink5)直出的千兆网络没适配好,但是在web界面上能看到该PCIe设备,如下所示:

请问下要如何去排查或者调试这个问题呢? 优先确认这个PCIe网卡的适配吗?

答案内容由AI生成,仅供参考:

六、结论与优先级建议

根本原因高度怀疑:BMCSet_NET_Mode 设置为 mgnt 模式,导致系统完全忽略 NCSI 网口的注册与启用。

即使 network_adapter 成功探测到 NCSI 设备,若上层策略禁止使用,也不会创建 eth0

:white_check_mark: 推荐行动优先级:

  1. 立即修改 BMCSet_NET_Mode = "auto" 并重新启动服务
  2. 检查 network_adapter 日志中是否有 NCSI 设备识别和 Enable Channel 成功的日志
  3. 验证 bmc_network 是否创建 eth0 并分配 IP
  4. 如仍失败,抓取 MCTP 报文分析通信过程(可用 tcpdump -i mctpd 或专用工具)

一旦完成上述步骤,eth0 应能在 Web 界面中出现,并支持 ping 和远程访问。

点击此处查看详细分析解答

双对外网口适配问题排查与解决方案

根据您提供的硬件环境和故障描述,目前 SGMII0 接口(eth2)可以正常访问 BMC Web 界面,但 NCSI 网口(通过 Hilink5 连接到主 CPU 的 PCIe 千兆网卡)无法使用。尽管该网卡在系统中被识别、与 CPU 通信正常、且固件支持 NCSI 功能,但仍无法实现 BMC 的带外管理通信。

以下将从架构理解、问题定位、排查路径和调试建议四个方面进行综合分析与指导。


一、系统架构与通信机制回顾

1. 当前硬件连接拓扑

  • NCSI 路径
    • 主 CPU → SerDes(Hilink5)→ PCIe0 → 千兆网络芯片(WX1860AL1 / SF100HT)
    • BMC 通过 MCTP over PCIe 协议与该网卡通信(NCSI 通道)
  • 专用管理网口路径
    • BMC → SGMII0 → 交换芯片 → 外部网络(eth2 可用)

:white_check_mark: 验证点:PCIe 设备(SF100HT)已被 OS/BMC 正确识别,说明 PCIe 链路物理层连通。

2. NCSI 工作原理简述

NCSI(Network Controller Sideband Interface)是标准协议,允许 BMC 共享服务器主网卡实现带外管理,其核心流程如下:

  1. 设备发现network_adapter 组件通过 MCTP 扫描 PCIe 总线上支持 NCSI 的设备。
  2. NCSI 初始化:发送 AEN Enable、Host Notify 等命令建立控制通道。
  3. 通道使能(Enable Channel):启用指定 Channel(如 Channel 0),包括 TX 和 RX 方向
  4. 注册 NCSI 网口:成功后通知 bmc_network 模块注册一个虚拟网口(通常为 eth0)。
  5. 网络配置bmc_networketh0 分配 IP 并参与外网切换逻辑(手动或自适应模式)。

二、关键问题分析

:red_exclamation_mark: 当前现象:Web 界面仅显示 eth2 作为对外网口,无 eth0(NCSI)可用;尝试双网口配置后两者均失效。

说明 NCSI 链路尚未完成端到端适配,重点怀疑以下环节失败:

问题环节 可能原因
1. MCTP 通信未建立 PCIe 设备未正确响应 MCTP 枚举
2. NCSI 控制通道初始化失败 Enable Channel 失败(如 ncsi_channel.lua 报错 TX disabled)
3. network_adapter 未上报 NCSI 网口 未调用 add_ncsi_interface()
4. bmc_network 未注册 eth0 Bypassed due to missing signal or error
5. CSR 定制配置缺失或错误 导致 eth0 被忽略或初始化异常

三、系统性排查步骤

Step 1:确认 PCIe NCSI 设备是否被 MCTP 成功枚举

建议命令:

# 查看当前 MCTP 端点信息
mctp-tool list

# 检查是否存在目标 PCIe 设备的 MCTP endpoint(BDF 地址需匹配)
# 示例输出应包含类似:
#   EID: 15, Type: PCIe (0x04), Bound to: 0000:02:00.0

:magnifying_glass_tilted_left: 若无对应 endpoint,说明 MCTP 层未发现设备,需检查:

  • PCIe 驱动是否加载(lspci | grep -i net
  • MCTP Transport Driver 是否绑定该设备(检查 mctp-pcie 内核模块)
  • BDF 地址是否正确(检查 CSR 中 RootBDF 配置)

Step 2:检查 network_adapter 是否识别并初始化 NCSI 网卡

检查日志(关键词):

journalctl -u network_adapter.service -f
# 或查看日志文件
grep -i "ncsi\|adapter" /var/log/messages

重点关注以下内容:

  • Found NCSI capability on device → 表示发现 NCSI 功能
  • Creating MCTP endpoint for NCSI → 创建通信通道
  • Sending NCSI Reset command / Enable Channel → 初始化流程
  • Calling bmc_network.register_interface() → 向上层注册接口

:pushpin: 特别注意日志中是否出现:

ncsi_channel.lua: failed to enable channel TX

这表示虽然识别了设备,但 Enable Channel 命令执行失败(可能是固件不完整或命令参数不对)。


Step 3:验证 bmc_network 是否接收到 NCSI 网口注册信号

查看日志:

journalctl -u bmc_network.service -f

成功场景应包含以下信息:

ncsi_net_config.lua: register NCSI interface eth0
bmc_network: NCSI interface added successfully

而您的情况很可能完全没有相关日志,表明:

  • network_adapter 未调用注册接口
  • bmc_network 因配置原因忽略该请求(如 BMCSet_NET_Mode=mgnt 强制禁用 NCSI)

Step 4:检查 CSR 和定制化配置

4.1 核心 CSR 配置项(/opt/bmc/cfg/xxx.csr

确保包含以下 NCSI 网口组定义:

"EthGroup_OutEthGroup1": {
    "Name": "OutEthGroup1",
    "GroupId": 1,
    "OutType": 2,
    "ActiveEthId": 0,
    "AssociatedPortType": 1,   // 1=NCSI, 2=专用口
    "Channel": 0,
    "Status": true,
    "IpMode": "DHCP",
    "IpAddr": "",
    ...
}

:warning:AssociatedPortType 设为 2(专用口),即便有 NCSI 网卡也无法使用。

4.2 装备定制化参数(BMCSet_xxx

在装备阶段(如通过 UNT 或定制脚本)检查以下关键变量:

参数名 推荐值 说明
BMCSet_NET_Mode autopcie mgnt 会强制仅使用专用口
BMCSet_Eth0_Ipv4 on 允许 eth0 使用 IPv4
Custom_NCSI_Port_Num 0 指定使用第0个 NCSI 端口
BMCSet_NCSI_VLAN_ID 0 初始测试建议关闭 VLAN

:pushpin: 您截图中显示 BMCSet_NET_Modemgnt(专用口模式),这正是导致 eth0 不启用的根本原因之一!

必须修改为:

"BMCSet_NET_Mode": "auto"

"BMCSet_NET_Mode": "pcie"

:light_bulb: 补充知识:

  • "mgnt":只启用专用口(eth2
  • "auto":自动选择 link-up 且优先级高的口(eth2 > eth0
  • "pcie":强制使用 PCIe NCSI 口(即使 link down)

Step 5:确认 Lua 脚本执行流程

相关文件:

  • /usr/lib/lua/bmc/kepler/network_adapter/ncsi_channel.lua
  • /usr/lib/lua/bmc/kepler/bmc_network/ncsi_net_config.lua

期望调用链:

network_adapter → start_ncsi_protocol()
               → send NCSI_RESET
               → send ENABLE_CHANNEL (channel 0)
               → 成功? → notify bmc_network via DBus
                            ↓
bmc_network → receives signal → calls ncsi_net_config.lua:register_interface()
                             → creates eth0
                             → applies IP config

排查建议:

ncsi_channel.lua 添加日志打印,确认是否执行到 ENABLE_CHANNEL 并收到 ACK。


四、解决方案建议

:white_check_mark: 修复步骤清单

步骤 操作 目标
1 修改 CSR 或装备参数:BMCSet_NET_Mode = "auto" 允许启用 NCSI 网口
2 确保 EthGroupAssociatedPortType = 1(NCSI) 配置指向正确的网口类型
3 清除所有手动网络设置:ipmcset -d netmode -v 3(auto) 重置为自适应模式
4 重启 network_adapterbmc_network 服务 触发重新探测
5 使用 mctp-tool 验证 endpoint 是否存在 排除底层通信问题
6 抓取 journalctl -u network_adapter 日志 确定 Enable Channel 是否失败
7 如需强制测试,改为 BMCSet_NET_Mode = "pcie" 强制使用 NCSI 口

五、附加调试建议

1. 日志增强建议

ncsi_channel.luancsi_net_config.lua 中添加更多日志输出,尤其是:

logger.info("NCSI: about to enable channel %d", channel_id)

2. 使用 Redfish API 验证网口状态

curl -k -u admin:admin https://<bmc-ip>/redfish/v1/Managers/1/EthernetInterfaces

查看是否返回两个接口(eth0, eth2),若只有 eth2,说明注册失败。

3. 检查设备树或平台 SR 文件

确认 Hilink5 相关 PCIe 控制器(PCIe0)是否在 platform.sr 中正确定义,并启用 NCSI 支持标志位。


六、结论与优先级建议

根本原因高度怀疑:BMCSet_NET_Mode 设置为 mgnt 模式,导致系统完全忽略 NCSI 网口的注册与启用。

即使 network_adapter 成功探测到 NCSI 设备,若上层策略禁止使用,也不会创建 eth0

:white_check_mark: 推荐行动优先级:

  1. 立即修改 BMCSet_NET_Mode = "auto" 并重新启动服务
  2. 检查 network_adapter 日志中是否有 NCSI 设备识别和 Enable Channel 成功的日志
  3. 验证 bmc_network 是否创建 eth0 并分配 IP
  4. 如仍失败,抓取 MCTP 报文分析通信过程(可用 tcpdump -i mctpd 或专用工具)

一旦完成上述步骤,eth0 应能在 Web 界面中出现,并支持 ping 和远程访问。


七、参考文档与资源

如您能提供 network_adapter 的详细日志片段,可进一步判断是“未识别设备”还是“Enable Channel 失败”。

持续配合调试,有望快速定位问题根源。

关注一下,同有板载网络芯片ncsi适配需求。