GW-US54GXSで無線LAN接続を試みる

引越した部屋の間取り上、無線LANを使う必要が出てきたので、試行錯誤することに。

今回の肝は、FreeBSDでの動作報告が殆ど無いGW-US54GXSで動くのか?というところ。

  • Kernelを7.0にあげ

FreeBSDでは、zydというドライバでGW-US54GXSを扱うらしいのだけど、6.3には取り込まれていないみたい。当該ドライバのソースファイルだけ持ってきて組み込む手もあるけど(面倒だが…)、この際、7.0にあげてみることにする。
cvsupのtagsはRELENG_7。

if_zydモジュールのkldloadをすっかり忘れていてugenのまま時間を浪費してしまった。てっきり、GENELICに書かれているものだと… /boot/loader.confに以下を記載したら、zyd0というインターフェースを認識してくれた。

if_zyd_load=yes
  • rc.confにifconfig_zyd0

本当は、/etc/start_if.zyd0のほうが良いのかも知れないけど、とりあえず動かすこと優先。さらにとりあえずWEPで。

ifconfig_zyd0="DHCP ssid WARPSTAR-HOGEHOGE mode 11g weptxkey 1 wepkey 1:0x0123456789ABC wepmode on"

status: associatedになった。

  • 認識するものの通信できず

無線LANアクセスポイント兼ルータへのpingが通らない。こんなエラーが出てしまう。

zyd0: device timeout

man zydによると、

zyd%d: device timeout  A frame dispatched to the hardware for transmis-
sion did not complete in time.  The driver will reset the hardware.  This
should not happen.

だそうだから、難しそうだ…

#後程わかったけど、ifconfigの設定ミス。
#設定ミスってても、status: associatedになっちゃうときがあるみたい。

  • currentのドライバを移植してしまおうか?

HEADタグの最新版if_zyd*を持ってきてコンパイルしたのだけど、他の最新ファイルに依存していてコンパイルエラーに。あまり本格的にやるとメンテナンスが大変そうなので、ちょっと保留。

  • 救世主?ndisgen

man ndisgen

ndisgen -- generate a FreeBSD driver module from a Windows(R) NDIS driver
distribution

という救世主的なツールを発見。使ってみる。

mitsu@garlic$ sudo ndisgen ZD1211BU.INF ZD11BU2K.SYS
 :
 色々説明が出てくるのでEnter押下.
 :
        Press enter to try converting the files now:
ndiscvt: line 66: %Manufacturer%: syntax error.
CONVERSION FAILED

がーん。
あきらめきれないので、ZD1211BU.INFの中を覗いてみる。

 61 HKR,,                 DeviceVxDs,         0, %DriverFileName%
 62
 63 ; NDIS Info
 64 HKR,NDIS,             MajorNdisVersion,   1, 03
 65 HKR,NDIS,             MinorNdisVersion,   1, 0A
 66 HKR,NDIS,             LogDriverName,      0, %CustomServiceName%(%Manufacturer%)
 67

INFファイルの書式はわからないんだけども、%Hoge%が変数みたいなものか?66行目で真新しいのは、(%Hoge%)というフォーマット?べた書きしちゃえばよいのかしら。と思って試行錯誤を繰り返すも埒が明かず。直しても直しても続々と出てくるエラーを前に、とりあえずあきらめる。

と思ったけど、もう一度徹底的に直してみる。なんとか成功。結局何を直したかというと

  1. 改行コードをCR-LFからLFに変更(これは念のため)
  2. %CustomServiceName%(%Manufacturer%)は思い切って(%Manufacturer%)を削除
  3. ダブルクォーテーションは削除

などなど。で、ZD11BU2K_SYS.koが生成された。

  • kldunload if_zyd
mitsu@garlic$ sudo kldunload if_zyd
mitsu@garlic$ kldstat
Id Refs Address    Size     Name
 1    1 0xc0400000 9796f4   kernel
mitsu@garlic$
mitsu@garlic$ sudo kldload ./ZD11BU2K_SYS.ko
Password:
mitsu@garlic$
mitsu@garlic$ kldstat
Id Refs Address    Size     Name
 1    9 0xc0400000 9796f4   kernel
 2    1 0xc292d000 71000    ZD11BU2K_SYS.ko
 3    1 0xc299e000 c000     if_ndis.ko
 4    2 0xc29ac000 16000    ndis.ko
mitsu@garlic$

となるものの、ifconfigには現れず… この辺が諦め時か…

  • さらに諦めない⇒成功

もう一度、原点に返りif_zydの設定を見直すことにした。

  1. wepkeyはhexdecimal-asciiっぽくみえるけど、ただの文字列では?
  2. 念のためchannelも明示的に指定したほうが良いのでは?

といった辺りを弄ってみると以下のようになった。

ifconfig_zyd0="DHCP ssid WARPSTAR-HOGE channel 7 mode 11g weptxkey 1 wepkey 1:0123456789ABC wepmode on"

すると…成功!

きちんとDHCPIPアドレスを付与してもらえて、インターネットにも繋がるようになった。

  • とはいえ不安定だったりする
zyd0: device timeout
zyd0: could not transmit buffer: TIMEOUT

割と頻繁にこんなエラーがでて通信できなくなってしまう。USB抜き差しすれば復活するが、実運用を考えると難しい。

#すぐ隣のWindowsを使った感じでは、電波(っていうのかな?)自体は十分届いているようだ。

  • 結局

この無線LAN USBアダプタはLinux(Ubuntu)に譲り、FreeBSDとかのPC群へは長〜い有線LANを這わせることにしよう。その際は壁とかを傷つけないようにしよう。賃貸だから。

無線LANはまるっきり素人だったので、挙動が分かったりしていい勉強になった。久しぶりに、程よく燃え尽きたので結構満足。