昨日やったイーサネットでの受信 ではとりあえず動いてはいるがまともに受信できてないので, きちんと受信できるように修正したい.
で,エンディアンとかタイミングとかを全体的に見直し.
main.v
rx.v
tx.v
ether_ctrl.v
ether_rx.v
ether_tx.v
memory.v
s3astarter.ucf
基本的な動作は変わっていない. コマンド体系も前回と同じ.
で,さっそく試してみる. 前回同様, スタータキットと FreeBSD のPCをクロスケーブルで直結し, FreeBSD側から投げたフレームをスタータキットで受信する.
まずはフレーム送信に使う FreeBSD マシンの設定.
teapot# ifconfig udav0 up teapot# ifconfig udav0 inet 192.168.10.1/24 teapot# ifconfig udav0 media 100baseTX teapot# ifconfig udav0 ether 00:01:23:45:67:89 teapot# ifconfig udav0 udav0: flags=108943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500 inet 192.168.10.1 netmask 0xffffff00 broadcast 192.168.10.255 ether 00:01:23:45:67:89 media: Ethernet 100baseTX status: active teapot#ifconfig でIPアドレスなどを設定する. 実験用として,MACアドレスを 00:01:23:45:67:89 というものすごーくてきとうな ものに設定している.
次にスタータキットをシリアルで FreeBSD マシンに接続し,スタータキットを起動.
teapot# cu -l /dev/cuad0 Connected READYREADYが出たらSコマンドでリセットし,Gコマンドでリンクアップの確認.
teapot# cu -l /dev/cuad0 Connected READY$S+SET$G+7809$G+780d0x7809→0x780dなので,リンクアップしていることがわかる.
次に,AコマンドとRコマンドで受信バッファの状態の確認.
teapot# cu -l /dev/cuad0 Connected READY$S+SET$G+7809$G+780d$A+00000000$R+00000000 ~~~ ~~~ Aコマンド Rコマンドサイズゼロ,バッファ先頭もゼロクリアされていることが確認できる.
フレームをキャプチャして確認するために,FreeBSDでwiresharkを起動する.
wiresharkでは udav0 に対してキャプチャを開始する. 注意として,FreeBSD-6.x では以下のようにしないとうまくキャプチャできない.
で,キャプチャ開始した状態で,FreeBSDマシンから ping を投げる.
hiroaki@teapot:~>% ping -c 1 192.168.10.2 PING 192.168.10.2 (192.168.10.2): 56 data bytes ^C --- 192.168.10.2 ping statistics --- 1 packets transmitted, 0 packets received, 100% packet loss hiroaki@teapot:~>%これにより,アドレス解決しようとしてARPフレームが投げられる.
wiresharkで見ると,たしかにARPが投げられていることがわかる.
これでスタータキット側でも受信できているはずなので, Aコマンドでサイズを確認する.
teapot# cu -l /dev/cuad0 Connected READY$S+SET$G+7809$G+780d$A+00000000$R+00000000$A+00000010 ~~~ Aコマンドさっきとは異なり,サイズとして 0x00000010 を応答している. 4バイト単位で処理しているので,64バイトを受信していることがわかる.
Rコマンドで受信バッファの中身を見てみよう.
teapot# cu -l /dev/cuad0 Connected READY$S+SET$G+7809$G+780d$A+00000000$R+00000000$A+00000010$R+ffffffff$R+ffff0001$R+23456789$R+08060001$R+08000604$R+00010001$R+23456789$R+c0a80a01$R+00000000$R+0000c0a8$R+0a020000$R+00000000$R+00000000$R+00000000$R+00000000$R+168d631e$R+00000000$R+00000000$R+00000000$R+00000000 ~~~ → Rコマンドえーと,これではわかりにくいので,受信したデータを整理すると以下のようになる.
0x0000 ffffffff ffff0001 23456789 08060001 0x0010 08000604 00010001 23456789 c0a80a01 0x0020 00000000 0000c0a8 0a020000 00000000 0x0030 00000000 00000000 00000000 168d631e 0x0040 00000000 00000000 00000000 00000000wiresharkでのキャプチャ結果に一致している.バッチリだ.
先頭6バイトの ff の連続はARPの宛先MACアドレス(ブロードキャストなのでオール1), その直後の6バイト 0x000123456789 は FreeBSD 側の送信MACアドレスになっている. あとは0x0806がARPフレームを指し,フレームの内容が続いている. 注意として,最後に FCS として,0x168d631e という値が受信できている. ここで,FCSも含めて64バイトになっていることに注意. イーサネットの最小フレームサイズは64バイトだが,これはFCSも含めてのサイズ なので,送信できるデータの(宛先MACアドレスなども含んでの)最小サイズは 60バイトということになる.
とりあえず受信はそれっぽくできた.あとはPHYのループバック機能を利用して, 送信のデバッグをしたい.