linux内核 初始化 wifi,Linux驱动(六)----Wifi基础

1. 内核函数说明

1subsys_initcall() 系统调用子系统初始化入口函数,你将入口函数加入到initd总,系统启动do_initcal时调用

2. WIFI 驱动学习

1. userspace nl80211 cfg80211 mac 80211结构图

5aad635a48460e792054e377a2c0f315.png

2.1 基本概念

nl80211 cfg80211 mac80211由内核提供支持wifi配置的处理。

文件目录:linux-3.10.14-p112871/net/wireless/

1. nl80211: 用于对无线设备进行配置管理,它是一个基本Netlink的用户态协议(User态)

2. cfg80211:  与FullMAC, mac80211和nl80211一起工作。cfg80211是Linux 802.11配置API。 cfg80211用于取代Wireless-Extensions。 nl80211用来配置一个cfg80211设备,用于内核< - >用户空间之间的通信

3. mac80211: 是一个driver开发者可用于为SoftMAC无线设备写驱动的框架 (Kernel态)。mac80211为SoftMAC设备实现了cfg80211回调函数,且mac80211通过cfg80211实现了向网络子系统注册和配置。配置由cfg80211通过nl80211和wext实现。

2.2 nl80211驱动

开始文件:linux-3.10.14-p112871/net/wireless/nl80211.c

2.2.1 关键数据结构

1. nl消息头

struct genlmsghdr {

__u8cmd;

__u8version;

__u16reserved;

};

2. 协议注册

static struct genl_family nl80211_fam = {

.id = GENL_ID_GENERATE,/* don't bother with a hardcoded ID */

.name = "nl80211",/* have users key off the name instead */

.hdrsize = 0,/* no private header */

.version = 1,/* no particular meaning now */

.maxattr = NL80211_ATTR_MAX,

.netnsok = true,

.pre_doit = nl80211_pre_doit,

.post_doit = nl80211_post_doit,

};

id:genl family的ID号,一般由内核进行分配,取值范围GENL_MIN_ID~GENL_MAX_ID(16~1023),其中GENL_ID_CTRL为控制器的family ID,不可另行分配,该familyID全局唯一并且在family_ht中的位置也由该值确定;

hdrsize:用户私有报头的长度,即可选的user msg header长度,若没有则为0;

name:genl family的名称,必须是独一无二且用户层已知的(用户通过它来向控制查找family id);

version:版本号;

maxattr:消息属性attr最大的类型数(即该genl family所支持的最大attr属性类型的种类个数);

netnsok:指示当前簇是否能够处理网络命名空间;

pre_doit:调用genl_ops结构中处理消息函数doit()前调用的钩子函数,一般用于执行一些前置的当前簇通用化处理,例如对临界区加锁等;

注释:主要通过用户态发送的消息中,通过cfg80211查找相应的dev信息,并填充到info当中。

post_doit:调用genl_ops结构中处理消息函数doit()后调用的钩子函数,一般执行pre_doit函数相反的操作;

mcast_bind/mcast_unbind:在绑定/解绑定socket到一个特定的genl netlink组播组中调用(目前内核中没有相关使用);

attrbuf:保存拷贝的attr属性缓存;

ops/n_ops:保存genl family命令处理结构即命令的个数,后面详细描述;

family_list:链表结构,用于将当前当前簇链入全局family_ht散列表中;

mcgrps/n_mcgrps:保存当前簇使用的组播组及组播地址的个数;

4. 命令 钩子函数

static struct genl_ops nl80211_ops[] = {

{

.cmd = NL80211_CMD_GET_WIPHY, //cmd

.doit = nl80211_get_wiphy, //对应的钩子函数

.dumpit = nl80211_dump_wiphy,

.policy = nl80211_policy, //策略

/* can be retrieved by unprivileged users */

.internal_flags = NL80211_FLAG_NEED_WIPHY,

},

}

policy:属性attr有效性策略,若该字段不为空,在genl执行消息处理函数前会对消息中的attr属性进行校验,否则则不做校验;

doit:标准命令回调函数,在当前族中收到数据时触发调用,函数的第一个入参skb中保存了用户下发的消息内容;

dumpit:转储回调函数,当genl_ops的flag标志被添加了NLM_F_DUMP以后会调用该回调函数,这里的第一个入参skb中不再有用户下发消息内容,而是要求函数能够在传入的skb中填入消息载荷并返回填入数据长度;

done:转储结束后执行的回调函数

支持的命令:

5. 接收信息结构

struct genl_info {

u32snd_seq;

u32snd_portid;

struct nlmsghdr *nlhdr;

struct genlmsghdr *genlhdr;

void *userhdr;

struct nlattr **attrs;

#ifdef CONFIG_NET_NS

struct net *_net;

#endif

void *

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值