Linux 様のIntel WiFi ドライバ iwlwifi をありがたくFreeBSD上で動かすという仕組みが FreeBSD 13.1 から入ってます

# Linux のドライバを拝借する仕組み LinuxKPI

 新しいハードウェアは次々生まれるが FreeBSD 向けにドライバを作るのは大変、ということで Linux のドライバを動かせたら……、しかし GPL コードは取り込みたくない、ということで生まれたのが LinuxKPI というサブシステムです。

　LinuxKPIはカーネルレベルの Linux の互換レイヤーです。作成はプログラマが GPL ソースを見ないで作成されています。この互換レイヤーにより、Linuxのドライバを修正することなくFreeBSD でコンパイル&実行できるようになります。
　この仕組みはグラフィックドライバ drm ですでに使用されていて、Intel / AMD の新しいグラフィックボード対応が拡充されました。
　この成功で波に乗って、WiFi ドライバでも LinuxKPI を使っちゃおうということで、Linux 向けの　Intelチップ用 WiFi ドライバ iwlwifi が FreeBSD に取り込まれました。iwlwifi 自体は GPLv2とBSD 3-clause のデュアルライセンスなので、FreeBSD ソースツリーにcontrib として入れることができます(src/sys/contrib/dev/{iwlwifi,iwlwififw} )。

# 対応は13.1-RELEASE から

iwlwifi は FreeBSD 13.1-RELEASE から導入されました。12系には入らない予定のようです([FreeBSD wiki のFAQ "Will you support FreeBSD 13 or 12? "より](https://wiki.freebsd.org/WiFi/Iwlwifi))。

# 対応チップ
current の [iwlwifi の man](https://www.freebsd.org/cgi/man.cgi?query=iwlwifi&apropos=0&sektion=0&manpath=FreeBSD+14.0-CURRENT&arch=default&format=html "iwlwifi の man") (14-current)によると、
```` 
     •   Intel(R) Dual Band Wireless AC 7260
     •   Intel(R) Dual Band Wireless N 7260
     •   Intel(R) Wireless N 7260
     •   Intel(R) Dual Band Wireless AC 3160
     •   Intel(R) Dual Band Wireless N 3160
     •   Intel(R) Wireless N 3160
     •   Intel(R) Dual Band Wireless AC 3165
     •   Intel(R) Dual Band Wireless AC 3168
     •   Intel(R) Dual Band Wireless AC 7265
     •   Intel(R) Wireless N 7265
     •   Intel(R) Dual Band Wireless N 7265
     •   Intel(R) Dual Band Wireless AC 8260
     •   Intel(R) Dual Band Wireless N 8260
     •   Intel(R) Dual Band Wireless AC 4165
     •   Intel(R) Dual Band Wireless AC 8265
     •   Intel(R) Dual Band Wireless AC 8275
     •   Killer (R) Wireless-AC 1550 Wireless Network Adapter (9260NGW) 160MHz
     •   Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)
     •   Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)
     •   Killer(R) Wireless-AC 1550s Wireless Network Adapter (9560D2W) 160MHz
     •   Killer(R) Wireless-AC 1550i Wireless Network Adapter (9560NGW) 160MHz
     •   Killer(R) Wi-Fi 6E AX1690s 160MHz Wireless Network Adapter (411D2W)
     •   Killer(R) Wi-Fi 6E AX1690i 160MHz Wireless Network Adapter (411NGW)
     •   Intel(R) Wireless-AC 9260-1
     •   Intel(R) Wi-Fi 6 AX200 160MHz
     •   Killer(R) Wi-Fi 6 AX1650w 160MHz Wireless Network Adapter (200D2W)
     •   Killer(R) Wi-Fi 6 AX1650x 160MHz Wireless Network Adapter (200NGW)
     •   Intel(R) Wi-Fi 6 AX201 160MHz
     •   Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)
     •   Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)
     •   Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201NGW)
     •   Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201D2W)
     •   Intel(R) Wi-Fi 6E AX211 160MHz
     •   Intel(R) Wi-Fi 6 AX210 160MHz
     •   Killer(R) Wi-Fi 6E AX1675w 160MHz Wireless Network Adapter (210D2W)
     •   Killer(R) Wi-Fi 6E AX1675x 160MHz Wireless Network Adapter (210NGW)
     •   Intel(R) Wi-Fi 6E AX411 160MHz
     •   Killer(R) Wi-Fi 6E AX1675s 160MHz Wireless Network Adapter (211NGW)
     •   Killer(R) Wi-Fi 6E AX1675i 160MHz Wireless Network Adapter (211NGW)
     •   Intel(R) Wireless-AC 9461 160MHz
     •   Intel(R) Wireless-AC 9461
     •   Intel(R) Wireless-AC 9462 160MHz
     •   Intel(R) Wireless-AC 9462
     •   Intel(R) Wireless-AC 9560 160MHz
     •   Intel(R) Wireless-AC 9560
     •   Intel(R) Wireless-AC 9270 160MHz
     •   Intel(R) Wireless-AC 9270
     •   Intel(R) Wireless-AC 9162 160MHz
     •   Intel(R) Wireless-AC 9162
     •   Intel(R) Wireless-AC 9260 160MHz
     •   Intel(R) Wireless-AC 9260
     •   Intel(R) Wi-Fi 6 AX101
     •   Intel(R) Wi-Fi 6 AX203
     •   Intel(R) Wi-Fi 6E AX221 160MHz
     •   Intel(R) Wi-Fi 6E AX231 160MHz
     •   Intel(R) TBD Bz device
     •   Intel(R) Wi-Fi 6 AX204 160MHz
