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 bytes | 46-1500 bytes | 4 bytes |
|---|---|---|
| Destination Address | Source Address | EtherType (DMTF NC-SI) |
3.1 以太头格式
| Bytes | 31..24 | 23..16 | 15..08 | 07..00 |
|---|---|---|---|---|
| 00..03 | DA5=0xff | DA4=0xff | DA3=0xff | DA2=0xff |
| 04..07 | DA1=0xff | DA0=0xff | SA5 | SA4 |
| 08..11 | SA3 | SA2 | SA1 | SA0 |
| 12..13 | EtherType=0x88F8 (DMTF NC-SI) |
3.2 NCSI报文头格式
| Bytes | 31..24 | 23..16 | 15..08 | 07..00 |
|---|---|---|---|---|
| 00..03 | MC ID | Header Revision | Reserved | IID |
| 04..07 | Control Packet Type | Channel ID | Flags | Payload Length |
| 08..11 | Reserved | |||
| 12..15 | Reserved |
3.3 关键字段说明
- Control Packet Type:命令字,每个命令字对应一条不同功能的命令;
- Channel ID:这个字段实际是Package ID(高3bit)+ Channel ID(低5bit),简单来说Package ID表示哪张网卡(从0开始,最大7),Channel ID表示哪个网口(从0开始,最大31)。
4. NCSI控制报文分类
| 请求/响应命令 | 命令名称 | 命令详细介绍 |
|---|---|---|
| 0x00/0x80 | Clear Initial State Command | 清除通道初始状态,如果不清除,所有网卡响应的命令都会异常,返回需要通道初始化的原因码 |
| 0x01/0x81 | Select Package Command | 选择一个Package,简单说,该命令就是探测阶段,寻找哪些网卡可用,给每个网卡分配一个独立的ID,避免冲突 |
| 0x02/0x82 | Deselect Package Command | 取消所选的Package,简单说就是不和这个网卡继续通信 |
| 0x03/0x83 | Enable Channel Command | 使能通道,允许Pass-Through报文和AEN报文通过 |
| 0x04/0x84 | Disable Channel Command | 去使能通道 |
| 0x06/0x86 | Enable Channel Network TX Command | 允许该通道内的Pass-Through报文转发到外部网络,简单说,开启后,BMC发出的网络报文才能通过网卡转发到外网,BMC的网络功能才能正常 |
| 0x07/0x87 | Disable Channel Network TX Command | 去使能通道网络TX |
| 0x0A/0x8A | Get Link Status Command | 获取通道的连接状态 |
| 0x0B/0x8B | Set VLAN Filter Command | 设置VLAN过滤器,BMC通常是设置特定的VLAN ID |
| 0x0C/0x8C | Enable VLAN Command | 使能VLAN,需要和上面的过滤器一起使用,即上面设置了VLAN过滤器规则,这里再使能才能使规则生效 |
| 0x0D/0x8D | Disable VLAN Command | 去使能VLAN |
| 0x0E/0x8E | Set MAC Address Command | 设置单播和组播MAC地址过滤,网络报文只有MAC地址匹配后才会转发给BMC |
| 0x10/0x90 | Enable Broadcast Filter Command | 使能广播报文过滤,只允许特定的广播报文转发,广播报文:ARP、DHCP等 |
| 0x11/0x91 | Disable Broadcast Filter Command | 去使能广播报文过滤,所有广播报文都能转发 |
| 0x12/0x92 | Enable Global Multicast Filter Command | 使能全局组播报文过滤,允许特定的组播报文转发,组播报文:IPv6 NA、IPv6 RA报文等 |
| 0x13/0x93 | Disable Global Multicast Filter Command | 去使能全局组播报文过滤 |
5. Network_Adapter NCSI初始化流程
5.1 第一阶段:通道探测与初始化
- 根据网卡在位情况切换NCSI寄存器指向,NCSI当前分为PCIe、OCP1、OCP2三种类型,按照优先级PCIe > OCP1 > OCP2配置寄存器(寄存器默认指向PCIe);
- 启动NCSI报文接收任务,创建Socket不停接收BMC的NCSI网口收到的NCSI协议以太报文;
- 发送Select Package Command获取到Package ID;
- 遍历所有通道:
- 调用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 第二阶段:网口注册与监听
- 遍历所有通道,如果该通道可用,则向bmc_network注册可用的网口(会显示到Web上);
- 获取当前BMC所使用的网口和当前NCSI VLAN ID及使能情况,如果是NCSI网口则记录下来保存该通道号,不是则不继续往下走;
- 启动相关监听任务,监听BMC网口切换、MAC变更、NCSI VLAN变更等信号。
5.3 第三阶段:通道使能与状态监控
- 使能第二阶段记录的通道号,调用Enable Channel Network TX Command,及设置Set VLAN Filter Command设置VLAN相关配置;
- 启动一个任务调用Get Link Status Command获取所有通道的连接状态并实时更新。
6. 网口切换
参考:ncsi_info:on_update 函数
7. AEN报文处理
在初始化第一阶段接收NCSI报文时会判断是否是网卡发送的AEN报文,如果是则会重新触发NCSI初始化。当前多用于网卡下电再上电场景,网卡会给BMC发送AEN报文。
参考函数:ncsi_core.ncsi_receive_packet