hostapd_acs 源码分析

hostapd_acs 源码分析在自动信道文件中。函数处理流程进行:Main()../hostapd/main.c+552hostapd_wpa_event()../src/ap/drv_callbacks.c+1017在该函数中通过接收事件是否为EVENT_CHANNEL_LIST_CHANGED,触…

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

在自动信道文件中。函数处理流程进行:

   Main()                        ../hostapd/main.c + 552

              hostapd_wpa_event()        ../src/ap/drv_callbacks.c    +1017 在该函数中通过接收 事件 是否 为 EVENT_CHANNEL_LIST_CHANGED,触发hostapd 更新信道。而这个事件在什么地方发送的呢? src/drivers/Driver_nl80211.c +2754

hostapd_acs 源码分析

分别会在 NL80211_CMD_REG_CHANGE 和 NL80211_CMD_REG_BEACON_HINT 这两个事件下。

hostapd_channel_list_updated()    ../src/ap/hostapd.c    +992

——–setup_interface2(iface);       ../src/ap/hostapd.c    +1060      

—————hostapd_select_hw_mode() 信道是在这调用检查信道功能,判断是否channel =0, 如果=0 就进行自动信道选择。

———————— hostapd_check_chans(iface)      src/ap/hw_features.c +973 这函数中就是触发自动信道功能的。

——————————-acs_init()         // 初始化运行调用自动信道功能

———————————————-acs_request_scan()

这个才是自动信道 处理流程:

————-main:709———–

————-hostapd_setup_interface:1249———–

————-setup_interface:1048———–

————-setup_interface:1058———–

————-setup_interface2:1066———–

————-setup_interface2:1071———–

————-hostapd_select_hw_mode:974———–

————-hostapd_check_chans:857———–

————-acs_init:795———–

NL80211_CMD_REG_CHANGE 事件

 

wiphy_register()

/*

 * This can happen on global regulatory changes or device specific settings

 * based on custom world regulatory domains.

 */

     nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_CHANGE);                 // .. \compat-wireless-2013-06-27\drivers\net\wireless\nl80211.c +9301

        

hostapd_select_hw_mode 选择 hw 模式 在该函数中会检查信道。

switch (hostapd_check_chans(iface)) {

          case HOSTAPD_CHAN_VALID:

          return 0;

          case HOSTAPD_CHAN_ACS: /* ACS will run and later complete */

          return 1;

          case HOSTAPD_CHAN_INVALID:

           default:

          hostapd_notify_bad_chans(iface);

           return -3;

}

 

nl80211作为用户空间的配置管理。

struct wpa_driver_ops *wpa_drivers[] =

{

#ifdef CONFIG_DRIVER_NL80211

&wpa_driver_nl80211_ops,

}

const struct wpa_driver_ops wpa_driver_nl80211_ops = {

.init2 = wpa_driver_nl80211_init,   src/drivers/Driver_nl80211.c +11443

}

——- wpa_driver_nl80211_init()/ i802_init()

—————wpa_driver_nl80211_drv_init()   src/drivers/Driver_nl80211.c +3780

———————wpa_driver_nl80211_init_nl     src/drivers/Driver_nl80211.c +3621

———————————–process_drv_event       src/drivers/Driver_nl80211.c +2794

————————————————–do_process_drv_event()  

static int process_drv_event(struct nl_msg *msg, void *arg)     

 

  1. 1在../src/ap/drv_callbacks.c  加上hostapd_acs 源码分析
  1. 2     Hostapd 打印错误

root@xxxxxx:/# hostapd -ddd -P /var/run/wifi-phy0.pid /var/run/hostapd-phy0.conf

Configuration file: /var/run/hostapd-phy0.conf

Channel not configured (hw_mode/channel in hostapd.conf)

Could not select hw_mode and channel. (-3)

wlan0: Unable to setup interface.

 

 

关于自动信道功能:

Hostapd 20131120 版本

Acs 中:

* How does it work

 * —————-

 * 1. passive scans are used to collect survey data

 *    (it is assumed that scan trigger collection of survey data in driver)

 * 2. interference factor is calculated for each channel

 * 3. ideal channel is picked depending on channel width by using adjacent

 *    channel interference factors

 

Hostapd 20131120 版本实现原理:

  1. 从页面配置到hostapd 通过channel 字段的文本来触发开启自动功能。Hostapd 初始化解析配置文件将信道channel=acs_survey设置为0.
  2. 当开启自动信道功能后,启动hostapd 进程hostapd 内部通过检查信道是否可用,如果信道为0,就触发启动自动信道功能调用acs_init()。

