ath9k驱动代码主要数据结构概览。

(1)在ath9k的驱动中,几乎是最顶层的数据结构是ath_softc,这个数据结构几乎随处可见。ath_softc是硬件与MAC层进行交互的中间载体,很多有用的

网络参数都可以从ath_softc中得到,对于进一步的网卡驱动开发,收集网络数据等很有帮助。

定义位置:drivers/net/wireless/ath/ath9k/ath9k.h 具体定义如下:

struct ath_softc {
struct ieee80211_hw *hw; //保存硬件信息
struct device *dev; //当前工作的设备 u32 chan_bw; // 信道带宽
int chan_idx; // 信道序号
int chan_is_ht; // 是否使用high_throughput模式 即绿野模式
struct survey_info *cur_survey;
struct survey_info survey[ATH9K_NUM_CHANNELS]; struct tasklet_struct intr_tq;
struct tasklet_struct bcon_tasklet; //结构体定义在 include <linux/interrupt.h> 用于中断管理
struct ath_hw *sc_ah; //hw的包装结构体
void __iomem *mem; //内存区域
int irq;
spinlock_t sc_serial_rw;
spinlock_t sc_pm_lock;
spinlock_t sc_pcu_lock; //进行数据读取,或者处理skb时需要的锁
struct mutex mutex;
struct work_struct paprd_work;
struct work_struct hw_check_work;
struct work_struct hw_reset_work; //执行不同工作的工作队列 以后在代码中具体解释
struct completion paprd_complete; unsigned int hw_busy_count; u32 intrstatus;
u32 sc_flags; /* SC_OP_* */
u16 ps_flags; /* PS_* */
u16 curtxpow;
bool ps_enabled;
bool ps_idle;
short nbcnvifs;
short nvifs;
unsigned long ps_usecount; struct ath_config config;
struct ath_rx rx;
struct ath_tx tx;
struct ath_beacon beacon;
struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; //当前支持的带宽 #ifdef CONFIG_MAC80211_LEDS
const char *led_default_trigger;
struct list_head leds;
#endif struct ath9k_hw_cal_data caldata;
int last_rssi; #ifdef CONFIG_ATH9K_DEBUGFS
struct ath9k_debug debug;
spinlock_t nodes_lock;
struct list_head nodes; /* basically, stations */
unsigned int tx_complete_poll_work_seen;
#endif
struct ath_beacon_config cur_beacon_conf;
struct delayed_work tx_complete_work;
struct delayed_work hw_pll_work;
struct ath_btcoex btcoex;
struct ath_mci_coex mci_coex; struct ath_descdma txsdma; struct ath_ant_comb ant_comb;
u8 ant_tx, ant_rx;
};

在ath_softc中的一些数据结构是值得注意的,ieee80211_hw, ath_rx,ath_tx,ath_beacon,ath_debug。这些结构体在网卡编码中经常使用,现在逐一

对其分析解释。

(2)ath9k_debug。在Linux运行过程中,会建立一个虚拟的文件操作系统 /proc,通过/proc可以访问内核内部数据结构、改变内核设置的机制,对

于OpenWrt操作系统来说,内核与外部shell之间的交互是通过读写/sys/kernel/debug/ieee80211/phy0/ath9k/目录下的文件实现的。ath9k_debug中定义

的数据结构承接了外部参数输入和内核数据的导出。如果先要改变内核运行时的参数,可以在此结构中定义新的数据变量,然后通过实现新的file_operations达到

参数的读入和内核数据的导出的目的。总之,想要在代码中增加需要的数据结构,定义好后,放一个对象在这个结构体中,就可以安心使用了,当然具体的操作

方法,会在以后的博客中再具体说明。

  ath_debug定义在 drivers/net/wireless/ath/ath9k/debug.h 中。

