昨日やったイーサネットでの受信 ではとりあえず動いてはいるがまともに受信できてないので, きちんと受信できるように修正したい.
で,エンディアンとかタイミングとかを全体的に見直し.
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のループバック機能を利用して, 送信のデバッグをしたい.