二、AEN报文的处理

控制端口连接状态变化的AEN报文,主要是通过插拔网线引起,由网卡发送给系统内核驱动处理,控制网卡端口连接状态。

ncsi_rcv_rsp函数中,判断是否是aen报文,Packet type为NCSI_PKT_AEN 0xff,调用aen报

问处理函数ncsi_aen_handler

控制端口连接状态变化的ncsi aen报文的type是NCSI_PKT_AEN_LSC 0x00, 调用ncsi_aen_handler_lsc

如果端口原来是连接的,又来一个up的aen报文,不处理。不连接也是一样

另外,如果已经正在处理aen报文,再来一个aen报文,不处理(是否合理?有部分网卡插拔网线会连续发多个信号)

chained = !list_empty(&nc->link);   nc->link 理解是连接状态发生变化的节点

如果端口原来是连接的,又来一个up的aen报文,不处理。不连接也是一样

另外,如果已经正在处理aen报文,再来一个aen报文,不处理(是否合理?有部分网卡插拔网线会连续发多个信号)

chained = !list_empty(&nc->link);   nc->link 理解是连接状态发生变化的节点

Aen报文中会携带报文来自于哪个package,channel,是连接是down还是up等信息。

这里先要来说下,这四个变量

ndp->multi_package  如果为1

系统允许有多张网卡支持ncsi

nc->package->multi_channel  如果为1

系统允许一张网卡上有多个端口支持ncsi,但不代表可以同时多个端口都作为ncsi通道的使用口。一般来说,1张4端口的网卡,只能选择其中一个端口作为ncsi通道的使用口,这个端口的是active的,且TX是打开的。其他3个端口也是active的,但是TX是关闭的。如果有多个端口连接网络,那么第一个连接着网络的端口作为ncsi通道的使用口;此端口网络断开,重新从1到4端口查找第一个连接着网络的端口。如果没有其他端口连接网络,则默认构建active第一个端口,TX打开,即端口1。

为什么所有端口是active的?因为系统内核aen报文的接收会受到端口ncsi inactive影响。如果端口是ncsi inactive的,端口插拔网线,内核就不会接收到该端口的up的aen报文。

虽然所有端口都active了,但是只有其中一个端口的TX会打开,其他TX关闭的端口,网络断开连接发送的aen报文,不作处理。

TX开启意思是可以通过端口网线向外发包,TX的打开和关闭是ncsi命令控制的,ncsi命令的发送不受TX,RX开启关闭的影响。Aen报文则会受到影响。

ndp->package_whitelist

package白名单,只有白名单内的package,允许被active。

np->channel_whitelist

channel白名单,只有白名单内的channel,允许被active,且TX是打开的。如果白名单内有多个端口,只有第一个连接网络的端口会被active,且TX打开。其他白名单内的端口都是inactive的(在ncsi_choose_active_channel函数中,其他端口不会加到channel_queue里面,所以不会去active)。如果所有白名单内的端口都没有连接网络,那么会默认会active第一个白名单内的端口,且TX打开。

白名单变量规则:

package->channel_whitelist = 0x1 << channel->id;

端口0在白名单里,channel->id为0,channel_whitelist为0x1

端口0,1在白名单里,channel_whitelist为0x11

所有端口都在白名单里,channel_whitelist为UINT_MAX

收到aen报文,这里又分两种情况:

ndp->multi_package,nc->package->multi_channel是否允许多个package,channel

1.不支持多个package,channel,只允许active单个端口。

这种情况下,只处理down的事件,ncsi_suspend_channel函数disable掉端口;ncsi_configure_channel函数enable端口,ncsi_channel_is_tx函数会判断是否端口TX是否需要打开。白名单内第一个插着网线的端口active,TX打开;都没插着网线,第一个白名单内的端口active,TX打开。

这个函数的逻辑真的很严谨,包含了所有的情况。multi_channel时,ndp->channel_queue有网卡的所有端口,channel_whitelist时,ndp->channel_queue只有需要enable的端口。

2.支持多个package,channel,允许active多个端口。

断开网络时if (had_link),需要从第一个端口开始检测是否其他端口连接网络ncsi_update_tx_channel,如果有,使用该端口。如果没有,重置ncsi_reset_dev,重新选择使用端口。

