Linux ネットワーク

【無線LAN】組み込みボードで無線LANを動かしてみた(Intel N6300編)

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

この記事で解決できること

  • IntelのN-6300という無線LANカードを組み込みデバイスで動かす方法がわかる。

関連記事

【無線LAN】組み込みボードで無線LANを動かしてみた(Intel N6300編)

【無線LAN】組み込みボードで無線LANを動かしてみた(QCA9377失敗編)

【無線LAN】パソコンの無線LANアダプタをアクセスポイント(SoftAP)にする方法

【自宅でNFC】非接触ICカードリーダーPaSoRiを試してみた

【モバイル通信】自宅のインターネット環境をポケットWi-Fiにしよう(お薦めの理由3つ)

IntelのN-6300という無線LANカード

古いパソコンから抜き取ったN-6300というIntelの無線LANカード。

Intel公式サイトにN-6300の仕様が載ってます。当たり前ですがディスコン(生産中止)ですね。

発売日:2011
ステータス:Discontinued
アンテナ:3x3
バンド: 2.4 GHz/5 Ghz
最高速:450 Mbps
Wi-Fi認定: 802.11a/g/n
内蔵Bluetooth:いいえ
コンプライアンス: PCI, CISP, FIPS, FISMA
ボード・フォーム・ファクター:PCIe Half MiniCard(要はminiPCIe)
システムインターフェースタイプ:PCIe
MU-MIMO:いいえ

見た目はこんな感じ。とりあえずMACアドレスはマスクしておきました。

なんかシリアルNo的なものたちが何を示すのか、少し調べてみました。イマイチわからないのは飛ばしました。

D P/N:04W00N0 REV A05
DELLで番号が振りなおされてる模様。
そういえば、この無線LANカードはDELLのPCから引っこ抜いたものだった。
CN-04W00N-14084-3C8-07VO-A05
4W00Nが部品番号みたい。QRコードはこれを指してる。
MAC:xx xx xx xx xx xx
言わずもがなMACアドレスですね。
TA:E67160-013
いまいちわからん。誰か教えてくれ。

 

組み込みデバイスにつなぐには

IntelのN-6300というminiPCIeの無線LANカードをご紹介しましたが、これをminiPCIeで組込ボードに接続するにはどうすればよいか?

①Raspberry Pi 3 B+にはminiPCIeがついてなかった

薄々気づいてましたがRaspberry Pi 3 B+にはN-6300を接続するためのminiPCIeがありません。困ったなぁ…。昔持ってたけど断捨離で捨てちゃったIntelのGalileo(廃版)にはminiPCIeが付いてたんだよな。今持ってるボードでPCIeがつながらないか調べてみたらJetson Nanoが対応してそうだがM.2なので今回はパス。i.MX6 Sabre Liteも対応してそうでminiPCIeの変換ボードがありそうということが分かった。今回はi.MX6 Sabre Liteを選択。

Raspberry Pi 3 B+ なし
Raspberry Pi 1 なし
Dragonboard 410c なし
Altera DE0 nano SoC なし
NXP i.MX6 Sabre Lite(Boundary Device)あり(但し変換ボードが必要)
NVIDIA Jetson Nano あり(但しM.2)

ちなみにJetson NanoのM.2はこんな感じ。

ちなみに、M.2(エムドットツー)って旧称:NGFF(Next Generation Form Factor)だそうで。

M.2(エムドットツー)(旧称: Next Generation Form Factor、NGFF)は、コンピュータの内蔵拡張カードのフォームファクタと接続端子について定めた規格である。M.2はmSATAの後継として開発された。機能性に優れカードの幅や長さについてもより柔軟性を持つことから、SSDやそれを組み込むウルトラブックやタブレットコンピュータなどの小さいデバイスに適した規格とされる。

M.2は本質的にはSATA Expressの小型版といえる。M.2の提供するバスインターフェイスは論理的にはSATA Expressの上位互換である。M.2はSATA Expressの持つPCI ExpressとSATA 3.0との互換性に加えて、USB 3.0との内部互換性を備える。M.2端子には一つ以上の切り欠きがあり、組み合わせで機器のタイプを示す。 M.2の拡張カードには、Wi-Fi、Bluetooth、GPS、NFC、デジタルラジオ、WiGig、WWAN、SSDなど様々な機能を持たせることができる。バス方式はPCI Express、Serial ATA 3.0、USB 3.0(USB 2.0と下位互換)の三種類が提供される。SATA規格ではrevision 3.2で新たにM.2についてのハードウェアレイアウトを定めている。

M.2は4つのPCI Expressレーンと1つのSATA 3.0 6Gbpsポートを一つの端子内に備えており、PCI Express機器とSATAストレージ機器をM.2カードとして接続することができる。PCI Expressレーンはストレージ機器から見て通常のPCI Expressと全く同じに、追加の抽象化なく接続できる。2013年12月、PCI-SIG(英語版)は、M.2規格 1.0でM.2について定めている。

②i.MX6 Sabre LiteにPCIeを増設するには?

さて、i.MX6 Sabre Lite。要は下の写真の黄色枠にピンヘッダが出てるので、ここからminiPCIeに変換すれば良いのだろう。しかしPCIeみたいな高速I/Fをこんなピンでつないで信号品質を保てるのだろうか…。

ちょっと調べたら出てきた。Boundary Devices ドーターカードとOEMボード

 Boundary Devices Nit6X_PCIEに詳細が載ってる。

この写真はだけでは良く分からないので…。

 Nit6X_PCIE データシートを見たところ違う画像があった。通販サイトの画像と違うがどっちが正しいのだろうか。ちなみに私が持ってるSabre Liteはジャンパを挿すらしい。

更にNit6X_PCIE(公式)を見るとこんな画像が出てくる。なんか通販サイトの画像と違うけど、型番は一緒だしデータシートの画像と同じなのでこれが正しいのかな?

mPCIE daughter board for i.MX6 boards Compatible with Nitrogen6X and BD-SL-i.MX6 boardと書いてあり一安心(取り急ぎポチった)。

③USB3.0からminiPCIeを引っ張れないか?

とりあえずi.MX6ボードにminiPCIeを拡張できる目途が立ったのだが、USB 3.0規格のFAQ(1) ―― 信号波形からSuperSpeed USBを理解しようにある通り、USB3.0はPCIeと物理層が一緒みたい。それならUSB3.0に対応してるRaspberry Pi 4のUSB3.0ポートをminiPCIeに変換できるアダプタは無いものか?

色々調べたが現時点(2019年9月)ではドンピシャな製品は無いようだが類似のことを考えた人がいるのを発見。ina_aniさんのツイートを見るとRaspberry Pi 4のUSBはPCI Express接続なのでUSBコントローラを剥がしてPCIeボードを繋いだという人がいるみたい。

ツイートから飛ぶとHACKADAYというサイトのGiving The Pi 4 PCI Expressという記事が出てくる。現状ここまでやりたいわけではない。単にUSB3.0からminiPCIeが引っ張れればよいのだ。まぁいつか製品化する人が出てくるだろうと思うので、しばし待つことにした。

HW接続インタフェース

無線LANカードのHW接続インタフェースにはどんな種類があるか?調べてみました。

①HW接続インタフェースとは?

インターフェースとは?を読んでみた。要はUSBとかPCI Expressみたいな話。

ハードウェアインターフェースとは、複数の装置を接続して通信する際の仕様で、コネクタの形状や電気信号の形式などを定めている。コンピュータ内部のデータ伝送、コンピュータと周辺機器のデータ伝送、コンピュータ間の通信など、用途に合わせて様々なインターフェースが存在する。例としてUSB、SATA、IEEE 1394、PCI Express、HDMIなどの規格、およびこれらのコネクタなどが挙げられる。

また、接続先がコンピュータネットワーク(LAN)の場合は特にネットワークインターフェースと呼ばれることもあり、イーサネット(Ethernet)や無線LAN(Wi-Fi)などの通信規格、およびコネクタや差込口(ポート)、拡張カード、通信チップなどを指す。

②無線LANカードのHW接続インタフェースとは?

12年ぐらい前はPCカード(PCMCIA)をよく見かけたが最近全く見ない。無線LANカードのHW接続インタフェースは以下の4つぐらいと認識している。

USB
PCIe
SDIO
低速インタフェース(UART、SPI)

それぞれ具体例を紹介していく。

USB

いわゆるUSBドングルと呼ばれる無線LAN子機(STA)。搭載されている無線チップセット・ドライバによっては無線LAN親機(AP)やモニターモードに変身できるものもある。お手軽なのでつい買ってしまい、以下のように増えていくわけだ(写真はBluetoothのUSBドングルも含まれている)。

実は組込Linuxボードを家の無線ルータに繋ぐときUSBドングルを使うことが多く、この連載記事もUSBドングルを使えばサクサク進むのだが芸がない。あえてminiPCIeを選択しハードルを上げている次第。

PCIe
今回の記事で紹介しているN-6300の物理層はPCIe(PCI Express)であり、コネクタはminiPCIe(Mini PCI Express)という小型のコネクタが採用されている。ノートPCの無線LANは、ちょっと前までminiPCIeが多く使われていたが、ここ3年ぐらいでM.2(新しい規格)が主流になっている印象。この連載でいつかM.2の無線LANカードも紹介しようと考えている。ちなみにminiPCIeと同じコネクタに挿さるmSATA(mini SATA)という規格があるのでご注意を…。

SDIO

SDIOとはSDカードとピン互換のインタフェース。GPS、Bluetooth、無線LANなどの機能を持っていることが多い。SDIOの無線LANカードを一般ユーザが使うケースは稀と思われる。低消費電力が売りらしく、携帯電話の無線LANにも多く採用されているらしいが、携帯電話にSDカードが挿さっているわけではなく、無線チップとCPUがSDIOピンで接続されているようだ。

ちなみに、SDIOカードタイプの無線LANカードも市販されているため、もし入手できたら連載のどこか紹介したいと考えている。

低速インタフェース(UART、SPI)

低速インタフェース(UART、SPI)が採用された無線LANカードは、SDIOよりも珍しいと思う。高速インタフェース(USB、PCIe、SDIO)がついていないマイコンで採用されていることが多いらしい。いつかチャレンジしてみたい。

BD-SABRE-LITE

【組込Linuxボード】Boundary Devices社のSabre Liteボード(i.MX6)を動かしてみたを読みながら起動。大丈夫そうだ。

①NIT6X_PCIEが到着した

こんな感じ。

なんか長いネジが付いてる。これをどう使うかというと...。

②認識させてみた

TeraTermでUART接続し、root(パスワードなし)でログイン。PCIデバイスを一覧表示させるコマンドlspciを打ってみるが…。何も表示されない。

 command
root@nitrogen6x:~# lspci

当たり前だがインストールされたドライバを一覧表示させるコマンドlsmodを打ってみてもWLANモジュールは出てこない。

 command
root@nitrogen6x:~# lsmod
Module Size Used by
ov5640_camera_mipi 53880 0
mxc_v4l2_capture 25411 1 ov5640_camera_mipi
ipu_bg_overlay_sdc 4303 1 mxc_v4l2_capture
ipu_still 1811 1 mxc_v4l2_capture
ipu_prp_enc 4919 1 mxc_v4l2_capture
ipu_csi_enc 3097 1 mxc_v4l2_capture
adv7180_tvin 8599 0
ipu_fg_overlay_sdc 5199 1 mxc_v4l2_capture
v4l2_int_device 1936 3 ov5640_camera_mipi,adv7180_tvin,mxc_v4l2_capture
snd_soc_fsl_asrc 24344 0

接触不良かも?

シャットダウンして電源OFF。ネジを外し、N-6300を深く挿して再びネジ止め。再び電源ON。

再びlspciを打ったらPCI bridgeとN-6300を認識してる。

 command
root@nitrogen6x:~# lspci
00:00.0 PCI bridge: Synopsys, Inc. Device abcd (rev 01)
01:00.0 Network controller: Intel Corporation Centrino Ultimate-N 6300 (rev 35)

