hostapd移植到RK356X

1. 简介

  • 开发环境:Ubuntu20.04

  • 目标平台:RK356X,内核版本:4.19.234

  • hostapd版本:2.10, 依赖特定版本的openssllibnl

    • opsnssl版本:3.0.15

    • libnl版本:3.2.3

2. openssl 移植

  • hostapd依赖openssl,需要先移植openssl

  • 获取openssl源码,选择使用3.0.15版本,链接如下

https://openssl-library.org/source/

  • 解压,进入源码目录

    $ tar -xvf openssl-3.0.15.tar.gz
    $ cd openssl-3.0.15/
    
  • config配置

    • --prefix 指定make install时的安装路径

    • --cross-compile-prefix 指定交叉编译工具链前缀,最好使用绝对路径

    openssl-3.0.15$ ./config \
    no-asm \
    shared \
    no-async \
    --prefix=$(pwd)/build \
    --cross-compile-prefix=/home/jun/work/share/IG-20/rk3568/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
    
  • 修改Makefile,去除-m64标识

  • 编译,并安装到指定路径

    openssl-3.0.15$ make && make install
    
  • 查看编译输出

3. libnl移植

  • hostapd也依赖libnl,需要先移植libnl

  • 获取libnl-3.2.3源码,下载链接如下

    https://www.infradead.org/~tgr/libnl/files/

  • 解压,进入源码目录

    $ tar -xvf libnl-3.2.3.tar.gz
    $ cd libnl-3.2.3/
    
  • configure配置

    • --host指定目标主机平台

    • --prefix执行make install时的安装路径

    • CC指定交叉编译工具链

    $ ./configure \
    --host=arm-linux \
    --prefix=$(pwd)/build \
    --enable-static \
    --enable-shared \
    CC=/home/jun/work/share/IG-20/rk3568/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
    
  • 编译,并安装到指定目录

    libnl-3.0$ make && make install
    
  • 查看编译输出

4. hostapd移植

  • hostapd版本:2.10

  • 我是针对wifi6模块进行开发,要求hostapd支持IEEE80211AXIEEE80211AC

  • 解压,进入hostap源码目录

    $ tar -xvf hostapd-2.10.tar.gz
    $ cd hostapd-2.10/hostapd/
    
  • 拷贝生成一个默认配置文件.config

    hostapd$ cp defconfig .config
    
  • 修改.config,开启如下选项

    CONFIG_IEEE80211AX=y
    CONFIG_IEEE80211AC=y
    

  • 返回上一级目录,修改hostapd源码,在2.4G AP时强制使用40M带宽


  • 修改src/utils/includes.h

    • 添加头文件#include </usr/include/errno.h>
    • 添加头文件#include <netlink/errno.h>
  • 修改src/ap/sta_info.h,替换#include "list.h"include "utils/list.h,如下

  • 修改src/build.rules,指定交叉编译工具链

    CC:=/home/jun/work/share/IG-20/rk3568/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
    
  • 修改src/build.rules, 指定libnl路径,即前文提到的libnl编译输出路径

    CFLAGS += -I/home/jun/work/share/IG-20/wifi/libnl-3.2.3/build/include/libnl3
    LDFLAGS += -L/home/jun/work/share/IG-20/wifi/libnl-3.2.3/build/lib
    
  • 修改src/build.rules, 指定openssl路径,即前文提到的openssl编译输出路径

    # openssl
    EXTRA_CFLAGS += -I/home/jun/work/share/IG-20/wifi/openssl-3.0.15/build/include
    LDFLAGS += -L/home/jun/work/share/IG-20/wifi/openssl-3.0.15/build/lib64
    
  • 查看一下src/build.rules

  • 设置环境变量PKG_CONFIG_PATH,确保能够找到libnl编译得到的的libnl-3.0.pc文件

    hostapd$ export PKG_CONFIG_PATH=/home/jun/work/share/IG-20/wifi/libnl-3.2.3/build/lib/pkgconfig:$PKG_CONFIG_PATH
    
  • make编译,注意:是在hostapd-2.10/hostapd下执行make

    hostapd$ make
    
  • 查看编译输出

5. 安装测试

  • 将编译得到的hostapd和依赖的库libnl.so/libcrypto.so/libssl.so拷贝到目标机上,确保hostapd能够链接到所有的库

  • 编写配置文件hostapd.conf

    • 如下配置文件:5G频段 信道:36 80M AX
    interface=wlp1s0
    bridge=br0
    ssid=TEST-D80P-5gap
    hw_mode=a
    channel=36
    auth_algs=1
    driver=nl80211
    wme_enabled=1
    wpa=2
    wpa_passphrase=12345678
    ieee80211n=1
    ieee80211ac=1
    ieee80211ax=1
    vht_oper_chwidth=1
    vht_oper_centr_freq_seg0_idx=42
    he_oper_chwidth=1
    he_oper_centr_freq_seg0_idx=42
    he_basic_mcs_nss_set=65534
    he_su_beamformee=1
    he_twt_required=0
    vht_capab=[SHORT-GI-80][MAX-A-MPDU-LEN-EXP7][RX-STBC-1][RX-LDPC]
    ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40+][HT40-][LDPC][RX-STBC1]
    wpa_key_mgmt=WPA-PSK
    rsn_pairwise=CCMP
    
  • 启动hostapd

    # hostapd hostapd.conf
    
  • 手机接入热点,日志如下

  • 此时,手机是无法获取到IP的,因为还没有配置DHCP服务器

  • DHCP服务器的配置参考我的另一篇文章

    https://www.cnblogs.com/zhijun1996/p/18537740

posted @ 2024-11-14 10:04  zhijun  阅读(69)  评论(0编辑  收藏  举报