最近,正在学习 NC-SI 的使用方法,于是开始各种 Google 查找 NC-SI 的资料进行学习。最详细还是得直接看 NC-SI 规范文档 DSP0222,以下就是记录的一些感觉 NC-SI 规范中比较重要的点以及我的一些理解,以备后续查阅。
有任何疑问,请直接查看 NC-SI 规范文档 DSP0222
起源
为了方便对服务器进行管理,在服务器上通常有个被称为 BMC(Baseboard Management Controller,基板管理控制器)的独立硬件模块。通过相应的传感器,BMC 接收各种系统参数数据,例如,温度、风扇转速、操作系统状态等。管理员则可以通过 BMC 查看服务器运行状态及控制服务器。
BMC 有自己的 IP 地址,可以通过特殊的 Web 界面访问。
带外管理
带外(Out-of-band,OOB)是一个网络术语,指的是具有单独的通信通道,该通道不通过常规的数据流通道传输。带外管理就是使用单独的管理接口通道来管理和监控设备。在计算领域,带外管理的一种形式有时被称为无人值守管理(lights-out management,LOM)。
带外管理可以使用物理上分离的独立硬件模块,它允许系统管理员通过远程控制来监视和管理服务器和其他网络连接设备,而不管计算机是否已打开电源或者操作系统是否已安装及正常运行。
带内管理
带内( in-band)是相对于带外来说的,就是指使用常规数据通道。带内管理就是使用常规数据通道来管理和监控设备。我们常用的 VNC 或 SSH 就是基于带内连接(通常的网络通道)的带内管理方式。
带内管理通常必须依赖安装在被管理的远程系统上的软件,并且仅在操作系统启动并启动网络后才能工作。而且,它通常不是一个独立的硬件模块,不允许独立于其他网络组件的当前状态来管理远程设备。
IPMI
BMC 是智能平台管理接口 ( Intelligent Platform Management Interface,IPMI) 的一部分。IPMI 是自治计算机子系统的一组计算机接口规范,它提供独立于主机系统的 CPU、固件(BIOS 或 UEFI)和操作系统的管理和监视功能。IPMI 定义了一组接口,供系统管理员用于计算机系统的带外管理。
- IPMI 由英特尔牵头,于 1998 年 9 月 16 日首次发布。
- IPMI 的后继者是由 DMTF 制定的 Redfish
IPMI 子系统由一个被称为 BMC 的主控制器和其他管理控制器组成。这些控制器分布在不同系统模块中,然后通过 SMBus 或 RS-232 串口或 IPMB 或者直接使用地址 + 数据线与 BMC 相连进行通信。
最初,BMC 有一个独立的网口用来提供远程管理,后来,NIC 制造商开始使用专有的边带接口(通常基于 I2C / SMBus 接口)来提供一种机制,通过这种机制 BMC 可以与操作系统共享以太网端口。
最初的边带接口通信速度慢,且使用专有协议。DMTF 开始创建一个行业标准边带接口,它的运行速度将比 SMBus 快得多,并减轻了 BMC 工程师的一些负担。最终,网络控制器边带接口(NC-SI)规范于 2009 年以 1.0.0 版本发布。此后,NC-SI 逐渐成为了 BMC 的标配接口。
DMTF(Distributed Management Task Force,分布式管理任务组)是一个非营利性行业标准组织,致力于创建 IT 基础设施的开放式可管理性标准。
NC-SI
NC-SI 全称 Network Controller Sideband Interface(网络控制器边带接口)是一个由分布式管理任务组(DMTF)定义的电气接口和协议。通过 NC-SI,BMC 就可以与 CPU(操作系统)共享 NIC。
NC-SI 的目的是提供独立于网络控制器的带内活动的方法。同时,它提供一种健壮的过滤机制,允许 BMC 精确地指定它将接受的以太网流量类型。并且,NC-SI 支持高达 100Mbps 的全双工速度运行。
简单对 NC-SI 规范文档做个说明,第五章主要是对 NC-SI 的概述;第六章主要是 MC 和 NC 的设计要求;第七章主要是多 NC-SI 封装的仲裁机制;第八章是 NC-SI 协议的格式;第九章规定了各种操作的应答时间;第十章是 RBT 电气规范。同时,注意区分以下名词:
- Management Controller(MC,管理控制器)通常就是 BMC
- Network Controller(NC,网络控制器)通常就是 NIC。
- Package:在 NC-SI 中是封装的意思,用来代指一个芯片或芯片里的一个模块。这个名词对于理解规约非常重要!
- Packet:表示 Frame 中的一块结构化的数据
- Frame:代指以太网帧
数据包
NC-SI 将数据包被分为了 Pass-through Packets 和 Control Packets。其中,Pass-through Packets 就是 IEEE 802.3 以太网帧;Control Packets 的数据域则由 NC-SI 进行了自定义。
-
Control Packets: 仅用于 MC 与 NC 之间,是 MC 用来配置 NC、RMII 接口以及 Pass-through 规则的数据包,MC 发送 Command,NIC 给出 Response。NC-SI 协议就是指的针对 Control Packets 的协议。
-
Pass-through Packets: 用于 MC 与远程管理终端通信,就是我们常见的 TCP/IP 协议栈定义各种报文,例如 ARP、DHCP 等等。它由 NIC 根据 MC 下发的过滤配置(VLAN Tag filter、L2 address filters、 MAC address support、and limited frame filtering using L3 / L4 header),将数据包转发到公网以及将公网数据转发给 MC。
详见规范 6.5 Frame filtering for Pass-through mode 章节
-
Asynchronous Event Notification: 异步事件通知(AEN)报文使 NC 能够在网络控制器发生某些可能影响接口操作的状态变化时,主动向 MC 发送通知。MC 可以通过
AEN Enable
命令让 NC 开启或关闭该功能。AEN 没有应答,因此存在丢包的可能。
通信模型
NC-SI 通信模型是经典的 Request-Response 一问一答网络模型,由 MC 发送 Command,然后 NIC 给出 Response。在规范的 6.3.1.2 章节有明确说明,NC 和 MC 都只需要实现单线程处理,MC 发送一个 Command 后,需要等待应答(或超时)后,才能发送下一个 Command,NC 处理完一个命令后才会出来下一个命令。
管理控制器必须尝试 NCSI 请求(相同 IID)至少 3 次,才能够报告网络控制器发生了错误。
其中,异步事件通知(AEN)比较特殊,它是由 NC 主动向 MC 发送,并且 MC 不会给出 Response。当 NC 由于一些原因出现复位后,就可以利用 AEN 及时通知 MC,请求 MC 重新配置 NC。
拓扑结构
NC-SI 规范定义了完整的拓扑结构,它主要包括一个管理控制器(Management Controller,MC),一个或多个(最多支持 4 个)网络控制器(Network Controller,NC)。一个 NC 可以有多个通道(可以理解为一个 NC 的对外有多个网口)。在协议的定义中,则最多可以支持 8 个 NC,每个 NC 最多支持 31 个通道。
NC-SI 接口
NC-SI 规范定义的接口是基于 IEEE802.3 的 RMII 的,被称为 RBT(RMII Based Transport),定义于规范的第 10 章 10 RBT Electrical specification
(支持的其他接口见独立规范 DSP0261)。与标准 RMII 不同,RBT 允许将多个网络控制器连接到单个BMC,而 RMII 最初是设计用于点对点互连的。
通常,对于单个物理网络控制器封装(芯片或模块)存在单个逻辑 NC-SI 封装。然而,NC-SI 规范允许单个物理芯片或模块容纳多个 NC-SI 逻辑封装。根据通道和 NC-SI 封装的多少,NC-SI 规范将 NC 分为了单控制器和集成控制器。其中,单控制器是指只支持单个 NC-SI 通道的控制器,集成控制器是指能提供多个 NC-SI 通道的控制器。
多个 NC-SI 逻辑封装可以理解为 NC-SI 接口上有多个缓冲区(上图的 bus buffers),但对外的 NC-SI 接口还是一个。 NC-SI 协议的命令中有相应的字段来指定通信使用哪个 NC-SI 封装和通道。多个 NC-SI 封装和多个通道的对应关系由厂家来决定,NC-SI 规范并没有规定。
多个网络控制器封装(包括一个 NC 中的多个逻辑封装)能够同时接收来自管理控制器发出的在 NC-SI 的 TXD[1:0]
线上传输的流量,而不必为总线仲裁。但是,由于多个网络控制器封装共享 NC-SI 的 RXD[1:0]
线,不能同时进行返回数据,因此,必须有仲裁机制来允许连接到接口的多个网络控制器共享 RXD 线路,从而向管理控制器发送数据包。
通过仲裁机制,保证在任何给定时间只有一个 NC 封装可以将数据传输到 RXD 总线上。规范的第 7 章 7 Arbitration in configurations with multiple Network Controller packages
专门介绍了两种仲裁方法。并且要求 NC 封装支持接收 MC 下发的命令配置仲裁方式。
目前,NC-SI 仅支持一个 MC,也就不存在仲裁等问题,因此,对于 MC 侧,NC-SI 规范并没有详细描述
基于硬件的仲裁
为了防止两个或多个 NC-SI 封装同时传输,NC-SI 规范设计了一种基于硬件的仲裁方案,在任何给定的时间只允许一个 NC 封装驱动共享接口的 RX 线。当允许控制器通过 NC-SI 接口进行传输时,该方案采用一种在 NC 封装之间传递消息(运算码)的机制进行协调。
基于硬件的仲裁需要网络控制器上两个额外的引脚(ARB_IN 和 ARB_OUT)。一个 NC 的 ARB_OUT 引脚连接到下一个 NC 的 ARB_IN 引脚,形成一个环配置。硬件仲裁的时序要求被设计为最多容纳四个网络控制器。
如果实现包含一个单一的 NC,ARB_OUT 引脚可能连接到同一个 NC 上的 ARB_IN 引脚,或者可能保持断开连接,在这种情况下,应该使用 Select Package 命令禁用硬件仲裁。规范可选地支持使用 Get Capabilities 命令报告硬件仲裁实现状态和硬件仲裁状态。
基于硬件的仲裁是可选的,因此,先不看了(看了没看懂)!规范中有详细的介绍。
基于命令的仲裁
NC 可以不支持硬件仲裁,但是,必须要支持通过 Select Package
和 Deselect Package
这两个命令来控制哪一个 NC 封装可以在 RXD 线路上传输。因为只允许一个 NC 包在 RXD 线路上传输,所以在任何给定的时间,MC 应该只有一个包处于选定状态。
注意,这里的 Package 是指的 NC 中的 NC-SI 封装
NC-SI 协议
NC-SI 是一个遵循 IEEE 802.3 标准以太网帧格式的以太网接口,因此,其数据帧就是标准的 IEEE 802.3 以太网帧,定义于规范的 8 Packet definitions。NC-SI 将数据包被分为了 Pass-through Packets 和 Control Packets。其中,Pass-through Packets 就是 IEEE 802.3 以太网帧;NC-SI 协议就是针对 Control Packets 的。
- NC-SI 规定,除非另有指定,否则 Control Packets 中多字节数字首先传输最高有效位,字节内的位则先传输最高有效位。
- Control Packets 不能包含 802.1Q VLAN 标记
- Control Packets 的 EtherType 为 0x88F8
Ethernet frame header
以太网帧头就是标准的 IEEE 802.3 以太网帧格式。对于 NC-SI,取值都是确定的,规范中进行了规定:
- Destination Address (DA): 无论是 MC 还是 NC,这个字段必须填写为
FF:FF:FF:FF:FF:FF
的广播地址。如果收到不是该值的帧,由 NC 或 MC 自行决定如何处理该帧(丢弃、正常响应、错误响应)。 - Source Address (SA): 这个字段的内容可以设置为任何值。NC 生成的 NC-SI 控制报文中的该字段应使用
FF:FF:FF:FF:FF:FF
。 - Ethertype: 对于 NC-SI 控制报文,该字段应设置为 IEEE分 配给 NC-SI 的固定值 0x88F8。该值可以使 NC-SI 控制报文在整个报文流中与其他报文区分开来。
Frame Check Sequence
帧末尾的帧检测序列(FCS),用于检测帧的损坏情况。任何 FCS 无效的帧将被丢弃。
Control packet header
Control Packets(Command、Response、AEN)包含一个公共的被称为头 Control packet header
,包含用于识别、验证和处理报文的数据。Control packet header
共 16 个字节,采用大端字节顺序。
Management Controller ID
1 字节的 MC ID 用于标识发出 Control Packets 的 MC,目前,MC 应该将该字段设置为 0x00 。在任何给定的时间,只支持一个 MC 通过NC-SI 访问 NC。NC 发送的 Response 中的 MC ID 必须与 MC 下发的相同。
对于 AEN 报文,该字段是 AEN Enable 命令设置的参数。
Header revision
这个 1 字节字段标识发送方使用的控制包报头的版本。目前,报头修订是 0x01。
Instance ID (IID)
IID 用来唯一标识一次通信过程(发送方和接收方需要一致),类似于帧序号,取值是 0x01 ~ 0xFF。网络控制器可以使用它来区分重试的命令和新的命令实例。管理控制器可以使用此值来匹配接收到的应答与先前发送的命令。
由于 AEN 没有应答,所以 AEN 的 IID 固定是 0x00。
在实际通信中,MC 每次发送一个命令,都会增加 IID 的值,如果是重发上一个命令,则 IID 不变,NC 接收到后,直接返回收到的 IID,MC 接收应答后判断 IID 与自己下发的一致,方可确认应答有效。
由于 NS-SI 是 Request-Response 一问一答模型,因此,最多只需要缓存上一次命令即可
Control packet type
这个 1 字节的字段包含是个标识符,用于识别特定的命令和应答。其中,最高 BIT 位 置 1 表示应答,为 0 表示命令。这允许128 个唯一的应答类型和 128 个唯一的命令类型之间的一一对应。
由于 AEN 没有应答,该字段固定是 0xFF。
Channel ID
这个 1 字节的字段包含网络控制器通道标识符。网络控制器中的每个通道都应该被物理分配一个网络控制器通道 ID,管理控制器会在命令中设置这个值来指定该命令要用于的 NC-SI 封装和内部通道 ID。
比特位 | 名称 | 描述 |
---|---|---|
[7…5] | Package ID | 封装 ID 其实就是用来唯一代表一个 NC 封装,主要用于一个 NC 多个 NC-SI 封装的情况(取值从 0 依次增加) 。 网络控制器应至少允许系统集成商配置该字段的最低有效位两位(最高有效位为 0),当然也可以实现允许有所有 3 位可配置。 |
[4…0] | Internal Channel ID | 网络控制器内部通道的 id,从 0 开始编号,针对网络控制器支持的每个直通通道依次递增,管理控制器使用 NC-SI 命令访问该通道。 内部通道 ID 值为 0x1F 适用于整个包。 |
Channel ID 由 NC 进行定义,可以支持可配置,也可以不可配置,如果可配置,需要存储为非易失性数据,防止掉电丢失。同时,必须保证唯一性,不能出现多个 ID 对应同一个通道的情况。
Payload length
这个 12 位的字段以字节为单位指示了 NC-SI 报头之后的命令或应答帧中任何有效载荷数据(Control packet payload)的长度。该值不包括 NC-SI 报头的长度、校验和值或任何可能存在的填充。
Reserved
这些字段是为将来使用保留的,应该被置为 0,MC 和 NC 都不应该使用或判断该字段的值。
Control packet payload
NC-SI 数据包负载可以包含零个或多个定义的数据值,这取决于数据包是命令数据包还是应答数据包或其他特定的类型。Control packet type
取值不同,下面的结构会进一步格式化。
例如,对于 Response 报文,前 4 个字节固定为 2 字节 Response Code 和 2 字节 Reason Code。 有些 Response Code 和 Reason Code 有特定的组合。
数据
NC-SI 数据包负载总是按照大端字节顺序格式化。如果有效负载存在且是 32 位对齐的,则应该插入 1 到 3 个值为 0x00 的填充字节,将数据对齐到 32 位(校验和字段的偏移必须在 32 位边界)。
2’s Complement checksum compensation
计算的范围是从 Control packet header 到 Control packet payload(含对齐字节) 。这个校验和就是一个以 32 位表示的所有字节累加和的补码值。注意,计算过程是以 16 位无符号数来累加的,因此,需要每两个字节拼成一个 16 位无符号。
uint32_t ncsi_calculate_checksum(uint8_t *data, uint32_t len)
{
uint32_t checksum = 0;
for (int i = 0; i < len; i += 2)
{
checksum += (((uint32_t)data[i] << 8) | data[i + 1]);
}
return (~checksum + 1);
}
校验方在收到之后,同样将 Control packet header 到 Control packet payload(含对齐字节)的字节以 16 位无符号数来累加形成一个 32 位的累加和(注意不是补码),然后在加上收到的校验和,如果没有错误,那么就应该正好为 0。
- 1’s Complement:即反码,常用在 IP、TCP 的 checksum 校验和中
- 2’s Complement:即补码
Ethernet packet pad
IEEE 802.3 规定,从 DA 到 FCS,所有以太网帧的长度至少为 64 字节。大多数 NC-SI 控制报文的长度小于以太网帧负载的 46 字节的最小长度,因此,需要填充以符合 IEEE 802.3。
AEN 帧结构
AEN 报文应该遵循控制报文的一般报文格式,但是,其 IID 字段设置为 0,控制包类型字段的值应该是 0xFF,通道 ID 字段中填写自己的 ID,以表明自己是通知源。注意,管理控制器不会发送响应报文来确认 AEN 报文。
工作流
规范的第六章 6 Operational behaviors
包含了对 MC 和 NC 实现 NC-SI 的一些工作流程。例如,MC 和 NC 有哪些状态,各种状态下该干啥,如何处理异常情况(丢包、校验)等等。
NC 工作流
下图描述了网络控制器是否以及何时准备好处理 NC-SI 命令报文,何时允许通过 NC-SI 接口传输透传报文,以及何时进入期望管理控制器配置的状态,以及各状态之间的转换逻辑。
MC 工作流
当 NC-SI 接口第一次上电时,管理控制器需要发现并配置 NC-SI 设备(即 NC),以便可以在后续进行透传数据。该任务包括设置 MAC 地址、配置二层过滤、设置通道启用等参数。
6.2.13 Startup sequence examples
描述了 MC 的工作流程,我这里只关于与不带硬件仲裁的流程 6.2.13.2 Typical non hardware arbitration specific startup sequence
。至于带硬件仲裁的流程,自己查看 6.2.13.3 Hardware arbitration specific startup sequence
。
NS-SI 规范要求,MC 应定期向 NC 发出相关命令,以测试 NC 是否已输入初始状态。该测试应多久进行一次由 MC 决定。
规范中给出的下面提供的流程是管理控制器启动 NC-SI 操作的一种方式的示例。这个流程假设管理控制器事先不知道有多少网络控制器连接到它的 NC-SI,或者这些控制器支持什么功能。如果管理控制器事先了解网络控制器的功能,例如网络控制器是否已经连接并启用了硬件仲裁,那么可以跳过一些步骤。
- Power up:需要等待一定的时间间隔, 确保 NC 已经初始化就绪。如果提前发送命令,需要自行处理 NC 不应答的问题。各种操作的时间要求,在规范的
9 Packet-based and op-code timing
有定义。 - Discover package
- Discover and get capabilities for each channel in the package
- Repeat steps 2 and 3 for remaining packages
- Initialize each channel in the package
- Enable hardware arbitration for the packages
- Start Pass-through packet and AEN operation on the channels
参考
- DSP0222
- https://en.wikipedia.org/wiki/Out-of-band_management