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_devicesetup()函数指针。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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 挖矿病毒处理记录「建议收藏」

    挖矿病毒处理记录「建议收藏」wnTKYg进程发现 执行top 会发现此进程。wnTKYg应该是利用redis漏洞入侵,加了定时任务,每一段时间向固定地址发送请求,执行挖矿程序后导致cpu和带宽升高,kill进程会自动重启。检查authorized_keys、known_hosts文件[root@zfr~]#cd/root/.ssh[root@zfr~]#catauth…

    2022年6月3日
    34
  • 滴滴回应乐清顺风车乘客遇害事件:深感自责与愧疚

    滴滴回应乐清顺风车乘客遇害事件:深感自责与愧疚

    2021年6月11日
    265
  • 进程调度程序设计实验报告_进程调度模拟程序设计实验报告

    进程调度程序设计实验报告_进程调度模拟程序设计实验报告进程调度的设计与实现中文摘要无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。关键词进程调度C++优先级生命周期pidstatus前言实验目的1、综合应用下列知识点设计并实现操作系统的进程调度:邻接表,布…

    2022年9月29日
    2
  • java并发编程实战_java解决并发问题

    java并发编程实战_java解决并发问题Executors  在Java5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java5中引入的,其内部使用了线程池机制,它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好…

    2025年10月24日
    5
  • bindService:绑定本地服务和远程服务示例

    bindService:绑定本地服务和远程服务示例绑定本地服务AndroidManifest.xml中声明服务:<serviceandroid:name=".TestLocalService"><intent-filter><actionandroid:name="maureen.intent.action.BIND_LOCAL…

    2022年6月7日
    30
  • Lena.jpg 与图像处理的渊源

    Lena.jpg 与图像处理的渊源作为图像处理研究人员,相信大家一定认识下面这幅图片(下载自:https://en.wikipedia.org/wiki/Lenna):这就是Lenna本人了,全图是很sexy的,大家去看吧(http://www.lenna.org/full/l_hires.jpg)。熟悉图像处理或者压缩的工程师、研究人员和学生经常在他们的实验或者项目任务里使用“Lenna”或者“Lena”的图像。Lenna…

    2022年6月19日
    33

发表回复

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

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