【Atheros】无线网卡驱动性能测试工具pktgen的使用

前言:从12年开始做无线驱动相关的工作,到13年大概做了一年半,现在歇了快一年了,以免白学那么久,最近重新整理了一下当时的资料,写一点文章,这方面的帖子比较少,当时碰到过很多问题难以解决,我是用的linux2.6的内核,将来用其他版本的朋友也可能会碰到类似的问题,可以把我的解决方案做一个参考~

测试无线性能的pktgen有专用的版本,编译atheros固件的时候会自带一个无线版本的pktgen,我一开始用pktgen官网提供的pktgen发送脚本,怎么发都是一运行内核就panic,或者开发板变得非常卡,有时候没有崩溃的情况下,dmsg查看输出,可以看到源码里这一句打印了堆栈信息:

WARN_ON(tid->ac->txq != txq);

代码位置不重要,反正可以看到是txq,也就是发送队列有问题。正巧呢经过仔细观察pktgen的统计信息:

发现里面有queue_map_min和queue_map_max这样两个参数,pktgen官方的脚本里没有设置,我从pktgen官网上下载的源码里面也没有提这两个参数,这俩就是关键,现在的2是我后来自己设置的,默认好像是0。这个发送队列在代码里对应的是这样的取值:

/**
 * enum ieee80211_ac_numbers - AC numbers as used in mac80211
 * @IEEE80211_AC_VO: voice
 * @IEEE80211_AC_VI: video
 * @IEEE80211_AC_BE: best effort
 * @IEEE80211_AC_BK: background
 */
enum ieee80211_ac_numbers {
    IEEE80211_AC_VO        = 0,
    IEEE80211_AC_VI        = 1,
    IEEE80211_AC_BE        = 2,
    IEEE80211_AC_BK        = 3,
};

这是数据包对应于不同接入类别的几个发送队列,正常数据包都是使用尽力而为这种级别,只要把queue_map_min和queue_map_max都设置为2,pktgen的数据包都用这个AC来发就没问题了。

==================================分割线=========================================

关于这个发送队列,实际在使用pktgen的过程中还有一个后续问题,在这里分享一下:

虽然设置了queue_map,但是不知道为什么,生成的前两个数据包仍然是队列0和1的,后面才是我指定的2的,虽然影响不大,但是有两个弊端:一是pktgen的clone_skb域只能设置为0或其它较小的数,如果设置为10000,那么最前面的将近20000个包的发送队列都是不对的。而clone_skb的值越大,pktgen发送包的效率越高,当然,clone_skb为0时的效率已经够我们用的了,所以这一点关系不大。在这里解释一下clone_skb这个属性,pktgen调用驱动的某个函数(假设函数是tx())来进行发包,并把封装数据的sk_buff对象(skb)作为参数传进去,那么如果一共发三个包,大概就是这样的流程(下面的都是伪代码):

struct sk_buff *skb = get_new_skb();//生成一个新的skb并填充数据
tx(skb);
struct sk_buff *skb = get_new_skb();
tx(skb);
struct sk_buff *skb = get_new_skb();
tx(skb);

这是clone_skb=0或1的情况,也就是说,发送的这三个数据包是相互独立的,没有重复使用,如果clone_skb=2就指定两个包共用一个skb,就变成了下面这样:

struct sk_buff *skb = get_new_skb();
tx(skb);
tx(skb);
struct sk_buff *skb = get_new_skb();
tx(skb);

因为没有重复生成skb,也就提高了效率。这是第一个问题,第二个是在驱动里有一开始提到的WARN_ON的那一步判断,如果发送队列不是预期的值,会打印堆栈信息,这个打印操作是很耗时,在内核中,过于频繁的printk都可以导致系统崩溃,如果太频繁的打印堆栈信息,也是会导致崩溃的(这也是不设置pktgen的发送队列时板子可能会崩溃的原因),现在clone_skb的值是0,用脚本自动切换MCS时,每次使用新的MCS之后前两个包都会打印出堆栈信息,而堆栈信息又很长,这样很影响我们观察在驱动其它地方使用printk打印的输出。

解决方法是不管queue_map_min和queue_map_max怎么设置了,统一在数据包刚进入链路层代码的地方强制把这个字段置成2,当然如果是以真实使用为目的还要改回去,现在用pktgen做实验用,就没关系了,pktgen发包是通过调用atheros驱动的

ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev)

这个函数,该函数在/net/mac80211/tx.c中,就在这个函数开始的位置判断当前数据包是不是pktgen的数据包(通过pktgen头部的magic number来进行判断),如果是,就调用前面提到的skb_set_queue_mapping函数把它放到2号队列里去。代码片段如下:

if (skb->len > 58){
    __le32 *magic = &skb->data[42];
    if(*magic == 0xbe9be955)                /* magic number of pktgen */
        skb_set_queue_mapping(skb, 2);        /* BE */
}

