ラズパイで6GHz帯WiFiを使ってみた（ルータモードアクセスポイント編）

2022年9月から日本でも6GHz帯が無線LANで使用することが許可されました。Netgear A8000を使って、ラズパイで6GHz対応のルータモードアクセスポイントを作ってみました（English version article is [here](https://dev.to/wataniguchi/how-to-build-a-6ghz-wifi-router-mode-ap-with-a-raspberry-pi-and-netgear-a8000-31om)）。
接続用のクライアントは[「ラズパイで6GHz帯WiFiを使ってみた（クライアント編）」](https://qiita.com/wataniguchi/items/e61130686f3f3e97bde0)で作ります。

なお、ブリッジモードアクセスポイントの構築については、[ラズパイで6GHz帯WiFiを使ってみた（ブリッジモードアクセスポイント編）](https://qiita.com/wataniguchi/items/313aeecba00e2b28554d)をご覧下さい。

# まとめ - これだけやればできる

- A8000がUSB接続時に返すベンダーID・製品IDが標準mt7921uドライバに認識されるようにする
- Linux無線規制データベースを最新化して日本での6GHz帯使用許可を反映する
- MediaTek WiFiアダプタ用のファームウェアを最新化する
- dnsmasqを導入する
- hostapdを導入してv2.10へ差し替える

# 前提

- Raspberry Pi OSはBullseye（kernel 6.1）を利用しています
- ラズパイの内蔵WiFiのインターフェース名がwlan0、A8000のインターフェース名がwlan1であるとします
- 6GHz帯のネットワークを192.168.193.0 / 255.255.255.192とし、アクセスポイントに192.168.193.62を割り当てます

# A8000がUSB接続時に返すベンダーID・製品IDが標準mt7921uドライバに認識されるようにする

[「ラズパイで6GHz帯WiFiを使ってみた（クライアント編）」](https://qiita.com/wataniguchi/items/e61130686f3f3e97bde0#a8000がusb接続時に返すベンダーid製品idが標準mt7921uドライバに認識されるようにする)を参照

# Linux無線規制データベースを最新化して日本での6GHz帯使用許可を反映する

[「ラズパイで6GHz帯WiFiを使ってみた（クライアント編）」](https://qiita.com/wataniguchi/items/e61130686f3f3e97bde0#linux無線規制データベースを最新化して日本での6ghz帯使用許可を反映する)を参照

# MediaTek WiFiアダプタ用のファームウェアを最新化する

[「ラズパイで6GHz帯WiFiを使ってみた（クライアント編）」](https://qiita.com/wataniguchi/items/e61130686f3f3e97bde0#mediatek-wifiアダプタ用のファームウェアを最新化する)を参照

# dnsmasqを導入する

`sudo apt-get install dnsmasq`でパッケージを導入した後、設定ファイル`/etc/dnsmasq.conf`へ以下の記述を追加します。

```/etc/dnsmasq.conf
interface=wlan1
dhcp-range=192.168.193.1,192.168.193.61,12h
```

# hostapdを導入してv2.10へ差し替える

まず最初に、`sudo apt-get install hostapd`でパッケージを導入します。
次に、[802.11axサポートはv2.10で付加された](https://forums.raspberrypi.com/viewtopic.php?t=338143)ので、本稿執筆当時で最新であるv2.10への差し替えを行います。
[「ラズパイで6GHz帯WiFiを使ってみた（クライアント編）」](https://qiita.com/wataniguchi/items/e61130686f3f3e97bde0#wpa-supplicantをv210へ差し替える)ではWPA Supplicantをv2.10へ差し替えます。WPA Supplicantとhostapdの両方が含まれた`hostap_2_10.tar.gz`を[配布サイト](https://w1.fi/cgit/hostap/)からダウンロードします。
以下は手順です。

```
tar -xzvf hostap_2_10.tar.gz
cd hostap_2_10/hostapd
cp defconfig .config
echo CONFIG_IEEE80211AX=y >> .config
echo CONFIG_IEEE80211AC=y >> .config
echo CONFIG_SAE=y >> .config
echo CONFIG_ACS=y >> .config
make
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd_2_9
sudo cp hostapd /usr/sbin/
sudo mv /usr/sbin/hostapd_cli /usr/sbin/hostapd_cli_2_9
sudo cp hostapd_cli /usr/sbin/
```

dhcpcdの設定ファイル`/etc/dhcpcd.conf`を変更して、wlan1へはDHCPを適用せず静的IPアドレスを割り当てるようにします。

```/etc/dhcpcd.conf
interface wlan1
static ip_address=192.168.193.62/26
nohook wpa_supplicant
```

hostapdの設定ファイル`/etc/hostapd/hostapd.conf`を新規に作成します。`ssid=`、`sae_password=`、`channel=`の部分は適当に変更して下さい。

```/etc/hostapd/hostapd.conf
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
country_code=JP
interface=wlan1
driver=nl80211
ssid=foo-ax
sae_password=foobar
hw_mode=a
channel=57
ieee80211ax=1
wmm_enabled=1
op_class=131
ieee80211w=2
auth_algs=3
wpa=2
wpa_key_mgmt=SAE
rsn_pairwise=CCMP
rsn_preauth=1
sae_require_mfp=1
sae_pwe=1
wpa_group_rekey=1800
group_cipher=CCMP
wpa_psk_radius=0
```

hostapdをブート時に自動開始するサービスとして登録します。
```
sudo systemctl unmask hostapd.service
sudo systemctl enable hostapd.service
```

必要に応じて、`/etc/sysctl.d/routed-ap.conf`に以下を追加することで、IPv4フォワーディングを有効化します。
```/etc/sysctl.d/routed-ap.conf
net.ipv4.ip_forward=1
```

# 完了

`sudo hostapd_cli status`すると、6GHz帯でアクセスポイントが稼働していることがわかります。お疲れ様でした。
```
$ sudo hostapd_cli status
Selected interface 'wlan1'
state=ENABLED
phy=phy1
freq=6235
num_sta_non_erp=0
num_sta_no_short_slot_time=1
num_sta_no_short_preamble=1
olbc=0
num_sta_ht_no_gf=0
num_sta_no_ht=1
num_sta_ht_20_mhz=0
num_sta_ht40_intolerant=0
olbc_ht=0
ht_op_mode=0x0
cac_time_seconds=0
cac_time_left_seconds=N/A
channel=57
edmg_enable=0
edmg_channel=0
secondary_channel=0
ieee80211n=0
ieee80211ac=0
ieee80211ax=1
beacon_int=100
dtim_period=2
he_oper_chwidth=0
he_oper_centr_freq_seg0_idx=0
he_oper_centr_freq_seg1_idx=0
supported_rates=0c 12 18 24 30 48 60 6c
max_txpower=23
bss[0]=wlan1
bssid[0]=94:18:65:xx:xx:xx
ssid[0]=foo-ax
num_sta[0]=1
```

# おまけ

6GHz WiFiには直接関係のない話題です。


dnsmasqを使って、wlan1だけでなくeth0でもDHCPによるIPアドレス動的配布を行いたいが、上手く行かないという声を頂きました。
`/etc/dhcpcd.conf`でeth0のIPアドレスを指定すると、ケーブル未接続状態ではリンクダウンとなりeth0インターフェースが利用できないことが原因のようです。昔ながらのやり方でブート時のスクリプトでifconfigによってインターフェース定義することで回避しましょう。
```/etc/network/interfaces.d/ifconfig.eth0
auto eth0
iface eth0 inet static
  address 192.168.194.62
  netmask 255.255.255.192
```
```/etc/dnsmasq.conf
interface=wlan1
dhcp-range=192.168.193.1,192.168.193.61,12h
interface=eth0
dhcp-range=192.168.194.1,192.168.194.61,12h
dhcp-option=3 # no default route
dhcp-option=tag:wlan1,option:classless-static-route,192.168.194.0/26,192.168.193.62
dhcp-option=tag:eth0,option:classless-static-route,192.168.193.0/26,192.168.194.62
```
```/etc/dhcpcd.conf
interface wlan1
static ip_address=192.168.193.62/26
nohook wpa_supplicant
```
これでokです。


```
$ cat /var/lib/misc/dnsmasq.leases 
1690710797 94:18:65:xx:xx:xx 192.168.193.7 oak 01:94:18:65:xx:xx:xx
1690709032 04:1e:64:xx:xx:xx 192.168.194.29 rose 01:04:1e:64:xx:xx:xx
```
eth0に接続したMacにもIPアドレスが配布されるようになりました。