FreeBSD の各種デバッグオプションを有効にし NDIS を観察2017年01月22日 12時52分06秒

NDIS が 11.0-RELEASE になって動かないが、あまり有効な手段を見付けられないので、取り敢えず FreeBSD の各種デバッグオプションを有効にして、カーネルを作ることにした。何らかのヒントが出てくれれば良いのだが。

カーネルの設定ファイルは他のものを読み込むことが出来る。

% cat /usr/src/sys/i386/conf/DEBUG 
include GENERIC

ident           GENERIC-DEBUG

#options        DEADLKRES               # Enable the deadlock resolver
options         INVARIANTS              # Enable calls of extra sanity checking
options         INVARIANT_SUPPORT       # Extra sanity checks of internal structures, required by INVARIANTS
options         WITNESS                 # Enable checks to detect deadlocks and cycles
options         WITNESS_SKIPSPIN        # Don't run witness on spinlocks for speed

options         DDB
options         KDB
include で GENERIC カーネルの設定を読み込み、DDB/KDB、INVARIANTS と WITNESS を有効にして、buildkernel KERNCONF=DEBUG。

再起動後に、ndis を試すと、ロックのエラーが表示された。

kernel: panic: mtx_lock() of spin mutex network driver @ /usr/src/sys/modules/if_ndis/../../dev/if_ndis/if_ndis.c:1849
kernel: cpuid = 0
kernel: KDB: stack backtrace:
kernel: #0 0xc0c81d3f at kdb_backtrace+0x4f
kernel: #1 0xc0c3f1d5 at vpanic+0x115
kernel: #2 0xc0c3f0b9 at kassert_panic+0xd9
kernel: #3 0xc0c1e3c3 at __mtx_lock_flags+0x183
kernel: #4 0xc73b4d08 at ndis_start+0x38
kernel: #5 0xc73b1021 at ndis_starttask+0x21
kernel: #6 0xc6ceaea1 at _end+0x4f2afd1
kernel: #7 0xc0bffd6e at fork_exit+0x7e
kernel: #8 0xc119af50 at fork_trampoline+0x8

NDIS に変更が行われたのは 2015 年の夏2017年01月05日 12時54分41秒

NDIS が FreeBSD 11.0-RELEASE から使えなくなっている。current メーリングリストで、テスト募集中とあったのを見た覚えがあったので、見返してみた。メールは 2015 年の夏だった。どうやら一人だけ、テストをしてみようとした人はいたみたいだったが、動作するデバイスを持っていないようだった。

当時は当該機 も current を使っていなかったので、目に止めただけだった。これに返信しても、返事が貰えるかは定かではないが、とりあえず駄目元で返信を試みた。

11.0-RELEASE と 11-CURRENT の NDIS の状態2016年12月01日 12時09分13秒

ifconfig wlan0 に ssid を指定すると、問題が起きる事まで突き止めた。これは FreeBSD 11.0-RELEASE でのテスト。

FreeBSD 11.0-RELEASE では既に NDIS の一部が動かない様だが、何度か古いカーネルで試した結果からみても、最新のコードが一番真っ当な様だ。

春先に 11-CURRENT で wlan の作成が出来なくなった変更があった。11.0-RELEASE を下に調査を続ける前に、その変更が原因で壊れたのかを点検したい。SVN の履歴などを調べるとRev 300738が該当の変更だったようだ。そこで、Rev 300737 に戻して、試してみようと思う。尚、変更は ifconfig だったので、buildworld と buildkernel が必要になるので、時間が掛かりそうだ。

11.0-RELEASE で NDIS でパニックの再現2016年11月29日 18時50分38秒

ifconfig wlan0 list scan は動作するのは確認した。しかし、dhclient は動かない。この後、sysctl を使うとカーネルがパニックを起こす場合があるのを確認した。

ndis から wlan デバイスを作成しただけでは大丈夫なようだ。

$ kldload if_ndis
$ kldload /boot/modules/bcmwl5_sys.ko
$ sysctl -a | wc -l
5330
$ ifconfig wlan0 create wlandev ndis0 up
$ ifconfig wlan0 list scan
$ sysctl -a | wc -l
5338
$ dhclient wlan0
wlan0: no link .............. giving up
$ sysctl -a | wc -l
5338

ssid を指定して wlan を作成するとパニックを起こすようだ。

$ kldload if_ndis
$ kldload /boot/modules/bcmwl5_sys.ko
$ wlan create wlandev ndis0 ssid <id> wepmode on wepkey <key> weptxkey 1 up
$ sysctl -a | wc -l
kdb に落ちるので見ると、fill_kinfo_proc 内の strlcpy を指している。
db> where
Tracing pid 993 tid 100145 td 0xc7275000
strlcpy(...)
fill_kinfo_proc()
kern_Proc_out()
fill_kinfo_proc では二箇所で strlcpy が使われていた。

