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

news/2024/12/14 8:15:53/

学习笔记:从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.ppmy.cn/news/1554965.html

相关文章

IoTDB 集群扩容方法

问题 问题1:当时序数据库 IoTDB 集群的存储占用达到多少时,建议增加节点?是等到存储完全满,还是达到一半时就进行扩容?如果集群存储已满,是否需要手动进行数据清理,比如设置 TTL,还…

Apache HTTP 服务器高级性能优化

引言 在上一篇文章中,我们讨论了基础的性能优化措施。现在,我们将深入探讨一些更为复杂的优化技术,包括使用代理服务器、负载均衡、调整操作系统的内核参数等。这些方法适用于那些已经实施了基本优化但仍需进一步提升性能的场景。 1. 使用反…

大数据(Hadoop)学习案例—通过Shell脚本定时采集数据到HDFS

案例—通过Shell脚本定时采集数据到HDFS 掌握HDFS的Shell操作,能够完成案例-通过Shell脚本定时采集数据到HDFS 在实际的开发环境中,服务器每天都会产生大量的日志文件,这些日志文件会记录服务器的运行状态。当服务器宕机时,可以…

kubectl 使用yaml创建镜像仓库secret

要使用kubectl和YAML文件创建Docker镜像仓库的secret,需要提供适当的凭证。以下是一个YAML文件示例,它定义了一个用于Docker镜像仓库的secret: apiVersion: v1 kind: Secret metadata:name: my-registry-secret type: kubernetes.io/dockerc…

6.数据建模和数据检索及权限检查

总学习目录请点击下面连接 SAP ABAP开发从0到入职,冷冬备战-CSDN博客 目录 1.数据建模和ABAP字典的透明表 现实产品到数据库数据过程 飞行数据模型 做一个简单的引用。 从旅行社来看: 对于开发人员: 透明表 结构体和透明表 在系统中…

【xrdp配置文件】

这里写自定义目录标题 /etc/xrdp/sesman.ini /etc/xrdp/sesman.ini ;; See man 5 sesman.ini for details 这一行提示用户可以查阅手册页来获取更多关于sesman.ini配置文件的细节信息。 [Globals] ListenAddress127.0.0.1 ListenPort3350 EnableUserWindowManagertrue ; Give i…

Linux进程与资源管理

在Linux学习,进行各种操作过程中需要用到很多种命令,本篇主要讲Linux进程与资源管理命令仅供大家参考。绝对是干货满满的一篇文章!!! Linux进程与资源管理命令: 提示:以下是本篇文章正文内容&am…

【0363】Postgres内核 从 XLogReaderState readBuf 解析 XLOG Record( 8 )

上一篇: 【0362】Postgres内核 XLogReaderState readBuf 有完整 XLOG page header 信息 ? ( 7 ) 直接相关: 【0341】Postgres内核 读取单个 xlog page (2 - 2 ) 文章目录 1. readBuf 获取 page header 大小1.1 XLOG record 跨 page ?1.2 获取 XLOG Record 的 长度(xl…