突然 パソコンと NintendoDS をつなぎたくなった
(注) 結局 DSとの接続は確認できませんでした…
CPU | AMD Turion(tm) 64 Mobile Technology MT-37 |
---|---|
OS | Linux kernel 2.6.24 |
GCC | 4.1.2 i686 |
glibc | 2.5 |
ndiswrapper | 1.52 |
DHCP | ISC-DHCP 4.1.0a1 |
無線LAN 接続機器 | PC-MV1-C1W(SHARP製ノート) WILLCOM03(PHS端末) NintendoDS(ゲーム) Wii(ゲーム) |
(NintedoDSだけが目的ではありませんが…) 導入までの流れは以下のとおりです
- インターフェースユニットの選定
- ドライバの導入
- Linux側の MACフィルタリング DHCPの設定
- 無線LANの設定
- 他の無線LAN機器との接続
インターフェースユニットの選定
ます インターフェースカードの選定に苦労しました
PCIでパソコン内部に設置できることと
802.11bよりも速い通信方式をサポートしていること
Linuxでの動作実績があること
デスクトップパソコン (PCI)で利用できる 無線LANカードは数が少ないようです (2008年購入)
今回は WLI2-PCI-G54S を購入しました
2009年初には結局 USB接続の無線機も購入しました
DS接続(802.11b + 2Mbpsレート + WEP128bit方式)をサポートしていること
Linux動作実績があるもの
なんだかんだと 安さで衝動購入してしまった WLI-UC-G も結果報告します
WLI2-PCI-G54Sドライバの導入
まず カーネルに必要なオプションを設定します
Wireless extensionsは必須です (net_device構造体に 無線LAN系の拡張がなされます)
Improved wireless configuration API はもしかしたら不要かもしれません
(いろいろ試して 少なくとも動いたのがこのオプションです)
また iptables により MACフィルタを行うので Networking Options を次のようにします
次に ドライバですが Linuxネイティブのドライバが存在せず
NDISwrapper という Windowsのドライバを利用するドライバラッパをかませます
上記サイトから ndiswrapper ソースコードを取得し展開します
インストールされるファイルは数としてはそんなにありません
$ tar -tzvf ndiswrapper-1.52.tar.gz $ cd ndiswrapper-1.52 $ make make -C driver make[1]: Entering directory `/home/admin/ndiswrapper-1.52/driver' make -C /usr/src/linux-2.6.24 SUBDIRS=/home/admin/ndiswrapper-1.52/driver make[2]: Entering directory `/usr/src/linux-2.6.24' LD /home/admin/ndiswrapper-1.52/driver/built-in.o CC [M] /home/admin/ndiswrapper-1.52/driver/crt.o CC [M] /home/admin/ndiswrapper-1.52/driver/hal.o CC [M] /home/admin/ndiswrapper-1.52/driver/iw_ndis.o CC [M] /home/admin/ndiswrapper-1.52/driver/loader.o CC [M] /home/admin/ndiswrapper-1.52/driver/ndis.o CC [M] /home/admin/ndiswrapper-1.52/driver/ntoskernel.o CC [M] /home/admin/ndiswrapper-1.52/driver/ntoskernel_io.o CC [M] /home/admin/ndiswrapper-1.52/driver/pe_linker.o CC [M] /home/admin/ndiswrapper-1.52/driver/pnp.o CC [M] /home/admin/ndiswrapper-1.52/driver/proc.o CC [M] /home/admin/ndiswrapper-1.52/driver/rtl.o CC [M] /home/admin/ndiswrapper-1.52/driver/wrapmem.o CC [M] /home/admin/ndiswrapper-1.52/driver/wrapndis.o CC [M] /home/admin/ndiswrapper-1.52/driver/wrapper.o CC [M] /home/admin/ndiswrapper-1.52/driver/usb.o CC [M] /home/admin/ndiswrapper-1.52/driver/divdi3.o LD [M] /home/admin/ndiswrapper-1.52/driver/ndiswrapper.o Building modules, stage 2. MODPOST 1 modules CC /home/admin/ndiswrapper-1.52/driver/ndiswrapper.mod.o LD [M] /home/admin/ndiswrapper-1.52/driver/ndiswrapper.ko make[2]: Leaving directory `/usr/src/linux-2.6.24' make[1]: Leaving directory `/home/admin/ndiswrapper-1.52/driver' make -C utils make[1]: Entering directory `/home/admin/ndiswrapper-1.52/utils' gcc -g -Wall -I../driver -o loadndisdriver loadndisdriver.c make[1]: Leaving directory `/home/admin/ndiswrapper-1.52/utils' $ su # make install make -C driver install make[1]: Entering directory `/home/admin/ndiswrapper-1.52/driver' make -C /usr/src/linux-2.6.24 SUBDIRS=/home/admin/ndiswrapper-1.52/driver make[2]: Entering directory `/usr/src/linux-2.6.24' Building modules, stage 2. MODPOST 1 modules make[2]: Leaving directory `/usr/src/linux-2.6.24' echo /lib/modules/2.6.24/misc /lib/modules/2.6.24/misc mkdir -p /lib/modules/2.6.24/misc install -m 0644 ndiswrapper.ko /lib/modules/2.6.24/misc /sbin/depmod -a 2.6.24 -b / make[1]: /sbin/depmod: コマンドが見つかりませんでした make[1]: [install] エラー 127 (無視されました) make[1]: Leaving directory `/home/admin/ndiswrapper-1.52/driver' make -C utils install make[1]: Entering directory `/home/admin/ndiswrapper-1.52/utils' install -D -m 755 loadndisdriver /sbin/loadndisdriver install -D -m 755 ndiswrapper /usr/sbin/ndiswrapper install -D -m 755 ndiswrapper-buginfo /usr/sbin/ndiswrapper-buginfo NOTE: Windows driver configuration file format has changed since 1.5. You must re-install Windows drivers if they were installed before. make[1]: Leaving directory `/home/admin/ndiswrapper-1.52/utils' mkdir -p -m 0755 /usr/man/man8 install -m 644 ndiswrapper.8 /usr/man/man8 install -m 644 loadndisdriver.8 /usr/man/man8 #
続いて Linuxの設定 MACフィルタの設定を行います
Linuxの ファイアウォール機能である iptablesを用いて セキュリティを確保します
ファイアウォールポリシーとしては 以下のとおりです
「3台(Mebius WILLCOM03 NintendoDS)の MACアドレス以外から通信を受けない」
# iptables -A INPUT -j ACCEPT -i wlan0 -m mac --mac-source **:**:**:**:**:** # iptables -A INPUT -j ACCEPT -i wlan0 -m mac --mac-source **:**:**:**:**:** # iptables -A INPUT -j ACCEPT -i wlan0 -m mac --mac-source **:**:**:**:**:**
3台の MACアドレスの部分は伏字にしてます 実際は MACアドレスを調べて登録します
デフォルトポリシーを iptables -P INPUT DROP としているので
上記ポリシー追加により 指定の MACアドレスからの通信のみ許可されることになります
参考のために 自環境の iptables設定を紹介します
# iptables -L -v Chain INPUT (policy DROP 5920 packets, 1818K bytes) pkts bytes target prot opt in out source destination 60335 4298K ACCEPT all -- lo any anywhere anywhere 60846 78M ACCEPT all -- eth1 any anywhere anywhere 9122 1621K ACCEPT all -- wlan0 any anywhere anywhere MAC **:**:**:**:**:** 0 0 ACCEPT all -- wlan0 any anywhere anywhere MAC **:**:**:**:**:** 14 2472 ACCEPT all -- wlan0 any anywhere anywhere MAC **:**:**:**:**:** 57978 37M ACCEPT !icmp -- eth0 any anywhere anywhere ctstate RELATED,ESTABLISHED 0 0 ACCEPT icmp -- eth0 any anywhere anywhere icmp echo-reply 0 0 ACCEPT icmp -- eth0 any anywhere anywhere icmp echo-request 3 200 ACCEPT icmp -- eth0 any anywhere anywhere icmp destination-unreachable 1 63 ACCEPT udp -- eth0 any anywhere anywhere udp spt:domain Chain FORWARD (policy ACCEPT 261K packets, 225M bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 197K packets, 18M bytes) pkts bytes target prot opt in out source destination # # iptables -L -v -t nat Chain PREROUTING (policy ACCEPT 8397 packets, 2224K bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 7665 packets, 592K bytes) pkts bytes target prot opt in out source destination 173 8316 MASQUERADE all -- any any 192.168.0.0/23 !192.168.0.0/23 Chain OUTPUT (policy ACCEPT 7660 packets, 592K bytes) pkts bytes target prot opt in out source destination #
自マシンが LAN/無縁LAN/インターネット のGWを兼ねていて NIC構成は以下の通りです
(eth0) インターネット向け
(eth1) LAN (192.168.0/24)
(wlan0) 無線LAN (192.168.1/24)
ファイアウォールの設定はなるべく簡素にしています (不要な通信が外に抜けないか警戒する必要があります)
- INPUTチェインのみ デフォルト DROP とし 必要な通信のみ許可設定を入れる
- FORWARDING OUTPUT チェインは設定しない デフォルト ACCEPT
- 外部(192.168.0.0/23以外)への通信は NATするように設定
では 次の設定です DHCP です 無線LAN用に dhcpd.wlan0.conf を用意しました
option domain-name "local"; option domain-name-servers 192.168.1.1; default-lease-time 600; max-lease-time 7200; ddns-update-style none; authoritative; log-facility daemon; subnet 192.168.1.0 netmask 255.255.255.0 { option routers 192.168.1.1; option broadcast-address 192.168.1.255; host mebius { hardware ethernet **:**:**:**:**:**; fixed-address 192.168.1.2; } host ds { hardware ethernet **:**:**:**:**:**; fixed-address 192.168.1.3; } host w03 { hardware ethernet **:**:**:**:**:**; fixed-address 192.168.1.4; } }
MACアドレスは伏字です
各自 無線LANのネットワーク環境にあわせて設定します
以降に紹介する手順では省略しますが 無線LANのインターフェースである wlan0 が有効化したときに
# dhcpd -q -pf /var/run/dhcpd.wlan0.pid -cf /usr/local/etc/dhcpd.wlan0.conf wlan0
のコマンドをいれて wlan0 用の dhcpd を常駐させるようにしましょう
WLI2-PCI-G54S の Windowsドライバが動作するか検証します
手順としては
1. Windowsドライバをダウンロードして一時的なディレクトリの中に展開
2. 適切な .infファイルを ndiswrapperに読み込ませる
ftp.dell.com にある network/R81433.EXE (unzipで解凍可能)での動作実績が
他のホームページでも紹介されていましたが 私の環境では動作しませんでした
同じ dell.com の ドライバダウンロードサイトから
R140747.EXE を使いました 以下の手順で .infファイルを ndiswrapperに読み込ませます
$ mkdir r140747 $ cd r140747 $ unzip R140747.EXE Archive: /home/admin/WLI2-PCI-G54S/r140747.exe inflating: msvcr71.DLL inflating: preflib.dll inflating: README.rtf inflating: setup.exe inflating: setup.inx inflating: Setup.ini inflating: setup.iss inflating: WLBCGCBPRO731.DLL inflating: wltray.exe 〜 〜 inflating: is.exe extracting: launcher.ini inflating: layout.bin inflating: MFC71.DLL inflating: msvcp71.DLL inflating: Version.txt $ cd DRIVER $ ls bcm43xx.cat bcm43xx64.cat bcmwl5.inf bcmwl5.sys bcmwl564.sys $ ndiswrapper -i bcmwl5.inf installing bcmwl5 ... $ ndiswrapper -l bcmwl5 : driver installed
最後の ndiswrapper -l でドライバの一覧を確認しています
一般ユーザ権限でドライバを導入できることに ある意味ビックリしましたが
モジュールのロードには root権限が必要です
$ su # modprobe ndiswrapper # lsmod Module Size Used by ndiswrapper 145084 0 nvidia 4702512 22 # ifconfig wlan0 wlan0 Link encap:Ethernet HWaddr **:**:**:**:**:** unspec addr:[NONE SET] Bcast:[NONE SET] Mask:[NONE SET] BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 Interrupt:21 Memory:ef010000-ef012000
HWaddr の部分は伏字としてますが 16進数の MACアドレスが見えてればOKです
dmesgの出力は
ndiswrapper version 1.52 loaded (smp=no, preempt=no) ndiswrapper: driver bcmwl5 (Broadcom,10/12/2006, 4.100.15.5) loaded ACPI: PCI Interrupt 0000:00:08.0[A] -> GSI 16 (level, low) -> IRQ 21 ndiswrapper: using IRQ 21 wlan0: ethernet device **:**:**:**:**:** using NDIS driver: bcmwl5, version: 0x4 640f05, NDIS version: 0x501, vendor: 'NDIS Network Adapter', 14E4:4318.5.conf wlan0: encryption modes supported: WEP; TKIP with WPA, WPA2, WPA2PSK; AES/CCMP with WPA, WPA2, WPA2PSK usbcore: registered new interface driver ndiswrapper ACPI: PCI Interrupt 0000:01:00.0[A] -> GSI 16 (level, low) -> IRQ 21
最後に iwconfig でのインターフェース設定を行います
# iwconfig wlan0 mode ad-hoc essid '****' key s:'*****' commit # iwconfig wlan0 wlan0 IEEE 802.11b ESSID:"****" Mode:Ad-Hoc Frequency:2.462 GHz Cell: **:**:**:**:**:** Bit Rate=11 Mb/s Tx-Power:32 dBm RTS thr:2347 B Fragment thr:2346 B Encryption key:7368-696B-61 Security mode:restricted Power Management:off Link Quality:0 Signal level:0 Noise level:0 Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0
まず essid ですが任意のアクセスポイント名(英数字)を決めて設定します(一応伏字)
key ですがこれは WEPキー(暗号化)を表します s: に続けて文字列で設定します
WEPキーは 5文字(40/64bit) もしくは 13文字(128bit) で指定します
設定は完了ですが iwconfig の画面で疑問点があります IEEE802.11b(11Mbps)の規格なのです
ハードウェアとしては もっと速い IEEE802.11g(54Mbps)に対応してるはずなのですが
では Mebiusノートの接続から 検証開始します