lsmodも打つと、iwlwificfg80211も出てきた。
もうちょっとハマると思ったのでやや拍子抜け(もうちょっと試行錯誤したかった…)。

 command
root@nitrogen6x:~# lsmod
Module Size Used by
ov5640_camera_mipi 53880 0
mxc_v4l2_capture 25411 1 ov5640_camera_mipi
ipu_bg_overlay_sdc 4303 1 mxc_v4l2_capture
ipu_still 1811 1 mxc_v4l2_capture
ipu_prp_enc 4919 1 mxc_v4l2_capture
ipu_csi_enc 3097 1 mxc_v4l2_capture
adv7180_tvin 8599 0
ipu_fg_overlay_sdc 5199 1 mxc_v4l2_capture
v4l2_int_device 1936 3 ov5640_camera_mipi,adv7180_tvin,mxc_v4l2_capture
iwlwifi 70357 0
cfg80211 376620 1 iwlwifi
snd_soc_fsl_asrc 24344 0

③N-6300を無線ルータに繋いでみる

さて、N-6300がPCIeデバイスとして認識され、無線LANドライバのインストールまでは来た。しかしこいつはまだ赤ちゃんみたいなもの。無線LAN子機(STA)として動かすためにはIPアドレスを設定したり、無線LAN親機(AP)に繋いだりする必要がある。

cfg80211が認識されているようなのでnetlink系だ(こんど詳しく説明する)。netlink系の無線LAN設定ツールiwを打ち込んでみたが...。ナイネ。ubuntuじゃないのでapt-getなんか使えるわけもなく、iwをクロスコンパイルする感じか?無線LANルータに繋がってないわけだから当然インターネットにもつながっていない。楽しくなってきた。

 command
root@nitrogen6x:~# iw
-sh: iw: not found

ネットワークインタフェースの設定ツールifconfigを打つと、eth0は見えているがwlan0はいない。

 command
root@nitrogen6x:~# ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
UP BROADCAST 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) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 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:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

(WPA2接続を行うための)IEEE802.11iサプリカントwpa_supplicantは...。居る。しかしiwが使えないので無線LAN初期化ができない。これは出直しか?

 command
root@nitrogen6x:~# wpa_supplicant
Successfully initialized wpa_supplicant
wpa_supplicant v2.3
Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi> and contributors This software may be distributed under the terms of the BSD license.
See README for more details. usage:
wpa_supplicant [-BddhKLqqtuvW] [-P<pid file>] [-g<global ctrl>] \
[-G<group>] \
-i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] [-p<driver_param>] \
[-b<br_ifname>] [-e<entropy file>] \
[-o<override driver>] [-O<override ctrl>] \
[-N -i<ifname> -c<conf> [-C<ctrl>] [-D<driver>] \
[-p<driver_param>] [-b<br_ifname>] [-I<config file>] ...] drivers:
nl80211 = Linux nl80211/cfg80211
wext = Linux wireless extensions (generic)
hostap = Host AP driver (Intersil Prism2/2.5/3)
wired = Wired Ethernet driver
options:
-b = optional bridge interface name
-B = run daemon in the background
-c = Configuration file
-C = ctrl_interface parameter (only used if -c is not)
-i = interface name
-I = additional configuration file
-d = increase debugging verbosity (-dd even more)
-D = driver name (can be multiple drivers: nl80211,wext)
-e = entropy file
-g = global ctrl_interface
-G = global ctrl_interface group
-K = include keys (passwords, etc.) in debug output
-t = include timestamp in debug messages
-h = show this help text
-L = show license (BSD)
-o = override driver parameter for new interfaces
-O = override ctrl_interface parameter for new interfaces
-p = driver parameters
-P = PID file
-q = decrease debugging verbosity (-qq even less)
-u = enable DBus control interface
-v = show version
-W = wait for a control interface monitor before starting
-N = start describing new interface
example:
wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf

iwをPCで動かしてみた

BD-SABRE-LITE向けLinuxイメージ(Yocto)に無線LANの設定ツールiwが入っていなかったため初期化できず。

iwを入れるのは後でやるとして、そもそも無線LANドライバの初期化ってどうやるんだっけ?

とりあえずLinuxの無線LANについて俯瞰すべくワイヤレス設定を読んだ。

まず、ip linkというコマンドを打ってwlan0が生成されているか確認せよ、と書いてあるのですぐにip linkと打ってみたら…。wlan0ナイネ。

 command
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: can0: <NOARP40000> mtu 16 qdisc noop qlen 10
link/[280] 3: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:19:b8:06:ca:7f brd ff:ff:ff:ff:ff:ff
4: sit0@NONE: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0

wlan0ナイネのときは、dmesgでiwlwifiのファームが読み込まれてるか?iwlwifiのエラーが発生してないか?調べてみろと書いてあるので実行してみると…。”iwlwifi-6000-4.ucode”というファームがなくて、ファームの読み込みが失敗していることが分かった。

 command
# dmesg | grep firmware
imx-sdma 20ec000.sdma: loaded firmware 3.1
usbserial: USB Serial support registered for Keyspan - (without firmware)
egalax_ts 2-0004: Failed to read firmware version
ili210x_i2c 2-0041: Failed to get firmware version, err: -5 # dmesg | grep iwlwifi
iwlwifi 0000:01:00.0: request for firmware file 'iwlwifi-6000-4.ucode' failed.
iwlwifi 0000:01:00.0: no suitable firmware found!

思いついた入手方法は以下の2つ。どっちも454608バイトでバイナリ比較結果も一致。今回は②を使った。

①BD-SABRE-LITEをYoctoでビルドしたときのSDKに含まれる/lib/firmware。

/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/lib/firmware/iwlwifi-6000-4.ucode

②Ubuntu14(開発PC)の/lib/firmware。

/lib/firmware/iwlwifi-6000-4.ucode

②の/lib/firmware/iwlwifi-6000-4.ucodeはTeraTermのメニューから「ファイル」「SSH SCP」をクリック。

画面下半分の「From」と「To」を指定して「Receive」をクリック。無事c:\tmp\iwlwifi-6000-4.ucodeをゲット。

iwlwifi-6000-4.ucodeをコピーするためUSBメモリ(FAT32で初期化したもの)をBD-SABRE-LITEに挿したら、こんなん出た。/dev/sdaとして認識されたらしい。

usb 1-1.1: new high-speed USB device number 3 using ci_hdrc
usb-storage 1-1.1:1.0: USB Mass Storage device detected
scsi1 : usb-storage 1-1.1:1.0
scsi 1:0:0:0: Direct-Access BUFFALO USB Flash Disk 4000 PQ: 0 ANSI: 4
sd 1:0:0:0: [sda] 15950592 512-byte logical blocks: (8.16 GB/7.60 GiB)
sd 1:0:0:0: [sda] Write Protect is off
sd 1:0:0:0: [sda] No Caching mode page found
sd 1:0:0:0: [sda] Assuming drive cache: write through
sd 1:0:0:0: [sda] No Caching mode page found
sd 1:0:0:0: [sda] Assuming drive cache: write through
sda:
sd 1:0:0:0: [sda] No Caching mode page found
sd 1:0:0:0: [sda] Assuming drive cache: write through
sd 1:0:0:0: [sda] Attached SCSI removable disk
FAT-fs (sda): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

でも/mediaに自動マウントされなかったので。

 command
# ls /media

手動マウントして、/lib/firmwareにコピーしてrebootした。

 command
# mount /dev/sda /mnt
root@nitrogen6x:~# ls /mnt
System Volume Information iwlwifi-6000-4.ucode # cp /mnt/iwlwifi-6000-4.ucode /lib/firmware/ # reboot ♯ reboot

リブート後、無事認識された。

 command
# dmesg | grep iwlwifi
iwlwifi 0000:01:00.0: loaded firmware version 9.221.4.1 build 25532 op_mode iwldvm
iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEBUG disabled
iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEBUGFS disabled
iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEVICE_TRACING disabled
iwlwifi 0000:01:00.0: Detected Intel(R) Centrino(R) Ultimate-N 6300 AGN, REV=0x74
iwlwifi 0000:01:00.0: L1 Disabled - LTR Disabled

再びip linkを打つと、無事wlan0アルネ。

 command
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: can0: <NOARP40000> mtu 16 qdisc noop qlen 10
link/[280] 3: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:19:b8:06:ca:7f brd ff:ff:ff:ff:ff:ff
4: sit0@NONE: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
5: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 3c:a9:f4:8b:fe:d0 brd ff:ff:ff:ff:ff:ff

インタフェース有効化まで行けたので、いよいよiwを動かしたい。

iwって何?

iw(Linux)を読んだ。IEEE 802.11規格の無線LANネットワークの設定を行うためのコマンドラインユーティリティとある。私がLinuxの無線LANドライバを始めて触ったのはカーネル2.4から2.6への過渡期で、net_device(WIRELESS_EXT)に依存するwireless-toolsが一般的だったが、最近はnetlinkに依存するiwに置き換わっているのだ。

iwは、IEEE 802.11規格の無線LANネットワークの設定を行うためのコマンドラインユーティリティである。wireless-tools(英語版)の置き換えを目標に開発が行われている。

iwは、ISCライセンスの下で配布されているフリーソフトウェアで、iwlwifi(英語版)など多くの無線ドライバに対応している。WPAで暗号化された無線ネットワークに接続する場合は、wpa_supplicantの使用が必要になる。

Ubuntu14(開発PC)でiwと打つとヘルプが表示される。which iwと打ったら/sbin/iwに居るみたい。

 command
$ which iw
/sbin/iw

共有ライブラリの依存関係を表示するlddコマンドを打ってみた。/lib/x86_64-linux-gnu/にライブラリがインストールされてるみたい。

 command
$ ldd /sbin/iw
linux-vdso.so.1 => (0x00007ffebdeb9000)
libnl-genl-3.so.200 => /lib/x86_64-linux-gnu/libnl-genl-3.so.200 (0x00007f79be756000)
libnl-3.so.200 => /lib/x86_64-linux-gnu/libnl-3.so.200 (0x00007f79be53b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79be172000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f79bdf54000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f79bdc4e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f79be95c000)

ライブラリってどうやって検索されるのか?共有ライブラリへパスを通すを読んだ。

①LD_LIBRARY_PATHにパスを通す
②システム全体にパスを通す

の2種類あるみたい。

まず①のLD_LIBRARY_PATHをechoしてみたが、何も表示されない(設定されてない)ので、ウチの環境は②であると考えた。

 command
$ echo $LD_LIBRARY_PATH

②のシステム全体にライブラリパスを通すには/etc/ld.so.confという設定ファイルに登録するようなので、/etc/ld.so.confを開いたところ…。

 command
$ sudo vi /etc/ld.so.conf

という感じ。他の*.confをインクルードしてるみたい。階層が深いね。

 command