struct ath9k_debug {
struct dentry *debugfs_phy;
u32 regidx;
struct ath_stats stats;
spinlock_t samp_lock;
struct ath_dbg_bb_mac_samp bb_mac_samp[ATH_DBG_MAX_SAMPLES];
u8 sampidx;
u8 tsidx;
u8 rsidx;
// 以上是系统自定义的变量
// 下面是个人开发需要所增加的变量,其中的结构体变量的定义也在debug.h中
bool first_into;
unsigned long mcs_tx_time;
struct inject_settings *setting;
struct list_head recv_tp_list;
struct realtime_var rtv;
struct list_head xmit_bw_list;
struct list_head rx_infos_list;
struct list_head frame_list;
unsigned int frame_maxnum;
};

  (3)ath_rx_status这个数据结构,。此结构提供的信息对于分析信道状况、统计单帧的信息都很有帮助,而且信息的粒度足够小了。这个数据结构

定义了网卡接收到一个skb时网卡的状态,数据帧的状态等信息,具体见代码注释,没注释的就是我也没看懂的各位谁知道的请留言,多谢赐教。

格式:结构体:成员变量--含义 比如 ath_rx_status:rs_rate--标记速率类型。

结构体定义在:drivers/net/wireless/ath/ath9k/mac.h

struct ath_rx_status {
u32 rs_tstamp; // 接收的时间戳
u16 rs_datalen;
u8 rs_status; // 标记出错类型 CRC or PHY
u8 rs_phyerr; // PHY Error 有很多类型,这个变量可以使这些类型对应的某一个或几个
int8_t rs_rssi; // 当前数据帧的信号接收强度
u8 rs_keyix;
u8 rs_rate;      // 标记当前速率是否是HT模式 如果是 则rs_rate = 0x80
u8 rs_antenna; // 接收天线编号
u8 rs_more; // 标记当前数据帧是否是分片之一
int8_t rs_rssi_ctl[]; // 候选RSSI集合,与diversity和combining有关
int8_t rs_rssi_ext[];
u8 rs_isaggr; // 是否是聚合帧的一部分
u8 rs_moreaggr; // 是否是聚合帧中的最后一个数据帧
u8 rs_num_delims;
u8 rs_flags;
bool is_mybeacon; // 是否是属于自己的beacon帧
u32 evm0;
u32 evm1;
u32 evm2;
u32 evm3;
u32 evm4;
};

(4)ath_atx_tid是发送端MAC层非常重要的一个数据结构。块确认机制、重传、窗口管理、发送队列的管理和实现都依赖或者设计到ath_atx_tid。

具体使用方法会在后续的发送端详解中依次说明,现在看一下其中的成员变量及含义。

此数据结构定义在drivers/net/wireless/ath/ath9k/ath9k.h。

struct ath_atx_tid {
struct list_head list;
struct sk_buff_head buf_q;
struct ath_node *an;
struct ath_atx_ac *ac;
unsigned long tx_buf[BITS_TO_LONGS(ATH_TID_MAX_BUFS)]; //类似于Bitmap,标记窗口内已发送的数据帧
int buf_pending;
int bar_index; // Block Ack Request的索引
u16 seq_start; // 当前发送序号的开始
u16 seq_next; // 下一次发送序号的开始
u16 baw_size; // Block Ack Window 的大小 一般为128
int tidno; //标记当前传输的数据的类型:媒体数据或者是文本数据等等
int baw_head; /* first un-acked tx buffer */
int baw_tail; /* next unused tx buffer slot */
int sched;
int paused;
u8 state; // 发送状态,正在发送,发送完毕,或出错
};

    未完待续。