````
current の man なので 13.1-RELEASE とは状況が違うかもしれません。

　上記には従来 iwm でサポートされていたチップも含まれていますので、古いチップならばどちらのドライバを使うか選ぶこともできます。

# 使い方

　肝心の使い方ですが、だいたい従来の WiFi ドライバと同じです。

　ドライバのカーネルモジュールを明示的にロードするため/etc/rc.conf の kld_list にif_iwlwifiを追記します。

````
kld_list="if_iwlwifi"
````

　グラフィックドライバも Intel を使っている人はすでに i915kms.ko が入っていると思うので、

````
kld_list="/boot/modules/i915kms.ko if_iwlwifi"
````

　という風にスペースを挟んで追記する形になると思います。

あとは他の WiFiドライバと同様に設定します。

/etc/rc.conf には
````
wlans_iwlwifi0=wlan0
ifconfig_wlan0="DHCP WPA -powersave"
````
上記では DHCP を設定しています。

あとは wpa_passphrase コマンドで

````
wpa_passphrase お家のssid password
````

でssidとパスワード指定して出力された

````
network={
	ssid="お家のssid"
	#psk="password"
	psk=a11c3e81e37118ce8e640b076239ef95f3cbc5a3b961010e10255b31ba69aace
}
````
を /etc/wpa_supplicant.conf に書き込めばWiFi 設定完了です。

dmesg で確認です。ThinkPad X250 で、Intel(R) Wireless N 7265 が認識されています。

````
Intel(R) Wireless WiFi based driver for FreeBSD
iwlwifi0: <iwlwifi> mem 0xf1000000-0xf1001fff at device 0.0 on pci2
iwlwifi0: successfully loaded firmware image 'iwlwifi-7265D-29.ucode'
iwlwifi0: Found debug destination: EXTERNAL_DRAM
iwlwifi0: Found debug configuration: 0
iwlwifi0: loaded firmware version 29.4063824552.0 7265D-29.ucode op_mode iwlmvm
iwlwifi0: Detected Intel(R) Wireless N 7265, REV=0x210
iwlwifi0: Applying debug destination EXTERNAL_DRAM
iwlwifi0: Allocated 0x00400000 bytes for firmware monitor.
iwlwifi0: base HW address: 18:5e:0f:24:e3:39, OTP minor version: 0x0
````

# lagg が使えない

　私の環境では iwm ドライバでも使用可能です。現状私が使う上で２つのドライバの大きな違いは、iwlwifi では lagg が使えないということです。
　有線と WiFi が両方使用できるノートPCでは、有線のインターフェースと無線のインターフェースを フェイルオーバーのlaggでまとめて、有線接続時は有線、有線ケーブルを外したら WiFiに切り替わるように設定するのが定番です。それが今は iwlwifiではできないので、私はまだ iwm ドライバを使っています。ここらへんはそのうち改善されると思うので、今後に期待です。