include /etc/ld.so.conf.d/*.conf

他の*.confをリスト表示。libnlが格納されているx86_64-linux-gnu.confの*.confもあるね。

 command
$ ls /etc/ld.so.conf.d
合計 20
-rw-rw-r-- 1 root root 38 3月 24 2014 fakeroot-x86_64-linux-gnu.conf
-rw-r--r-- 1 root root 44 8月 10 2009 libc.conf
-rw-r--r-- 1 root root 68 4月 12 2014 x86_64-linux-gnu.conf
lrwxrwxrwx 1 root root 43 2月 17 2019 x86_64-linux-gnu_EGL.conf -> /etc/alternatives/x86_64-linux-gnu_egl_conf
lrwxrwxrwx 1 root root 42 2月 17 2019 x86_64-linux-gnu_GL.conf -> /etc/alternatives/x86_64-linux-gnu_gl_conf
-rw-r--r-- 1 root root 56 1月 16 2018 zz_i386-biarch-compat.conf
-rw-r--r-- 1 root root 58 1月 16 2018 zz_x32-biarch-compat.conf

/etc/ld.so.conf.d/x86_64-linux-gnu.confを開いてみたところ…。libnl-3.so.200libnl-3.so.200 が居る/lib/x86_64-linux-gnu/が書かれている。この仕組みでライブラリが探せるわけだ。

 command
$ sudo vi /etc/ld.so.conf.d/x86_64-linux-gnu.conf
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

iwをUbuntu14(開発PC)で練習ビルドする

さて、iwをまずUbuntu14(x86_64の開発PC)で練習ビルドすることにした。まずソースコードを入手するためiw(Linux)を調べたところ、iw(Linux)にgitのリポジトリも書いてあった。

さらに参照先のgitリポジトリにgitのクローンURLが書いてあった。(最近はURLじゃなくてURIって言うんですよね。でもなんか慣れなくてついついURLって言ってしまう私です)

 command
git://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git

Ubuntu14(開発PC)でiwをgit clone。

 command
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git
Cloning into 'iw'...
remote: Counting objects: 2984, done.
remote: Compressing objects: 100% (219/219), done.
remote: Total 2984 (delta 127), reused 0 (delta 0)
Receiving objects: 100% (2984/2984), 734.38 KiB | 657.00 KiB/s, done.
Resolving deltas: 100% (1989/1989), done.
Checking connectivity... done.

カレントディレクトリにiwというディレクトリが出来た。lsしてみる。

 command
$ ls -l ./iw
合計 768
-rw-rw-r-- 1 pavement1234 pavement1234 491 9月 21 23:26 Android.mk
-rw-rw-r-- 1 pavement1234 pavement1234 1871 9月 21 23:26 CONTRIBUTING
-rw-rw-r-- 1 pavement1234 pavement1234 849 9月 21 23:26 COPYING
-rw-rw-r-- 1 pavement1234 pavement1234 2915 9月 21 23:26 Makefile
-rw-rw-r-- 1 pavement1234 pavement1234 464 9月 21 23:26 README
-rw-rw-r-- 1 pavement1234 pavement1234 3246 9月 21 23:26 ap.c
-rw-rw-r-- 1 pavement1234 pavement1234 6708 9月 21 23:26 bitrate.c
-rw-rw-r-- 1 pavement1234 pavement1234 3796 9月 21 23:26 bloom.c
-rw-rw-r-- 1 pavement1234 pavement1234 7241 9月 21 23:26 coalesce.c
-rw-rw-r-- 1 pavement1234 pavement1234 5146 9月 21 23:26 connect.c
-rw-rw-r-- 1 pavement1234 pavement1234 1199 9月 21 23:26 cqm.c
-rw-rw-r-- 1 pavement1234 pavement1234 33273 9月 21 23:26 event.c
-rw-rw-r-- 1 pavement1234 pavement1234 4715 9月 21 23:26 ftm.c
-rw-rw-r-- 1 pavement1234 pavement1234 2445 9月 21 23:26 genl.c
-rw-rw-r-- 1 pavement1234 pavement1234 3507 9月 21 23:26 hwsim.c
-rw-rw-r-- 1 pavement1234 pavement1234 3206 9月 21 23:26 ibss.c
-rw-rw-r-- 1 pavement1234 pavement1234 1594 9月 21 23:26 ieee80211.h
-rw-rw-r-- 1 pavement1234 pavement1234 28980 9月 21 23:26 info.c
-rw-rw-r-- 1 pavement1234 pavement1234 17900 9月 21 23:26 interface.c
-rw-rw-r-- 1 pavement1234 pavement1234 1117 9月 21 23:26 iw.8
-rw-rw-r-- 1 pavement1234 pavement1234 13970 9月 21 23:26 iw.c
-rw-rw-r-- 1 pavement1234 pavement1234 7725 9月 21 23:26 iw.h
-rw-rw-r-- 1 pavement1234 pavement1234 7874 9月 21 23:26 link.c
-rw-rw-r-- 1 pavement1234 pavement1234 8476 9月 21 23:26 measurements.c
-rw-rw-r-- 1 pavement1234 pavement1234 14303 9月 21 23:26 mesh.c
-rw-rw-r-- 1 pavement1234 pavement1234 3662 9月 21 23:26 mgmt.c
-rw-rw-r-- 1 pavement1234 pavement1234 6048 9月 21 23:26 mpath.c
-rw-rw-r-- 1 pavement1234 pavement1234 1941 9月 21 23:26 mpp.c
-rw-rw-r-- 1 pavement1234 pavement1234 11089 9月 21 23:26 nan.c
-rw-rw-r-- 1 pavement1234 pavement1234 280715 9月 21 23:26 nl80211.h
-rw-rw-r-- 1 pavement1234 pavement1234 851 9月 21 23:26 ocb.c
-rw-rw-r-- 1 pavement1234 pavement1234 904 9月 21 23:26 offch.c
-rw-rw-r-- 1 pavement1234 pavement1234 669 9月 21 23:26 p2p.c
-rw-rw-r-- 1 pavement1234 pavement1234 22269 9月 21 23:26 phy.c
-rw-rw-r-- 1 pavement1234 pavement1234 1693 9月 21 23:26 ps.c
-rw-rw-r-- 1 pavement1234 pavement1234 2893 9月 21 23:26 reason.c
-rw-rw-r-- 1 pavement1234 pavement1234 7553 9月 21 23:26 reg.c
-rw-rw-r-- 1 pavement1234 pavement1234 825 9月 21 23:26 roc.c
-rw-rw-r-- 1 pavement1234 pavement1234 59949 9月 21 23:26 scan.c
-rw-rw-r-- 1 pavement1234 pavement1234 45 9月 21 23:26 sections.c
-rw-rw-r-- 1 pavement1234 pavement1234 5601 9月 21 23:26 sha256.c
-rw-rw-r-- 1 pavement1234 pavement1234 1709 9月 21 23:26 sha256.h
-rw-rw-r-- 1 pavement1234 pavement1234 28210 9月 21 23:26 station.c
-rw-rw-r-- 1 pavement1234 pavement1234 3732 9月 21 23:26 status.c
-rw-rw-r-- 1 pavement1234 pavement1234 2751 9月 21 23:26 survey.c
-rw-rw-r-- 1 pavement1234 pavement1234 38669 9月 21 23:26 util.c
-rw-rw-r-- 1 pavement1234 pavement1234 3262 9月 21 23:26 vendor.c
-rwxrwxr-x 1 pavement1234 pavement1234 1103 9月 21 23:26 version.sh
-rw-rw-r-- 1 pavement1234 pavement1234 12793 9月 21 23:26 wowlan.c

とりあえずmakeしてみたがエラーで瞬殺。libnlが見つからないと言っている。

 command
$ cd iw
$ make
Makefile:75: *** Cannot find development files for any supported version of libnl. 中止.

READMEを開いた。えーと、makeが失敗したらlibnlが見つかるように環境変数PKG_CONFIG_PATHを設定してください、みたいな感じのことが書いてある気がする。

This is 'iw', a tool to use nl80211.

To build iw, just enter 'make'. If that fails, set the
PKG_CONFIG_PATH environment variable to allow the Makefile
to find libnl.

'iw' is currently maintained at http://git.sipsolutions.net/iw.git/,
some more documentation is available at
http://wireless.kernel.org/en/users/Documentation/iw.

Please send all patches to Johannes Berg <johannes@sipsolutions.net>
and CC linux-wireless@vger.kernel.org for community review.

(Google和訳)

これは、nl80211を使用するツールである「iw」です。

iwをビルドするには、「make」と入力します。 それが失敗した場合、設定
Makefileを許可するPKG_CONFIG_PATH環境変数
libnlを見つけます。

「iw」は現在http://git.sipsolutions.net/iw.git/で管理されています。
さらにいくつかのドキュメントが利用可能です
http://wireless.kernel.org/en/users/Documentation/iw。

すべてのパッチをJohannes Berg <johannes@sipsolutions.net>に送信してください。
コミュニティレビュー用のCC linux-wireless@vger.kernel.org。

$PKG_CONFIG_PATHをechoしたが、何も出てこない(=設定されてない)。

が、そもそもPKG_CONFIG_PATHって何かよくわかってない。PKG_CONFIG_PATHで検索かけたところpkg-configという単語が出てきた。さらにpkg-configを調べてみたところ、PKG_CONFIG_PATHには*.pcというファイルを置かなきゃならないみたい。

pkg-configは、環境変数PKG_CONFIG_PATHのパスに存在する *.pc ファイルに記録された情報を元に、ビルドの際に必要な文字列を返す。

さらに、こんなことが書いてある。一般的には/usr/lib/pkgconfig/に*.pcファイルを置くのですね。

*.pcは普通は/usr/lib/pkgconfig/以下に作成され、pkg-config が読みにいくデフォルトのパスもここだが、/usr/share/pkgconfigの場合もあるかもしれない。

*.pcの作り方を知りたい。最低限何を書けばよいのだろう。

取り急ぎ、pkg-configに対応するを読んだ。さらにpkg-config をクロス開発で使うも読んだが、イマイチ書き方がわからない。さらに/usr/lib/pkgconfig/*.pcも読んだが、それぞれ微妙に書き方が異なっていて、標準的な書き方が見いだせない。段々ハマり始めた感じ。ズブズブ…。

ちょっと一歩引いて整理してみよう

iwのREADMEにはこんなことが書いてあった。

「iw」は現在http://git.sipsolutions.net/iw.git/で管理されています。
さらにいくつかのドキュメントが利用可能です
http://wireless.kernel.org/en/users/Documentation/iw。

https://wireless.wiki.kernel.org/en/users/documentation/iwを開いたところ、Linux Wirelessというサイトのabout iwというページだった。ここにiwのビルドに関するヒントらしきものが書いてあり、更にヒントとなりそうなURLリンクが書いてある。

Build requirements

libnl >= libnl1
libnl-dev >= libnl-dev-1
pkg-config Using iw requires you to have libnl, the first working version is 1.0 pre8 as this release introduced genl, Generic Netlink, which nl80211 relies on. If your distribution's libnl is a wrong version then you'll have to download and compile libnl yourself for now (http://www.infradead.org/~tgr/libnl/).

(Google和訳)
ビルド要件

libnl> = libnl1
libnl-dev> = libnl-dev-1
pkg-config iwを使用するにはlibnlが必要です。このリリースでは、nl80211が依存するgenl、Generic Netlinkが導入されたため、最初の作業バージョンは1.0 pre8です。 ディストリビューションのlibnlのバージョンが間違っている場合は、今のところlibnlをダウンロードしてコンパイルする必要があります(http://www.infradead.org/~tgr/libnl/)。

http://www.infradead.org/~tgr/libnl/を開いたところ、Netlink Protocol Library Suite (libnl)というページだった。SWの階層構造が説明されており、めちゃめちゃわかりやすいがpkg-configを解決できそうな記載はなかった(pkg-configでページ内を検索しただけだが)。

なかなか突破口が開けない。こういうときは、一旦寝るに限る…。

前回(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直下で実行してる)。

 command
$ 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を実行する。

 command
$ 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する。

 command
$ 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する。

 command
$ 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を指定する

 command
$ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

②iwをビルドする(成功)
初めてiwのビルドが通りました。

 command
$ 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ですね。

 command
$ 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)は参照されない。

 command
$ 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をビルドしてみよう。

クロスコンパイル環境(Yocto)でiwをビルド

①カーネルコンフィグに無線LANアクセスポイント設定を足す方法

 command
$ MACHINE=nitrogen6x bitbake -f -c menuconfig virtual/kernel

menuconfig画面で、以下の項目を変更してExit(Save)する。
├ Networking support --->
└ Wireless --->
└ nl80211 testmode command [ ] → [*]

├ Device Drivers --->
└ Network device support
└ Wireless LAN
└ IEEE802.11 for Host AP(Prism2/2.5/3 and WEP/TKIP/CCMP) [ ] → [*]

②local.confへlibnlとiwを足す方法(失敗

【組込Linuxボード】Boundary Devices社のSabre Liteボード(i.MX6)を動かしてみたの手順を参考に、Yoctoの追加パッケージにlibnlとiwを足してみたがこれは失敗。なお、iwの前に半角スペースを付けないと前のコンポーネントと文字列が連結されてします。packagegroup-core-x11-sato-gamesiwみたいな感じ。

 command
$ vi ~/fido/core-image-sato/conf/local.conf
MACHINE ??= 'nitrogen6x'
DISTRO ?= 'poky'
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES = "debug-tweaks"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS = "\
STOPTASKS,${TMPDIR},1G,100K \
STOPTASKS,${DL_DIR},1G,100K \
STOPTASKS,${SSTATE_DIR},1G,100K \
ABORT,${TMPDIR},100M,1K \
ABORT,${DL_DIR},100M,1K \
ABORT,${SSTATE_DIR},100M,1K"
PACKAGECONFIG_append_pn-qemu-native = " sdl"
PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl"
CONF_VERSION = "1" BB_NUMBER_THREADS = '2'
PARALLEL_MAKE = '-j 2' DL_DIR ?= "${BSPDIR}/downloads/"
ACCEPT_FSL_EULA = ""
IMAGE_INSTALL_append = " iw libnl"
LICENSE_FLAGS_WHITELIST = 'commercial'

ビルド時のエラーログ。

 command
$ bitbake core-image-sato
Loading cache: 100% |###############################################################| ETA: 00:00:00
Loaded 2088 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies
NOTE: multiple providers are available for jpeg (jpeg, libjpeg-turbo)
NOTE: consider defining a PREFERRED_PROVIDER entry to match jpeg
NOTE: multiple providers are available for jpeg-native (jpeg-native, libjpeg-turbo-native)
NOTE: consider defining a PREFERRED_PROVIDER entry to match jpeg-native Build Configuration:
BB_VERSION = "1.26.0"
BUILD_SYS = "x86_64-linux"
NATIVELSBSTRING = "Ubuntu-14.04"
TARGET_SYS = "arm-poky-linux-gnueabi"
MACHINE = "nitrogen6x"
DISTRO = "poky"
DISTRO_VERSION = "1.8.2"
TUNE_FEATURES = "arm armv7a vfp thumb neon callconvention-hard cortexa9"
TARGET_FPU = "vfp-neon"
meta
meta-yocto = "(nobranch):87631919819b6f85f23f57689cd1065c64d7fb03"
meta-oe
meta-multimedia = "(nobranch):902964a4da26e46018d2a8d17dcdda1ac4627a39"
meta-fsl-arm = "(nobranch):c9f259a4bf8472dfa3ff75f1c3fcbe5e0ded7aaf"
meta-fsl-arm-extra = "(nobranch):b292f6204912ace18e30b7683748a311c5dfa780"
meta-fsl-demos = "(nobranch):17f9da65efb5c65c1d44b5cc18584034b29a742b" NOTE: Preparing RunQueue
WARNING: /home/pavement1234/fido/sources/meta-fsl-arm-extra/recipes-kernel/linux/linux-boundary_3.14.28.bb.do_compile is tainted from a forced run
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
WARNING: Failed to fetch URL http://libmpeg2.sourceforge.net/files/mpeg2dec-0.4.1.tar.gz, attempting MIRRORS if available
ERROR: Fetcher failure: Fetch command failed with exit code 4, no output
ERROR: Function failed: Fetcher failure for URL: 'http://libmpeg2.sourceforge.net/files/mpeg2dec-0.4.1.tar.gz'. Unable to fetch URL from any source.
ERROR: Logfile of failure stored in: /home/pavement1234/fido/core-image-sato/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/mpeg2dec/0.4.1-r2/temp/log.do_fetch.11185
ERROR: Task 4357 (/home/pavement1234/fido/sources/poky/meta/recipes-multimedia/mpeg2dec/mpeg2dec_0.4.1.bb, do_fetch) failed with exit code '1'
WARNING: Failed to fetch URL http://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz, attempting MIRRORS if available
ERROR: Fetcher failure: Fetch command failed with exit code 4, no output
ERROR: Function failed: Fetcher failure for URL: 'http://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz'. Unable to fetch URL from any source.
ERROR: Logfile of failure stored in: /home/pavement1234/fido/core-image-sato/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/libmad/0.15.1b-r3/temp/log.do_fetch.20289
ERROR: Task 4344 (/home/pavement1234/fido/sources/poky/meta/recipes-multimedia/libmad/libmad_0.15.1b.bb, do_fetch) failed with exit code '1'
NOTE: Tasks Summary: Attempted 2716 tasks of which 2711 didn't need to be rerun and 2 failed.
Waiting for 0 running tasks to finish: Summary: 2 tasks failed:
/home/pavement1234/fido/sources/poky/meta/recipes-multimedia/mpeg2dec/mpeg2dec_0.4.1.bb, do_fetch
/home/pavement1234/fido/sources/poky/meta/recipes-multimedia/libmad/libmad_0.15.1b.bb, do_fetch
Summary: There were 3 WARNING messages shown.
Summary: There were 4 ERROR messages shown, returning a non-zero exit code.

 

解決した

--hostで色々ハマったのだが救世主が降臨し無事解決。yoctoのSDKは良く出来ていて--hostにarm-angstrom-linux-gnueabiを指定すれば良いらしい。

 command
$ . /opt/poky/1.8.2/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
$ cd ~/libnl-3.4.0/
$ ./configure --host=arm-angstrom-linux-gnueabi
configure: loading site script /opt/poky/1.8.2/site-config-cortexa9hf-vfp-neon-poky-linux-gnueabi
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-angstrom-linux-gnueabi-strip... arm-poky-linux-gnueabi-strip
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports nested variables... (cached) yes
checking for style of include used by make... GNU
checking for arm-angstrom-linux-gnueabi-gcc... arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... yes
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi accepts -g... yes
checking for arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi option to accept ISO C89... none needed
checking whether arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi understands -c and -o together... yes
checking dependency style of arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi... gcc3
checking for arm-angstrom-linux-gnueabi-ar... arm-poky-linux-gnueabi-ar
checking the archiver (arm-poky-linux-gnueabi-ar) interface... ar
checking for arm-angstrom-linux-gnueabi-gcc... (cached) arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi
checking whether we are using the GNU C compiler... (cached) yes
checking whether arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi accepts -g... (cached) yes
checking for arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi option to accept ISO C89... (cached) none needed
checking whether arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi understands -c and -o together... (cached) yes
checking dependency style of arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi... (cached) gcc3
checking build system type... x86_64-pc-linux-gnu
checking host system type... arm-angstrom-linux-gnueabi
checking how to print strings... printf
checking for a sed that does not truncate output... (cached) sed
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for fgrep... /bin/grep -F
checking for ld used by arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi... arm-poky-linux-gnueabi-ld --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi
checking if the linker (arm-poky-linux-gnueabi-ld --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... arm-poky-linux-gnueabi-nm
checking the name lister (arm-poky-linux-gnueabi-nm) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking how to convert x86_64-pc-linux-gnu file names to arm-angstrom-linux-gnueabi format... func_convert_file_noop
checking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop
checking for arm-poky-linux-gnueabi-ld --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi option to reload object files... -r
checking for arm-angstrom-linux-gnueabi-objdump... arm-poky-linux-gnueabi-objdump
checking how to recognize dependent libraries... pass_all
checking for arm-angstrom-linux-gnueabi-dlltool... no
checking for dlltool... no
checking how to associate runtime and link libraries... printf %s\n
checking for arm-angstrom-linux-gnueabi-ar... (cached) arm-poky-linux-gnueabi-ar
checking for archiver @FILE support... @
checking for arm-angstrom-linux-gnueabi-strip... (cached) arm-poky-linux-gnueabi-strip
checking for arm-angstrom-linux-gnueabi-ranlib... arm-poky-linux-gnueabi-ranlib
checking command to parse arm-poky-linux-gnueabi-nm output from arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi object... ok
checking for sysroot... no
checking for a working dd... /bin/dd
checking how to truncate binary pipes... /bin/dd bs=4096 count=1
checking for arm-angstrom-linux-gnueabi-mt... no
checking for mt... mt
configure: WARNING: using cross tools not prefixed with host triplet
checking if mt is a manifest tool... no
checking how to run the C preprocessor... arm-poky-linux-gnueabi-gcc -E -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for dlfcn.h... yes
checking for objdir... .libs
checking if arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi supports -fno-rtti -fno-exceptions... no
checking for arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi option to produce PIC... -fPIC -DPIC
checking if arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi PIC flag -fPIC -DPIC works... yes
checking if arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi static flag -static works... no
checking if arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi supports -c -o file.o... yes
checking if arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi supports -c -o file.o... (cached) yes
checking whether the arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi linker (arm-poky-linux-gnueabi-ld --sysroot=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking for flex... flex
checking for bison... bison -y
checking for an ANSI C-conforming const... yes
checking for inline... inline
checking for arm-angstrom-linux-gnueabi-pkg-config... no
checking for pkg-config... /opt/poky/1.8.2/sysroots/x86_64-pokysdk-linux/usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for CHECK... yes
checking for dlfcn.h... (cached) yes
checking for pthread_mutex_lock in -lpthread... yes
checking for strerror_l... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating libnl-3.0.pc
config.status: creating libnl-route-3.0.pc
config.status: creating libnl-genl-3.0.pc
config.status: creating libnl-nf-3.0.pc
config.status: creating libnl-cli-3.0.pc
config.status: creating libnl-xfrm-3.0.pc
config.status: creating libnl-idiag-3.0.pc
config.status: creating python/setup.py
config.status: creating include/netlink/version.h
config.status: creating lib/defs.h
config.status: lib/defs.h is unchanged
config.status: executing depfiles commands
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. -------------------------------------------------------------------------------

iwも無事解決。スッキリ。

 command
$ cd ~/iw
$ PKG_CONFIG_PATH=/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/lib/pkgconfig
$ export PKG_CONFIG_PATH
$ make
CC ap.o
CC bitrate.o
bitrate.c: In function 'handle_bitrates':
bitrate.c:95:9: warning: missing initializer for field 'mcs' of 'struct nl80211_txrate_vht' [-Wmissing-field-initializers] struct nl80211_txrate_vht txrate_vht_24 = {};
^
In file included from bitrate.c:3:0:
nl80211.h:4562:8: note: 'mcs' declared here
__u16 mcs[NL80211_VHT_NSS_MAX];
^
bitrate.c:96:9: warning: missing initializer for field 'mcs' of 'struct nl80211_txrate_vht' [-Wmissing-field-initializers] struct nl80211_txrate_vht txrate_vht_5 = {};
^
In file included from bitrate.c:3:0:
nl80211.h:4562:8: note: 'mcs' declared here
__u16 mcs[NL80211_VHT_NSS_MAX];
^
CC bloom.o
CC coalesce.o
CC connect.o
connect.c: In function 'iw_connect':
connect.c:98:9: warning: missing initializer for field 'ts' of 'struct print_event_args' [-Wmissing-field-initializers] struct print_event_args printargs = { };
^
In file included from connect.c:10:0:
iw.h:166:17: note: 'ts' declared here
struct timeval ts; /* internal */
^
CC cqm.o
CC event.o
event.c: In function 'parse_nan_term':
event.c:303:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_NAN_FUNC_SERVICE_ID] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from iw.h:6,
from event.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
event.c:309:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from iw.h:6,
from event.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
event.c:312:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_NAN_FUNC_SERVICE_INFO] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from iw.h:6,
from event.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
event.c: In function 'parse_nan_match':
event.c:574:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_NAN_FUNC_SERVICE_ID] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from iw.h:6,
from event.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
event.c:580:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from iw.h:6,
from event.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
event.c:583:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_NAN_FUNC_SERVICE_INFO] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from iw.h:6,
from event.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
CC ftm.o
CC genl.o
CC hwsim.o
CC ibss.o
CC info.o
CC interface.o
CC iw.o
iw.c: In function 'usage':
iw.c:96:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for (i = 0; i < &__stop___cmd - __start___cmd; i++) \
^
iw.c:207:2: note: in expansion of macro 'for_each_cmd'
for_each_cmd(section, i) {
^
iw.c:96:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for (i = 0; i < &__stop___cmd - __start___cmd; i++) \
^
iw.c:217:3: note: in expansion of macro 'for_each_cmd'
for_each_cmd(cmd, j) {
^
iw.c: At top level:
iw.c:562:15: warning: missing initializer for field 'name' of 'struct cmd' [-Wmissing-field-initializers] static struct cmd sizer1 __attribute__((section("__sizer"))) = {};
^
In file included from iw.c:25:0:
iw.h:69:14: note: 'name' declared here
const char *name;
^
iw.c:563:15: warning: missing initializer for field 'name' of 'struct cmd' [-Wmissing-field-initializers] static struct cmd sizer2 __attribute__((section("__sizer"))) = {};
^
In file included from iw.c:25:0:
iw.h:69:14: note: 'name' declared here
const char *name;
^
CC link.o
link.c: In function 'link_bss_handler':
link.c:31:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_BSS_BSSID] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from link.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
link.c:34:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_BSS_INFORMATION_ELEMENTS] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from link.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
CC measurements.o
measurements.c: In function 'handle_ftm_req':
measurements.c:241:9: warning: missing initializer for field 'ts' of 'struct print_event_args' [-Wmissing-field-initializers] struct print_event_args printargs = { };
^
In file included from measurements.c:4:0:
iw.h:166:17: note: 'ts' declared here
struct timeval ts; /* internal */
^
CC mesh.o
CC mgmt.o
CC mpath.o
CC mpp.o
CC nan.o
CC ocb.o
CC offch.o
CC p2p.o
CC phy.o
CC ps.o
CC reason.o
CC reg.o
CC roc.o
CC scan.o
scan.c: In function 'print_bss_handler':
scan.c:2117:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_BSS_BSSID] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from scan.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
scan.c:2120:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_BSS_INFORMATION_ELEMENTS] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from scan.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
scan.c:2125:3: warning: missing initializer for field 'type' of 'struct nla_policy' [-Wmissing-field-initializers] [NL80211_BSS_BEACON_IES] = { },
^
In file included from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/msg.h:17:0,
from /opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/genl/genl.h:16,
from scan.c:6:
/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/libnl3/netlink/attr.h:62:11: note: 'type' declared here
uint16_t type;
^
CC sections.o
CC sha256.o
CC station.o
CC status.o
CC survey.o
CC util.o
CC vendor.o
CC wowlan.o
wowlan.c: In function 'wowlan_parse_tcp_file':
wowlan.c:110:11: warning: missing initializer for field 'start' of 'struct nl80211_wowlan_tcp_data_seq' [-Wmissing-field-initializers] struct nl80211_wowlan_tcp_data_seq seq = {};
^
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