11.0-RELEASE で NDIS の実験を続ける2016年11月26日 06時14分50秒

11.0-RELEASE の方が ndis の状態が良いので、壊れた当初のリビジョンより、11.0-RELEASE で原因追求を続けることに。テストを続けていると、パニックを起こす状態になるのだが、あれこれと試しながらだったので、何がきっかけだかは完全には掴めていない。

取り敢えず、このコマンドが動作できるのは確認した。

$ kldload if_ndis
$ kldload /boot/modules/bcmwl5_sys.ko
$ ifconfig wlan0 create wlandev ndis0 up
$ ifconfig wlan0 list scan
list scan が動くので、通信は機能している様子。

次に、dhclient をそのまま試したら駄目だった。

$ dhclient wlan0
wlan0: no link .............. giving up

NDIS を 11.0-RELEASE に戻して更に原因追求2016年11月22日 13時43分58秒

NDIS の原因追求再試行第三段 286410 にて問題を再現にて、この辺りが問題が発生していたのは分かった。286419 では kldload でパニックを起こす。しかし、11.0-RELEASE で最近試したときのことを思い出す。その時は、通信こそ出来なかったもののパニックを起こしてはいなかったはず。そこで、11.0-RELEASE に戻す。

11.0-RELEASE では kldload でのパニックは収まっていた。dmesg から

ieee80211_new_state_locked: pending AUTH -> SCAN transition lost
を見付ける。まだ、何に関係あるのかは分からないが取り敢えず、記録。

NDIS のデバッグを有効にする sysctl がある。

$ sysctl debug.ndis=1
この後、
ndis_newstatus: ASSOC -> RUN
と表示されるようになった。

NDIS の原因追求再試行第三段 286410 にて問題を再現2016年11月17日 18時51分29秒

リビジョン 286409 が動作可能なのを確かめた。今回は、286410 が怪しかったので、このままリビジョンを一つのみ上げる。

リビジョン 286410 は zyd ドライバを壊してしまったので、そのままではコンパイル出来ない。リビジョン 286416 にてその修正が入っているので、これを利用するのが一番簡単そうだ。

案の定このリビジョンから、ndis ドライバを作り直して、kldload をすると落ちるようになった。

NDIS の原因追求再試行第二段 286409 へ2016年11月04日 21時48分23秒

リビジョン 283540 へ失敗した。そこで、次に大きい変更が入る 286410 の一つ手前の 286409 を試す。

今度も buildkernel が ath ドライバとその他の二つのドライバでコンパイルに失敗した。エラーは、「shifting a negative signed value is undefined」。これは今日の 286409 でも、前回の 283540 でも起きている。新しいエラーチェックが追加されたか、有効化された影響のように見える。

11.0-RELEASE で試すよりも、少し古い 10.2-RELEASE で試してみることにした。そうすると、今回はカーネルの再構築に成功。

NDIS をコンパイルし直して試したら動いた。286509 では利用可能。

[tcp] 10.0.0.1:/mnt/nfs: Permission denied2014年05月03日 13時50分03秒

久しぶりに NFS サーバをスタート。マウントが出来ない。大概の問題は exports の誤記か NFS サーバが設定を読み直していないこと。FreeBSD では showmount -e で現在公開中のディレクトリが調べられる。

FreeBSD で WPA2-PSK を設定2014年01月03日 23時00分48秒

WEP 接続だけなら ifconfig だけでも出来るが、WPA は wpa_supplicant の助けが要る。

Windows で接続可能なネットワークは「WPA2-PSK」と表示される。しかし、wpa_supplicant には特に、WPA2 が無く、WPA と同じ様に設定すれば良いみたいだ。


$ cat /etc/wpa_supplicant.conf 
network={
        ssid="UYOTNETWORK"
        key_mgmt=WPA-PSK
        psk="1234567890"
}
$ ifconfig wlan create wlandev wpi0 up
$ wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
$ dhclient wlan0

wlan を用いて WPA を設定するので、事前に wlan0 を作っておく必要がある。ここでは wpi0 を関連づけている。これが無いと、wlan0 が存在しないので、wpa_supplicant が失敗するし、自動では作ってはくれない。

UYOTANETWORK が ssid で、0x1234567890 がそのパスワードの例。network も複数あっても大丈夫。ただし、個人的には複数の network が記されていて、複数のネットワークが有効になっている環境で試したことは無い。試したのは、複数記述されているが、有効になっていたのは一つだけだった場合のみ。

rc.conf に設定する方法は 30.3. Wireless Networking に載っている。

前回