qca wlan wifi modules 解析四

qca wlan wifi modules 解析四WiFi驱动架构的一般层次为:应用层BSDsocket层TCP/IP协议层IP层网络设备层net/coremac8011层/ieee80211设备驱动层具体实例如下图:上层应用程序简历socket,对网络接口进行ioctl操作,正是通过触发,网络设备和80211层,调用底层驱动函数来实现的。qcawlanmodules中,通过创建虚拟AP来实现WiFi功能,即VAP…

大家好,又见面了,我是你们的朋友全栈君。

WiFi驱动架构的一般层次为:

  • 应用层
  • BSD socket层
  • TCP/IP协议层
  • IP层
  • 网络设备层net/core
  • mac8011层/ieee80211
  • 设备驱动层

具体实例如下图:

上层应用程序简历socket,对网络接口进行ioctl操作,正是通过触发,网络设备和80211层,调用底层驱动函数来实现的。

qca wlan modules中,通过创建虚拟AP来实现WiFi功能,即VAP: 创建VAP的命令如下:

wlanconfig ath0 create wlandev wifi0 wlanmode ap
复制代码

VAP网络接口是通过wifi radio网络接口的ioctl SIOC80211IFCREATE来创建的,VAP接口是wifi设备接口的子接口。

VAP创建调用了net_device中ioctl,在qca wlan modules中,__ath_attach 中attach了ioctl的操作:

dev->do_ioctl = ath_ioctl;
复制代码

在ath_ioctl中,转入cmd:SIOC80211IFCREATE中执行创建:

case SIOC80211IFCREATE:
	{
       	    struct ieee80211_clone_params cp;
            if (scn->sc_in_delete) {
                printk("%s: Can't create VAP, in detach\n", __func__);
                return -ENODEV;
            }
            if (__xcopy_from_user(&cp, ifr->ifr_data, sizeof(cp))) {
       	        return -EFAULT;
            }	
            error = osif_ioctl_create_vap(dev, ifr, cp, scn->sc_osdev);
	}
        break;
复制代码

osif_ioctl_create_vap()调用alloc_netdev(),

dev = alloc_netdev(sizeof(osif_dev), name, ether_setup);
    if(dev == NULL) {
        adf_net_delete_wlanunit(unit);
        return EIO;
    }
复制代码

alloc_netdev()函数生成一个net_device结构体,对其成员赋值并返回该结构体的指针。第一个参数是设备私有成员的大小,第二个参数为设备名,第三个参数为net_device的setup()函数指针。setup()函数接收的参数为struct net_device指针,用于预置net_device成员的值。

然后wlan_vap_create()函数根据创建wifi的模式来创建接口:

vap = wlan_vap_create(devhandle, cp.icp_opmode, scan_priority_mapping_base, cp.icp_flags, cp.icp_bssid, cp.icp_mataddr);
复制代码

在wlan_vap_create()函数中实际调用的是attach关联的函数ath_vap_create(), 既ath_attach中的:

ic->ic_vap_create = ath_vap_create;  
复制代码

在ath_vap_create()中设置一些列wifi参数

  • ieee80211_vap_setup
  • ieee80211vap_set_macaddr
  • ieee80211_vap_attach

底层的VAP创建,调用了osif_vap_setup()

在osif_ioctl_create_vap()最后在实现网络接口的注册:

register_netdevice(dev)
复制代码

调用关系如下图:

VAR的删除操作,也通过wifi网络接口的ioctl来实现的,SIOC80211IFDESTROY

调用关系如下图:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157548.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • mysql如何优化慢查询_慢sql优化思路

    mysql如何优化慢查询_慢sql优化思路这篇文章主要是就在公司实习的时候,对SQL优化工作作出的一些整理。  在公司实习的时候,导师分配了SQL慢查询优化的任务,任务是这样的:每周从平台中导出生产数据库的慢查询文件进行分析。进行SQL优化的手段也主要是修改SQL写法,或者新增索引。  现在从记录项目中的一点点做起。  (1)数据库中设置SQL慢查询    一、第一步.开启mysql慢查询     方…

    2022年10月15日
  • 手把手包教会_手把手地教是什么意思

    手把手包教会_手把手地教是什么意思文章目录前言?往期知识点Selenium简介1.1,组件1.2,特点前言Selenium是一个用于web自动化测试的框架,在使用Ajax请求数据的页面中,会出现sign,token等密钥,如果考虑去激活成功教程可能花费的精力较多,所以考虑借助使用Selenium框架来实现数据爬取。?往期知识点?往期内容回顾?python教程】保姆版教使用pymysql模块连接MySQL实现增删改查?python+requests+BeautifulSoup实现对数据保存到mysql数据库?sele

    2022年10月20日
  • uint32 t java_数据类型 — uint32_t 类型「建议收藏」

    uint32 t java_数据类型 — uint32_t 类型「建议收藏」1>.在写程序时注意”无符号类型”的使用,各种类型边界值的情况.如:a>当某个数据不可能为负数时我们一定要考虑用以下类型:unsignedchar,unsignedint,uint32_t,size_t,uint64_t,unsignedlongint,b>当有些数据你不知道是正负时一定不要用”a>”中的类型,不然他永远也不可能为负.c>…

    2022年9月6日
  • illegal instruction非法指令的解决思路[通俗易懂]

    转自:http://blog.csdn.net/chyxwzn/article/details/8879750我移植x264到开发板上,armlinux系统。移植好后将库都拷贝到nfs文件系统上,可是执行后出现illegalinstruction的错误。可能是x264配置问题,我的x264开始的编译配置是./configure –host=arm-none-linux-gn

    2022年4月7日
  • UFT使用技巧

    UFT使用技巧1 UFT基本功能的使用         UFT的基本功能包括两大部分:一部分是提供给初级用户使用的关键字视图;另一部分是提供给熟悉VBScript脚本编写的自动化测试工程师使用的专家视图。但是,并没有严格的区分,在实际的自动化测试项目中完全可以两者结合着使用。 1.1 UFT自动化测试的基本过程          使用UFT进行自动化测试的基本过程与使用其他自动化测试工具进行自动化功能测试的过…

    2022年5月26日
  • json格式的字符串是什么类型的_输入字符串的格式要求

    json格式的字符串是什么类型的_输入字符串的格式要求1.JSON数值({“key”:value}){“key”:520,”key1″:1314}2.JSON字符串({“key”:“value”}){“key”:”我爱你”,”key1″:”一生一世”}3.JSON数组({“key”:[value]}){“key”:[520,1314],”key1″:[520,3344]}4.JSON对象({“key”:{value}}

    2022年4月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号