linux NC-SI

article/2025/9/30 8:18:18

NCSI 的简单介绍

图 1. 服务器的网络管理模块结构图

 它主要包括:一个管理控制器(Management Controller, MC),一个或多个(NCSI 的电气特性最多支持 4 个)网络控制器(Network Controller, NC)。网络控制器一方面连接了外部网络接口与内部主机接口,另一方面,又与管理控制器之间有一个带外接口。

  通过带外接口的网络数据包主要分为两类:一类是在外部网络与管理控制器之间传输的普通数据包,网络控制器对于这类数据包只作转发处理;另一类是在管理控制器与网络控制器之间传输的携带控制信息的数据包,他们往往是管理控制器对网络控制器配置的一些修改操作,对于这类数据包,网络控制器需要做出相应的响应。而管理控制器与网络控制器之间的带外接口的电气性质以及通信协议,就是由 NCSI 来定义的。

  此外,NCSI 还提供了相应的传输协议栈来保证这种带外管理。NCSI 的传输协议栈如图 2 所示:


图 2. NCSI 的传输协议栈

  从图 2 中可以看到:

在 NCSI 的传输协议栈中,位于最底层的是物理层,NCSI 的物理层是基于 RMII 接口的;

  位于物理层之上的是数据链路层,NCSI 的数据链路层是基于以太介质的;

  NCSI 支持的位于数据链路层之上的协议主要有两种:一种是管理控制器与网络控制器之间交互的 NCSI 命令协议,另一种是管理控制器与外部网络通信的网络数据协议,如:ARP 协议、DHCP 协议、NetBIOS 协议等,它们只是被网络控制器在管理控制器和外部网络之间作转发处理。在本文中,我们着重讨论第一种协议,也就是控制命令协议。

  NCSI 控制命令协议

  NCSI 控制命令允许管理控制器初始化、规范化自己的 NCSI 接口流量,配置 NCSI 信道过滤规则以及监控网络控制器的运行状态。作为 NCSI 控制命令协议的主体,管理控制器是所有控制命令的发起者,而网络控制器则响应管理控制器发送的控制命令。


就目前而言,网络控制器只能以单线程的方式支持 NCSI 命令。也就是说,网络控制器一次只能够执行一个 NCSI 命令。只有当它对收到的某个 NCSI 请求发送了响应包之后,才能够继续接受下一个 NCSI 请求。

  网络控制器的这种单线程机制使得管理控制器在对同一个网络控制器发送 NCSI 请求时也只能以单线程方式进行。当管理控制器向某个网络控制器发送了一个 NCSI 请求后,它必须保持等待状态,直到收到了网络控制器发出的 NCSI 响应或者超时重传为止。

  超时重传机制

  如果在 NCSI 命令超时的时间间隔内,管理控制器还没有收到网络控制器回复的 NCSI 响应,则管理控制器必须以相同的 IID 重发之前的 NCSI 请求。

  管理控制器必须尝试 NCSI 请求至少 3 次,才能够报告网络控制器发生了错误。

  在网络环境相对恶劣的情况下,可能管理控制器在收到之前发送的 NCSI 请求的响应的时候,已经超过了超时重发的时间间隔。在这种情况下,管理控制器会收到对于同一个 NCSI 请求的两个响应。管理控制器必须有相应的机制能够检测出这第二个 NCSI 响应,并且将它丢弃。

  异步事件通告包

  AEN(Asynchronous Event Notification)包是网络控制器在某些状态发生变化、且影响其接口正常工作的情况下向管理控制器主动发送的通告数据包。由于 NCSI 命令只是网络控制器处理的众多数据包中的一小部分,网络控制器的一系列事件都会影响到命令的正常执行。这些事件包括:链路状态变化、操作系统驱动加载及卸载、芯片复位等等。

  网络控制器对哪些事件会向管理控制器发送 AEN 包是由管理控制器来定义的,管理控制器通过使用控制位(control bit),可以单独地定义网络控制器对各个事件的异步事件通告是否启用。

  AEN 包是工作在 NCSI 请求 - 应答机制之外的一种 NCSI 包。也就是说,AEN 包既不是 NCSI 请求,也不是任意 NCSI 请求的响应。AEN 包没有应答,即使一个 AEN 包在传输的过程中丢失了,管理控制器也无从得知。

  一个 AEN 包的 IID 始终为 0x00。

  NCSI 包结构

  NCSI 的以太网帧头

  正如前文所述,NCSI 是基于以太介质的。所有的 NCSI 包都是封装在 IEEE 802.3 定义的以太网帧格式中的,即:任意一个 NCSI 包都被封装在 14 字节的以太网头及 4 字节的以太网尾中,如图 3 所示:

  图 3. NCSI 包的以太帧格式

