前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >qca wlan wifi modules 解析四

qca wlan wifi modules 解析四

作者头像
全栈程序员站长
发布2022-09-14 15:06:54
6580
发布2022-09-14 15:06:54
举报
文章被收录于专栏:全栈程序员必看

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

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

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

具体实例如下图:

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

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

代码语言:javascript
复制
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的操作:

代码语言:javascript
复制
dev->do_ioctl = ath_ioctl;
复制代码

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

代码语言:shell
复制
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(),

代码语言:shell
复制
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的模式来创建接口:

代码语言:javascript
复制
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中的:

代码语言:javascript
复制
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()最后在实现网络接口的注册:

代码语言:javascript
复制
register_netdevice(dev)
复制代码

调用关系如下图:

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

调用关系如下图:

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年7月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档