とりあえずARM向けiwバイナリを生成できた。基板にコピーしてiwを実行したら動いた。次回無線LANを初期化する。

 command
$ ./iw
Usage: ./iw [options] command
Options:
--debug enable netlink debugging
--version show version (5.3-3-g3708f61)
Commands:
dev <devname> ap stop
dev <devname> ap start
phy <phyname> coalesce show
phy <phyname> coalesce disable
phy <phyname> coalesce enable <config-file>
dev <devname> auth <SSID> <bssid> <type:open|shared> <freq in MHz> [key 0:abcde d:1:6162636465] dev <devname> connect [-w] <SSID> [<freq in MHz>] [<bssid>] [key 0:abcde d:1:6162636465] [mfp:req/opt/no] dev <devname> disconnect
dev <devname> cqm rssi <threshold|off> [<hysteresis>] event [-t|-r] [-f] dev <devname> ftm start_responder [lci=<lci buffer in hex>] [civic=<civic buffer in hex>] dev <devname> ftm get_stats
phy <phyname> hwsim wakequeues
phy <phyname> hwsim stopqueues
phy <phyname> hwsim setps <value>
phy <phyname> hwsim getps
dev <devname> ibss join <SSID> <freq in MHz> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>] [basic-rates <rate in Mbps,rate2,...>] [mcast-rate <rate in Mbps>] [key d:0:abcde] dev <devname> ibss leave
features
commands
phy
list
phy <phyname> info
dev <devname> switch channel <channel> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] [beacons <count>] [block-tx] dev <devname> switch freq <freq> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] [beacons <count>] [block-tx] dev <devname> switch freq <control freq> [5|10|20|40|80|80+80|160] [<center1_freq> [<center2_freq>]] [beacons <count>] [block-tx] dev
dev <devname> info
dev <devname> del
dev <devname> interface add <name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*] [addr <mac-addr>] phy <phyname> interface add <name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*] [addr <mac-addr>] help [command] dev <devname> link
dev <devname> measurement ftm_request <config-file> [timeout=<seconds>] [randomise[=<addr>/<mask>]] dev <devname> mesh leave
dev <devname> mesh join <mesh ID> [[freq <freq in MHz> <NOHT|HT20|HT40+|HT40-|80MHz>] [basic-rates <rate in Mbps,rate2,...>]], [mcast-rate <rate in Mbps>] [beacon-interval <time in TUs>] [dtim-period <value>] [vendor_sync on|off] [<param>=<value>]*
dev <devname> mgmt dump frame <type as hex ab> <pattern as hex ab:cd:..> [frame <type> <pattern>]* [count <frames>] dev <devname> mpath dump
dev <devname> mpath set <destination MAC address> next_hop <next hop MAC address>
dev <devname> mpath new <destination MAC address> next_hop <next hop MAC address>
dev <devname> mpath del <MAC address>
dev <devname> mpath get <MAC address>
dev <devname> mpath probe <destination MAC address> frame <frame>
dev <devname> mpp dump
dev <devname> mpp get <MAC address>
wdev <idx> nan add_func type <publish|subscribe|followup> [active] [solicited] [unsolicited] [bcast] [close_range] name <name> [info <info>] [flw_up_id <id> flw_up_req_id <id> flw_up_dest <mac>] [ttl <ttl>] [srf <include|exclude>  <bf|list> [bf_idx] [bf_len] <mac1;mac2...>] [rx_filter <str1:str2...>] [tx_filter <str1:str2...>] wdev <idx> nan rm_func cookie <cookie>
wdev <idx> nan config [pref <pref>] [bands [2GHz] [5GHz]] wdev <idx> nan stop
wdev <idx> nan start pref <pref> [bands [2GHz] [5GHz]] dev <devname> ocb leave
dev <devname> ocb join <freq in MHz> <5MHz|10MHz>
dev <devname> offchannel <freq> <duration>
wdev <idx> p2p stop
wdev <idx> p2p start
dev <devname> cac channel <channel> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] dev <devname> cac freq <freq> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] dev <devname> cac freq <control freq> [5|10|20|40|80|80+80|160] [<center1_freq> [<center2_freq>]] dev <devname> cac trigger channel <channel> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] dev <devname> cac trigger freq <frequency> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] dev <devname> cac trigger freq <frequency> [5|10|20|40|80|80+80|160] [<center1_freq> [<center2_freq>]] phy <phyname> channels
reg reload
phy <phyname> reg get
reg get
reg set <ISO/IEC 3166-1 alpha2>
dev <devname> roc start <freq> <time in ms>
dev <devname> scan [-u] [freq <freq>*] [duration <dur>] [ies <hex as 00:11:..>] [meshid <meshid>] [lowpri,flush,ap-force,duration-mandatory] [randomise[=<addr>/<mask>]] [ssid <ssid>*|passive] dev <devname> scan sched_stop
dev <devname> scan sched_start [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>]] dev <devname> scan abort
dev <devname> scan trigger [freq <freq>*] [duration <dur>] [ies <hex as 00:11:..>] [meshid <meshid>] [lowpri,flush,ap-force,duration-mandatory] [randomise[=<addr>/<mask>]] [ssid <ssid>*|passive] dev <devname> scan dump [-u] dev <devname> set bitrates [legacy-<2.4|5> <legacy rate in Mbps>*] [ht-mcs-<2.4|5> <MCS index>*] [vht-mcs-<2.4|5> <NSS:MCSx,MCSy... | NSS:MCSx-MCSy>*] [sgi-2.4|lgi-2.4] [sgi-5|lgi-5] dev <devname> set mcast_rate <rate in Mbps>
dev <devname> set peer <MAC address>
dev <devname> set noack_map <map>
dev <devname> set 4addr <on|off>
dev <devname> set type <type>
dev <devname> set meshid <meshid>
dev <devname> set monitor <flag>*
dev <devname> set mesh_param <param>=<value> [<param>=<value>]*
phy <phyname> set txq limit <packets> | memory_limit <bytes> | quantum <bytes>
phy <phyname> set antenna <bitmap> | all | <tx bitmap> <rx bitmap>
dev <devname> set txpower <auto|fixed|limit> [<tx power in mBm>] phy <phyname> set txpower <auto|fixed|limit> [<tx power in mBm>] phy <phyname> set distance <auto|distance>
phy <phyname> set coverage <coverage class>
phy <phyname> set netns { <pid> | name <nsname> }
phy <phyname> set retry [short <limit>] [long <limit>] phy <phyname> set rts <rts threshold|off>
phy <phyname> set frag <fragmentation threshold|off>
dev <devname> set channel <channel> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] phy <phyname> set channel <channel> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] dev <devname> set freq <freq> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] dev <devname> set freq <control freq> [5|10|20|40|80|80+80|160] [<center1_freq> [<center2_freq>]] phy <phyname> set freq <freq> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] phy <phyname> set freq <control freq> [5|10|20|40|80|80+80|160] [<center1_freq> [<center2_freq>]] phy <phyname> set name <new name>
dev <devname> set power_save <on|off>
dev <devname> get mesh_param [<param>] phy <phyname> get txq
dev <devname> get power_save <param>
dev <devname> station dump [-v] dev <devname> station set <MAC address> txpwr <auto|limit> [<tx power dBm>] dev <devname> station set <MAC address> airtime_weight <weight>
dev <devname> station set <MAC address> mesh_power_mode <active|light|deep>
dev <devname> station set <MAC address> vlan <ifindex>
dev <devname> station set <MAC address> plink_action <open|block>
dev <devname> station del <MAC address> [subtype <subtype>] [reason-code <code>] dev <devname> station get <MAC address>
dev <devname> survey dump
dev <devname> vendor recvbin <oui> <subcmd> <filename|-|hex data>
dev <devname> vendor recv <oui> <subcmd> <filename|-|hex data>
dev <devname> vendor send <oui> <subcmd> <filename|-|hex data>
phy <phyname> wowlan show
phy <phyname> wowlan disable
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.