图 3. NCSI 包的以太帧格式


目的地址字段:

  NCSI 以太帧的第 0 到 5 字节分别代表以太网目的地址的第 5 到 0 字节。由于传输 NCSI 命令的信道并没有被分配一个特定的 MAC 地址,所以 NCSI 以太帧的目的地址为广播地址(FF:FF:FF:FF:FF:FF)。

  如果网络控制器收到了一个目的地址不是 FF:FF:FF:FF:FF:FF 的 NCSI 包,则它会直接丢弃该数据包并且返回一个错误响应。

  源地址字段:

  NCSI 以太帧的第 6 到 11 字节分别代表以太网源地址的第 5 到 0 字节。如果 NCSI 包来自于管理控制器,那么源地址字段可以为任意值。如果 NCSI 包来自于网络控制器,则源地址字段必须为 FF:FF:FF:FF:FF:FF。

  类型字段:

  NCSI以太帧的第 12、13 字节分别代表以太网类型的第 1、0 字节。对于NCSI 控制包而言,其类型字段为 0x88F8。

  NCSI 控制包头

  每个 NCSI 包(包括 NCSI 请求包、响应包以及 AEN 包)都有一个 16 字节长的控制包头,以大端在先顺序排列,如图 4 所示:


  图 4. NCSI 控制包头格式

  

图 4. NCSI 控制包头格式

  Management Controller ID(MC ID)字段


MC ID 字段 1 字节长,标识了 NCSI 包对应的管理控制器。在 NCSI 1.0.0a 版本中,该字节规定为 0x00。

  网络控制器每收到一个管理控制器发出的 NCSI 请求时都必须将请求包中的 MC ID 字段拷贝到响应包的 MC ID 字段中。

  Header Revision 字段

  Header Revision 字段 1 字节长,标识了 NCSI 命令包头的版本号。在 NCSI 1.0.0a 版本中,该字节规定为 0x01.

  IID 字段

  IID 字段 1 字节长。正如上文所述,网络控制器可以用 IID 来辨别当前 NCSI 命令是一个新的请求还是一个超时重传的请求;管理控制器可以用 IID 来确认某个特定的 NCSI 请求是否得到了相应。

  Command 字段

  Command 字段 1 字节长,用于标识特定的 NCSI 命令请求与响应。每个 NCSI 请求命令都对应着 0x00 到 0x7F 之间唯一的一个命令号,而对该 NCSI 请求包的响应的命令号就是把 NCSI 请求的命令号的最高位置为 1,这样就建立了 128 个 NCSI 请求命令与相应的 128 个 NCSI 响应命令之间的一一对应关系。

  Channel ID 字段

  Channel ID 字段 1 字节长。每个 NCSI 管理控制器可以对应一个或者多个 package,这些 package 可以属于同一个网络控制器,也可以属于不同的网络控制器。每个 package 的内部又可以定义一个或者多个信道(channel)。所有的 NCSI 数据包都是在某个特定的 channel 中传输的,Channel ID 字段就标识了当前 NCSI 数据包所在的 channel。

  Payload Length 字段

  Payload Length 字段 12 比特长,标识了紧随 NCSI 包头之后的 NCSI 载荷的长度。

  Reserved 字段

  图中标有 Reserved 的区域均为保留字段,通常被置为 0。

  NCSI 控制包载荷

  NCSI 控制包载荷的数据都是按照大端在先的顺序排列的,包括数据、载荷填充、校验和以及以太包填充 4 部分,如图 5 所示:


