ネットワーク

【無線LAN】組み込みボードで無線LANを動かしてみた(Intel N6300編)③Ubuntu14(開発PC)でiwコマンドをx86_64ビルド

【※ 当記事は2020年7月2日時点の情報です】

ペイヴメント(@pavement1234)です。

エンジニア
エンジニア

古いパソコンから抜き取ったN-6300というIntelの無線LANカードを例えばRaspberry Piみたいな組込デバイスに接続したい

こんな悩みを解決します。

今回やることは1つ。

  1. Ubuntu14(開発PC)でiwコマンドをx86_64ビルド

バージョン情報

Linux Kernel 3.14

前回(iwのビルド失敗)の振り返り

前回、Ubuntu14(開発PC:x86_64)でまずiwのビルドを試みました。pkg-configにハマって抜け出せなくなりましたが、libnlをビルドして*.pcを生成すればいいのではないか?と考えました。

さらに、とりあえず組込Linuxボードでiwが動けばよいという話もあるので、深く考えずにYoctoの追加パッケージにiwを入れればよいのではないか?とも考えました。

次の項で色々試してみようと思います。ちなみに調べる過程で役に立ちそうなページを2つ見つけました

①Cross Compiling iw wpa supplicant hostapd rfkill for ARM – BeyondLogic

ここにiwのクロスコンパイル方法が書いてあります。しかし私のYocto(SDK)環境の/libにはpkgconfigがなかったので、もう1ひねり必要なのでしょう。

iw

With the Netlink Protocol Library Suite prerequisite installed, download and build the iw nl80211 based CLI configuration utility:

wget https://www.kernel.org/pub/software/network/iw/iw-3.15.tar.gz
tar -xzf iw-3.15.tar.gz
cd iw-3.15/
export PKG_CONFIG_PATH=/usr/arm-linux-gnueabi/lib/pkgconfig
export CC=arm-linux-gnueabi-gcc
make

②iwlwifi Gentoo Wiki

iwlwifiを使う場合のカーネルコンフィグが書いてあります。nl80211、cfg80211、mac80211などnetinkの基本ライブラリをインストールする方法、無線LANチップのファームウェアをインストール方法(ちょっと前にファームのダウンロードで失敗しました。この記事があったらハマらなかったかも)など。

まずはlibnlをビルドしてみる

①libnlのソースをダウンロードして解凍する(自分のアカウントのhome直下で実行してる)

$ wget https://github.com/thom311/libnl/releases/download/libnl3_4_0/libnl-3.4.0.tar.gz
$ tar xvf libnl-3.4.0.tar.gz

②libnlのソースがあるディレクトリに移動して./configureを実行する

$ cd libnl-3.4.0
$ ./configure
checking for a BSD-compatible install… /usr/bin/install -c
checking whether build environment is sane… yes

config.status: executing libtool commands
——————————————————————————-
NOTE

There have been some changes starting with 3.2 regarding where and how libnl
is being installed on the system in order to allow multiple libnl versions
to be installed in parallel:

– Headers will be installed in ${prefix}/include/libnl3, therefore
you will need to add “-I/usr/include/libnl3” to CFLAGS

– The library basename was renamed to libnl-3, i.e. the SO names become
libnl-3.so., libnl-route-3.so, etc.

– libtool versioning was assumed, to ease detection of compatible library
versions.

If you are using pkg-config for detecting and linking against the library
things will continue magically as if nothing every happened. If you are
linking manually you need to adapt your Makefiles or switch to using
pkg-config files.

——————————————————————————-

③makeする

$ make
CC lib/lib_libnl_3_la-addr.lo
CC lib/lib_libnl_3_la-attr.lo

CC src/src_nl_util_addr-nl-util-addr.o
CCLD src/nl-util-addr

④管理者権限でmake installする

$ sudo make install
make[ 1 ]: ディレクトリ /home/pavement1234/libnl-3.4.0' に入ります
/bin/mkdir -p '/usr/local/lib'
/bin/bash ./libtool --mode=install /usr/bin/install -c lib/libnl-3.la lib/libnl-route-3.la lib/libnl-idiag-3.la lib/libnl-genl-3.la lib/libnl-nf-3.la lib/libnl-xfrm-3.la src/lib/libnl-cli-3.la '/usr/local/lib'
ldconfig -n /usr/local/lib
…(省略)
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/bin/mkdir -p '/usr/local/bin'
…(省略)
ldconfig -n /usr/local/lib/libnl/cli/cls
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib/libnl/cli/cls

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/bin/mkdir -p '/usr/local/lib/libnl/cli/qdisc'
…(省略)
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /usr/local/lib/libnl/cli/qdisc
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib/libnl/cli/qdisc

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/bin/mkdir -p '/usr/local/etc/libnl'
/usr/bin/install -c -m 644 etc/pktloc etc/classid '/usr/local/etc/libnl'
make[ 1 ]: ディレクトリ
/home/pavement1234/libnl-3.4.0′ から出ます

