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

article/2025/9/30 8:32:29

一、共享网口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\boot\dts\aspeed-ast2600-evb.dts

所有ncsi驱动相关的代码都在linux-5.4.11\linux-5.4.11\net\ncsi目录下

先介绍几个结构体:

struct ncsi_dev_priv *ndp;  这个是一个总的ncsi驱动设备信息

struct ncsi_channel *hot_channel;    /* Channel was ever active    */曾经使用过的通道channel 信息

struct ncsi_package *active_package; /* Currently handled package  */当前处理的package

struct ncsi_channel *active_channel; /* Currently handled channel  */当前处理的channel

struct ncsi_request requests[256];   /* Request table              */储存ncsi命令和结果

bool                multi_package;   /* Enable multiple packages   */是否允许多个package

u32                 package_whitelist; /* Packages to configure    */允许的package,package 白名单

struct ncsi_package *np;  这个是package的信息,package可以理解为支持的ncsi网卡

bool                 multi_channel; /* Enable multiple channels  */是否允许active多个channel

u32                  channel_whitelist; /* Channels to configure */允许构建active的channel,channel白名单

unsigned int         channel_num; /* Number of channels     */网卡的总端口数

struct ncsi_channel *nc;  这个是channel的信息,channel可以理解为支持的ncsi网卡端口

struct ncsi_channel_mode    modes[NCSI_MODE_MAX]  channnel端口的某些信息,比如端口连接状态 NCSI_MODE_LINK

struct ncsi_cmd_arg nca;  这个是发送ncsi命令,组包的结构体

unsigned char        package;     /* Destination package ID        */ncsi命令发往的package

unsigned char        channel;     /* Detination channel ID or 0x1f */ncsi命令发往的channel

unsigned char        type;        /* Command in the NCSI packet    */ncsi命令的命令字

unsigned char        *data;       /* NCSI OEM data                 */ncsi厂商命令的数据段放在这

struct ncsi_request *nr;  这个是储存ncsi命令和结果的结构体

struct ncsi_request requests[256];   /* Request table              */

ndp可以记录最近的256个ncsi命令及结果,以sk_buff的形式保存在*cmd,*rsp中

struct sk_buff       *cmd;    /* Associated NCSI command packet  */

ncsi命令sk_buff

struct sk_buff       *rsp;    /* Associated NCSI response packet */

ncsi命令结果 sk_buff

2.ncsi驱动注册函数

ncsi_register_dev

  1. 注册ncsi工作队列

ncsi_dev_work

根据当前的state状态,执行不同的功能

ncsi_probe_channel 探测网卡端口的功能,一般网口up起来,或者网卡端口插上网线触发

ncsi_suspend_channel暂停端口的功能,一般在拔网线触发

ncsi_configure_channel构建active网卡端口的功能,一般在probe以后触发,或者端口自适应下拔网线failover另一个端口

2)注册ncsi报文接收处理函数

ncsi_rcv_rsp

Ncsi驱动接收到的控制报文主要分两类:

  1. aen报文,主要是通过插拔网线引起,由网卡发送给系统内核驱动处理,控制网卡端口连接状态
  2. 系统内核驱动发出ncsi命令以后,网卡返回的ncsi命令的响应报文

判断是否是aen报文,Packet type为NCSI_PKT_AEN 0xff,调用aen报文处理函数,aen报文的处理流程后面会讲

Ncsi命令响应报文,根据Packet type,调用ncsi命令响应处理函数

ncsi_rsp_handler  结构体(报文类型,命令的返回有效长度,ncsi命令响应处理函数)

Ncsi命令响应处理函数

Ncsi协议中定义的Packet type和代码中的是一致的

查询网卡端口信息(连接状态,速率等)的ncsi命令举例:

Ncsi命令类型Command Type 0x0a    ncsi响应类型Response Type 0x8a

struct ncsi_pkt_hdr *hdr;  这个是ncsi命令头的结构体,和协议里面是一致的,16个字节

Ncsi命令响应处理函数

Ncsi命令响应包,代码里的结构体如下所示:

  1. 网口up起来,探测网卡package,构建active网卡端口channel

网口up,调用到linux-5.4.11\drivers\net\ethernet\faraday\ftgmac.c  ftgmac100_open函数

如果使用的是phy驱动,调用phy_start(netdev->phydev);

如果使用的是ncsi驱动,调用ncsi_start_dev(priv->ndev);

更新ncsi驱动state状态,调用上文中提到的工作队列,根据当前的state状态,执行探测网卡package的功能

ncsi_dev_work –>ncsi_probe_channel,探测网卡package是通过发送一系列ncsi命令来实现的。我们可以称之为ncsi状态机的变化,具体可以参照协议和代码分析。

ncsi_probe_channel探测网卡package

ncsi_choose_active_channel选择合适的网卡端口

ncsi_configure_channel构建active网卡端口

选择好package以后,就要继续选择channel,ncsi_probe_channel ->ncsi_choose_active_channel

选择合适的网卡端口默认策略是:从网卡第一个端口开始,判断网线是否连接,如果没有连接,继续遍历剩余端口;如果连接,便只构建active此端口;如果所有端口都没有连接网线,默认构建上次连接过网线的端口,之前没有连接过,active第一个端口。

选择好端口以后,就需要构建active网卡端口, ncsi_choose_active_channel-> ncsi_process_next_channel-> ncsi_configure_channel,channel的active也是通过发送一系列ncsi命令来实现的

记录hot_nc,之前连接过网线的端口的信息

至此,如果此端口连接着网线,网络就连通了。


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

相关文章

什么是网络连接状态指示器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,它可以负责给这个特定的项…

快速查找参考文献影响因子——ScholarScope

前言: 最初看到的关于查看影响因子的插件有:pubmedy, pubmed plus 和 scholar scope. 试了pubmedy,找到的版本没有用。 PubMed 是一个提供生物医学方面的论文搜寻以及摘要,并且免费搜寻的数据库。它的数据库来源为MEDLINE。其核心…

新手刚学js遇到的ie6问题

2019独角兽企业重金招聘Python工程师标准>>> 1.前段时间遇到一个需求,需要让图片在点击tab的时候加载。如果那个tab是由a标签组成的,这时候你就需要在click之后return false。不然坑爹的ie6是没法显示图片的。 2.有个需求是,做一…