图 5. NCSI 控制载荷格式

  数据(Data)部分:

  NCSI 请求不含 Data 部分。

  每个 NCSI 响应都有 2 字节的响应值和 2 字节的原因值。对于某些 NCSI 命令的响应,还有一定长度的附加信息。

以太包填充部分:


  根据 IEEE 802.3 标准,所有的以太帧长度必须大于 64 字节,也就是说,NCSI 包头和 NCSI 载荷的长度之和必须大于 46 字节。事实上,大部分的 NCSI 包都无法满足这一条件。因此,几乎所有的 NCSI 包的末尾都需要作一定长度的填充。

  AEN 包格式

  NCSI 的 AEN 包格式如图 6 所示:

  图 6. AEN 包格式

  

图 6. AEN 包格式

  发送 AEN 包的网络控制器需要在 NCSI 包头的 Channel ID 字段里标识发生相应事件的 channel 号。

  AEN 包的 NCSI 头的 IID 字段始终为 0x00,command 字段始终为 0xFF,Payload Length 字段始终为 0x04,也就是说 AEN 包的 NCSI 载荷长度为 4。




http://chatgpt.dhexx.cn/article/wbBMwCYx.shtml

相关文章

【Linux】 浅谈 NCSI 及其在 Linux 上的实现

关于NCSI的标准介绍,我们可以参考DMTF的文档,链接: https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.1.0.pdf https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.2.0b.pdf 也可以参考下面这…

Linux内核ncsi驱动源码分析(一)

一、共享网口NCSI的初始化 1.注册ncsi驱动 linux-5.4.11\drivers\net\ethernet\faraday\ftgmac.c 系统起来时,ftgmac100_probe函数,根据dts文件里的ncsi节点是否存在,判断是否需要加载ncsi驱动设备 linux-5.4.11\linux-5.4.11\arch\arm\bo…

什么是网络连接状态指示器NCSI

什么是网络连接状态指示器? (NCSI ,Network Connectivity Status Indicator),中文意思:网络连接状态指示器,是Windows系统判断某一台机器是否能够连接到Internet的技术。其实,最早是…

SpringBoot项目下的mvnw与mvnw.cmd

原文地址:http://ju.outofmemory.cn/entry/214018 Maven是一个常用的构建工具,但是Maven的版本和插件的配合并不是那么完美,有时候你不得不切换到一个稍微旧一些的版本,以保证所有东西正常工作。 而Gradle提供了一个Wrapper,可以…

SpringBoot--maven-wrapper(mvnw)--使用/详解

原文网址:SpringBoot--maven-wrapper(mvnw)--使用/详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍SpringBoot项目中maven-wrapper(也就是mvnw)的用法。 粉丝福利:很多粉丝私信问我有没有Java的面试及PDF书籍等资料,我…

安卓-mvvm项目架构搭建(一)- 项目搭建

前言 用了几百年的mvp和mvc了,这和我的业务环境脱不了关系,维护老旧项目的时间很多,导致一直没什么机会来写一个mvvm标准架构的应用, 我开个帖子记录一下使用安卓组件化和mvvm模式来从头做一个项目 开始 1.将会使用jectpact来…

android mvvm架构-基于Jetpack

2020年最新最实用的android-MVVM框架 https://github.com/VcStrong/JetpackMVVM.git 注册的密码规则是数字加字母超过8位即可 测试账号:13126965106 密码:111111aa 阅读此文档前,先尝试运行项目,文档中部分类名需要结合项目中代码…

安卓如何搭建Mvvm框架

安卓架构从我们最初熟悉的Mvc模式,发展到用Mvp,再到现在比较火的Mvvm架构。一路走来感觉架构都是浮云,最主要的还是个人对业务的理解深入,然后再进行代码的封装解耦,才能真正是代码逻辑简洁和维护成本减小。 下面我们就…

