编译hostapd

1. 下载hostapd

首先到官网上下载,我编译时是hostapd-2.6

解压并进入源码目录:

1
2
tar -xzvf hostapd-2.6.tar.gz
cd hostapd-2.6/hostapd

2. 复制源码目录下的defconfig到.config并编辑,如下操作:

1
2
3
4
5
6
7
8
9
cp defconfig .config
vi .config

# 修改.config文件如下选项
CONFIG_DRIVER_NL80211=y # 使它编译为支持nl80211驱动
CONFIG_LIBNL32=y
CONFIG_IEEE80211N=y
CONFIG_IEEE80211AC=y
CONFIG_ACS=y # 打开这个选项,才能使用自动选择信道(ACS,Automatic Channel Selection)

3. 编译hostapd

1
2
make
sudo make install

4. 错误处理

  • ../src/drivers/driver_nl80211.c:22:31: fatal error:netlink/genl/genl.h: No such file or directory

原因:缺少libnl

解决方法1,从源安装:

1
sudo apt-get install libnl-genl-3-200 libnl-genl-3-dev libnl-idiag-3-dev

解决方法2,编译安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 下载源码
wget http://www.infradead.org/~tgr/libnl/files/libnl-3.2.25.tar.gz
tar -xzvf libnl-3.2.25.tar.gz

# 编译安装
cd libnl-3.2.25/
./configure --prefix=/home/leux/develop/temp
make
sudo make install

# 修改hostapd 中 .config 指定的ssl和libnl头文件的路径为 /home/leux/develop/temp

CFLAGS += -I/home/leux/develop/temp/include
LIBS += -L/home/leux/develop/temp/lib
LIBS_p += -L/home/leux/develop/temp/lib
LIBS_c += -L/home/leux/develop/temp/lib

# 注意,这里的路径一定是要你移植的ssl库和libnl库对应的路径 /home/leux/develop/temp/include/libnl3/netlink/genl/

# 注意:将netlink/genl/ 移至 include/ 目录下,否则还是会找不到的,会报同样的错误的。

  • ../src/crypto/tls_openssl.c:23:25:fatal error: openssl/ssl.h: No such file or directory

原因:缺少openssl库

解决方法1,从源安装:

1
sudo apt-get install libssl-dev

解决方法2,编译安装:

1
2
3
4
5
6
wget https://www.openssl.org/source/openssl-1.1.0c.tar.gz
tar -xzvf openssl-1.1.0c.tar.gz
cd openssl-1.1.0c
./config --prefix=/home/leux/develop/temp
make
make install

5. 其他

  • hostapd使用十分简单,直接运行命令:

    1
    hostapd -B hostapd.conf
  • 使用 iw dev 查看当前使用的频宽及信道

  • 强制使用40MHz频宽

hostapd开始是按设置使用40MHz的,只是当其检测到周边SSID使用40MHz时,就自动降为20MHz。可以修改代码,禁用检测判断。

仅限于hostapd-2.6,其他版本的更改请看这里

需要更改的文件:hostapd-2.6/src/ap/hw_features.c和ieee802_11_ht.c

  1. hostapd-2.6/src/ap/hw_features.c 文件修改。(注释掉319行的内容)
1
2
3
4
5
6
7
8
9
              iface->conf->channel,
iface->conf->channel +
iface->conf->secondary_channel * 4);

/* iface->conf->secondary_channel = 0; 大概在319行,注释此行 */

if (iface->drv_flags & WPA_DRIVER_FLAGS_HT_2040_COEX) {
/*
* TODO: Could consider scheduling another scan to check
  1. hostapd-2.6/src/ap/ieee802_11_ht.c 文件修改。(注释掉大概从308行到331行的内容)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

wpa_printf(MSG_DEBUG, "is_ht40_allowed=%d num_sta_ht40_intolerant=%d",
is_ht40_allowed, iface->num_sta_ht40_intolerant);

/* 308行 if (!is_ht40_allowed &&
(iface->drv_flags & WPA_DRIVER_FLAGS_HT_2040_COEX)) {
if (iface->conf->secondary_channel) {
。。。。。。。。。
wpa_printf(MSG_DEBUG,
"Reschedule HT 20/40 timeout to occur in %u seconds",
delay_time);
}
} 331行 */
}

至此,已经强制使用40MHz频宽,速率也提升了。

END