基本数据结构简介--ath9k网卡驱动开发总结(二)的更多相关文章

  1. 1、课程简介-Spring 注解驱动开发

    1.课程简介-Spring 注解驱动开发

  2. [Windows驱动开发](二)基础知识——数据结构

    本节主要介绍驱动开发的一些基础知识. 1. 驱动程序的基本组成 1.1. 最经常见到的数据结构 a. DRIVER_OBJECT驱动对象 // WDK中对驱动对象的定义 // 每个驱动程序都会有一个唯 ...

  3. [翻译]Behavior-Driven Development (BDD)行为驱动开发(二)

    测试驱动开发体现了开发人员对软件产品各部分运作方式的理解,而行为驱动开发则关注于开发人员对软件产品最终表现的行为的预期. 行为驱动开发 TDD更像是一种范式而不是一个过程.它描述了一种先编写测试,然后 ...

  4. 【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解

    写在前面 最近,二狗子入职了新公司,新入职的那几天确实有点飘.不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究A ...

  5. C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载

    基于Windows驱动开发技术详解这本书 一.简单的INF文件剖析 INF文件是一个文本文件,由若干个节(Section)组成.每个节的名称用一个方括号指示,紧接着方括号后面的就是节内容.每一行就是一 ...

  6. C++第三十九篇 -- 研究一下Windows驱动开发(二)-- 驱动程序中重要的数据结构

    数据结构是计算机程序的核心,I/O管理器定义了一些数据结构,这些数据结构是编写驱动程序时所必须掌握的.驱动程序经常要创建和维护这些数据结构的实例. 一.驱动对象(DRIVER_OBJECT) 每个驱动 ...

  7. Linux 网卡驱动学习(二)(网络驱动接口小结)

    [摘要]前文我们分析了一个虚拟硬件的网络驱动例子,从中我们看到了网络设备的一些接口,其实网络设备驱动和块设备驱动的功能比较类似,都是发送和接收数据包(数据请求).当然它们实际是有很多不同的. 1.引言 ...

  8. linux驱动开发学习二:创建一个阻塞型的字符设备

    在Linux 驱动程序中,可以使用等待队列来实现阻塞进程的唤醒.等待队列的头部定义如下,是一个双向列表. struct list_head { struct list_head *next, *pre ...

  9. 0、Spring 注解驱动开发

    0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...

随机推荐

  1. iOS分类

    ios中的分类其实就是把两个类用两个或多个文件写的,,在平时的开发中我们会发现有的时候我们想要一个类多个什么功能  但是已经定义好的类中没有,,我们又不想更改我们的程序  那么现在的这种情况下我就可以 ...

  2. 十个最值得阅读学习的C开源项目代码

    1. Webbench Webbench 是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以 模拟3万个并 ...

  3. 饿了么 天降红包 bug ----这是谁的错

    早上来点餐,从没用饿了么点成功过,因为太难用. 今早,不,应该说前几天,出了个天降红包,领了个满20 减110的红包,没在意,因为还没升级客户端,不能用. 今早来,升级了一下客户端,下单了,看了饿了么 ...

  4. mac + apache + php

    1: 设置下用sublimetext为默认打开方式, 确保下载sublimetext 2:设置下默认打开方式为sm sudo ln -s /Applications/Sublime\ Text\ 2. ...

  5. java小型科学计算器

    /** * 1.先转换为逆波兰顺序 * 数字直接存入list,符号压入栈中,但是如果栈底元素不大于该运算符的运算顺序,则将栈底pop,直到大于栈底运算符为止,再压入栈中, * 最后将运算符依次全部po ...

  6. 正确决解Hibernate4.*中:Connection cannot be null when 'hibernate.dialect' not set

    <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  7. 启用 ASP.NET MVC 项目的 Edit and Continue

    VS 的 Edit and Continue 功能允许你在 Debug 的过程中,修改代码并且编译运行修改后的代码.对于编程阶段非常的好用,不需要你停止正在进行的 Debug,修改代码然后运行代码. ...

  8. 元素“Button”不是已知元素。原因可能是网站中存在编译错误,或者缺少web.config文件

    最近开发的时候ASP控件都有波浪下划线,提示不是已知元素,搞得挺郁闷的.虽然不影响变异,不过就是不爽. 折腾N久...... 解决了,把FramWork平台换成3.5,问题解决,不知道为啥,求大神指点 ...

  9. 将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件

      将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件import java.io.File;import java.io.FileOutputStre ...

  10. MATLAB中文论坛帖子整理(GUI)

    MATLAB中文论坛帖子整理(GUI) 目   录  1.GUI新手之——教你读懂GUI的M文件... 10 2.GUI程序中改变current directory引起的问题... 15 3.GUI中 ...