(↑の写真は SHARP の製品ページ からのパクリものです)

まず 内蔵無線LAN を使用開始にします タッチパッド左手前の無線LANランプが点灯していることを確認します
(ランプが消灯していれば Fnキー + F1キー で無線LANを有効にします)

無線LAN設定ツールを開いて設定します 設定箇所は 赤枠の2箇所です
まず ESSIDを 先ほど Linux側で設定した ESSIDに合わせます
(もしくは スキャンボタンを押して アクセスポイントとして検出されることを確認します)
次に WEPキーを入力します これも先ほどアクセスポイントで設定した 5文字/13文字 です
ノートパソコンと Linux側で DHCPの設定が正しければ ノートパソコンでインターネットが見れるようになります
私の環境では動作OKでした
WILLCOM03の設定です

赤↑の箇所をタッチして 無線デバイスの設定を呼び出します

無線LANデバイスを有効にします 赤↑の箇所をタッチするとデバイスが有効になり MACアドレスが表示されます

無線LANの設定を行います 左上のスタートメニューから「設定」を開いて
「接続」タブを選択します 「ネットワークカード」が設定ツールです

アクセスポイントが検出されると 絵のように ESSIDが見えます
これに対して必要な登録を行います

まず ネットワーク名 として ESSIDが表示されているので正しいことを確認して「次へ」

