学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式

  1. 参考文档:
https://www.dmtf.org/standards/published_documents
https://www.dmtf.org/dsp/DSP0222
https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.2.0.pdf
  1. 参考代码
https://github.com/torvalds/linux/blob/master/net/ncsi/ncsi-pkt.h
  1. ncsi/nc-si协议简介:
    一般用于服务器主板上的BMC芯片与智能网卡MAC芯片之间的直连控制线通讯。
    在这里插入图片描述
    Ethernet Header中Des Add全1,且 EtherType = 0x88F8时即为NCSI协议数据。
    在这里插入图片描述
  2. ncsi协议一般是在BMC与MAC之间互发数据,有三种
struct ncsi_cmd_pkt_hdr { // BMC发给MAC的操作命令struct ncsi_pkt_hdr common; /* Common NCSI packet header */
};struct ncsi_rsp_pkt_hdr { // MAC执行命令后,返回给BMC的操作结果struct ncsi_pkt_hdr common; /* Common NCSI packet header */__be16              code;   /* Response code             */__be16              reason; /* Response reason           */
};struct ncsi_aen_pkt_hdr { // MAC主动发给BMC的异步事件,例如拔网线了struct ncsi_pkt_hdr common;       /* Common NCSI packet header */unsigned char       reserved2[3]; /* Reserved                  */unsigned char       type;         /* AEN packet type           */
};
  1. 以上三种的数据头的公用数据头只有一种ncsi_pkt_hdr
    通过type来区分后续的数据结构,这也是典型的派生类c语言实现方式
struct ncsi_pkt_hdr { //16byteunsigned char mc_id;        /* Management controller ID, BMC id==1 */unsigned char revision;     /* NCSI version - 0x01      */unsigned char reserved;     /* Reserved  ==0               */unsigned char id;           /* Packet sequence number,方便BMC区分最多255个命令的MAC反馈结果   */unsigned char type;         /* Packet type              */unsigned char channel;      /* Network controller ID,BMC一对多MAC定位用    */__be16        length;       /* Payload length,有效负载数据,不含checksum部分,也不含ncsi_pkt_hdr 部分           */__be32        reserved1[2]; /* Reserved                 */
};
  1. 最基本的没有额外描述信息的cmd、rsp结构
    需要注意的是,这种基本cmd有效Payload length 0,rsp Payload length 4。Payload length是相对于基类ncsi_pkt_hdr 而言的附加部分长度,且不含数据检验checksum部分。
    rsp的4byte是Response code+Response reason
/* NCSI common command packet */
struct ncsi_cmd_pkt {struct ncsi_cmd_pkt_hdr cmd;      /* Command header */__be32                  checksum; /* Checksum       */unsigned char           pad[26];
};struct ncsi_rsp_pkt {struct ncsi_rsp_pkt_hdr rsp;      /* Response header */__be32                  checksum; /* Checksum        */unsigned char           pad[22];
};
  1. payload length非0的cmd示例
    ncsi_cmd_sp_pkt 的payload length为4,reserved[3]+hw_arbitration
    不含checksum,也不含pad填充区
