Network_Adapter 模块边带NCSI功能介绍
更新时间: 2026/04/29
在Gitcode上查看源码

1. NCSI基本概念

NCSI(Network Controller Sideband Interface,网络控制侧带接口)被定义为管理控制器与一个或多个网络控制器之间的接口(包括协议、消息和介质)。该接口被称为边带接口,负责为管理控制器提供外部网络连接,同时允许外部网络接口与主机之间的数据流量共享使用。

简单理解就是BMC和网卡之间接了一根NCSI线缆,BMC就可以通过网卡访问外部网络,不用单独搭建管理网口的组网。

图1:NCSI 基本架构示意图

2. NCSI流量类型

NCSI的流量如图2所示,通过侧带接口可以传输两类数据包:

  • 直通数据包(Pass-Through):这些数据包在管理控制器与外部网络与内部主机之间传输,简单理解就是网络报文。
  • 控制数据包(Control):这些数据包在管理控制器与网络控制器之间传输,用于控制或者配置功能,简单理解就是BMC把配置发给网卡,网卡接收后执行相关配置。

图2:NCSI 控制面与数据直通面流量示意图

3. NCSI报文结构

NCSI边带走的是RBT(RMII-Based Transport),这是一个以太网接口,因此报文需要添加14字节的以太头,尾部添加4字节的FCS,以太类型为0x88F8。

14 bytes46-1500 bytes4 bytes
Destination AddressSource AddressEtherType (DMTF NC-SI)

3.1 以太头格式

Bytes31..2423..1615..0807..00
00..03DA5=0xffDA4=0xffDA3=0xffDA2=0xff
04..07DA1=0xffDA0=0xffSA5SA4
08..11SA3SA2SA1SA0
12..13EtherType=0x88F8 (DMTF NC-SI)

3.2 NCSI报文头格式

Bytes31..2423..1615..0807..00
00..03MC IDHeader RevisionReservedIID
04..07Control Packet TypeChannel IDFlagsPayload Length
08..11Reserved
12..15Reserved

3.3 关键字段说明

  • Control Packet Type:命令字,每个命令字对应一条不同功能的命令;
  • Channel ID:这个字段实际是Package ID(高3bit)+ Channel ID(低5bit),简单来说Package ID表示哪张网卡(从0开始,最大7),Channel ID表示哪个网口(从0开始,最大31)。

4. NCSI控制报文分类

请求/响应命令命令名称命令详细介绍
0x00/0x80Clear Initial State Command清除通道初始状态,如果不清除,所有网卡响应的命令都会异常,返回需要通道初始化的原因码
0x01/0x81Select Package Command选择一个Package,简单说,该命令就是探测阶段,寻找哪些网卡可用,给每个网卡分配一个独立的ID,避免冲突
0x02/0x82Deselect Package Command取消所选的Package,简单说就是不和这个网卡继续通信
0x03/0x83Enable Channel Command使能通道,允许Pass-Through报文和AEN报文通过
0x04/0x84Disable Channel Command去使能通道
0x06/0x86Enable Channel Network TX Command允许该通道内的Pass-Through报文转发到外部网络,简单说,开启后,BMC发出的网络报文才能通过网卡转发到外网,BMC的网络功能才能正常
0x07/0x87Disable Channel Network TX Command去使能通道网络TX
0x0A/0x8AGet Link Status Command获取通道的连接状态
0x0B/0x8BSet VLAN Filter Command设置VLAN过滤器,BMC通常是设置特定的VLAN ID
0x0C/0x8CEnable VLAN Command使能VLAN,需要和上面的过滤器一起使用,即上面设置了VLAN过滤器规则,这里再使能才能使规则生效
0x0D/0x8DDisable VLAN Command去使能VLAN
0x0E/0x8ESet MAC Address Command设置单播和组播MAC地址过滤,网络报文只有MAC地址匹配后才会转发给BMC
0x10/0x90Enable Broadcast Filter Command使能广播报文过滤,只允许特定的广播报文转发,广播报文:ARP、DHCP等
0x11/0x91Disable Broadcast Filter Command去使能广播报文过滤,所有广播报文都能转发
0x12/0x92Enable Global Multicast Filter Command使能全局组播报文过滤,允许特定的组播报文转发,组播报文:IPv6 NA、IPv6 RA报文等
0x13/0x93Disable Global Multicast Filter Command去使能全局组播报文过滤

5. Network_Adapter NCSI初始化流程

5.1 第一阶段:通道探测与初始化

  1. 根据网卡在位情况切换NCSI寄存器指向,NCSI当前分为PCIe、OCP1、OCP2三种类型,按照优先级PCIe > OCP1 > OCP2配置寄存器(寄存器默认指向PCIe);
  2. 启动NCSI报文接收任务,创建Socket不停接收BMC的NCSI网口收到的NCSI协议以太报文;
  3. 发送Select Package Command获取到Package ID;
  4. 遍历所有通道:
    • 调用Clear Initial State Command完成初始化,调用Set MAC Address Command设置MAC(这里的MAC就是BMC的NCSI网口MAC);
    • 发送Enable Channel Network TX Command,发通则认为BMC的该NCSI通道可用,用一个Flag记录后续在第二阶段使用,发不通则表示NCSI不可用不继续后面的流程,发通后再调用Disable Channel Network TX Command;
    • 调用Enable Channel Command,再调用Disable Channel Network TX Command,这两次操作就可以实现打开Channel的Rx,网卡可以向BMC传递网络报文,但BMC不能发送网络报文到外网;
    • 再调用Disable Broadcast Filter Command和Disable Global Multicast Filter Command保障所有广播和组播报文都能到达BMC。

5.2 第二阶段:网口注册与监听

  1. 遍历所有通道,如果该通道可用,则向bmc_network注册可用的网口(会显示到Web上);
  2. 获取当前BMC所使用的网口和当前NCSI VLAN ID及使能情况,如果是NCSI网口则记录下来保存该通道号,不是则不继续往下走;
  3. 启动相关监听任务,监听BMC网口切换、MAC变更、NCSI VLAN变更等信号。

5.3 第三阶段:通道使能与状态监控

  1. 使能第二阶段记录的通道号,调用Enable Channel Network TX Command,及设置Set VLAN Filter Command设置VLAN相关配置;
  2. 启动一个任务调用Get Link Status Command获取所有通道的连接状态并实时更新。

6. 网口切换

参考:ncsi_info:on_update 函数

7. AEN报文处理

在初始化第一阶段接收NCSI报文时会判断是否是网卡发送的AEN报文,如果是则会重新触发NCSI初始化。当前多用于网卡下电再上电场景,网卡会给BMC发送AEN报文。

参考函数:ncsi_core.ncsi_receive_packet