ハードウェア・ イーサIPコアを解読する

Similar documents
回路 7 レジスタ ( 同期イネーブル及び非同期リセット付 ) 入力データを保持するのに用いる記憶素子 使用用途として, マイクロプロセッサ内部で演算や実行状態の保持に用いられる Fig4-2 のレジスタは, クロック信号の立ち上がり時かつ 信号が 1 のときに外部からの 1 ビットデータ R をレ

Microsoft Word - 実験4_FPGA実験2_2015

- VHDL 演習 ( 組み合せ論理回路 ) 回路 半加算器 (half adder,fig.-) 全加算器を構成する要素である半加算器を作成する i) リスト - のコードを理解してから, コンパイル, ダウンロードする ii) 実験基板上のスイッチ W, が, の入力,LED, が, の出力とな

if clear = 1 then Q <= " "; elsif we = 1 then Q <= D; end rtl; regs.vhdl clk 0 1 rst clear we Write Enable we 1 we 0 if clk 1 Q if rst =

履歴 修正日 内容 2011/01/18 第 1 版制定 2012/10/ 版 内容 Bee Beans Technologies 社から配布されているネットワーク プロセッサ (SiTCP) のライブラリ使用方法を解説した文書です SiTCP の概要や各信号意味などは別文書 SiTCP

Microsoft PowerPoint LC_15.ppt

