zoukankan      html  css  js  c++  java
  • 飞凌2440开发板制作路由器

    原文链接:http://www.cnblogs.com/NickQ/p/8976054.html
    环境:Linux3.0内核 RT3070(无线) + DM9000(有线)

    在s3c2440上实现SoftAP模式

    • 配置内核

    wifi/ConfigKernel_AP_1

    wifi/ConfigKernel_AP_2


    • 配置完内核开始编译后,报如下错误。

    解决方法:make clean后重新编译。
    参考:https://blog.csdn.net/tonkeytong/article/details/52672782

    [nick@XQLY linux-3.0]$ make
      CHK     include/linux/version.h
      CHK     include/generated/utsrelease.h
    make[1]: “include/generated/mach-types.h”是最新的。
      CALL    scripts/checksyscalls.sh
      CHK     include/generated/compile.h
      LD      fs/nfs/nfs.o
    fs/nfs/client.o: file not recognized: File truncated
    make[2]: *** [fs/nfs/nfs.o] 错误 1
    make[1]: *** [fs/nfs] 错误 2
    make: *** [fs] 错误 2
    

    • libnl 移植

    Hostapd依赖于openssl与libnl两个库。
    下载解压

    wget  
    tar zvxf libnl-3.2.25.tar.gz
    cd ./libnl-3.2.25
    mkdir install
    

    配置并编译

        ./configure --prefix=`pwd`/install --build=i686-pc-linux --host=arm-linux CC=/opt/xtools/arm920t/bin/arm-linux-gcc AS=/opt/xtools/arm920t/bin/arm-linux-as  AR=/opt/xtools/arm920t/bin/arm-linux-ar LD=/opt/xtools/arm920t/bin/arm-linux-ld NM=/opt/xtools/arm920t/bin/arm-linux-nm RANLIB=/opt/xtools/arm920t/bin/arm-linux-ranlib OBJDUMP=/opt/xtools/arm920t/bin/arm-linux-objdump STRIP=/opt/xtools/arm920t/bin/arm-linux-strip
        
        make && make install
    
    • openssl 移植

    下载解压

    wget  
    tar zxvf openssl-0.9.8zf.tar.gz
    cd ./openssl-0.9.8zf
    patch -p1 < ../patch/openssl-0.9.8zf-tls-extensions.patch
    mkdir install
    

    修改Makefile

    将
    OPTIONS= no-camellia no-capieng no-cms no-gmp no-jpake no-krb5 no-mdc2 no-montasm no-rc5 no-rfc3779 no-seed no-shared no-zlib no-zlib-dynamic
    CONFIGURE_ARGS=dist
    改为
    #OPTIONS= no-camellia no-capieng no-cms no-gmp no-jpake no-krb5 no-mdc2 no-montasm no-rc5 no-rfc3779 no-seed no-shared no-zlib no-zlib-dynamic
    CC=/opt/xtools/arm920t/bin/arm-linux-gcc
    CONFIGURE_ARGS=dist
    修改以下变量
    INSTALLTOP= /home/nick/fl2440/3rdparty/wireless/openssl/openssl-0.9.8zf/install
    OPENSSLDIR= /home/nick/fl2440/3rdparty/wireless/openssl/openssl-0.9.8zf/install
    CC= /opt/xtools/arm920t/bin/arm-linux-cc
    AR= /opt/xtools/arm920t/bin/arm-linux-ar $(ARFLAGS) r
    ARD= /opt/xtools/arm920t/bin/arm-linux-ar $(ARFLAGS) d
    RANLIB= /opt/xtools/arm920t/bin/arm-linux-ranlib
    

    编译安装

    sudo make
    sudo make install
    
    • Hostapd 移植

    hostapd 是一个用户态用于AP和认证服务器的守护进程。它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。Linux下支持的驱动有:Host AP,madwifi,基于mac80211的驱动。
    采用脚本,编译安装

        #!/bin/bash
        
        # Description:  
        # This shell script used download and compile hostapd for ARM 
        
        PROJ_PATH=`pwd`
        
        OPENSSL_PATH=`pwd`/../openssl/
        LIBNL_PATH=`pwd`/../libnl/
        
        if [ -z $CROSSTOOL ] ; then
           CROSSTOOL=/opt/xtools/arm920t/bin/arm-linux-
        fi
        
        function msg_banner()
        {
            echo ""
            echo "+-----------------------------------------------------------------------"
            echo "|  $1 "
            echo "+-----------------------------------------------------------------------"
            echo ""
        }
        
        function check_result()
        {
            if [ $? != 0 ] ; then
               echo ""
               echo "+-----------------------------------------------------------------------"
               echo "|  $1 "
               echo "+-----------------------------------------------------------------------"
               echo ""
               exit ;
            fi
        }
        
        function export_cross()
        {
            # export cross toolchain
            export CC=${CROSSTOOL}gcc
            export AS=${CROSSTOOL}as
            export AR=${CROSSTOOL}ar
            export LD=${CROSSTOOL}ld
            export NM=${CROSSTOOL}nm
            export RANLIB=${CROSSTOOL}ranlib
            export OBJDUMP=${CROSSTOOL}objdump
            export STRIP=${CROSSTOOL}strip
        
            # export cross configure 
            export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
        
            # Clear LDFLAGS and CFLAGS
            export LDFLAGS=
            export CFLAGS=
        }
        
        function compile_hostapd()
        {
            SRC_NAME=hostapd-2.5
            PACK_SUFIX=tar.gz
        
        
            if [ -f ${PREFIX_PATH}/${IMG_NAME} ] ; then
                return 0;
            fi
        
            msg_banner "Start cross compile $SRC_NAME "
        
            if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
                wget https://w1.fi/releases/${SRC_NAME}.${PACK_SUFIX}
                check_result "ERROR: download ${SRC_NAME} failure"
            fi
        
            tar -xzf ${SRC_NAME}.${PACK_SUFIX}
            cd ${SRC_NAME}/hostapd
        
            cp defconfig .config
        
            #sed -i -e "s|^.*openssl/include.*|CFLAGS += -I${OPENSSL_PATH}/install/include|g" .config 
            #sed -i -e "s|^.*openssl/lib.*|LIBS += -L${OPENSSL_PATH}/install/lib|g" .config 
            
            sed -i -e "s|^.*libnl include files.*|CFLAGS += -I${LIBNL_PATH}/install/include/libnl3|g" .config 
            sed -i -e "s|^.*libnl library files.*|LIBS += -L${LIBNL_PATH}/install/lib|g" .config 
        
            sed -i -e "s|^.*CONFIG_LIBNL32=.*|CONFIG_LIBNL32=y|g" .config 
        
            export PKG_CONFIG_PATH=${LIBNL_PATH}/install/lib/pkgconfig/:$PKG_CONFIG_PATH
        
            export CFLAGS="-I${OPENSSL_PATH}/install/include"
            export LIBS="-L${OPENSSL_PATH}/install/lib"
        
            make  
        
            cp hostapd ${PROJ_PATH}/
            cp $LIBNL_PATH/install/lib/libnl-3.so.200.20.0 ${PROJ_PATH}/libnl-3.so.200 
            cp $LIBNL_PATH/install/lib/libnl-genl-3.so.200.20.0 ${PROJ_PATH}/libnl-genl-3.so.200
        
            cd -
        }
        
        
        export_cross
        
        if [ ! -d $OPENSSL_PATH/install/lib ] ; then
           cd $OPENSSL_PATH
           ./build.sh
           cd -
        else 
            msg_banner "openssl already cross compiled!"
        fi
        
        
        
        if [ ! -d $LIBNL_PATH/install/lib ] ; then
           cd $LIBNL_PATH
           ./build.sh
           cd -
        else 
            msg_banner "libnl already cross compiled!"
        fi
        
        
        compile_hostapd
    

    将生成的hostapd,和库拷到开发板/bin与/lib目录下,并给予可执行权限。这里采用lszrz+tftp方式

    [nick@XQLY hostapd]$ sz hostapd
    rz
    Starting zmodem transfer.  Press Ctrl+C to cancel.
    Transferring hostapd...
      100%    1768 KB    1768 KB/sec    00:00:01       0 Errors 
    [nick@NickQ_fl2440 bin]# tftp -gr hostapd 192.168.110.1
    hostapd              100% |*******************************|  1768k  0:00:00 ETA
    [nick@NickQ_fl2440 bin]# chmod a+x hostapd
    

    可以将hostapd目录下的hostapd.conf修改后拷贝到开发板/etc下,也可以直接新建一个,这里选择直接新建。
    在开发板/etc目录下创建这个文件hostapd.conf。

    interface=wlan0 //网络接口名称
    ssid=nick666 //热点名称
    driver=nl80211  //默认使用nl80211无线驱动
    channel=3   //设定无线频道
    hw_mode=g   //使用80211g协议标准 , 有效的值取决于硬件,通常:a, b, g
    ignore_broadcast_ssid=0 //开启或禁用广播ssid
    auth_algs=1 /*指定OSA认证算法, auth_algs=1 只支持 WPA2 身份验证算法。*/
    /*auth_algs=2 表示支持 WEP。永远不要使用有线等效加密 (wired equivalent privacy, WEP),因为它非常容易破解,并且多年前就已经被完全破解了。*/
    /*auth_algs=3 表示支持这两种方式。*/
    wpa=3   /*指定WPA/WPA2类型, wpa=2 仅支持 WPA2。wpa=1 表示支持 WPA1,而 wpa=3 表示二者都支持。*/
    wpa_key_mgmt=WPA-PSK    //指定您想支持的加密密钥算法
    wpa_passphrase=12345678 //指定认证密钥
    wpa_pairwise=TKIP   /*启用了WPA或WPA2则需要指定wpa_pairwise或rsn_pairwise。*/
    rsn_pairwise=CCMP   /*wpa_pairwise 和 rsn_pairwise控制支持加密数据的密钥,您可以使用 CCMP、TKIP 或两者均使用*/
    

    启用hostapd

    hostapd -B /etc/hostapd.conf
    

    ifconfig观察发现,多了网卡

    mon.wlan0 Link encap:UNSPEC  HWaddr 00-A1-B0-40-6F-1E-00-00-00-00-00-00-00-00-00-00  
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    

    udhcpd启用DHCP分配IP

    [nick@NickQ_fl2440 ~]# udhcpd -f /etc/udhcpd.conf
    udhcpd: started, v1.27.1
    phy0 -> rt2800_txdone_entry_check: Warning - TX status report missed for queue 2 entry 0
    udhcpd: sending OFFER of 192.168.10.20
    udhcpd: sending OFFER of 192.168.10.20
    udhcpd: sending ACK to 192.168.10.20
    udhcpd: sending ACK to 192.168.10.20
    

    udhcpd -f 选项是保持在前台运行。去掉-f则转为后台。

    iptables移植

    使用脚本编译安装

    #!/bin/bash
    
    
    # Description:  
    # This shell script used download and compile iptables for ARM
    
    PREFIX_PATH=`pwd`/
    
    if [ -z $CROSSTOOL ] ; then
       CROSSTOOL=/opt/xtools/arm920t/bin/arm-linux-
    fi
    
    function msg_banner()
    {
        echo ""
        echo "+-----------------------------------------------------------------------"
        echo "|  $1 "
        echo "+-----------------------------------------------------------------------"
        echo ""
    }
    
    function check_result()
    {
        if [ $? != 0 ] ; then
           echo ""
           echo "+-----------------------------------------------------------------------"
           echo "|  $1 "
           echo "+-----------------------------------------------------------------------"
           echo ""
           exit ;
        fi
    }
    
    function export_cross()
    {
        # export cross toolchain
        export CC=${CROSSTOOL}gcc
        export AS=${CROSSTOOL}as
        export AR=${CROSSTOOL}ar
        export LD=${CROSSTOOL}ld
        export NM=${CROSSTOOL}nm
        export RANLIB=${CROSSTOOL}ranlib
        export OBJDUMP=${CROSSTOOL}objdump
        export STRIP=${CROSSTOOL}strip
    
        # export cross configure 
        export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
    
        # Clear LDFLAGS and CFLAGS
        export LDFLAGS=
        export CFLAGS=
    }
    
    function compile_iptables()
    {
        SRC_NAME=iptables-1.4.21
        PACK_SUFIX=tar.bz2
        IMG_NAME=iptables
    
        if [ -f ${PREFIX_PATH}/${IMG_NAME} ] ; then
            return 0;
        fi
    
        msg_banner "Start cross compile $SRC_NAME "
    
        if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
            wget http://www.netfilter.org/projects/iptables/files/${SRC_NAME}.${PACK_SUFIX}
            check_result "ERROR: download ${SRC_NAME} failure"
        fi
    
        tar -xjf ${SRC_NAME}.${PACK_SUFIX}
        cd ${SRC_NAME}
    
        ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static --disable-shared --disable-ipv6 --disable-largefile  
        check_result "ERROR: configure ${SRC_NAME} failure"
    
        make 
        check_result "ERROR: compile ${SRC_NAME} failure"
    
        ${STRIP} iptables/xtables-multi
        cp iptables/xtables-multi ${PREFIX_PATH}/${IMG_NAME}
    
        cd -
    }
    
    
    export_cross
    
    compile_iptables
    
    

    再理解一次CFLAGS和LDFLAGS:一般我们通过CFLAGS的 -I 选项告诉编译器所依赖的第三方的库的头文件在哪里,通过LDFLAGS的-L选项告诉链接器这些库的库文件在哪里;还有LIBS是告诉链接器要链接哪些库文件。简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。有时候LIBS指定了却找不到库时可以试试LDFLAGS。


    [nick@NickQ_fl2440 ~]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    [nick@NickQ_fl2440 ~]# iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISH -j ACCEPT
    [nick@NickQ_fl2440 ~]# iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 
    

    自动启动
    在开发板/etc/init.d/中,创建启动脚本.以S?? ,如开头S30_wifiAP

    #!/bin/sh
    
    ifconfig wlan0 192.168.10.1 netmask 255.255.255.0 up
    
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISH -j ACCEPT
    iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
    
    hostapd -B /etc/hostapd.conf
    
    udhcpd  /etc/udhcpd.conf
    
  • 相关阅读:
    CentOS7利用docker安装MySQL5.7
    阿里云安装Nginx+vue项目部署
    python3 读取串口数据
    CentOS7.0安装EMQ代理服务
    Vue项目接入MQTT
    使用Python发送、订阅消息
    Android监听消息通知栏点击事件
    获取 Android APP 版本信息工具类(转载)
    Android 获取手机的厂商、型号、Android系统版本号等工具类(转载)
    树莓派通过语音模块下发指令点亮小灯泡
  • 原文地址:https://www.cnblogs.com/NickQ/p/8976054.html
Copyright © 2011-2022 走看看