参考情報

configureのbuild、host、targetの違いを読んだ。まず、この方は--build、--host、--targetの定義をこうしている。--hostとはmakeして作ったプログラムの実行環境とある。

--build コンパイルPC
--host makeして作ったプログラムの実行環境
--target クロス開発におけるターゲット環境

iwを使った無線LAN管理

Linuxの無線LANについて書いてあるワイヤレス設定を読みながら進めてみる。

①ドライバーの状態について確認する
PCIブリッジとN-6300のドライバがPCIデバイスとして認識されている。

 command
# lspci -k
00:00.0 PCI bridge: Synopsys, Inc. Device abcd (rev 01)
Kernel driver in use: pcieport
01:00.0 Network controller: Intel Corporation Centrino Ultimate-N 6300 (rev 35)
Subsystem: Intel Corporation Centrino Ultimate-N 6300 3x3 AGN
Kernel driver in use: iwlwifi
Kernel modules: iwlwifi

②ip linkと打ち込み無線LANインタフェース(例えばwlan0)が生成されているか見る
wlan0が出来ている。

 command
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: can0: <NOARP40000> mtu 16 qdisc noop qlen 10
link/[280] 3: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether xx:xx:xx:xx:xx:xxbrd ff:ff:ff:ff:ff:ff
4: sit0@NONE: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
5: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