具体自动信道实现acs 处理

  1. 收集干扰数据

Acs  发出扫描请求,调用驱动进行扫描hostapd_driver_scan();

     2. 分析计算干扰数据

      3. 根据计算出的结果选择一个理想信道然后赋值

iface->conf->channel = ideal_chan->chan;

struct hostapd_iface *iface

自动选择信道:

在分析自动选择信号到后,可以找到调用自动信道的位置为:

  1. Shell 或者lua :解析到acs, 启动定时自动调用函数,调用命令:killall -16 hostapd 向hostapd 发送一个信号SIGUSR1 (16)
  2. Hostapd 在选择信道的时候,默认如果是自动的会先选择一个。

hostapd_select_hw_mode() 函数中,进行信号注册,等待接收信号SIGUSR1, 如果收到了信号,进入信号处理函数进行选择信道。

 

#ifdef CONFIG_ACS

if(iface->conf->channel == 0)

{

              iface_G = iface;

            signal(SIGUSR1, sig_han);

}

#endif

设置hostapd 配置文件里面的信道方法:

system(“sed -i \”s/$\(cat /var/run/hostapd-phy0.conf | grep \”channel=\”\)/channel=6/g\” /var/run/hostapd-phy0.conf”);

 

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

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

(0)
上一篇 2022年5月21日 下午12:20
下一篇 2022年5月21日 下午12:20


相关推荐

  • 基于ERNIE Bot SDK的智能文本纠错:技术实现与应用实践

    基于ERNIE Bot SDK的智能文本纠错:技术实现与应用实践

    2026年3月12日
    2
  • 【Protobuf】proto通用二进制文件的生成与解析(C++/Python,附完整源码)

    【Protobuf】proto通用二进制文件的生成与解析(C++/Python,附完整源码)protobuf 是 Google 开源的一个跨平台的结构化数据存储格式 可用于通讯协议 数据存储等领域的语言无关 平台无关 可扩展的序列化结构数据格式 前言说起 proto 的用法 可能最熟悉的莫过于以下两句 obj ParseFromStr data data obj SerializeToS 其中 obj 是 proto 中 message 的实例对象 data 是序列化之后的

    2026年3月18日
    2
  • 大动作!三六零火速发布“龙虾”新品!发布会现场“真吃虾”

    大动作!三六零火速发布“龙虾”新品!发布会现场“真吃虾”

    2026年3月15日
    2
  • 国外代理服务器ip哪个好用?

    国外代理服务器ip哪个好用?哪个类型的IP代理运行得更好?人们在网上冲浪时,常常无意中暴露自己的IP地址,是因特网链路级网关提供的一个重要安全功能,主要工作于开放系统互连(Osl)模型的对话层上,因此可以作为防火墙。那什么类型的IP代理运行得更好呢?目前市场上代理IP的品牌很多,虽然都是代理IP,但具体的功能也各不相同,因为代理IP也有不同的种类,根据不同的需求可以选择哪种代理IP,今天万变代理小编就带你去看看哪个类型的代理IP比较好用?1、Http代理:最常用的代理,代理客户端http访问,主要是代理浏览器访问网页,一般有80、.

    2022年4月29日
    154
  • mybatis逆向工程配置文件_mybatis逆向工程多表查询

    mybatis逆向工程配置文件_mybatis逆向工程多表查询mybatis逆向工程很早之前有用过,但是一直没有整理使用步骤,今天来回顾下在idea下springboot中整合mybatis逆向工程的实现步骤什么是逆向工程?所谓mybatis逆向工程,就是mybatis会根据我们设计好的数据表,自动生成pojo、mapper以及mapper.xml。本文将介绍两种方式实现mybatis的逆向工程。generatorConfig.xml配置文件配置数据…

    2022年8月21日
    9
  • python模块 – – – IPy模块 (IP类)

    python模块 – – – IPy模块 (IP类)IPy 模块中 我们主要会使用到的是有 3 个模块 IPint IP IPSetIPint 类中说明 目前最好是用 IP 模块 因为有的功能不怎么完善那么就从 IP 类开始 1 int 将 ip 地址转为长整数返回如果是一个网段 那么取其第一个 2 version 判断参数 ip 的版本 3 prefixlen 这个网段有多少个地址数量 4 netIP 类的 net 方法和 IPint 类的 net 方法类似 但是

    2026年3月19日
    2

发表回复

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

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