⑦インストール先を見てみる

ビルドログを見ると、こんな感じのファイルがインストールされているようです。pkgconfigも(/usr/local/lib/pkgconfig)にインストールされます。

/usr/local/bin/genl-ctrl-list
/usr/local/bin/idiag-socket-details
/usr/local/bin/nl-*
/usr/local/etc/libnl/classid
/usr/local/etc/libnl/pktloc
/usr/local/man/man8/*
/usr/local/share/man/man8/*
/usr/local/include/libnl3/netlink/*
/usr/local/lib/libnl
/usr/local/lib/libnl-*.a
/usr/local/lib/libnl-*.la
/usr/local/lib/libnl-*.so
/usr/local/lib/libnl-*.so.200
/usr/local/lib/pkgconfig

iwもビルドしてみる

①PKG_CONFIG_PATHに/usr/local/lib/pkgconfigを指定する

$ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

②iwをビルドする(成功)

初めてiwのビルドが通りました。

$ cd ~/iw
$ make
CC ap.o
CC bitrate.o
bitrate.c: In function ‘handle_bitrates’:
…(省略)
In file included from wowlan.c:13:0:
nl80211.h:4886:8: note: ‘start’ declared here
__u32 start, offset, len;
^
GEN version.c
CC version.o
CC iw

③ビルドしたiwを動かしてみる(成功)

エラーなど出ずusageが出てきました。OKですね。

$ cd ~/iw
$ ./iw
./iw: /lib/x86_64-linux-gnu/libnl-genl-3.so.200: no version information available (required by ./iw)
./iw: /lib/x86_64-linux-gnu/libnl-3.so.200: no version information available (required by ./iw)
Usage: ./iw [options] command
Options:
–debug enable netlink debugging
–version show version (5.3-3-g3708f61)
Commands:
dev <devname> ap stop
phy <phyname> wowlan enable [any] [disconnect] [magic-packet] [gtk-rekey-failure] [eap-identity-request] [4way-handshake] [rfkill-release] [net-detect [interval <in_msecs> | scan_plans [<interval_secs:iterations>*] <interval_secs>]  [delay <in_secs>] [freqs <freq>+] [matches [ssid <ssid>]+]] [active [ssid <ssid>]+|passive] [randomise[=<addr>/<mask>]]] [tcp <config-file>] [patterns [offset1+]<pattern1> …]

Commands that use the netdev (‘dev’) can also be given the
‘wdev’ instead to identify the device.

You can omit the ‘phy’ or ‘dev’ if the identification is unique,
e.g. “iw wlan0 info” or “iw phy0 info”. (Don’t when scripting.)

Do NOT screenscrape this tool, we don’t consider its output stable.

④iwが参照するライブラリを見てみる

自作libnl(/usr/local/lib/libnl-*.so.200)は参照されません。

$ ldd ~/iw/iw
./iw: /lib/x86_64-linux-gnu/libnl-genl-3.so.200: no version information available (required by ./iw)
./iw: /lib/x86_64-linux-gnu/libnl-3.so.200: no version information available (required by ./iw)
linux-vdso.so.1 => (0x00007ffe6d9ac000)
libnl-genl-3.so.200 => /lib/x86_64-linux-gnu/libnl-genl-3.so.200 (0x00007fa74ca86000)
libnl-3.so.200 => /lib/x86_64-linux-gnu/libnl-3.so.200 (0x00007fa74c86b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa74c4a2000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa74c284000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa74bf7e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa74cc8c000)

自作libnl(/usr/local/lib/libnl-*.so.200)にライブラリ参照パスを通して、再びlddしてみると自作libnlが参照されました。

$ LD_LIBRARY_PATH=/usr/local/lib
$ export LD_LIBRARY_PATH
$ ldd ~/iw/iw
linux-vdso.so.1 => (0x00007fff51b6c000)
libnl-genl-3.so.200 => /usr/local/lib/libnl-genl-3.so.200 (0x00007f334e35d000)
libnl-3.so.200 => /usr/local/lib/libnl-3.so.200 (0x00007f334e13c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f334dd73000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f334db55000)
/lib64/ld-linux-x86-64.so.2 (0x00007f334e563000)

まとめ

とりあえず、Ubuntu14(開発PC)でx86_64ビルドが出来たので、次はクロスコンパイル環境(Yocto)でiwをビルドしてみます。

 

ABOUT ME
ペイヴメント
ペイヴメントのエンジニア塾(当ブログ)では20年以上の経験から得られたプログラミング系ノウハウについてベテランにも満足して頂けるような内容の濃いコンテンツを初心者にも分かりやすい形で日々発信しています。【経歴】ベンチャーのソフトハウスで4年勤務後、精密機器メーカーのソフト開発部門に勤務し今に至ります。