③念のためFirmwareがロードされているか確認する
iwlwifi(ver 9.221.4.1 build 25532 )が動作モード(op_mode)iwldvmで起動している。

 command
# dmesg | grep firmware
imx-sdma 20ec000.sdma: loaded firmware 3.1
usbserial: USB Serial support registered for Keyspan - (without firmware)
egalax_ts 2-0004: Failed to read firmware version
ili210x_i2c 2-0041: Failed to get firmware version, err: -5
iwlwifi 0000:01:00.0: loaded firmware version 9.221.4.1 build 25532 op_mode iwldvm

さらにiwlwifiの情報を得るにはこんな感じ。

 command
# dmesg | grep iwlwifi
iwlwifi 0000:01:00.0: loaded firmware version 9.221.4.1 build 25532 op_mode iwldvm
iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEBUG disabled
iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEBUGFS disabled
iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEVICE_TRACING disabled
iwlwifi 0000:01:00.0: Detected Intel(R) Centrino(R) Ultimate-N 6300 AGN, REV=0x74
iwlwifi 0000:01:00.0: L1 Disabled - LTR Disabled

さて、危うくスルーするとこだったが動作モードのiwldvmとは何だろう。iwldvmでGoogle検索したらiwlwifiがヒットした。iwlwifi(Intelの無線LANドライバ)について詳しく解説されている。

で、iwldvmだが、どうもIntelの無線LANファームはIntel Wireless WiFi DVM Firmware supportIntel Wireless WiFi MVM Firmware supportという2つの種類があるみたい。Linux WirelessのIntel無線LANファームウェアのリストを見るとチップ型番によりDVM、MVMが決まってる様子。で、DVMが何なのかはよく分からなかった。

いよいよ無線LANとしての動作を確認する。

N-6300を無線LAN子機(STA)として動作させてみる

さらにワイヤレス設定を読み進める。ヒントにもある通りまずは手動で接続を試行すべきとのこと。自宅の無線LAN親機(AP)はWPAなのでiwとwpa_supplicantが必要みたい。

①無線LANインタフェースの名前を調べる
すでにip linkでも確認していたが、iwで改めて確認。wlan0として認識されている。

 command
# ./iw dev
phy#0
Interface wlan0
ifindex 5
wdev 0x1
addr 3c:a9:f4:8b:fe:d0
type managed

②リンクの状態を確認する
未接続だ。

 command
# ./iw dev wlan0 link
Not connected.

③インタフェース有効化(通常は不要らしいが…)
なんかエラー出た。

 command
# ip link set wlan0 up
ip: SIOCSIFFLAGS: Operation not possible due to RF-kill

どうも典型的な現象らしい。

#Rfkillによるブロックを読み、rfkill listを実行。Soft blocked: yes、Hard blocked: noなので物理的にOFFされているわけではなく、ソフト(カーネル)でブロックされているだけみたい。

 command
# rfkill list
0: phy0: wlan
Soft blocked: yes
Hard blocked: no

ソフトブロックを解除するには、こうするらしい。

 command
# rfkill unblock wifi

再びrfkill listを実行したところ、ソフトブロックが解除されていた。

 command
# rfkill list
0: phy0: wlan
Soft blocked: no
Hard blocked: no

④再びインタフェース有効化
ワオワオ。今度は動いた。

 command
# ip link set wlan0 up
iwlwifi 0000:01:00.0: L1 Disabled - LTR Disabled
iwlwifi 0000:01:00.0: Radio type=0x0-0x3-0x1
iwlwifi 0000:01:00.0: L1 Disabled - LTR Disabled
iwlwifi 0000:01:00.0: Radio type=0x0-0x3-0x1
IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready

④インタフェースが立ち上がってるか確認
UPされている。

 command
# ip link show wlan0
5: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

⑤無線LAN親機(AP)をスキャンする
APが見つかった。(MACアドレスとかSSIDは一部マスクした)

 command
./iw dev wlan0 scan
SS xx:xx:xx:xx:xx:xx(on wlan0)
TSF: 6365888411648 usec (73d, 16:18:08)
freq: 5200
beacon interval: 100 TUs
capability: ESS Privacy SpectrumMgmt (0x0111)
signal: -60.00 dBm
last seen: 0 ms ago
Information elements from Probe Response frame:
SSID: W04_xxxxxxxxxxxx_5G
Supported rates: 6.0* 9.0 12.0* 18.0 24.0* 36.0 48.0 54.0
DS Parameter set: channel 40
HT capabilities:
Capabilities: 0x6e
HT20/HT40
SM Power Save disabled
RX HT20 SGI
RX HT40 SGI
No RX STBC
Max AMSDU length: 3839 bytes
No DSSS/CCK HT40
Maximum RX AMPDU length 32767 bytes (exponent: 0x002)
Minimum RX AMPDU time spacing: 4 usec (0x05)
HT RX MCS rate indexes supported: 0-7, 32
HT TX MCS rate indexes are undefined
HT operation:
* primary channel: 40
* secondary channel offset: below
* STA channel width: any
* RIFS: 0
* HT protection: no
* non-GF present: 1
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
WPA: * Version: 1
* Group cipher: TKIP
* Pairwise ciphers: TKIP CCMP
* Authentication suites: PSK
RSN: * Version: 1
* Group cipher: TKIP
* Pairwise ciphers: TKIP CCMP
* Authentication suites: PSK
* Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)
WMM: * Parameter version 1
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
BSS Load:
* station count: 1
* channel utilisation: 3/255
* available admission capacity: 31250 [*32us] VHT capabilities:
VHT Capabilities (0x31c00020):
Max MPDU length: 3895
Supported Channel Width: neither 160 nor 80+80
short GI (80 MHz)
+HTC-VHT
RX antenna pattern consistency
TX antenna pattern consistency
VHT RX MCS set:
1 streams: MCS 0-9
2 streams: not supported
3 streams: not supported
4 streams: not supported
5 streams: not supported
6 streams: not supported
7 streams: not supported
8 streams: not supported
VHT RX highest supported: 292 Mbps
VHT TX MCS set:
1 streams: MCS 0-9
2 streams: not supported
3 streams: not supported
4 streams: not supported
5 streams: not supported
6 streams: not supported
7 streams: not supported
8 streams: not supported
VHT TX highest supported: 292 Mbps
VHT operation:
* channel width: 1 (80 MHz)
* center freq segment 1: 42
* center freq segment 2: 0
* VHT basic MCS set: 0xfffe

⑥無線LAN(親機)に繋ぐためのwpa_supplicant設定

iwを使ってWPAの無線LAN(親機)に繋ぐには、wpa_supplicantを使う必要がある。wpa_supplicantの設定ファイルを開いたところ、最初はなにも設定されていない。

 command
# vi /etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1 network={
key_mgmt=NONE
}

Linuxでwpa_supplicantを使ってWPA2の無線LANに接続する方法を読み、自宅の無線LAN(親機)のSSIDとパスフレーズ(psk)を指定。

 command
# vi /etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
ssid="W04_xxxxxxxxxxxx_5G"
key_mgmt=WPA-PSK
proto=WPA WPA2
pairwise=CCMP TKIP
group=CCMP TKIP WEP104 WEP40
psk="xxxxxxxxxxxx"
}

⑦wpa_supplicantを起動
成功したみたい。

 command
# wpa_supplicant -D nl80211,wext -i wlan0 -c /etc/wpa_supplicant.conf
Successfully initialized wpa_supplicant
wlan0: SME: Trying to authenticatwlan0: authenticate with xx:xx:xx:xx:xx:xx
e with xx:xx:xx:xx:xx:xx (SSID='W04_xxxxxxxxxxxx_5G' freq=5200 MHz)
wlan0: send auth to xx:xx:xx:xx:xx:xx (try 1/3)
wlan0: authenticated
wlan0: Trying to associate with xx:xx:xx:xx:xxxxfe (SSID='W04_xxxxxxxxxxxx_5G' freq=5200 MHz)
wlan0: associate with xx:xx:xx:xx:xx:xx(try 1/3)
wlan0: RX AssocResp from xx:xx:xx:xx:xx:xx(capab=0x111 status=0 aid=1)
IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
wlan0: associated
wlan0: Associated with xx:xx:xx:xx:xx:xx
wlan0: WPA: Key negotiation completed with xx:xx:xx:xx:xx:xx[PTK=CCMP GTK=TKIP] wlan0: CTRL-EVENT-CONNECTED - Connection to xx:xx:xx:xx:xx:xxcompleted [id=0 id_str=]

Ctrl+Cで抜けたら、リンクが切れた。

 command
wlan0: deauthenticating from xx:xx:xx:xx:xx:xx by local choice (reason=3)
cfg80211: Calling CRDA to update world regulatory domain
wlan0: CTRL-EVENT-DISCONNECTED bssid=xx:xx:xx:xx:xx:xxreason=3 locally_generated=1
wlan0: CTRL-EVENT-TERMINATING

&を付けてバックグラウンド起動しなければ。

 command
# wpa_supplicant -D nl80211,wext -i wlan0 -c /etc/wpa_supplicant.conf &
(省略)

⑧再びリンク状態を取得
繋がった。

 command
# ./iw dev wlan0 link
Connected to ac:84:c6:cc:31:fe (on wlan0)
SSID: W04_xxxxxxxxxxxx_5G
freq: 5200
RX: 45180 bytes (367 packets)
TX: 533 bytes (5 packets)
signal: -61 dBm
rx bitrate: 24.0 MBit/s
tx bitrate: 6.0 MBit/s bss flags: short-slot-time
dtim period: 0
beacon int: 100

 

⑨IPアドレスを振る
自宅の無線LAN親機(AP)はDHCPサーバだが、組込Linuxボードにdhcpが入ってないので静的IPを設定した。うちのセグメントは192.168.100.xなのでこんな感じ。

 command
# ip addr add 192.168.100.222/24 dev wlan0
# ip route add default via 192.168.100.1

⑩IPアドレスを確認する
IPアドレスは無事振れた様子。

 command
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: can0: <NOARP40000> mtu 16 qdisc noop qlen 10
link/[280] 3: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether xx:xx:xx:xx:xx:xxbrd ff:ff:ff:ff:ff:ff
4: sit0@NONE: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
5: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.100.222/24 scope global wlan0
valid_lft forever preferred_lft forever
inet6 xxxx:xxx:xxxx:xxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic
valid_lft 7004sec preferred_lft 3404sec
inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link
valid_lft forever preferred_lft forever

⑪無線LAN親機(AP)にPINGを打ってみる
無線LAN親機(AP)のIPアドレス(192.168.100.1)に対してPINGが通った。

 command
# ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1): 56 data bytes
64 bytes from 192.168.100.1: seq=0 ttl=64 time=17.649 ms
64 bytes from 192.168.100.1: seq=1 ttl=64 time=37.288 ms
64 bytes from 192.168.100.1: seq=2 ttl=64 time=10.136 ms
64 bytes from 192.168.100.1: seq=3 ttl=64 time=29.372 ms
(以下略)

⑫無線LAN親機(AP)から切断
リンク断した。

 command
# ip link set wlan0 down
wlan0: deauthenticating from xx:xx:xx:xx:xx:xx by local choice (reason=3)
wlan0: CTRL-EVENT-DISCONNECTED bssid=xx:xx:xx:xx:xx:xx reason=3 locally_generated=1
cfg80211: Calling CRDA to update world regulatory domain

wpa_supplicantのプロセスIDを調べて。

 command