pktgen的最小包长是14(MAC头)+20(IP头)+8(UDP头)+16(Pktgen头),大于该值才进行判断,pktgen头部是从第42字节开始,按小端序取出来和pktgen的magic number来进行比较,如果匹配,则设置发送队列。

时间: 2024-12-15 13:19:32

【Atheros】无线网卡驱动性能测试工具pktgen的使用的相关文章

iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数

iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数 iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的,=>main=>set_private=>iw_get_priv_info获取wireless网卡所能处理的所有wlan_private_args类型. dev_ioctl=>wext_handle_ioctl=>wireless_process_ioctl    if (cmd

Jmeter服务性能测试工具

Jmeter性能测试工具 下载地址:http://jmeter.apache.org/download_jmeter.cgi Windows下使用 这里我们选择Binaries包,jmeter不需要安装直接解压使用,但是需要配置Java环境 安装jdk,这里就不说了 配置Java环境变量: win7系统 计算机--属性--高级系统设置--高级--环境变量--系统变量--新建 变量名:JAVA_HOME 变量值:C:\ProgramFiles (x86)\Java\jre1.8.0_101    

CentOS安装雷凌RT5370 Wireless Adapter无线网卡驱动

1.挂载光盘安装USB查看工具lsusb [[email protected] ~]# mkdir /mnt/cdrom[[email protected] ~]# mount /dev/cdrom /mnt/cdrommount: block device /dev/sr0 is write-protected, mounting read-only 或者接光驱后直接进入到光盘 [[email protected] ~]# cd /media/CentOS_6.2_Final/CentOS_B

acer(宏基) Aspire E1-472G ubuntu-12.04下安装无线网卡驱动

本人前阶段时间买了个比较实惠的笔记本电脑acer(宏基) Aspire E1-472G,自带linux操作系统,由于工作需要便把操作系统换成了ubuntu12.04,但一直苦于没有无线网卡驱动.今天终于把这个问题给解决了,方法如下: 1,查看无线网卡型号: ~$ lspci -vnn | grep Wireless 我的无线网卡是: 02:00.0 Network controller [0280]: Qualcomm Atheros QCA9565 / AR9565 Wireless Netw

Centos6.5 安装无线网卡驱动实现无线上网

满心欢喜地安装了Centos,却发现不能用无线网络,原来centos不像ubuntu那样大部分的驱动都帮你装好了.ubuntu装好就能直接连无线网络,但是centos却不行. 下面演示一下我是如何实现centos的无线上网功能的. 一.查看是否安装了无线网卡驱动 出现以上的结果证明你的没有安装,不能无线上网.如果你已经装了网卡驱动并能实现无线上网就会有如下显示: 二.查看无线网卡的型号 [[email protected] software]# lspci    |grep  -i   netw

CentOS 5.10安装无线网卡驱动全面总结

转载请注明出处:http://blog.csdn.net/bettarwang/article/details/41908987 这几天因为想尝试一下CentOS,所以就在笔记本上安装了一个CentOS 5.10,但是安装完之后问题来了:它不像Ubuntu那样安装后之后就有相应的无线网卡驱动.所以如果要使用YUM安装或更新软件的话,第一件事就是安装无线网卡驱动.这中间的过程实在异常曲折,因为网络上很多人的文章是在已经能上网(比如通过有线上网)的前提下来安装无线网卡驱动,那自然简单许多.为了让后来

centos6.5安装无线网卡驱动并配置wifi

1.驱动下载地址: RTL8188无线网卡驱动下载 链接:https://pan.baidu.com/s/1ms-EbQCDxa76jPhYUPmr9Q 密码:r2vu 2.安装步骤: [[email protected] ~]# yum -y install wireless-tools pciutils make gcc gcc-c++ kernel-devel [[email protected] ~]# yum update [[email protected] ~]# tar -zxv

记录Ubuntu 14.04 下安装无线网卡驱动解决无法连接WiFi的过程

新电脑安装了Ubuntu 14.04,但是网络连接中只有以太网而没有WiFi的选项. 打开System Setting系统设置-Software&Updates软件&更新-Additional Drivers附加驱动,无法加载出相应的驱动,更换为国内源也无法显示出相应的驱动. 打开Terminal使用命令查询网卡(hardware of Internet)状态 $ lshw -C network 详细信息如下 *-network UNCLAIMED description: Network

性能测试工具基本工作原理及仿真能力比较

性能测试的基本概念 性能测试:是指在特定情况下测试系统如何执行的.资源的使用.可扩展性和可靠性也是性能测试的范畴.性能测试是性能工程的一个子集,主要发现软件架构以及设计导致的性能问题. 性能测试的目标:主要目标是测出系统运行的性能指标基线,我们在测试中也可能测试一些业界定义的性能指标基线.性能测试的目的不是寻找应用程序的缺陷,它更加重要的目的是测试基线以及程序的标准性能.性能测试特征就是关注测试性能测试的结果 以及持续的监控. 性能测试工具分类 性能测试工具主要包括服务端性能测试工具和客户端性能