次が設定のキモの部分です 「データ暗号化」に WEP を指定して
「ネットワークキー」の部分に WEPキー を入力します

IEEE802.1xというのは 端末とアクセスポイントの認証方式で
WILLCOM03 はこの機構をサポートしているようです
WLI2-PCI-G54Sは この機構をサポートしてないためか何も設定できません
最後に「完了」を押して設定完了です

DHCPの設定等が正しければ そのうち「接続済」のステータスとなり
めでたくインターネットにつながります WILLCOM03 もうまく接続できました
次に NintendoDS の検証です
ちょうど ファイナルファンタジー3 のソフトに Wi-Fi の設定ツールが付属しているので
それを使ってみます

Wi-Fi設定のトップ画面です 青いパネルをタッチして設定開始します

3箇所まで設定できます 1箇所目の設定をタッチして
「アクセスポイントの検索」をタッチします

ESSID名が表示されアクセスポイントが認識されました これを選択します
続いて WEPキーの入力画面に移りますので WEPキー を入力します
そのまま 接続テスト の画面に移行した後…

こんな画面で 接続失敗となってしまいます
接続確認でエラー 51300 について ネットを検索してみましたが解決には至りませんでした
wlan0 に対して tcpdump を実施しましたが 通信自体が流れていないことが分かりました
無線LAN物理層の設定が悪いのか 任天堂独自プロトコル?? WEPキーの設定のミスでしょうか
後から調べて分かった話ですが
DSでは WEP 128bit/40bit 802.11b 2Mbps で接続しているようです
今回の WLI2-PCI-G54S は 11Mbps(固定?) だったので通信速度が合わなかったと思われます
ちなみに Buffalo社の AOSSという接続の規格がありますが
これは IPで言うところの DHCP に近い機能で WEPの ESSID と キー を自動設定するものです
今回の失敗の件とは直接関係がないと思われます
別の WLI2-PCI-G54S のドライバを試してみます
いろいろ検索して 他のドライバもあたってみましたが 次に紹介するものが私の環境で動作しました
bcmwl5a.inf
bcmwl5.sys
直リンクです(ごめんなさい) 2つのファイルを同じディレクトリにダウンロードして
# rmmod ndiswrapper # ndiswrapper -r bcmwl5 # ndiswrapper -i bcmwl5a.inf installing bcmwl5a ... forcing parameter IBSSGMode from 0 to 2 forcing parameter IBSSGMode from 0 to 2 #
一旦古いドライバを ndiswrapper -r で削除して入れ直しました
# modprobe ndiswrapper # dmesg 〜 usbcore: deregistering interface driver ndiswrapper ndiswrapper version 1.52 loaded (smp=no, preempt=no) ndiswrapper: driver bcmwl5a (Broadcom,12/22/2004, 3.100.46.0) loaded ACPI: PCI Interrupt 0000:00:08.0[A] -> GSI 16 (level, low) -> IRQ 21 ndiswrapper: using IRQ 21 wlan0: ethernet device **:**:**:**:**:** using NDIS driver: bcmwl5a, version: 0x3642e00, NDIS version: 0x501, vendor: 'NDIS Network Adapter', 14E4:4318.5.conf wlan0: encryption modes supported: WEP; TKIP with WPA, WPA2, WPA2PSK; AES/CCMP with WPA, WPA2, WPA2PSK usbcore: registered new interface driver ndiswrapper
とりあえず ドライバはロードできたみたいです
# ifconfig wlan0 192.168.1.1 netmask 255.255.255.0 up # iwconfig wlan0 mode ad-hoc essid '*******' key s:'*****' commit # iwconfig wlan0 wlan0 IEEE 802.11g ESSID:"*******" Mode:Ad-Hoc Frequency:2.462 GHz Cell: **:**:**:**:**:** Bit Rate=54 Mb/s Tx-Power:25 dBm RTS thr:2347 B Fragment thr:2346 B Encryption key:****-****-****-****-****-****-** Security mode:restricted Power Management:off Link Quality:0 Signal level:0 Noise level:0 Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 #
お IEEE802.11gで認識されているではありませんか
ドライバを入れ換えることで 通信規格が選択できるかも(面倒くさいが)
で これは期待できます NitendoDS と通信できるかも で試した結果
Mebius(PC-MV1-C1W) | 通信OK |
---|---|
WILLCOM03 | つながらない |
NintendoDS | つながらない アクセスポイントは発見できる |
で WILLCOM03 がつながらなかった分さっきよりも結果は悪くなってしまいました
でも確か WILLCOM03は IEEE802.11g サポートされてるはず… ??
結果的に NintendoDS が相変わらず無反応でしたが
とりあえず Linuxで無線LANが使える環境になりました
WILLCOM03の無線機能を ONにしていると明らかに端末が熱をおび
バッテリーを消費してるんだなぁ と分かります 使わない場合は無線機能は OFF にしましょう
WLI-UC-Gドライバの導入
ものの情報によれば
この USBデバイスは Linuxの rt2x00 rt73 ドライバで動作するとのこと
まず Linuxのソースツリーに このドライバがあるか確認してみました
$ cd /usr/src/linux $ find . -name '*rt73*' ./drivers/net/wireless/rt2x00/rt73usb.c ./drivers/net/wireless/rt2x00/rt73usb.h $ $ less drivers/net/wireless/rt2x00/Kconfig config RT2X00 tristate "Ralink driver support" depends on MAC80211 && WLAN_80211 && EXPERIMENTAL ---help--- This will enable the experimental support for the Ralink drivers, developed in the rt2x00 project http://rt2x00.serialmonkey.com. These drivers will make use of the Devicescape ieee80211 stack. When building one of the individual drivers, the rt2x00 library will also be created. That library (when the driver is built as a module) will be called "rt2x00lib.ko". 〜 config RT73USB tristate "Ralink rt73 usb support" depends on RT2X00 && USB select RT2X00_LIB_USB select RT2X00_LIB_FIRMWARE ---help--- This is an experimental driver for the Ralink rt73 wireless chip. When compiled as a module, this driver will be called "rt73usb.ko". 〜 $
以下の内容が読み取れます
rt73 は rt2x00 に依存している
rt2x00 は MAC80211 と WLAN_80211 と EXPERIMENTAL に依存している
従って カーネルのコンフィグ設定画面では
“Prompt for development and/or incomplete code/drivers” を有効にした上で
WLAN_80211 は WLI2-PCI-G54Sの作業のときに有効にしていたので
次は rt73 を有効にします
今回の WLI-UC-G の USB上での ベンダID, 製品ID はそれぞれ 0x0411, 0x0137 でした
rt73ドライバが この IDを認識するように追加する必要があります
カーネルソースの drivers/net/wireless/rt2x00/rt73usb.c を書き換えます
2033 /* Billionton */ 2034 { USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) }, 2035 /* Buffalo */ 2036 { USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) }, 2037 { USB_DEVICE(0x0411, 0x0137), USB_DEVICE_DATA(&rt73usb_ops) }, 2038 /* CNet */ 2039 { USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) }, 2040 { USB_DEVICE(0x1371, 0x9032), USB_DEVICE_DATA(&rt73usb_ops) }, 2041 /* Conceptronic */ 2042 { USB_DEVICE(0x14b2, 0x3c22), USB_DEVICE_DATA(&rt73usb_ops) },