♯ ps | grep wpa_supplicant
806 root 6364 S wpa_supplicant -D nl80211,wext -i wlan0 -c /etc/wpa_
822 root 2660 S grep wpa_supplicant

killした。

 command
# kill -9 806

次回はN-6300を無線LAN親機(AP)にしてみよう。

N-6300を無線LAN親機(AP)として動作させてみる

hostapd を用いた無線 LAN アクセスポイントの構築を読んだ。hostapdというソフトウェア無線LAN親機(AP)が必要になるみたい。BD-SABRE-LITEでhostapdと打ち込んでみたが、インストールされてなかったのでソースからビルドしてみる。

 command
# hostapd
-sh: hostapd: not found

①wgetでダウンロード
まずはQiitaの記事と同じようにhostapd(ver.2.6)のソースをダウンロード。

 command
$ wget https://w1.fi/releases/hostapd-2.6.tar.gz
--2019-10-05 01:32:38-- https://w1.fi/releases/hostapd-2.6.tar.gz
w1.fi (w1.fi) をDNSに問いあわせています... 212.71.239.96
w1.fi (w1.fi)|212.71.239.96|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1822341 (1.7M) [application/x-gzip] hostapd-2.6.tar.gz' に保存中 100%[==========================================================>] 1,822,341 365KB/s 時間 5.4s 2019-10-05 01:32:45 (332 KB/s) - hostapd-2.6.tar.gz' へ保存完了 [1822341/1822341]

 

②hostapd(tar.gz)を解凍
解凍した。

 command
$ tar xvf hostapd-2.6.tar.gz
hostapd-2.6/
hostapd-2.6/CONTRIBUTIONS
(以下略)

③hostapdのフォルダに入り、コンフィグファイルをコピー
こんな作法みたいだ。

 command
$ cd hostapd-2.6/hostapd/
$ cp defconfig .config

④クロスコンパイラの環境変数を設定
例によってこれを打つ。

 command
$ . /opt/poky/1.8.2/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi

⑤まずmakeしてみる(失敗覚悟)
エラー発生。Qiitaをもう1度読んでみる。HOSTAPをコメントアウトしてLIBNL3を有効化してるみたい。うちもLIBNL3なので真似してみる。

 command
$ make
CC main.c
CC config_file.c
CC ../src/ap/hostapd.c
CC ../src/ap/wpa_auth_glue.c
CC ../src/ap/drv_callbacks.c
CC ../src/ap/ap_drv_ops.c
CC ../src/ap/utils.c
CC ../src/ap/authsrv.c
CC ../src/ap/ieee802_1x.c
CC ../src/ap/ap_config.c
CC ../src/ap/eap_user_db.c
CC ../src/ap/ieee802_11_auth.c
CC ../src/ap/sta_info.c
CC ../src/ap/wpa_auth.c
CC ../src/ap/tkip_countermeasures.c
CC ../src/ap/ap_mlme.c
CC ../src/ap/wpa_auth_ie.c
CC ../src/ap/preauth_auth.c
CC ../src/ap/pmksa_cache_auth.c
CC ../src/ap/ieee802_11_shared.c
CC ../src/ap/beacon.c
CC ../src/ap/bss_load.c
CC ../src/ap/neighbor_db.c
CC ../src/ap/rrm.c
CC ../src/drivers/drivers.c
CC ../src/utils/eloop.c
CC ../src/utils/common.c
CC ../src/utils/wpa_debug.c
CC ../src/utils/wpabuf.c
CC ../src/utils/os_unix.c
CC ../src/utils/ip_addr.c
CC ../src/common/ieee802_11_common.c
CC ../src/common/wpa_common.c
CC ../src/common/hw_features_common.c
CC ../src/eapol_auth/eapol_auth_sm.c
CC ../src/eapol_auth/eapol_auth_dump.c
CC ../src/radius/radius.c
CC ../src/radius/radius_client.c
CC ../src/radius/radius_das.c
CC ../src/ap/accounting.c
CC ../src/ap/vlan_init.c
CC ../src/ap/vlan_ifconfig.c
CC ../src/ap/vlan.c
CC ../src/common/ctrl_iface_common.c
CC ctrl_iface.c
CC ../src/ap/ctrl_iface_ap.c
CC ../src/ap/iapp.c
CC ../src/ap/peerkey_auth.c
CC ../src/drivers/driver_hostap.c
../src/drivers/driver_nl80211.c:17:31: fatal error: netlink/genl/genl.h: No such file or directory
#include <netlink/genl/genl.h>
^
compilation terminated.
make: *** [../src/drivers/driver_nl80211.o] エラー 1

⑥confgファイルの変更
こんな感じ。

 command
$ diff -u defconfig .config
--- defconfig 2016-10-03 03:51:11.000000000 +0900
+++ .config 2019-10-05 01:49:38.935154260 +0900
@@ -10,7 +10,7 @@
# to override previous values of the variables. # Driver interface for Host AP driver
-CONFIG_DRIVER_HOSTAP=y
+#CONFIG_DRIVER_HOSTAP=y # Driver interface for wired authenticator
#CONFIG_DRIVER_WIRED=y
@@ -31,7 +31,7 @@
#CONFIG_LIBNL20=y # Use libnl 3.2 libraries (if this is selected, CONFIG_LIBNL20 is ignored)
-#CONFIG_LIBNL32=y
+CONFIG_LIBNL32=y

 

⑦再びmake
エラー発生。そろそろ真剣に考えてみよう。エラーは../src/drivers/drivers.o:(.rodata+0x4): undefined reference to wpa_driver_hostap_ops' collect2: error: ld returned 1 exit statusである。wpa_driver_hostap_opsが未定義と言ってるね。

 command
$ make
CC ../src/drivers/driver_nl80211.c
CC ../src/drivers/driver_nl80211_capa.c
CC ../src/drivers/driver_nl80211_event.c
CC ../src/drivers/driver_nl80211_monitor.c
CC ../src/drivers/driver_nl80211_scan.c
CC ../src/drivers/netlink.c
CC ../src/drivers/linux_ioctl.c
CC ../src/drivers/rfkill.c
CC ../src/utils/radiotap.c
CC ../src/l2_packet/l2_packet_linux.c
CC ../src/eap_server/eap_server_md5.c
CC ../src/eap_server/eap_server_tls.c
CC ../src/eap_server/eap_server_peap.c
CC ../src/eap_common/eap_peap_common.c
CC ../src/eap_server/eap_server_ttls.c
CC ../src/eap_server/eap_server_mschapv2.c
CC ../src/eap_server/eap_server_gtc.c
CC eap_register.c
CC ../src/eap_server/eap_server.c
CC ../src/eap_common/eap_common.c
CC ../src/eap_server/eap_server_methods.c
CC ../src/eap_server/eap_server_identity.c
CC ../src/crypto/ms_funcs.c
CC ../src/eap_common/chap.c
CC ../src/eap_server/eap_server_tls_common.c
CC ../src/crypto/tls_openssl.c
CC ../src/crypto/tls_openssl_ocsp.c
CC ../src/crypto/crypto_openssl.c
CC ../src/crypto/aes-omac1.c
CC ../src/crypto/sha1-prf.c
CC ../src/crypto/sha1-tlsprf.c
CC ../src/crypto/sha256-prf.c
CC ../src/crypto/sha256-tlsprf.c
CC ../src/crypto/sha256-kdf.c
CC ../src/crypto/random.c
CC ../src/ap/wmm.c
CC ../src/ap/ap_list.c
CC ../src/ap/ieee802_11.c
CC ../src/ap/hw_features.c
CC ../src/ap/dfs.c
CC ../src/drivers/driver_common.c
../src/drivers/drivers.o:(.rodata+0x4): undefined reference to
wpa_driver_hostap_ops'
collect2: error: ld returned 1 exit status
make: *** [hostapd] エラー 1

⑧configを再び編集
どうもHOSTAPを無効化してはならない気がする。CONFIG_DRIVER_HOSTAP=yをコメントアウトしたが、再び有効化した(♯を取った)。再びdiffを取るとこんな感じ。

 command
$ diff -u defconfig .config
--- defconfig 2016-10-03 03:51:11.000000000 +0900
+++ .config 2019-10-05 01:55:16.843157903 +0900
@@ -31,7 +31,7 @@
#CONFIG_LIBNL20=y # Use libnl 3.2 libraries (if this is selected, CONFIG_LIBNL20 is ignored)
-#CONFIG_LIBNL32=y
+CONFIG_LIBNL32=y # Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)

 

⑨またmakeした
今度はパス。hostapdとhostapd_cliが出来た。

 command
$ make
LD hostapd
CC hostapd_cli.c
CC ../src/common/wpa_ctrl.c
CC ../src/common/cli.c
CC ../src/utils/edit_simple.c
LD hostapd_cli

⑩実機にhostapdとhostapd_cliをコピー
動いた。

 command
# ./hostapd
hostapd v2.6
User space daemon for IEEE 802.11 AP management,
IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
Copyright (c) 2002-2016, Jouni Malinen <j@w1.fi> and contributors usage: hostapd [-hdBKtv] [-P <PID file>] [-e <entropy file>] \
[-g <global ctrl_iface>] [-G <group>]\
[-i <comma-separated list of interface names>]\
<configuration file(s)> options:
-h show this usage
-d show more debug messages (-dd for even more)
-B run daemon in the background
-e entropy file
-g global control interface path
-G group for control interfaces
-P PID file
-K include key data in debug messages
-i list of interface names to use
-S start all the interfaces synchronously
-t include timestamps in some debug messages
-v show hostapd version

 

⑪hostapd.confを作る
Qiitaを参考に書いてみた。重要なのはSSIDとパスフレーズ。

ctrl_interface=~/hostapd
interface=wlan0
driver=nl80211
ssid=pavement1234
country_code=JP
hw_mode=g
channel=1
wpa=1
wpa_passphrase=123456780
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

⑫hostapdを起動してみる
とりあえずやってみる主義の私。案の定失敗。wlan0がUPされてないみたい。

 command
# ./hostapd hostapd.conf
Configuration file: hostapd.conf
Could not set interface wlan0 flags (UP): Operation not possible due to RF-kill
nl80211: Could not configure driver mode
nl80211: deinit ifname=wlan0 disabled_11b_rates=0
nl80211 driver initialization failed.
wlan0: interface state UNINITIALIZED->DISABLED
wlan0: AP-DISABLED
hostapd_free_hapd_data: Interface wlan0 wasn't started

⑬作法に沿ってwlan0を有効化
いい感じ。

 command
# rfkill unblock wifi
# ip link set wlan0 up
iwlwifi 0000:01:00.0: L1 Disabled - LTR Disabled
iwlwifi 0000:01:00.0: Radio type=0x0-0x3-0x1
iwlwifi 0000:01:00.0: L1 Disabled - LTR Disabled
iwlwifi 0000:01:00.0: Radio type=0x0-0x3-0x1
IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready

⑭再びhostapdを起動
なんかnl80211でエラー出てる。

 command
# ./hostapd hostapd.conf
Configuration file: hostapd.conf
iwlwifi 0000:01:00.0: L1 Disabled - LTR Disabled
iwlwifi 0000:01:00.0: Radio type=0x0-0x3-0x1
IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
nl80211: Could not configure driver mode
nl80211: deinit ifname=wlan0 disabled_11b_rates=0
nl80211 driver initialization failed.
wlan0: interface state UNINITIALIZED->DISABLED
wlan0: AP-DISABLED
hostapd_free_hapd_data: Interface wlan0 wasn't started

hostapdが起動しない時の確認事項を読むとこんなことが書いてある。

理由:APとして使用したいインターフェースが設定と合っていない可能性が高いです。
確認するべき場所:

/etc/network/interfaces
/etc/default/isc-dhcp-server
hostapd.confファイル(自分で設定した場合はそのファイル)