問 2. タイミングチャート以下に示す VHDL コードで記述されている回路に関するタイミングチャートを完成させよ ) レジスタの動作 use IEEE.std_logic_64.all; entity RegN is generic (N : integer := 8 port ( CLK, EN

2ALU 以下はデータ幅 4ビットの ALU の例 加算, 減算,AND,OR の4つの演算を実行する 実際のプロセッサの ALU は, もっと多種類の演算が可能 リスト 7-2 ALU の VHDL 記述 M use IEEE.STD_LOGIC_1164.ALL; 00 : 加算 use IEE

Microsoft PowerPoint - 集積回路工学_ ppt[読み取り専用]

エンティティ : インタフェースを定義 entity HLFDD is port (, : in std_logic ;, : out std_logic ) ; end HLFDD ; アーキテクチャ : エンティティの実現 architecture RH1 of HLFDD is <= xor

TECH_I Vol.25 改訂新版PCIデバイス設計入門

TFTP serverの実装

VelilogHDL 回路を「言語」で記述する

// このクラスの有効期間中の各呼び出しに使用される キャッシュされた Socket オブジェクト Socket socket = null; // 非同期処理が完了したことを通知するために信号を送るオブジェクト static ManualResetEvent clientdone = new Ma

第1回 ネットワークとは

PowerPoint プレゼンテーション

Microsoft PowerPoint ppt [互換モード]

Verilog HDL による回路設計記述

情報通信の基礎

Microsoft PowerPoint - lecture rev00.pptx

QuartusII SOPC_Builderで利用できるGPIF-AVALONブリッジとは?

VHDL VHDL VHDL i

スライド 1

bitvisor_summit.pptx

スライド 1

MU120138A 10ギガビットイーサネットモジュール 製品紹介

【注意事項】RXファミリ 組み込み用TCP/IP M3S-T4-Tiny

Microsoft PowerPoint - KHPCSS pptx

Singapore Contec Pte Ltd. Opening Ceremony

2) では, 図 2 に示すように, 端末が周囲の AP を認識し, 認識した AP との間に接続関係を確立する機能が必要である. 端末が周囲の AP を認識する方法は, パッシブスキャンとアクティブスキャンの 2 種類がある. パッシブスキャンは,AP が定期的かつ一方的にビーコンを端末へ送信する

スライド 1

内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

オペレーティング システムでの traceroute コマンドの使用

パケットモニター (Wireshark) の使い方 第 1 版 1.Wireshark とは ネットワーク上 (LAN ケーブルに流れている ) のパケットを取得して その中の情報を画面に表示するソフトウェア (LAN アナライザーまたはパケットモニター ) の 1 つに Wiresh

4-5. ファイアウォール (IPv6)

4-4. ファイアウォール (IPv4)

スライド 1

ディジタル回路 第1回 ガイダンス、CMOSの基本回路

第1回 ネットワークとは

Ethernet 開発支援ツール ACCEL ti2k (LastUpdate Mar 1, 2019) 概要ターミナルツール (1) TcpTermS.exe ターミナルツール (2) TcpTermM.exe ターミナルツール (3) UdpTermS.exe ターミナルツール (

計算機アーキテクチャ

ex04_2012.ppt

Microsoft PowerPoint - about_stack_ ppt [互換モード]

アナログ・接点変換器

FPGA と LUPO その1

デザインパフォーマンス向上のためのHDLコーディング法

Microsoft PowerPoint - lecture rev00.pptx

GIGA光SW-HUB

Microsoft PowerPoint - diip ppt

コンバージドファブリック仕様一覧

Nios II - PIO を使用した I2C-Bus (2ワイヤ)マスタの実装

PowerPoint Presentation

iCLR

Microsoft Word - アプリケーションノート_Vehicle-SpyEEVBデモガイド編_A02.docx

-2 外からみたプロセッサ GND VCC CLK A0 A1 A2 A3 A4 A A6 A7 A8 A9 A10 A11 A12 A13 A14 A1 A16 A17 A18 A19 D0 D1 D2 D3 D4 D D6 D7 D8 D9 D10 D11 D12 D13 D14 D1 MEMR

8051 개발보드 메뉴얼

p_network-management_old-access_ras_faq_radius2.xlsx

[公開OK][空閑さん資料]kuga-ovs-fpga.pptx

モータ HILS の概要 1 はじめに モータ HILS の需要 自動車の電子化及び 電気自動車やハイブリッド車の実用化に伴い モータの使用数が増大しています 従来行われていた駆動用モータ単体のシミュレーション レシプロエンジンとモータの駆動力分配制御シミュレーションの利用に加え パワーウインドやサ

Microsoft PowerPoint - LogicCircuits11note.ppt [互換モード]

III 1 R el A III 4 TCP/IP プロトコルと 関連する各種上位プロトコルの基礎を学ぶ 具体的には 各プロトコルを実装したコマンド ( アプリケーションプログラム ) を実行し 各プロトコルの機能等を確認する また 同じプロトコルを実装したコンピュータ間では OS

Packetmasters/ Sessionmaster Network Packet Brokers ネットワーク パケットブローカ

2.5 トランスポート層 147

PowerPoint プレゼンテーション

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

スライド 1

スイッチ ファブリック

ソフトウェア基礎技術研修

インターネット,LAN,ネットワークに関する知識

PowerPoint プレゼンテーション

Microsoft PowerPoint - JANOG19-u10-GigaPcap(NonAnim).ppt

MINI2440マニュアル

Microsoft PowerPoint ppt

InfoPrint 5577/5579 ネットワーク設定ガイド(第5章 UNIX/Linux環境で使用する)

InfoPrint 5577/5579 ネットワーク設定ガイド(第4章 UNIX/Linux環境で使用する)

(Microsoft Word - DDR\203\215\203W\203A\203i\215\\\220\254-ver0619.doc)

Cisco Unified IP Phone のモデル情報、 ステータス、および統計の表示

FTP_RW_ProgramDescription_jp_V100

[ 参照規格一覧 ] JIS C5973 (F04 形単心光ファイバコネクタ ) JIS C6835 ( 石英系シングルモード光ファイバ素線 1991) JIS C6832 ( 石英系マルチモード光ファイバ素線 1995) IETF RFC791(Internet Protocol

フリップフロップ

ゴール インターネットの動作原理を理解する インターネットは様々な技術が連携して動作する 家族に聞かれて説明できるように主要技術を理解する

Microsoft PowerPoint ppt

IPsec徹底入門

プログラミングI第10回

2.RL78 での割り込み処理 ( 割り込み受け付け ) マスクが解除された (xxmk ビットが 0 の ) 割り込み要求信号は 2 つの用途で使用されます 一つ目は,CPU のスタンバイ状態の解除です この動作は, 割り込み優先順位とは全く無関係で, マスクされていない (xxmk=0 の )

<4D F736F F F696E74202D C190DD B A CB48D65208E DC58F49205B8CDD8AB B83685D>

ip nat outside source list コマンドを使用した設定例

PowerPoint Presentation

SimscapeプラントモデルのFPGAアクセラレーション

目次 1 本アプリケーションノートの目的 送信手順 基本的な送信方法 キャリアセンスなし送信 キャリアセンスあり送信 ACK 期待送信 フレームメモリへのデータの設定 INFO

エンタープライズ ソリューション カンファレンス IT Technical Seminar V15 (2014) SDNフレームワークの解説と OpenFlowコントローラのプログラミング および実演 2014年6月20日 株式会社オープントーン 金融ソリューション事業部 菱野孝史

ETCB Manual

SIP を使った簡単な通話 ( とりあえず試してみよう ) 相手 IP アドレスがわかっており ネットワークに接続されているとき INVITE 200 OK SIP 端末 (MSN Messenger) SIP 端末 (YAMAHA ルータ ) SIP アド

Microsoft PowerPoint - 11Web.pptx

< 動作マトリクス > 停止 REQ 固定位置 REQ 往復 REQ 停止 () 現在位置と同じなら無視異なれば停止パルス中へ 停止パルス中へ 停止 ( 固定位置 ) 現在位置と同じなら無視異なれば停止パルス中へ 停止パルス中へ 停止パルス中 ( 停止パルス終了後 ) ( 停止パルス終了後動作 )

MPLS での traceroute コマンド

ルート プロセッサ

目次 1 I2Cとは 13 結線写真 2 センサの多くがI2Cに対応 14 WHO_AM_I 3 マイコンでのI2C通信例 15 I2C読込みプログラム 4 とは 16 I2C読込みスクリプト概要① 5 タイミングパラメータ 17 I2C読込みスクリプト概要② 6 書込み 18 センサ読込みプログラ

Cisco CSS HTTP キープアライブと ColdFusion サーバの連携

Microsoft PowerPoint pptx

Transcription:

ハードウェア イーサ IP コアを理解する 2017 年 8 月 14 日 なひたふ for seccamp 17

いきなりですが 最初に 10GbEther のコードを解析します cosmok-10gbe-test cosmok-10gbe-test.srcs sources_1 new top.vhd というのを開いてください

動作環境 XILINX の Kintex-7 XC7K160T を搭載したボードに 10Gbps の光ファイバモジュール (SFP+) を挿して使います 10GbE の光をメタルに変換するため 市販の SW HUB を使います

Kintex-7 XC7K160T とは トランシーバ (GTX) 内蔵 10Gbps の信号を 8 本出せる 162,240 個のロジックセル 600 個のハードウェア乗算器 25 18bit を 1 クロックで計算 11.7Mbit の内蔵 RAM かなりすごいFPGA 普通の用途ならこれで十分

SFP+ のコアは XILINX の IP コアを使用 難解な制御ポートがいっぱいあるのでちょっと難しい 詳しくはソースを見てください

メインのコード process (core_clk) begin if rising_edge(core_clk) then case tx_state is when TX_STATE_IDLE => if tx_en = '1' then xgmii_txd <= x"d5555555555555fb"; -- FB: start of frame xgmii_txc <= x"01"; tx_count <= 0; tx_state <= TX_STATE_SENDING; else xgmii_txd <= x"0707070707070707"; xgmii_txc <= (others => '1'); end if; when TX_STATE_SENDING => tx_count <= tx_count + 1; case tx_count is when 0 => xgmii_txd <= x"addeffffffffffff"; xgmii_txc <= (others => '0'); when 1 => xgmii_txd <= x"01000608fecaefbe"; xgmii_txc <= (others => '0'); when 2 => xgmii_txd <= x"adde010004060008"; xgmii_txc <= (others => '0'); when 3 => xgmii_txd <= x"04030201fecaefbe"; xgmii_txc <= (others => '0'); when 4 => xgmii_txd <= x"0605000000000000"; xgmii_txc <= (others => '0'); when 5 => xgmii_txd <= x"0000000000000807"; xgmii_txc <= (others => '0'); when 6 => xgmii_txd <= x"0000000000000000"; xgmii_txc <= (others => '0'); when 7 => xgmii_txd <= x"0000000000000000"; xgmii_txc <= (others => '0'); when 8 => xgmii_txd <= x"d3f23ec300000000"; xgmii_txc <= (others => '0'); when 9 => xgmii_txd <= x"07070707070707fd"; -- FD: end of frame xgmii_txc <= (others => '1'); when others => xgmii_txd <= x"0707070707070707"; xgmii_txc <= (others => '1'); tx_state <= TX_STATE_IDLE; end case; end case; end if; end process;

10GbE 送信のステートマシン TX_STATE_SENDING 0 9 TX_STATE _IDLE en = = '1' ならば "D5555555555555FB" を送信 en = ='0' ならば "0707070707070707" を送信 en=='1' 1 2 3 4 5 8 7 6 10 ADDEFFFFFFFFFFFF 01000608FECAEFBE ADDE010004060008 04030201FECAEFBE 0605000000000000 0000000000000807 0000000000000000 0000000000000000 D3F23EC300000000 07070707070707FD 0707070707070707

送信しているデータの意味 STATE IDLE D5555555555555FB FBはSTART 55はプリアンプル D5はStartFrameDelimiter 0 ADDEFFFFFFFFFFFF FFFFFFFFFFFF は送信先 MAC 1 01000608FECAEFBE DEADBEAFCAFE は送信先 MAC 0806 は ARP 2 ADDE010004060008 0001 0800 0604 0001 で ARP REQUEST 3 04030201FECAEFBE DEADBEAFCAFE は送信元 MAC 010203040000 を探す 4 0605000000000000 5 0000000000000807 6 0000000000000000 7 0000000000000000 8 D3F23EC300000000 C33EF2D3 は FCS 9 07070707070707FD FD はフレームの終端 10 0707070707070707 07 は IDLE

どんな波形が出るのか? イーサのフレームと 64b/66b の制御コードが混ざってわかりにくいけど大目に見てください STATE IDLE SEND IDLE COUNT TXC 1 2 3 4 5 6 7 8 9 10 FF 01 00 FF TXD IDLE STAR T MAC MAC 0806 ARP TYPE SRC +FCS IDLE IDLE IDLE

実機で動作 ( 送信波形 ) 156.25MHz のクロックで 64bit を送信 (10000Mbps のレート ) 64b/66b 変換されるので 156.25 66=10.312Gbps 光ファイバ上のレートは 10.3124Gbps

送信 受信のループバック SFP を半分ずらして挿すとループバックできる 送信したパケットが戻ってきているのが見える

途中まとめ (FPGA での信号生成理 ) カウンタをぐるぐる回して ある値のときに特定の値を出力するような回路を作る プログラムカウンタみたいな感じ たくさんの条件分岐を付けると 複雑な波形が出せるようになります

本題 100M イーサの回路を解析しよう

全体的な構成 受信した IP アドレス MAC アドレス RX AXI-S arp_auto reply tx_arp_0 udp_src (DoS 用 ) GTX ether_core arp_table inserter tx_arp_1 (DoS 用 ) tx_ping_0 (DoS 用 ) axi interconnect arp_table tx_arp_1 (PING 応答用 ) icmp_reply AXI-S TX AXI-S

受信系の全体的な動作 ether_core は 受信したパケットを AXI Stream(AXI-S) で出力する axi_auto_reply は ARP 要求を受信したらパケットを解析して相手先 MAC アドレスと IP アドレスを抽出する tx_arp は 自分の MAC アドレスと IP アドレスを AXI-S で送る arp_table_inserter は 受信したパケットから MAC/IP の組を取り出し メモリに書き込む icmp_reply は PING のエコーを返す

イーサネットコア 物理層 (GTX) の処理を内包しています プリアンプルや FCS(CRC32) の処理をしています とにかく 送信したいイーサネットのフレーム (MAC アドレス ~FCS の手前まで ) を AXI-S で入れれば送信されます 受信したイーサネットのフレームが AXI-S 出てきます AXI-S の TLAST の次がパケットの先頭です 中身は複雑なので後回し

ARP 自動応答 (axi_auto_reply) コア まずはこれを読み解こう

ソースファイルの開き方 モジュールを選択して 右クリック Go to source で開きます

ステートマシンが入っています ステートは ST_READY ST_RECEIVING ST_SKIP の 3 つ そういえば ARP Request のパケットはこんな感じだったはず 6 6 2 2 2 2 2 6 4 6 4 DEST MAC SRC MAC TY PE H W PR HP OP SRC MAC SRC IP TGT MAC TGT IP CR C 0806 0001 0800 0004 0001

ST_READY when ST_READY => tvalidが来たら count <= 0; tx_go <= '0'; if (s_axis_tvalid = '1') then count <= 1; src_mac (47 downto 32) <= s_axis_tdata(15 downto 0); state <= ST_RECEIVING; end if; 受信データの下 16bitをSRC_MACの上位 16bitに格納

ST_RECEIVING count という内部信号でどの部分をキャプチャしているかを判別 count=1 なら src_mac の下 32bit count= 1,2 ではタイプなどを判別望んだタイプ (ARP REQ) でないならば SKIP ステートへ count= 3 では ソース IP を獲得 count=4 では 宛先 IP を獲得 count=5 で 宛先 IP が自分の IP だったら tx_go を '1' にして ST_SKIP へ tlast が来たら ST_READY へ when ST_RECEIVING => if (s_axis_tvalid = '1') then count <= count + 1; if (count = 1) then src_mac (31 downto 0) <= s_axis_tdata(63 downto 32); if (s_axis_tdata(31 downto 0) /= x"08060001") then state <= ST_SKIP; end if; elsif (count = 2) then if (s_axis_tdata(63 downto 16) /= x"080006040001") then state <= ST_SKIP; end if; elsif (count = 3) then src_ip <= s_axis_tdata(31 downto 0); elsif (count = 4) then dst_ip(31 downto 16) := s_axis_tdata(15 downto 0); elsif (count = 5) then dst_ip(15 downto 0) := s_axis_tdata(63 downto 48); if (dst_ip = self_ipv4_addr) then tx_go <= '1'; end if; state <= ST_SKIP; end if; if (s_axis_tlast = '1') then state <= ST_READY; end if; end if;

ST_SKIP tx_go を '0' に戻す tlast が来たら ST_READY に戻る when ST_SKIP => tx_go <= '0'; if (s_axis_tlast = '1') then state <= ST_READY; end if;

axi_auto_reply の動作 動作をまとめるとこんな感じ tvalid == 1 ST_READY tlast == 1 tlast == 1 ST_RECEI VING ST_SKIP tx_go を 1 にする ARP でないものを受信したもしくは 自分宛の ARP を受信した ( このときは tx_go を 1 にする )

ステートマシン連携のための出力処理 tx_arp_valid ARP 送信ステートマシン tx_arp_ack tx_go が '1' ならば tx_arp_valid を '1' にする tx_arp_ack が '1' ならば tx_arp_valid を '0' に戻す ARP 受信ステートマシン tx_go は一瞬 (1 クロック分 ) しか出ないので それを後段のステートマシンが受理するまで出力を保留しておくための仕組み process (clk) begin if (rising_edge(clk)) then if (tx_go = '1') then tx_arp_valid <= '1'; end if; if (tx_arp_ack = '1') then tx_arp_valid <= '0'; end if; end if; end process;

ARP 送信コア tx_arp_0 というコア 内部のステートは STATE_IDLE STATE_SENDINGの2つ tx_arp_validが来たらarp 応答を返し tx_arp_ackを立てる

ARP のテンプレートを定義 constant TEMPLATE_SIZE_IN_BYTE : integer := 60; constant TEMPLATE_WIDTH : integer := 8 * TEMPLATE_SIZE_IN_BYTE; constant TEMPLATE_ARP : std_logic_vector (TEMPLATE_WIDTH-1 downto 0) :=( -- 42 byte without padding x"ffffffffffff" & -- Target MAC Address (broadcast) [6 byte] x"deadbeefcafe" & -- Source MAC Address [6 byte] x"0806" & -- Type: ARP [2 byte] x"0001" & -- HardwareType: Ethernet [2 byte] x"0800" & -- Protocoltype: IPv4 [2 byte] x"06" & -- HardwareLength [1 byte] x"04" & -- ProtocolLength [1 byte] x"0001" & -- Operation: ARP Request [2 byte] x"deadbeefcafe" & -- Source Hardware Address [6 byte] 28 x"01020304" & -- Source Protocol Address [4 byte] x"000000000000" & -- Target Hardware Address [6 byte] x"01020305" & -- Target Protocol Address [4 byte] x"00000000_00000000_00000000_00000000_0000"-- padding [18 byte] ); signal template : std_logic_vector (TEMPLATE_WIDTH-1 downto 0); 2017/8/14 signal template_tx_count : integer; (C) なひたふ for seccamp17

STATE_IDLE の動作 tx_arp_validが来たら template_vという変数を更新 arp_requestならタイプを0001 replyならタイプを0002に tvalidとtstrbを立てる template_tx_countを8に (8ワード送信の意味) tx_arp_ackを立てて arp_auto_replyに受理を通知 テンプレートの上位 64bitをAXI_Sに送信

変数の活用 VHDL の変数は実際の信号ではなく 仮想的なもの signal とは違って上書きできる template_v := TEMPLATE_ARP; template_v(template_width -1 downto TEMPLATE_WIDTH- 6*8) := tx_arp_dst_mac_addr; template_v(template_width- 6*8-1 downto TEMPLATE_WIDTH-12*8) := tx_arp_src_mac_addr; template_v(template_width-22*8-1 downto TEMPLATE_WIDTH-28*8) := tx_arp_src_mac_addr; template_v(template_width-28*8-1 downto TEMPLATE_WIDTH-32*8) := tx_arp_src_ipv4_addr; template_v(template_width-32*8-1 downto TEMPLATE_WIDTH-38*8) := tx_arp_dst_mac_addr; template_v(template_width-38*8-1 downto TEMPLATE_WIDTH-42*8) := tx_arp_dst_ipv4_addr; if (tx_arp_request = '1') then -- ARP Request template_v(template_width-20*8-1 downto TEMPLATE_WIDTH-22*8) := x"0001"; else -- ARP Reply template_v(template_width-20*8-1 downto TEMPLATE_WIDTH-22*8) := x"0002"; end if; template <= template_v; ここで signal に代入 ( 実体化される )

STATE_SENDING での動作 template_tx_count の回数だけこの状態でループ 最後の 1 回は tlast を立てる tx_arp_ack <= '0'; m_axis_tvalid <= '1'; if (m_axis_tready = '1') then template_tx_count <= template_tx_count - 1; template(template_width-1 downto AXIS_DATA_WIDTH) <= template(template_width-axis_data_width-1 downto 0); template(axis_data_width-1 downto 0) <= (others => '0'); if (template_tx_count <= 1) then m_axis_tlast <= '0'; m_axis_tvalid <= '0'; state <= STATE_IDLE; elsif (template_tx_count <= 2) then m_axis_tlast <= '1'; m_axis_tstrb <= "11110000"; -- FIXME if AXIS_DATA_WIDTH is modified else m_axis_tlast <= '0'; end if; end if;

tx_arp の動作 動作をまとめるとこんな感じ tx_arp_request == 1 ならば tvalid を立てて遷移 STATE_ID LE STATE_SE NDING tlast を立てて遷移 カウンタが残っている

ARP テーブルの管理 ARP テーブルをキャッシュしておくと 毎回 ARP リクエストをしなくてよいので高速化できる ARP テーブルは 素早く検索したいから SRAM に入れる 仕組みは arp_table_inserter を読んでみよう ARP テーブルインサータ SRAM (BlockRAM という )

arp_table_inserter のステートマシン ST_READY 何かを受信した & イーサフレームの宛先が自分かFFFFFFFFなら動き出す ST_RECEIVING ARP REPLYでなければST_SKIPへ 有効なARP REPLYを受信したら 送信元 IPと送信元 MACを抽出して arp_table_weを '1' に ST_SKIP TLASTが来るまで待つ

SRAM への出力のくふう このハッシュって何? arp_table_dout <= "1" & src_ip & src_mac; arp_table_addr <= arp_table_hash(src_ip, ARP_TABLE_ADDR_WIDTH); 実体は別ファイル (utils.vhd) で定義されている function arp_table_hash(ip_addr : std_logic_vector; width : integer) return std_logic_vector is variable sum : std_logic_vector(15 downto 0); begin sum := std_logic_vector(unsigned(ip_addr(31 downto 16)) + unsigned(ip_addr(15 downto 0))); return sum(width-1 downto 0); end function; IP アドレスの上 16bit と下 16bit を加算して それをメモリのアドレスとしている つまり 192.168.1.1 と 192.168.1.2 と 192.168.2.1 の MAC を格納するアドレスが別々になる

次のモジュールを読んでみよう tx_ping 自ら PING を出すモジュール icmp_reply 受信した PING に応答するモジュール dummy_udp_src UDP のパケットの中身を作る tx_udp UDP のヘッダを被せたりチェックサムの計算 axis_data_fifo UDP のヘッダを被せるための一時記憶

UDP 送信モジュール 上位から送られてきた信号 axis_s_tvalid axis_s_tlast axis_s_tdata 下位へ送る信号 axis_m_tvalid ペイロード 受信したペイロードから IP と UDP のチェックサムをリアルタイムに計算する axis_m_tlast axis_m_tvalid ヘッダを付けて送信 ペイロード ペイロードの全体を見ないとチェックサムを計算できないので 遅延が生じてしまう

説明したイーサネット回路の機能 イーサネットコアは AXI-S で イーサネットフレームを入出力する イーサネットコアの上に様々な基本機能を追加 ARP PING に応答 ARP キャッシュテーブルを実装 PING REQ 送信の前に ARP REQ をするという本格仕様 PING ARP UDP をワイヤレートで送信可能 DoS 攻撃に最適

まとめ ソフトウェアでイーサネットのプロトコルスタックを作ると データのコピーがたくさん発生してしまう チェックサム計算のために遅延が生じるのは仕方がないが チェックサム計算中にも次のデータを受け入れ可能にできる ( パイプライン ) ので ワイヤスピードで動作させることができる ステートマシンを使えば 1クロック単位で自由自在に波形が作れる