NI-USRP 2954 10GbEサンプルプログラムからpingは返ってくるのか?(2)

こんにちは。ドルフィンシステム福島です。

今回は2020/02/03の続きです。
以前10GbEイーサネットを有効にしたNI USRP-2954Rでpingが返ってこない?ところまで確認しました。今日はその原因をFPGAソースコードを見て探ってみます。

ソースコードを探ってネットワークフレームがどのように処理されるか見る

まずFPGA側のトップレベル(TenGbE_FPGA.vi)を見てみます。
以下は、前々回でもお見せしましたが、PORT 0 の処理です。
SFP+コネクタでのイーサネットフレーム送受信を行っている部分ですね。
実際には、RxやTxと書かれているVI内で処理が行われています。



開いてみるとこのようになっています。
右側半分の最終出力は"debug data"となっており処理には関係ないので、画像に入っていません。
左端の端子からイーサネットが受信したデータが入ってきて、Host Rx FIFOへの書き込んでソフトにデータを渡すところまでが一連の流れのようです。



左端の端子は、恐らくイーサネットコントローラーからの生のデータ(イーサネットフレーム)が流れてきていると思われます。
その次のVIの中では、MACアドレスなどの抽出が行われARPコマンドの応答処理が実装されています。出力しているのは"MAC Data Stream"なのでイーサネットフレームが出ていると思いきや、実際にはIPv4パケットが出てきます。



更にその次のVIが出力しているのは、IPv4ヘッダ情報などが解析されたIPv4パケットが出てきます。



更にその次のVIが出力しているのが"UDP Data Stream"となっていますので、UDPパケットです。



生のデータ→イーサネットフレーム→IPv4パケット→UDPパケット→ホストのFIFOへ
というふうに順番にパケットを解析しデータを抽出しホストに渡しているようです。

で、pingは返ってくるのか?

結論から申し上げますとpingは返ってきません。
上記のVIを深く探っていくと、イーサフレームのバッファリングやIPパケットの構築、UDPパケットの抽出などの処理が行われていますがpingの応答のコードは入っていませんでした。
これらのコードも紹介しようと思ったのですが、複雑で見るだけでうんざりするので、紹介しません。

もしご興味がありましたら、

  • niInstr Network ARP FPGA v1.lvlib:Stream ARP Filter.vi
  • niInstr IPv4 FPGA v1.lvlib:Stream Filter IPv4.vi
  • niInstr IPv4 UDP FPGA v1.lvlib:UDP Rx State Machine.vi

などを見て下さい。

生データを取得する

ソースコードを探っているうちに、"RAW Mode"を見つけました。
こちらのスイッチをオンにするとIPv4パケットが直接取得できそうです。

実際にやってみました。
「NI USRP-2954で10GbEを動かしてみる」で紹介した "Getting Started (Loopback Test).vi"を動かしてみます。

まず何も改変せず、通常の状態。ループバック接続なので、インクリメントしたデータを送信し受信しました。



次にFPGAの値を設定するコードを追加し、RAW Modeをオンにします。



するとヘッダらしきデータが流れてきました。



このデータを解析してみると、やはりUDP/IPパケットです。



ということは、このUDPペイロード部分をうまく活用すればUSRP間で制御なども出来ますし、生のイーサネットフレームをホストまで持ってきてlwipに接続すればTCP/IP通信も出来そうです。

まとめ


  • ping応答は実装されていないのでpingは返ってこない
  • RAW Modeをオンにすることで、IPv4パケットを取得することが出来る

というわけで、今回は10GbEのパケットの中身を見てみました。

私たちドルフィンシステムは、お客様の様々な要望に答えられるような知見の蓄積・環境の構築を行い、最適な無線システムを提案していけるよう努力しております。

SDRを用いた無線システムのご要望はドルフィンシステムへ。

以上、ドルフィンシステム福島でした。


コメント