⑮原因を探る
hostapd.conf 覚書を読んでみた。リファレンスとして良さげだが今私が欲しいのはhostpad.confのサンプルである。RaspberryPiで無線LANアクセスポイント – Greenleafを読んだ。サンプルみっけ。

interface=wlan0
driver=nl80211
ssid=Pi3-AP
hw_mode=g
channel=6
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40] macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=r@spberry
rsn_pairwise=CCMP

サンプルの一部を変えた。hostapd.conf2と名付けた。

interface=wlan0
driver=nl80211
ssid=pavement1234
hw_mode=g
channel=6
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40] macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=123456789
rsn_pairwise=CCMP

エラー出た。ieee80211nとht_capabを取り急ぎ削除。

 command
# ./hostapd hostapd.conf2
Configuration file: hostapd.conf2
Line 6: unknown configuration item 'ieee80211n'
Line 8: unknown configuration item 'ht_capab'
2 errors found in configuration file 'hostapd.conf2'
Failed to set up interface with hostapd.conf2
Failed to initialize interface

再びhostapd起動を試みる。エラー発生。

 command
# ./hostapd hostapd.conf2
Configuration file: hostapd.conf2
iwlwifi 0000:01:00.0: L1 Disabled - LTR Disabled
iwlwifi 0000:01:00.0: Radio type=0x0-0x3-0x1
IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
nl80211: Could not configure driver mode
nl80211: deinit ifname=wlan0 disabled_11b_rates=0
nl80211 driver initialization failed.
wlan0: interface state UNINITIALIZED->DISABLED
wlan0: AP-DISABLED
hostapd_free_hapd_data: Interface wlan0 wasn't started

うーん…。
そもそもN-6300ってAPモード対応してるのか?
カーネルコンフィギュレーションのPrism AP、有効にしないとダメ?

仕切り直ししよう。

まず①。Intel N6300 wireless card doesn't support AP modeを読んだ。Wi-FiデバイスがAPモードをサポートしているかが重要みたい。次にソフトウェアアクセスポイント - ArchWikiを読んだ。iw listと打ち込むとAPモードに対応しているかわかるみたい。

iw listと打ってみたところ、APモードは対応してなかった...。というわけで、一旦仕切りなおし。先日購入した無線LANチップたちを試してみることにします。

 

Intel N-6300を組み込みボードに接続して動かせた

Intel N-6300を組み込みボードに接続して動かしてみました。

N-6300はSTAモードしか対応していなかったので、APモードに対応しているモジュールを試してみます。

 command
# ./iw list
Wiphy phy0
max # scan SSIDs: 20
max scan IEs length: 95 bytes
max # sched scan SSIDs: 0
max # match sets: 0
Retry short limit: 7
Retry long limit: 4
Coverage class: 0 (up to 0m)
Device supports RSN-IBSS.
Supported Ciphers:
* WEP40 (00-0f-ac:1)
* WEP104 (00-0f-ac:5)
* TKIP (00-0f-ac:2)
* CCMP-128 (00-0f-ac:4)
Available Antennas: TX 0 RX 0
 Supported interface modes:
  * IBSS
  * managed
  * monitor
Band 1:
Capabilities: 0x1072
HT20/HT40
Static SM Power Save
RX Greenfield
RX HT20 SGI
RX HT40 SGI
No RX STBC
Max AMSDU length: 3839 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 4 usec (0x05)
HT Max RX data rate: 450 Mbps
HT TX/RX MCS rate indexes supported: 0-23, 32
Bitrates (non-HT):
* 1.0 Mbps
* 2.0 Mbps (short preamble supported)
* 5.5 Mbps (short preamble supported)
* 11.0 Mbps (short preamble supported)
* 6.0 Mbps
* 9.0 Mbps
* 12.0 Mbps
* 18.0 Mbps
* 24.0 Mbps
* 36.0 Mbps
* 48.0 Mbps
* 54.0 Mbps
Frequencies:
* 2412 MHz [1] (15.0 dBm)
* 2417 MHz [2] (15.0 dBm)
* 2422 MHz [3] (15.0 dBm)
* 2427 MHz [4] (15.0 dBm)
* 2432 MHz [5] (15.0 dBm)
* 2437 MHz [6] (15.0 dBm)
* 2442 MHz [7] (15.0 dBm)
* 2447 MHz [8] (15.0 dBm)
* 2452 MHz [9] (15.0 dBm)
* 2457 MHz [10] (15.0 dBm)
* 2462 MHz [11] (15.0 dBm)
* 2467 MHz [12] (15.0 dBm) (no IR)
* 2472 MHz [13] (15.0 dBm) (no IR)
Band 2:
Capabilities: 0x1072
HT20/HT40
Static SM Power Save
RX Greenfield
RX HT20 SGI
RX HT40 SGI
No RX STBC
Max AMSDU length: 3839 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 4 usec (0x05)
HT Max RX data rate: 450 Mbps
HT TX/RX MCS rate indexes supported: 0-23, 32
Bitrates (non-HT):
* 6.0 Mbps
* 9.0 Mbps
* 12.0 Mbps
* 18.0 Mbps
* 24.0 Mbps
* 36.0 Mbps
* 48.0 Mbps
* 54.0 Mbps
Frequencies:
* 5180 MHz [36] (15.0 dBm) (no IR)
* 5200 MHz [40] (15.0 dBm) (no IR)
* 5220 MHz [44] (15.0 dBm) (no IR)
* 5240 MHz [48] (15.0 dBm) (no IR)
* 5260 MHz [52] (15.0 dBm) (no IR, radar detection)
* 5280 MHz [56] (15.0 dBm) (no IR, radar detection)
* 5300 MHz [60] (15.0 dBm) (no IR, radar detection)
* 5320 MHz [64] (15.0 dBm) (no IR, radar detection)
* 5500 MHz [100] (15.0 dBm) (no IR, radar detection)
* 5520 MHz [104] (15.0 dBm) (no IR, radar detection)
* 5540 MHz [108] (15.0 dBm) (no IR, radar detection)
* 5560 MHz [112] (15.0 dBm) (no IR, radar detection)
* 5580 MHz [116] (15.0 dBm) (no IR, radar detection)
* 5600 MHz [120] (15.0 dBm) (no IR, radar detection)
* 5620 MHz [124] (15.0 dBm) (no IR, radar detection)
* 5640 MHz [128] (15.0 dBm) (no IR, radar detection)
* 5660 MHz [132] (15.0 dBm) (no IR, radar detection)
* 5680 MHz [136] (15.0 dBm) (no IR, radar detection)
* 5700 MHz [140] (15.0 dBm) (no IR, radar detection)
* 5745 MHz [149] (15.0 dBm) (no IR)
* 5765 MHz [153] (15.0 dBm) (no IR)
* 5785 MHz [157] (15.0 dBm) (no IR)
* 5805 MHz [161] (15.0 dBm) (no IR)
* 5825 MHz [165] (15.0 dBm) (no IR)
Supported commands:
* new_interface
* set_interface
* new_key
* start_ap
* new_station
* set_bss
* authenticate
* associate
* deauthenticate
* disassociate
* join_ibss
* set_tx_bitrate_mask
* frame
* frame_wait_cancel
* set_wiphy_netns
* set_channel
* set_wds_peer
* probe_client
* set_noack_map
* register_beacons
* start_p2p_device
* set_mcast_rate
* set_qos_map
* connect
* disconnect
Supported TX frame types:
* IBSS: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* managed: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* AP: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* AP/VLAN: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* mesh point: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* P2P-client: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* P2P-GO: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* P2P-device: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
Supported RX frame types:
* IBSS: 0x40 0xb0 0xc0 0xd0
* managed: 0x40 0xd0
* AP: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0
* AP/VLAN: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0
* mesh point: 0xb0 0xc0 0xd0
* P2P-client: 0x40 0xd0
* P2P-GO: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0
* P2P-device: 0x40 0xd0
software interface modes (can always be added):
* monitor
interface combinations are not supported
HT Capability overrides:
* MCS: ff ff ff ff ff ff ff ff ff ff
* maximum A-MSDU length
* supported channel width
* short GI for 40 MHz
* max A-MPDU length exponent
* min MPDU start spacing
Device supports TX status socket option.
Device supports HT-IBSS.
Device supports SAE with AUTHENTICATE command
Device supports scan flush.
Device supports per-vif TX power setting
Driver supports a userspace MPM

SWインタフェースとは?

インターフェースとは?を読んでみた。要はAPIのこと。

ソフトウェアインターフェースは、プログラム間でデータや指示をやり取りする手順や形式を定めたもの。代表的なものとして、OSやミドルウェア、ライブラリなどの機能を外部から呼び出して利用するため規約であるAPI(Application Programming Interface)がある。

他にもABI(Application Binary Interface)やプロセス間通信の仕様なども含まれ、さらに広義にはネットワークを介してソフトウェア間で連携するための通信プロトコルや、複数のソフトウェアで共通して利用される汎用的なファイル形式などを指すこともある。

 

無線LANドライバのSWインタフェースとは?

超ざっくり書くとこんな感じ。今回は④を整理してみる。

アプリ・ミドルウェア層
①アプリケーション
②サプリカント
カーネル層
③TCPスタック
④ネットワークミドルウェア(net_device/libnl)
⑤無線LANドライバ
⑥バスドライバ
⑦ホストCPUドライバ

④ネットワークミドルウェア(net_device/libnl)

2007年頃、カーネル2.6で動作する無線LANドライバはnet_deviceが一般的だった。(以下の図はこのページから参照)

今回試しているIntelのN-6300もそうだが、最近はlibnlが一般的な気がする。

Linuxにおける無線LANのソフト構成を見ると、よりわかりやすい。

wpa_supplicant:STA(ステーション)として動作。802.1X/WPA認証、接続処理を担当
hostapd:SoftAP(アクセスポイント)として動作
iw:ドライバの設定、状態取得を実施
libnl:ユーザー空間とカーネル空間のI/F
cfg80211:チャンネル等の設定を担当
mac80211:スキャン、接続等のコア処理を担当
WLANドライバ:バスドライバ(SDIO、PCIe等)を制御
バスドライバ:SDIO、PCIe等のI/Fを通じてデバイスを制御

ユーザー空間では、wpa_suppliant、hostapd、iwが動作し、カーネル空間ではcfg80211、mac80211、ドライバが動作します。libnlはwpa_supplicant等のユーザー空間で動作するソフトとcfg80211とのインターフェースです。ソケットを通じてユーザー空間?カーネル空間との間でメッセージのやり取りをします。

使用するデバイスによっては、mac80211を使わないこともありますし、wpa_supplicantが直接ドライバにioctlを発行して(libnlを使わずに)制御することもあります。

これらの情報を総合的に扱っているのはLinux Wirelessだと思う。このサイトの記事で私が一番よく見るのがCRDA(Central Regulatory Domain Agent)である。CRDAはregdbと呼ばれる国(カントリーコード)毎の無線の法規制情報(利用可能チャネル、電波強度など)を管理するデータベース管理エージェントだ。これらのコンポーネント構成を理解するのにこのサイトにあった以下の図がわかりやすかった。

今回、④ネットワークミドルウェア(net_device/libnl)についてまとめた。②サプリカント、③TCPスタック、⑤無線LANドライバ、⑥バスドライバ、⑦ホストドライバなどもどこかで深堀したい。

関連記事

【無線LAN】組み込みボードで無線LANを動かしてみた(Intel N6300編)

【無線LAN】組み込みボードで無線LANを動かしてみた(QCA9377失敗編)

【無線LAN】パソコンの無線LANアダプタをアクセスポイント(SoftAP)にする方法

【自宅でNFC】非接触ICカードリーダーPaSoRiを試してみた

【モバイル通信】自宅のインターネット環境をポケットWi-Fiにしよう(お薦めの理由3つ)

  • この記事を書いた人
  • 最新記事

ペイヴメント

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

-Linux, ネットワーク

Copyright© ペイヴメントのエンジニア塾 , 2020 All Rights Reserved.