/* Select Package */
struct ncsi_cmd_sp_pkt {struct ncsi_cmd_pkt_hdr cmd;            /* Command header 16byte*/unsigned char           reserved[3];    /* Reserved       */unsigned char           hw_arbitration; /* HW arbitration */__be32                  checksum;       /* Checksum       */unsigned char           pad[22];
};static struct ncsi_cmd_handler {unsigned char type;int           payload;int           (*handler)(struct sk_buff *skb,struct ncsi_cmd_arg *nca);
} ncsi_cmd_handlers[] = {{ NCSI_PKT_CMD_SP,     4, ncsi_cmd_handler_sp      },
  1. ncsi_cmd_sp_pkt 的pad填充区是为了满足最小网络数据包的大小限制
    ncsi_cmd_sp_pkt 长度为16+4+4+22,共46,
    加上前面的Ethernet Header 14byte,再加最后面的FCS,
    刚好凑足64byte

  2. ncsi_cmd_handler 的写法是典型的虚函数的c语言实现模式
    实际执行时,根据 ncsi_pkt_hdr 的type调用对应的处理函数。
    MAC芯片的rsp侧也类似

static struct ncsi_rsp_handler {unsigned char	type;int             payload;int		(*handler)(struct ncsi_request *nr);
} ncsi_rsp_handlers[] = {{ NCSI_PKT_RSP_SP,      4, ncsi_rsp_handler_sp      },
  1. cmd、rsp、aen的type code定义范式
    各厂商自定义cmd type也给了一个OEM 0x50,允许不同厂商在padload部分任意定义
#define NCSI_PKT_CMD_SP		0x01 /* Select Package        */
#define NCSI_PKT_RSP_SP		(NCSI_PKT_CMD_SP     + 0x80)
#define NCSI_PKT_AEN		0xFF /* AEN Packet*/
以下三种aen子分类code存储在padload部分的type中
#define NCSI_PKT_AEN_LSC	0x00 /* Link status change       */
#define NCSI_PKT_AEN_CR		0x01 /* Configuration required   */
#define NCSI_PKT_AEN_HNCDSC	0x02 /* HNC driver status change */#define NCSI_PKT_CMD_OEM	0x50 /* OEM                              */
  1. netlink.h.c部分
    我的理解是,提供给用户态程序的netlink接口,允许做一些有限操作或查询。

  2. internal.h manager.c部分
    我的理解是, h为多模块共用的结构定义、常量定义
    c部分是内核管理bmc端数据状态的代码,与mac端保持一致。

  3. ncsi的目的和来龙去脉
    ncsi的目的:远程集中管理大型机房中不同型号的服务器。
    一般是通过redfish(dell基于这个进行修改)web界面远程设置服务器的net MAC特性。
    以前这种管理需求是IBM自己的一套管理系统(大概是叫 IPMI),后来延伸到 任意品牌服务器的管理,所以交由dmtf开源组织进行定义(ncsi mctp redfish),实现则由一家codeconstruct.com.au提供。

  4. 一点总结:
    图灵机的7元组中δ是算法,其他都是数据。
    更进一步,一切都是围绕数据去构建的。

数据的本质是真实物理世界的模型映射,数字化后,在硅基电路上进行信息处理,再通过各种物理设备反馈于真实世界。

linux的c实现提供各种优秀的范式,核心只有一个,数据。cpp等语言与c图灵等价。cpp能实现的概念,本质上都可以用c等价实现,只是方法不同,或编译期实现。其实,我满能理解linus本人反对cpp的,虽然不是完全赞同。

操作可以理解为对数据的解释,并反作用于数据。
硬件是基于数字电路对数据进行读写、存储、传输、解释执行的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489930.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D 生成重建030-SV3D合成环绕视频以生成3D

3D 生成重建030-SV3D合成环绕视频以生成3D 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文提出了Stable Video 3D (SV3D)——一个用于生成围绕三维物体的高分辨率图像到多视角视频的潜在视频扩散模型。最近关于三维生成的文献提出了将二维生成模型应用于新视图合成…

3D 生成重建035-DiffRF直接生成nerf

3D 生成重建035-DiffRF直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 本文提出了一种基于渲染引导的三维辐射场扩散新方法DiffRF,用于高质量的三维辐射场合成。现有的方法通常难以生成具有细致纹理和几何细节的三维模型,并且容易出…

Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中,笔者分析了Spark SQL 执行计划的解析,很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行,每个概念之间没有强烈的关联,因此这中间总感觉少了点…

探索Python的魔法工具箱:functools

文章目录 探索Python的魔法工具箱:functools背景库介绍安装简单库函数使用方法lru_cachepartialreducecmp_to_keytotal_ordering 场景应用缓存数据库查询结果固定函数参数计算序列的累积和自动补全比较方法将比较函数转换为key函数 常见Bug及解决方案Bug 1: lru_cac…

leetcode 3266 K次乘运算后的最终数组II 题解

题目大意 原题面 给你一个数组 nums,然后进行 k 轮游戏,每轮游戏都会选择数组当中最小的元素然后乘上一个数 multiplier(题目给出),问你 k 轮游戏结束之后,这个数组长什么样子,所有的元素要对 …

事务管理与锁机制

title: 事务管理与锁机制 date: 2024/12/14 updated: 2024/12/14 author: cmdragon excerpt: 在数据库系统中,事务管理至关重要,它确保多个数据库操作能够作为一个单一的逻辑单元来执行,从而维护数据的一致性和完整性。一个良好的事务管理系统能够解决并发操作带来的问题…

各种消息中间件介绍

消息中间件是一种在分布式系统中实现消息传递的软件架构,它允许不同的应用程序或系统组件之间异步地交换信息。 1. Apache Kafka Kafka是一个分布式流处理平台,能够处理高吞吐量的数据。它主要用于构建实时数据管道和流应用程序。 • Broker:…

mall-admin-web开源项目搭建教程(图文)

本章教程,介绍如何在本地部署运行mall-admin-web这个开源项目。 开源地址:https://gitee.com/macrozheng/mall-admin-web mall-admin-web是一个电商后台管理系统的前端项目,基于Vue+Element实现。主要包括商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计…

使用FastGPT制做一个AI网站日志分析器

越来越的多网站面临每天上千次的扫描和各类攻击,及时发现攻击IP,并有效的屏蔽不良访问成为网站安全的重要保障,这里我们使用AI来完成对网站日志的日常分析。 我们来使用FastGPT来制做一个AI网站日志析器,下面就开始: …

npm : 无法加载文件 D:\nodejs\npm.ps1

问题描述 npm run serve 启动一个Vue项目,报错如下: npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/? LinkID135170 中的 about_Execution_Policies。…

UE4_贴花_贴花基础知识一

贴花可以将材料和各种材料元素投影到表面上。您可以使用它们来添加独特的效果。贴花 是一种可以投射到网格体(包括静态网格体和骨骼网格体)上的材质。无论这些网格体的移动性(Mobility)是静态(Static)还是可…

ShardingSphereProxy:快速入门

使用 Docker 运行 ShardingSphere 在基于 Docker 安装 ShardingSphere 时,按照官方文档《使用 Docker :: ShardingSphere》所提供的步骤操作即可。 在运行ShardingSphereProxy之前,我们需要基于我们的测试场景修改配置文件,我测试场景中主要…

Unity 获取鼠标点击位置物体贴图颜色

实现 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) {textureCoord hit.textureCoord;textureCoord.x * textureMat.width;textureCoord.y * textureMat.height;textureColor textureMat.GetPixel(Mathf.Flo…

Python高性能web框架-FastApi教程:(3)路径操作装饰器方法的参数

路径操作装饰器方法的参数 1. 定义带有参数的POST请求路由 app.post(/items,tags[这是items测试接口],summary这是items测试的summary,description这是items测试的description,response_description这是items测试的response_description) def test():return {items: items数据…

基于SpringBoot的嗨玩旅游网站:一站式旅游信息服务平台的设计与实现

摘要 在旅游需求日益增长的今天,一个全面、便捷的旅游信息服务平台显得尤为重要。嗨玩旅游网站正是为了满足这一需求而设计的在线平台,它提供了包括景点信息、旅游线路、商品信息、社区信息和活动推广等在内的丰富旅游目的地信息,旨在帮助用…

【K8S系列】Kubernetes 资源对象的 YAML 文件示例及其详细介绍

在 Kubernetes 中,YAML 文件用于定义各种资源对象的配置,包括 Pods、Deployments、Services 等。以下是一些常见 Kubernetes 资源对象的 YAML 文件示例及其详细介绍。 一、Pod Pod 是 Kubernetes 中最基本的部署单位,通常包含一个或多个容器…

MVP模式的理解和实践

MVP(Model-View-Presenter)模式是一种用于组织代码的架构模式,主要用于用户界面的开发。它通过将应用程序的三个主要组件分开,提高了应用的可维护性和可测试性。本文将详细介绍MVP模式的理解和实践,并通过Java语言提供…

微信小程序中 crypto-js 加解密全攻略

一、引言 在微信小程序开发中,数据的安全至关重要。加解密技术在保护用户数据和应用程序的安全性方面起着关键作用。小程序在与服务器进行数据交互时,面临着数据泄露、篡改等安全风险。为了确保用户信息的安全,选择合适的加解密算法变得尤为…

Mac mini m4本地跑大模型(ollama + llama + ComfyUI + Stable Diffusion | flux)

change log 2024-12-11 10:28(推荐重新观看) 针对绘画大模型的使用做进一步的详细操作(flux1dev) 见篇节(绘画大模型) 2024-12-10 更新了基础的chat大模型和绘画大模型的基础环境搭建。 安装chat大模型&am…

jenkins harbor安装

Harbor是一个企业级Docker镜像仓库‌。 文章目录 1. 什么是Docker私有仓库2. Docker有哪些私有仓库3. Harbor简介4. Harbor安装 1. 什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub,而与Dock…