概述
Author Address: http://hi.baidu.com/zhyjp/item/8671820f1ad117ce75cd3c6e
最近的校园网环境换成了 H3C 的 iNode 认证,相比于之前的锐捷我觉得已经好多了,最起码 iNode 提供有官方的 Linux 和 Mac OS 认证客户端。之前用锐捷的校园网时,我编译了 mentohust 在路由器的 openwrt 系统下运行,可以直接由路由提供认证,手机打开 wifi 连上路由就可以直接上校园网了。现在换成了 H3C 的认证,能不能也把它放到路由器上呢?我首先找到了 xclient 这个兼容的认证客户端,但经试验,xclient 在我的网络环境下,连接上几分钟就会掉线。于是继续找,找到了 njit-client(感谢 liuqun 等同学们的开发和测试!)。在 Ubuntu 下编译运行,运行非常稳定,不掉线。接下来的工作就有挑战性了,就是把 njit-client 交叉编译到路由器平台的 openwrt 系统中。
(PS:我首先找到了一个 njit-client 之前的版本,在我的 Ubuntu 系统下没什么问题,但是编译到路由器上后,虽然可以运行,但是死活不能认证,现在也没搞清楚到底是为什么。后来编译了git 仓库中的最新版本,问题解决了。)
首先我们要作的就是搭建 openwrt 的交叉编译平台(这里是一份详细的英文教程)。以我的 Ubuntu 9.10 系统为例。首先建立一个文件夹,如 ~/openwrt 。进入文件夹,用 svn 获得 openwrt 的源代码。
svn checkout svn://svn.openwrt.org/openwrt/trunk kamikaze
源代码保存在 ~/openwrt/kamikaze 文件夹中,我们把它叫做工作目录。接下来用 make menuconfig 进行编译配置。make 首先会检查系统要求,如果提示你缺少什么必要的软件包,先安装全了(要编译 njit-client 可能还需要安装 libpcap-dev)。如果一切正常,就进入到配置界面了。
首先注意的是目标平台的选择,我的路由器是 broadcom 63xx 平台,属于 mips 架构的处理器。由于我们编译 njit-client 需要 libpcap 和 libgcrypt,所以还需要一些设置。libpcap 好办,Libraries 菜单下直接选择就行了。libgcrypt 就需要手动添加了。这里是 libgcrypt 和它依赖的 libgpg-error 的编译文件,将这两个文件夹放到工作目录的 package 目录下,重新运行 make menuconfig,进入 Libraries 菜单选择即可。
配置完成后,保存退出。输入 make V=99,就开始漫长的编译过程了。编译过程中会随时从网络上下载所需要的软件,如果你的网速不给力,可以按 ctrl+c 先取消,然后用下载工具手动下载下来,放到工作目录的 dl 文件夹下,然后重新编译。经过漫长的一段时间,openwrt 的平台就准备好了,可以开始编译 njit-client 了。
首先准备好 njit-client 的源代码,进入 src 目录下,运行 autoconf,生成 configure,接着 ./configure,生成 Makefile。在编译之前,我们要先进行一些小修改。njit-client 是利用一个 python 脚本来实现认证后获取和刷新 IP 地址的,路由器上我们不需要这么做。打开 auth.c,第261行改为
system("dhclient");
即使用 dhclient 这个脚本来刷新和获取 IP。然后修改 Makefile,加入 PATH 变量,就是 openwrt 工作目录下 staging_dir/toolchain-xxx...xxx/bin,将 CC 改为对应的编译器,去掉 CFLAGS 的调试标记参数 -g。如在我的环境下,就是
# Compiler options
PATH += $PATH:/home/ivan/openwrt/kamikaze/staging_dir/toolchain-mips_gcc-4.3.3+cs_uClibc-0.9.30.1/bin/
CC = mips-openwrt-linux-gcc
CFLAGS ?= -O2
EXEEXT :=
接着再往下找,有两行 libgcrypt-config 的调用
fillmd5.o: CFLAGS+=$(shell libgcrypt-config --cflags)
和
njit-client: LDLIBS+=$(shell libgcrypt-config --libs)
将其中的 libgcrypt 改为 openwrt 工作目录/staging_dir/target-xxx...xxx/usr/bin/libgcrypt-config,如在我的环境下,就是
fillmd5.o: CFLAGS+=$(shell /home/ivan/openwrt/kamikaze/staging_dir/target-mips_uClibc-0.9.30.1/usr/bin/libgcrypt-config --cflags)
njit-client: LDLIBS+=$(shell /home/ivan/openwrt/kamikaze/staging_dir/target-mips_uClibc-0.9.30.1/usr/bin/libgcrypt-config --libs)
上面还有一行 auth.o: CFLAGS+=$(shell pcap-config --cflags),在前面加个#注释掉。
接下来做最后一些准备工作。到 staging_dir/target-xxx...xxx/usr/include 目录下,拷贝 pcap 文件夹、pcap.h、pcap-bpf.h、pcap-namedb.h、gcrypt.h、gcrypt-module.h、gpg-error.h 到 staging_dir/toolchain-xxx...xxx/include 文件夹下。再到 staging_dir/target-xxx...xxx/usr/lib 目录下,拷贝 libgcrypt.a、libgpg-error.a、libpcap.a 到 staging_dir/toolchain-xxx...xxx/lib 目录下。
万事俱备,接下来输入 make,编译成功!
最后就是把相关的文件拷贝到路由器中,可以使用路由的 ftp 服务。拷贝 staging_dir/target-xxx...xxx/usr/lib 下的 libpcap.so.1.0.0、libgcrypt.so.11.5.3 和 libgpg-error.so.0.5.0 到路由器的 /usr/lib 目录下。拷贝编译好的可执行文件 njit-client 到 路由器的 /usr/bin 目录。接下来 ssh 登录路由器,chmod +x /usr/bin/njit-client 加上可执行属性,运行一下,如果还提示缺少什么 libpcap.so 什么的,就自己建立符号连接,指向 libpcap.so.1.0.0
cd /usr/lib
ln -s libpcap.so.1.0.0 libpcap.so
libgcrypt 和 libgpg-error 同理。
njit-client 到此应该可以正常运行了,认证下试试?
为了方便使用,可以在路由器的 /ect/init.d/ 目录下建立一个自动运行脚本 njit-client,内容如下
#!/bin/sh /etc/rc.common
#(c) 2010 ivan_wl
START=50
start() {
njit-client [username] [password] [interface] &
}
stop() {
killall njit-client
killall udhcpc
}
然后 chmod +x 加上可执行属性, /ect/init.d/njit-client enable 开启开机自动运行。
一切搞定,把电脑手机什么的都连上路由,享受网络吧!
附一些下载:
njit-client 的源代码
libgcrypt 和 libgpg-error 编译文件
njit-client 编译后的二进制文件(Broadcom 63xx mips 格式)
Tags: njit-client H3C iNode 802.1x openwrt cross-buildPosted in 技术 |Trackback: http://ivsays.appspot.com/2010/09/29/cross-build-njit-client-for-openwrt.html?code=agZpdnNheXNyDQsSBUVudHJ5GMG7AQw
最后
以上就是危机海燕为你收集整理的交叉编译 openwrt 平台上的开源 H3C iNode 客户端 njit-client的全部内容,希望文章能够帮你解决交叉编译 openwrt 平台上的开源 H3C iNode 客户端 njit-client所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复