二、无线信息传递——user space下的hostapd至kernel space的信息传递

系列说明

  上一篇文章说明了hostapd代码的初始化,程序信息处理框架以及hostapd的回调处理机制,以此大致了解hostapd的程序执行流程。
  这一篇我们对hostapd怎么将配置信息传递至kernel环境下,使无线驱动能运用这些user space下的配置信息进行组帧这个问题进行解答。
  接下来三篇为一个系列,主要针对以下3点进行一个顺序的描述:

  • 1、无线驱动信息传递框架:说明无线信息传递的步骤流程以及各程序块之间的联系
  • 2、generic Netlink信号传递机制:hostapd与无线驱动之间的信息传递机制;
  • 3、以ssid为例说明用户将user space中的ssid配置内容传递至kernel space的流程:以此系统地了解整个无线信息传递流程。

一、无线驱动信息传递框架

  截取起始处链接的一副程序框架图。它是说明mac80211在整个无线体系结构中的位置:
这里写图片描述
  既然提到了mac80211,那么就先对mac80211进行说明,引出相关的无线名词,方便后续文章的阅读和了解。

  • 1、mac80211:是一个driver开发者可用于为SoftMAC无线设备写驱动的框架 (Kernel态)。同时图中的mac80211为SoftMAC设备实现了cfg80211回调函数,且mac80211通过cfg80211实现了向网络子系统注册和配置。配置由cfg80211通过nl80211和wext实现
  • 2、SoftMAC:其MLME由软件实现,mac80211为SoftMAC实现提供了一个driver API。 即:SoftMAC设备允许对硬件执行更好地控制,允许用软件实现对802.11的帧管理,包括解析和产生802.11无线帧。目前大多数802.11设备为SoftMAC,而FullMAC设备较少;
  • 3、MLME:即MAC(Media Access Control ) Layer Management Entity,它管理物理层MAC状态机;
  • 4、FullMAC:其MLME由硬件管理,当写FullMAC无线驱动时,不需要使用mac80211;
  • 5、nl80211:用于对无线设备进行配置管理,它是一个基本Netlink的用户态协议(User态);
  • 6、cfg80211:基于消息机制,使用netlink接口。是Linux 802.11配置API。cfg80211用于代码wext(Wireless-Extensions),nl80211用于配置一个cfg80211设备,且用于kernel与userspace间的通信。wext现处于维护状态,没有新的功能被增加,只是修改bug。如果需要通过wext操作,则需要定义CONFIG_CFG80211_WEXT;
  • 7、wext:基于ioctl机制;
  • 8、ieee80211_ops:每个driver实现它的成员函数,且它的成员函数都以struct ieee80211_hw做为第一个参数。在struct ieee80211_ops中定义了24个方法,以下7个方法必须实现(tx,start,stop,add_interface,remove_interface,config和configure_filter)
  • 9、struct ieee80211_hw:表示硬件信息和状态。
    !!!其中的netlink机制在下一个模块说明。

      所以将以上这些名词综合至图片中是:
    这里写图片描述

  了解了无线程序相关框架之后,接下来依据具体代码从上至下进行一个一个模块的具体了解和说明。

1.1、user space(hostapd)

  首先是user space模块,这里主要针对hostapd进行说明,同时也会有其他的相关程序参与了无线的信息传递,比如wpa_supplicant等。
  从上一篇文章中知道了hostapd的几个主要知识点,分别为物理网卡初始化,信息回调处理机制和具体的管理帧处理。这其中网卡初始化为后续的信息回调处理和传递做了充分的准备工作。它决定了接收到什么信息去调用哪个回调,网卡初始化时调用哪些接口去设置信息等,然后接受命令,最后传至kernel space的nl80211中。
hostapd执行范围
  所以要说明该篇内容,网卡初始化是hostapd在这一篇需要进行主要说明的。进行主要网卡初始化的是hostapd的main函数中的hostapd_interface_init接口,下面我们主要以此接口观察初始化的回调接口是怎么引导信息向底层传递的。
这里写图片描述

static int wpa_driver_nl80211_set_ap(void *priv,
                     struct wpa_driver_ap_params *params)
{
    ...
    if (beacon_set)
        cmd = NL80211_CMD_SET_BEACON;                                       //设置beacon帧的命令序号
    nl80211_cmd(drv, msg, 0, cmd);
    wpa_hexdump(MSG_DEBUG, "nl80211: Beacon head",
            
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值