Raspberry Piを5GHz対応の無線LAN APにする

# [前回](https://qiita.com/air-gh/items/cbaeb372246c81c595a5)の主な宿題

- 5GHzの動作
- APモードの動作

ところが、MT7610Uドライバのソースを見ると、`NL80211_IFTYPE_AP`が出てこないので、APにならない気がする…。
そこで、[別チップを使っている](https://www.planex.co.jp/support/taiou/kisyu/developer_wifiusb.shtml)GW-900D-BKを試す。

# 環境

前回とほとんど同じだが、`apt-get dist-upgrade`でカーネルバージョンが上がった。

- ターゲット
    - Raspberry Pi 1 Model A+
    - 2017-11-29-raspbian-stretch-lite
    - Linux raspberrypi 4.9.80+ #1098 Fri Mar 9 18:51:28 GMT 2018 armv6l GNU/Linux
    - PLANEX GW-900D-BK
        - USB3.0
- ホスト
    - Ubuntu 16.04 amd64

# ドライバ

## rtl2xxxuの利用

[こちら](https://github.com/mk-fg/rtl8812au)によると、upstreamでは現状非対応とのこと->没。

## ドライバの取得

github上に色々あるが、ドライババージョンに4.xと5.xがあるようだ。
5.xで情報量も多い[こちら](https://github.com/mk-fg/rtl8812au)を選んでみる。

## toolchainの準備

[本家](https://www.raspberrypi.org/documentation/linux/kernel/building.md)を参照。

```
git clone https://github.com/raspberrypi/tools ~/tools
```

## カーネルソースの取得

dkmsなどもあるので、ターゲット上のビルドのほうが便利な気がしてきたが、
前回クロスコンパイル環境を作ってしまったので、そのまま使ってみる

rpi-4.9.yは今は4.9.80のようだ。

```
git clone --depth=1 -b rpi-4.9.y git://github.com/raspberrypi/linux.git
```

## カーネルソースの準備

[前回](https://qiita.com/air-gh/items/cbaeb372246c81c595a5)同様、[本家](https://www.raspberrypi.org/documentation/linux/kernel/building.md)を見ながら、`bcmrpi_defconfig`と`modules_prepare`を実施。

## ドライバソースへのパッチ

2点、Makefileにパッチを当てた。

1. ターゲット情報の設定
2. デバッグモードの設定

1.は、[こちら](https://github.com/diederikdehaas/rtl8812AU)の`CONFIG_PLATFORM_ARM_RPI`を真似する感じで設定。
2.は、そのままではビルドが通らなかったので、ソースをいじらずコンパイルが通る最低限の(?)デバッグオプションを設定。

コンカレントが動くかも試すために、`CONFIG_CONCURRENT_MODE`も設定。

```diff
diff --git a/Makefile b/Makefile
index a14133f..6a9e9d6 100755
--- a/Makefile
+++ b/Makefile
@@ -94,7 +94,8 @@ CONFIG_RTW_SDIO_PM_KEEP_POWER = y
 ###################### MP HW TX MODE FOR VHT #######################
 CONFIG_MP_VHT_HW_TX_MODE = n
 ###################### Platform Related #######################
-CONFIG_PLATFORM_I386_PC = y
+CONFIG_PLATFORM_I386_PC = n
+CONFIG_PLATFORM_ARM_RPI = y
 CONFIG_PLATFORM_ANDROID_X86 = n
 CONFIG_PLATFORM_ANDROID_INTEL_X86 = n
 CONFIG_PLATFORM_JB_X86 = n
@@ -1015,6 +1016,19 @@ INSTALL_PREFIX :=
 STAGINGMODDIR := /lib/modules/$(KVER)/kernel/drivers/staging
 endif

+ifeq ($(CONFIG_PLATFORM_ARM_RPI), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+EXTRA_CFLAGS += -DCONFIG_DBG -DCONFIG_PROC_DEBUG
+ARCH ?= arm
+CROSS_COMPILE ?= ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
+KVER ?= 4.9.80+
+KSRC := ~/linux
+MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
+INSTALL_PREFIX :=
+endif
+
 ifeq ($(CONFIG_PLATFORM_NV_TK1), y)
 EXTRA_CFLAGS += -DCONFIG_PLATFORM_NV_TK1
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
```

## ビルド

```
DEBUG=0 make
```

## インストール

`8812au.ko`ができるので、[前回](https://qiita.com/air-gh/items/cbaeb372246c81c595a5)同様、Raspberry Piにコピーして`sudo depmod -a 4.9.80+`。
`modprobe 8812au`すると、コンカレントのおかげで、`wlan0`と`wlan1`ができる。

# hostapd

## Raspbianのhostapd

`apt-get install hostapd`で入れてみたものの、`/etc/hostapd/hostapd.conf`がないと、起動しない。
適当な`hostapd.conf`を用意しても、`journalctl`で見ると、`Starting advanced IEEE 802.11 management: hostapd failed!`とのこと。
手動で`hostapd -dd /etc/hostapd/hostapd.conf`すると、
`nl80211: Register frame command failed (type=208): ret=-114 (Operation already in progress)`が原因で、最終的に`AP-DISABLED`となり、動かない模様。

ググりつつ、ドライバとRaspbianのhostapd 2.4が合わない、という雑な仮説のもと、最新のhostapd 2.6をビルドしてみる。
カーネルと違って依存ライブラリなどもあり、ターゲット上でビルドしてみる。

## 依存ライブラリのインストール

元々入っているのが`libnl-3`なので、`dev`も合わせる。

```
sudo apt-get install libssl-dev libnl-genl-3-dev
```

## ソースの取得

[本家](https://w1.fi/hostapd/)から、hostapd-2.6.tar.gzを取得。

## ビルドの設定

```
cp hostapd/defconfig hostapd/.config
```

```diff
--- hostapd/defconfig	2016-10-03 03:51:11.000000000 +0900
+++ hostapd/.config	2018-03-19 20:18:48.001721411 +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)
@@ -148,14 +148,14 @@
 #CONFIG_DRIVER_RADIUS_ACL=y

 # IEEE 802.11n (High Throughput) support
-#CONFIG_IEEE80211N=y
+CONFIG_IEEE80211N=y

 # Wireless Network Management (IEEE Std 802.11v-2011)
 # Note: This is experimental and not complete implementation.
 #CONFIG_WNM=y

 # IEEE 802.11ac (Very High Throughput) support
-#CONFIG_IEEE80211AC=y
+CONFIG_IEEE80211AC=y

 # Remove debugging code that is printing out debug messages to stdout.
 # This can be used to reduce the size of the hostapd considerably if debugging
```

## ビルド

```
cd hostapd
make
```

しばし待つと、`hostapd`と`hostapd_cli`ができる。

## 実行

`sudo ./hostapd -dd /etc/hostapd/hostapd.conf`すると、`AP-ENABLED`になった! (hostapd.confの内容は後ほど)

## インストール

```
sudo BINDIR=/usr/bin make install
```

これだと`apt-get`で入れたものに上書きとなるので注意。

# Raspberry Piの設定

## interfaceの設定

コンカレントを試すために、`wlan0`をSTAに、`wlan1`をAPに設定。
APのDHCPサーバなどは一旦省略。

```/etc/network/interfaces.d/sta
allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
wpa-ssid "SSID"
wpa-psk "hogehoge"
```

```/etc/network/interfaces.d/ap
allow-hotplug wlan1
auto wlan1
iface wlan1 inet auto
  wireless-mode master
```

## hostapdの設定

`/usr/share/doc/hostapd/examples/hostapd.conf.gz`を元に、適当にアレンジ。

```diff:/etc/hostapd/hostapd.conf
6c6
< interface=wlan0
---
> interface=wlan1
25c25
< # driver=hostap
---
> driver=nl80211
99c99
< #country_code=US
---
> country_code=JP
466c466
< #ieee80211n=1
---
> ieee80211n=1
1064c1064
< #wpa=1
---
> wpa=2
1073a1074
> wpa_passphrase=hogehoge
1094a1096
> wpa_key_mgmt=WPA-PSK
1106c1108
< #wpa_pairwise=TKIP CCMP
---
> wpa_pairwise=TKIP CCMP
1108c1110
< #rsn_pairwise=CCMP
---
> rsn_pairwise=CCMP
```

## 動作確認

色々変えて面倒なので、`sudo reboot`する。
`wlan0`は既存のAPにぶら下がり、`wlan1`に何か別のSTAをぶら下げる。

```
ping6 ff02::1%wlan0
ping6 ff02::1%wlan1
```

自分以外のホストから反応がある。ありがとうリンクローカル。

# 感想

同じRTWでも、RTL8192CUと違って、nl80211でhostapdが動くものもあるんだ。

# 調べてみようかな

- LED
    - 何もしなくても動いている?
- WPSボタン
- 40MHz, 80MHz

# オチ

USB無線LANドングル買った後に、5GHzに対応した[Pi 3 Model B+](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/)の発表が…

# おまけ

APを5GHzに設定してみるが、STAが2.4GHzでつながっていると、5GHzにならない模様。
STAを5GHzのAPにぶら下げた状態だと、APも5GHzになった。

[製品情報](https://www.planex.co.jp/products/gw-900d/)に書いてありました。

> 2.4GHzと5GHzの同時利用はできません。