mvnw,到底是什么鬼?

不羡鸳鸯不羡仙,一行代码调半天。原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。 使用start.spring.io生成项目,会发现里面有mvnw和mvnw.cmd两个文件。两个文件加…

SpringBoot创建项目生成的maven-wrapper(mvnw)

1 生成 用https://start.spring.io/生成Spring Boot初始项目后,会生成几个文件: . |-- .mvn | -- wrapper | |-- maven-wrapper.jar | – maven-wrapper.properties |-- mvnw |-- mvnw.cmd 在一些项目中并没有这几个文件,可见它们不是必须的…

Android MVI框架的使用

AndroidMviFrame AndroidMviFrame 是一个Android简单易用的项目框架 文档下面会对框架中所使用的一些核心技术进行阐述。该框架作为技术积累的产物,会一直更新维护,如果有技术方面的谈论或者框架中的错误点,可以在 GitHub 上提 Issues&…

关于Maven ./mvnw

文章目录 寻找找到帮助命令./mvnw是什么?add:该命令成功运行.后来?失败 寻找 C:\Users\71027>mvn /? [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ---------------…

Android MVVM架构

1.MVC,MVP,MVVVM 1.1什么是MVVM 1.MVVM,是Model-View-ViewModel的简写,是M-V-VM三部分组成。它本质上就是MVC 的改进 版。MVVM 就是将其中的View 的状态和行为抽象化,其中ViewModel将视图 UI 和业务逻辑分 开,它可以取出 Model …

Maven(mvn)的学习下载和配置

文章目录 Maven(mvn)1.Maven 是什么?2.Maven做什么?2.1传统方式对项目的管理2.2Maven对jar包的管理 3.Maven怎么学3.1Maven如何创建项目3.2Maven的下载与配置3.3Maven的项目结构3.4Maven依赖的引入3.5Maven依赖的剔除3.6Maven依赖…

Android之 MVC到MVVM架构发展和封装

一 简介 1.1 软件架构发展趋势是解耦,即分离数据层和视图层,使得数据层专注于业务的数据和逻辑处理。从而提高代码的可读可编辑效率,提高团队协作能力,项目的生产能力,降低后期维护成本。 1.2 Android架构发展MVC -…

安卓mvvm

AndroidX的意思是android extension libraries, 也就是安卓扩展包 AndroidX其实是Jetpack类库的命名空间 (190条消息) AndroidX初识_Neda Wang的博客-CSDN博客https://blog.csdn.net/weixin_38261570/article/details/111500044 viewmodel Android 面试总结 - ViewModel - 知…

Android MVVM的实现

Android MVVM的实现 前言: 在我们写一些项目的时候,通常会对一些常用的一些常用功能进行抽象封装,简单例子:比如BaseActivity,BaseFragment等等…一般这些Base会去承载一些比如标题栏,主题之类的工作&…

Android MVI框架搭建与使用

MVI框架搭建与使用 前言正文一、创建项目① 配置AndroidManifest.xml② 配置app的build.gradle 二、网络请求① 生成数据类② 接口类③ 网络请求工具类 三、意图与状态① 创建意图② 创建状态 四、ViewModel① 创建存储库② 创建ViewModel③ 创建ViewModel工厂 五、UI① 列表适…

Android MVVN 使用入门

MVVM(Model-View-ViewModel)是一种基于数据绑定的设计模式,它与传统的 MVC 和 MVP 模式相比,更加适合处理复杂的 UI 逻辑和数据展示。在 Android 开发中,MVVM 通常使用 Data Binding 和 ViewModel 实现。 下面是一个简…

mvnw的使用

1、什么是mvnw mvnw是Maven Wrapper的缩写。我们安装Maven时,默认系统所有项目都会使用全局安装的这个Maven版本。但对于某些项目来说,它可能必须使用某个特定的Maven版本,这时就可以使用Maven Wrapper,它可以负责给这个特定的项…