RTL8192CU用ドライバとhostapdをUbuntu 16.04でbuildする

# Ralink と Realtek
安価な小型USB Wi-FiデバイスをhostapdでAPにしたい。
まずは、ドライバもhostapdもiwとnetlinkの素で行けるという、[rt2800usbドライバ](https://wireless.wiki.kernel.org/en/users/Drivers/rt2800usb)で動くデバイスで試したところ、設定が素すぎたのか、pingがロスる。

[rtl8192cuドライバ](https://wireless.wiki.kernel.org/en/users/drivers/rtl819x)で動くデバイスも手元にあったので試そう。と、その前に検索すると、素で動くけどいまいちとか、別ドライバがあるという情報が出てくる。
[有線のr8168/r8169](https://unix.stackexchange.com/questions/26997/whats-the-difference-between-the-drivers-r8169-and-r8168)と似た展開か。
[こちら](https://bogeskov.dk/UsbAccessPoint.html)によると、ドライバを変えると、hostapdも変える必要があるのか。

バイナリをコピーする[記事](https://learn.adafruit.com/setting-up-a-raspberry-pi-as-a-wifi-access-point/install-software)も見かけるが、Raspberry Pi用だとARMで動かないし、Ubuntuではパッケージも無さそうだし、buildしてみるか…。

# 環境
- Ubuntu 16.04 amd64
- Planex [GW-USNano2](https://www.planex.co.jp/product/wireless/gw-usnano2/)

# ドライバ
検索すると、Realtekのドライバをベースにしたと思われるリポジトリが、github上にたくさんある。
正直どれが良いのかわからないが、[Ubuntuでの情報](https://askubuntu.com/questions/246236/compile-and-install-rtl8192cu-driver)があるのと、ほぼ最新のカーネルでも確認されていそうで、手順がご丁寧に書かれているので、[こちら](https://github.com/pvaret/rtl8192cu-fixes)にしてみよう。

## ドライバのbuild
迷いどころがないほど手順通りだったので、省略…

# hostapd
これまたパッチ状態のもの、パッチ適用済みのものなど、色々あるが、パッチながら手順が明確な[こちら](https://github.com/pritambaral/hostapd-rtl871xdrv)にしてみる。

ただ、hostapdは、自分のど素人ぶりを発揮し、迷いどころが少しあった。

## hostapdのバージョン
hostapdは、aptで入れた後、バイナリを置き換えることを想定していたが、両者でバージョンが違うようだ。

- [xenialのhostapd](https://packages.ubuntu.com/xenial/net/hostapd)は2.4?
- 最新版とRTLパッチは2.6

依存しているのはnetlinkくらいだし、入れるバイナリも2つだけなので、2.4が2.6になっても問題ない、と信じて2.6にしてみる。

## hostapdのbuild
勘違いしていたが、[パッチの手順](https://github.com/pritambaral/hostapd-rtl871xdrv/blob/master/README.md)には、hostapdのビルド手順が含まれているわけではない。
hostapdのビルド手順は、hostapdの[README](http://w1.fi/cgit/hostap/tree/hostapd/README)を見る必要がある。が、[Makefile](http://w1.fi/cgit/hostap/tree/hostapd/Makefile)のほうが詳しいような…。
[本家](http://w1.fi/hostapd/)をダウンロードし、パッチの手順と合体させて、

```shell-session
$ cd hostapd-2.6
$ patch -Np1 -i ~/git/hostapd-rtl871xdrv/rtlxdrv.patch
$ cd hostapd
$ cp defconfig .config
(.config編集)
$ echo CONFIG_DRIVER_RTW=y >> .config
$ make
```

(.configの編集)では、defaultのdefconfigから、

- `CONFIG_DRIVER_NL80211=y`を無効に
- `CONFIG_IEEE80211N=y`を有効に

してみた。RTWはNL80211とは排他ではなさそうだが、依存ライブラリのインストールが必要で、かつRealtekのドライバが対応していないので、無効にしてみた。

## hostapdのインストール
```shell-session
$ make -n install
install -D hostapd /usr/local/bin//hostapd
install -D hostapd_cli /usr/local/bin//hostapd_cli
```

で確認すると、Ubuntuのデフォルト設置場所である/usr/sbinと異なる。

```shell-session
$ BINDIR=/usr/sbin make -n install
install -D hostapd /usr/sbin/hostapd
install -D hostapd_cli /usr/sbin/hostapd_cli
```

これなら大丈夫そう。

## hostapdの設定
aptで入れて入っている`/etc/hostapd/hostapd.conf`をベースに、[hostapd.conf.rtl871xdrv](https://github.com/pritambaral/hostapd-rtl871xdrv/blob/master/hostapd.conf.rtl871xdrv)の部分を編集。

### `device_name`と`manufacturer`
これはビルド時に`CONFIG_WPS=y`になっていないと使えないようだ。
WPSは使わないので、設定しなかった。

### ブリッジの設定

```hostapd.conf
# For nl80211, this parameter can be used to request the AP interface to be
# added to the bridge automatically (brctl may refuse to do this before hostapd
# has been started to change the interface mode). If needed, the bridge
# interface is also created.
```

`nl80211`でなく`rtl871xdrv`だと、どうなるんでしょう。
よくわからないが、`/etc/network/interfaces`にて`brctl`で作る、で何となく動いている…。

# 感想
- ドライバは毒が入っているとこわいので、複数あると選択が難しい…
- やっぱり11ac対応機が欲しい!