连接网络时,else if (has_link),原来TX打开的端口TX关掉,连接网络的端口TX打开即可。

Linux内核ncsi驱动源码分析(二)相关推荐

  1. java jdbc(mysql)驱动源码分析_JAVA JDBC(MySQL)驱动源码分析(二)

    本文系转载,地址:http://blog.csdn.net/brilliancezhou/article/details/5425687 上一篇中分析了Class.forName("com. ...

  2. ARMv8 Linux内核head.S源码分析

    ARMv8Linux内核head.S主要工作内容: 1. 从el2特权级退回到el1 2. 确认处理器类型 3. 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4. 验证设备树的地址是否有 ...

  3. linux网卡驱动源码分析(一)

    linux网卡驱动源码分析(一) linux struct linux内核 网络 descriptor resources 转自http://blog.csdn.net/ustc_dylan/arti ...

  4. (转)Linux设备驱动之HID驱动 源码分析

    //Linux设备驱动之HID驱动 源码分析 http://blog.chinaunix.net/uid-20543183-id-1930836.html HID是Human Interface De ...

  5. linux打印源码,Linux打印机驱动源码分析.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsplinux/Unix相关 Linux打印机驱动源码分析.pdf1 ...

  6. linux显示启动logo源码分析以及修改显示logo

    1.linux显示启动logo整个流程分析 (1)logo图片在内核源码中是以ppm格式的文件保存,在编译内核时会把ppm格式的文件自动转换成.c文件,在c文件中会构造一个struct linux_l ...

  7. LCD驱动源码分析(s3cfb.c)

    1.驱动源码分析大致思路 (1)分析LCD驱动首先需要分析内核的帧缓冲子系统,因为LCD驱动就是按照帧缓冲子系统提供的注册接口来注册的: (2)内核帧缓冲子系统参考博客:<Linux 帧缓冲子系 ...

  8. 通用USB设备驱动源码分析

    通用USB设备驱动源码分析 Author:aaron 前段时间写了篇<qualcomm usb modem驱动小结>的文章, 描述了自己如何为高通的一个usb modem设备写驱动的过程, ...

  9. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  10. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

最新文章

  1. 什么是Bootstrap Aggregating
  2. linux删除目录所有内容,如何从Linux上的目录中删除所有内容
  3. VTK:InfoVis之WordCloud
  4. Linux软件安装之RPM的安装技巧
  5. JVM学习笔记之-执行引擎(Execution Engine)
  6. ue4材质节点怎么用_济南装修:阳台储物柜用什么材质好?怎么保养阳台储物柜?...
  7. Notepad++的json 格式化
  8. WDA 程序文本翻译OTR
  9. java解决Exception in thread “main“ java.lang.OutOfMemoryError: GC overhead limit exceeded
  10. 使用Three.js的材质
  11. 租用服务器多开虚拟机,服务器可以多开虚拟机
  12. cad设计绘图软件:AutoCAD 2020 Mac版
  13. 基于JSP实现学校社团管理系统
  14. 网上邻居是网络还是计算机,如何从局域网网络中找到网上邻居
  15. 前端数据可视化系列:三大数据可视化工具(G2、Echarts、BizCharts)(前章)
  16. elasticsearch整体结构示意图
  17. uniapp 复制 粘贴功能
  18. 2021-2022蓝桥杯寒假集训训练 - 问题 G: HTML新の手 -图片收集者
  19. 【论文阅读】Advances and challenges in conversational recommender systems: A survey
  20. SWUST OJ#480 Locker doors

热门文章

  1. 如何成为一名优秀的程序员
  2. 前端开发程序员的月薪到底有多高?
  3. PHP与前端谁的工资高,前端和后端哪个工资高一些
  4. 车企Tier1的日子不好过
  5. U盘弹出问题解决尝试和记录
  6. 大学心理学课本_大学心理学的教材依次(全部)都有哪些?
  7. 2021上半年教资综合素质——主观题
  8. 怎样保持下拉菜单截图?如何快速截图截图快捷键
  9. 软件可靠性测试意义,软件可靠性测试方法与目的
  10. python中stack.stack_Python stack