『 How to make FPGA router for high-speed networks』 Keio University SFC Murai lab Takeshi Matsuya [email protected] 1 Open Router Competition • INTEROP 2012 event at Makuhari Messe • • Theme • • 13.June.2012 Improve OpenRouter regardless of software or hardware. http://www.interop.jp/2012/orc/ 2 WHAT’S FPGA? Field Programmable Gate Array Address 24bit Address 4bit RAM 16MB Data 8bit FPGA 4LUT Data 1bit 16bit memory A B C D AND AND OR (A == 1 and B == 1) and (C == 1 or D == 1) 3 Addr A3 (A) A2 (B) A1 (C) A0 (D) Data 0 0 0 0 0 0 1 0 0 0 1 0 2 0 0 1 0 0 3 0 0 1 1 0 4 0 1 0 0 0 5 0 1 0 1 0 6 0 1 1 0 0 7 0 1 1 1 0 8 1 0 0 0 0 9 1 0 0 1 0 A 1 0 1 0 0 B 1 0 1 1 0 C 1 1 0 0 0 D 1 1 0 1 1 E 1 1 1 0 1 F 1 1 1 1 1 HI-SPEED NETWORK • Throughput • Wire speed • Low latency • Frame/Packet forwarding Switch/Router (Interface speed) Throughput Latency Note Infiniband Switch Chip (2G bps) Wire speed 200 ns (SDR) http://en.wikipedia.org/wiki/InfiniBand PCI Express Switch Chip (2.5G bps) Wire speed 150 ns http://www.plxtech.com/products/expressla ne/switches L3 Switch (1G bps) Wire speed 6,000 ns (64 Byte Frame) Gigabit Interface 64*8(ns) = 512(ns) PC Router (1G bps) ≦ Wire speed 24,000 ns (64 Byte Frame) Gigabit Interface 64*8(ns) = 512(ns) 4 FPGA Interface for Ethernet User logic SPEED PHY 5 Receive 100G Ethernet Transmit 40G Ethernet PCS PMA PMD 64bit 10G Ethernet 64bit Giga Ethernet 4bit @25MHz 2bit @50MHz 8bit @125MHz 4bit @250MHz 64bit @156MHz 32bit @312MHz 320bit @125MHz 128bit @312.5MHz 320bit @312.5MHz 156MHz 100M Ethernet BUS WIDTH @CLOCK 10G Ethernet Implement Buffered Repeater Transmit Receive 6 Giga Port #0 PHY PCS PMA PMD tx_data 8bit rx_data 8bit always @(posedge clock) begin if ( r0x_data_valid ) begin tx1_enable <= 1; tx1_data <= rx0_data; end else begin tx1_enable <= 0; end end User logic (repeater.v) Clock 125MHz module repeater ( input clock, input rx0_data_valid, // 0: invalid 1: valid input [7:0] rx0_data, output reg tx1_enable, // 0: disable 1: enable output reg [7:0] tx1_data Giga Port #1 Routing • • • • • Next hop IP address Lookup • FIB (Forwarding Information Base) Changing • Destination MAC address • TTL Recalculation • IP Header Checksum Filtering • Permit / Deny Priority Control • QoS 7 IDEAL ROUTING LATENCY PHY RX FRAME PMD Dest TTL SUM Src Dest IP OPT PMA MAC IP IP IP IP 0-40 Byte PCS 336ns 336~656ns Giga Ethernet 8ns/cycle@125MHz 180+384+180 = 744ns? IP LOOKUP 180ns PROCE SS FRAME PHY TX PROCE PMD SS Dest TTL SUM Src Dest IP OPT PMA IP IP IP 0-40 Byte MAC IP PCS 64ns 336~384ns 8 DESIGN • IP Address Lookup • Pipeline • Priority Control 9 IP ADDR LOOKUP • TCAM • SRAM • Hash and sequential • Direct addressing • Cache Address RAM Data Data 10 CAM Address CAM (Content Addressable Memory) 0012E258C982 0023DFDFFAB6 0012F27C0AE0 001192230842 SRAM 02 search data (ex.0012F27C0AE0) • Examples • MAC address table • ARP table • CPU cache controller, TLB • Database engines 11 ※ http://www.pagiamtz.com/pubs/pagiamtzis-jssc2006.pdf decoder 0 1 2 3 matchlines encoder CAM (48bit × 4 words) port 4 port 12 port 7 port 1 TCAM (Ternary CAM) 0101???? (1.1.?.?) 080808?? (8.8.8.?) 851B04??(133.27.4.?) 851B????(133.27.?.?) SRAM 02 search data (ex.133.27.4.130) • Examples • Forwarding Information Base • Access Control List • QoS List • Intrusion Prevention System 12 ※ http://www.pagiamtz.com/pubs/pagiamtzis-jssc2006.pdf decoder 0 1 2 3 Priority encoder TCAM (32bit × 4 words) matchlines 203.178.5.23 203.178.1.5 203.178.4.1 203.178.9.19 Next hop Hash and Sequential 13 Direct addressing Basic idea Address 32bit RAM 4GB Data 8bit decoder IP v4 Addr [31:0] SRAM 203.178.5.23 203.178.1.5 203.178.4.1 203.178.9.19 Subnet/32 Next hop IP v4 Addr [31:9] Address 23bit RAM 8MB Data 4bit V4 Addr [8:8] Subnet/24 http://bgp.potaroo.net/as2.0/bgp-active.html 14 C code struct { uint32_t ip; char subnet; char next_hop_id; } fib[1000000]; unsigined char mem_table[64*1024*1024]; int write_fib() { for ( subnet = 2; subnet <= 28; ++subnet ) for ( i = 0; i <= fib_max; ++i ) if ( fib[i].subnet == subnet ) { ip_start = fib[i].ip & ~((1<<(32-subnet))-1); ip_end = fib[i].ip | ((1<<(32-subnet))-1); for (ip=(ip_start>>4); ip<=(ip_end>>4);++ip) mem_table[ip] = fib[i].next_hop_id; } } uint32_t get_nexthop(uint32_t ip) { return ( next_hop[ mem_table[ip>>4].next_hop_id ] ); } 15 Verilog code always @(posedge sys_clk) begin case (frame_counter) 12'd00: eth_dest[47:40] <= dout[7:0]; 12'd01: eth_dest[39:32] <= dout[7:0]; 12'd02: eth_dest[31:24] <= dout[7:0]; 12'd03: eth_dest[23:16] <= dout[7:0]; 12'd12: eth_type[15:8] <= dout[7:0]; 12'd13: eth_type[7:0] <= dout[7:0]; 12'd30: ipv4_dest_ip[31:24] <= dout[7:0]; 12'd31: ipv4_dest_ip[23:16] <= dout[7:0]; 12'd32: ipv4_dest_ip[15: 8]<= dout[7:0]; 12'd33: begin ipv4_dest_ip[ 7: 0] <= dout[7:0]; if (forward_router == 1'b1 && bridge_mode == 1'b0) begin ip4lookup_req <= 1'b1; search_ip4 <= {ipv4_dest_ip[31:8], dout[7:0]}; end end end end 16 PIPELINE (1/2) Stage 00 01 02 03 00 01 02 03 04 05 06 07 08 00 01 02 03 04 05 06 07 00 01 02 03 04 05 06 00 01 02 03 04 05 00 01 02 03 04 00 01 02 03 00 01 02 00 01 04 05 06 07 00 08 17 PIPELINE (2/2) Stage 00Read 29 30 31 32 33 34 35 36 37 01 28 29 30 31 32 33 34 35 36 02 27 28 29 30 31 32 33 34 35 03 26 27 28 29 30 31 32 33 34 04 25 26 27 28 29 30 31 32 33 35 00 00 00 00 00 00 00 01 02 36 00 00 00 00 00 00 00 00 01 37Write 00 00 00 00 00 00 00 00 00 Reply IPIPaddr lookup Receive Destination IP address Request addr lookup Transmit packet 18 Verilog code always @(posedge sys_clk) begin dout01<={rd_valid,rx_fifo};dout02<=dout01;dout03<=dout02; dout04<=dout03;dout05<=dout04;dout06<=dout05; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ dout39<=dout38;dout40<=dout39;dout41<=dout40; dout42<=dout41; if (rd_vald == 1’b1) begin counter00 <= counter00 + 16’d1; case (counter00) 16'd00: ethr_dest[47:40] <= rx_fifo[7:0]; 16'd01: ethr_dest[39:32] <= rx_fifo[7:0]; endcase else counter00 <= 16’d0; end if (dout42[8] == 1’b1) begin counter42 <= counter42 + 16’d1; case (counter42) 16'd00: begin tx_fifo <= {1'b1,etht_dest[47:40]}; forward_port <= 16’b0000000000001000; end 16'd01: tx_fifo <= {1'b1,etht_dest[39:32]}; 16'd02: tx_fifo <= {1'b1,etht_dest[31:24]}; endcase else 19 counter42 <= 16’d0; Port#1(RX) Port#2(RX) ..... ..... IP DST IP DST FIFO IP SUM IP TOS (0) ..... MAC Dest IP SUM IP TOS (7) ..... MAC Dest FIFO FIFO PRIORITY CONTROL1 Port#3(TX) 20 PRIORITY CONTROL2 Port#1(RX) Port#2(RX) ..... FIFO ..... IP DST IP SUM IP SUM IP TOS (7) ..... MAC Dest IP TOS (0) FIFO FIFO IP DST ..... MAC Dest Port#3(TX) 21 PIPELINE (2/2) Stage 00Read 29 30 31 32 33 34 35 36 37 01 28 29 30 31 32 33 34 35 36 02 27 28 29 30 31 32 33 34 35 03 26 27 28 29 30 31 32 33 34 04 25 26 27 28 29 30 31 32 33 35 00 00 00 00 00 00 00 01 02 36 00 00 00 00 00 00 00 00 01 37Write 00 00 00 00 00 00 00 00 00 22 Adding frame TOS Port#1(RX) Port#2(RX) ..... ..... IP DST IP DST FIFO IP SUM ..... IP SUM ..... MAC Dest MAC Dest FRAME TOS (0) FRAME TOS (7) FIFO FIFO PRIORITY CONTROL3 Port#3(TX) 23 PRIORITY CONTROL4 Port#1(RX) Port#2(RX) ..... FIFO IP SUM ..... MAC Dest ..... IP DST FRAME TOS (0) FIFO FIFO IP DST IP SUM ..... MAC Dest Port#3(TX) 24 IMPLEMENT OF FIBNIC 25 背景と目標 高機能で入手が手軽なPCルータ、しかし専用機に劣る転送能力 • pps(packet per second)問題 • 1パケットあたりにかけられる処理時間の問題 • バスとメモリの帯域問題 • 高速Ethernetに対するPCI Express、メモリ帯域の問題 • ネットワークは発展途上 • L1のインターフェイス仕様は固定しているのに対しL2/L3技術は変化が早い • • PCルータの高機能と専用機の高性能のハイブリッド(いいとこどり) • PC NICにL2/L3スイッチの専用ASICに代わり自分で再構成可能な汎用FPGAを採用 • オープンなハードウェア技術によって、個人でもアイディアがあれば専用機並(以上?)の 性能をひきだすことが証明できたらいいなあ。。。 26 pps問題 Frame Size 64 速度 packet per second time/packet Frame 1518 CPU clock/pkt ※ @4GHz pps 100M 148,809 pps 6,905 ns 27,600 clock 8,127 pps Giga 1,488,095 pps 690 ns 2,760 clock 81,274 pps 10G 14,880,950 pps 69 ns 276 clock 812,743 pps 40G 59,523,800 pps 17 ns 68 clock 3,250,972 pps 100G 148,809,500 pps 7 ns 28 clock 8,127,433 pps ※ 1ポート、片方向通信の場合 CPUコア数を増やしたりGPU併用で処理の負担を軽減することができる 27 バスとメモリの帯域問題 DDR3-1600 12.8GB/s※1 ※片方向通信 PCI-Express G2×8 4GB/s 10G Ethernet 1.25GB/s 40G Ethernet 送信 受信 5GB/s 100G Ethernet 12.5GB/s 0 28 10 20 概要図 テスタ ルータ 29 デモ1 デモ http://web.sfc.wide.ad.jp/~macchan/fibnic_demo1.mov デモ2(40.5万ルート) http://web.sfc.wide.ad.jp/~macchan/fibnic_demo2.mov 30 IPv4性能評価(参考値) ※2 理論値と同じ 64バイトフレーム 1518バイトフレーム 遅延 フレーム間 遅延 (ns) GAP/pps ※1 (ns) NIC+PCルータ i5 2.8GHz (Linux 3.3.7) FIBNIC+PCルータ Celeron2.53G(Linux 3.3.7) 24,144 976 フレーム間 GAP/pps 270 byte 580 byte 101,152 365,497 pps 59,355 pps 12 byte 1,488,095 pps 条件 ポート数 IPv4 Route Giga×2ポート 2 Route Giga×4ポート 12 byte 976 405,452 Route 81,274 pps 13 byte Giga×4ポート 13 byte 6,600 1,470,588 20,608 4 Route 某社L3スイッチ 81,222 pps pps ※1 パケットをロストしない時のフレーム間ギャップ最小値(Ethernetの規格上は12 が最小) 31 IPv6性能評価(参考値) ※2 理論値と同じ 80バイトフレーム 遅延 (ns) FIBNIC+PCルータ Celeron2.53G(Lin ux 3.3.7) 某社L3スイッチ フレーム間 GAP/pps ※1 1518バイトフレーム 遅延 (ns) フレーム間 GAP/pps 条件 ポート数 1,064 12 byte 1,250,000 pps 6,552 13 byte 13 byte 1,237,624 20,480 Giga×4ポート 81,222 pps pps 12 byte 1,064 Giga×4ポート 81,274 pps ※1 パケットをロストしない時のフレーム間ギャップ最小値(Ethernetの規格上は12 が最小) 32 FIBNIC遅延内訳 • FIBNIC回路 • • IPルーティングに必要なDestIPを受信す るまでのフレーム内サイズ(8はプリアンプ ル部+StartFrameDelimiter) RGMII/GMII変換回路 • • IP Lookup、Fowarding、Filtering、 Priority処理 280ns FIBNIC @125MHz 35cycle DestIPまでの8+34バイトフレーム • • IPv4 976ns IPv4 (IPv6 1,064ns) 42cycle 5cycle 4bit@250MHz、8bit@125MHz変換 PHYチップ • DestIPまでの 336ns 8+34バイトフー RGMII/GMII変 40ns 換 320ns ケーブルの信号をASICやFPGAで接続 可能なディジタル信号に変換 33 PHYチップ 40cycle まとめ • • 市販のGigabit Ether FPGAボード上でH/W IPv4/IPv6 ルーティングが可能なPC用NICを実 装 • ワイヤーレートでのパケットルーティング • 1,488,095 経路探索/秒 (IPv4 40万経路時、回路単体では125M 経路探索/秒) ハードウェアの高速性とソフトウェアの高機能性の融合 • • 10/40G以上の高速Ethernetを考慮した回路設計 • • 簡単なパケットはハードウェア、複雑なプロトコルはNICにて処理 インターフェイスの入口から出口まで同じクロック、バス幅、ウェイト無し設計 ハードウェア記述言語による回路の再構成 • フィルタリング、フォワーディング条件等。回路の再構成時間は数秒 • ワイヤーレートでのNAT、トンネリング、4と6共存技術など色々できそう!?! 34 オープンソース ネットワークテスタ • Magukara • FPGAベースのオープンソースハードウェア • Lattice ECP3 Versa Development Kit ($299ドル !!) • 1000Base-T, IPv4/v6サポート • URL: https://github.com/Murailab-arch/magukara 35 Workshop 紹介 36 ここから予備スライド 37 PHY#0 RX Receive ※1 RX0GMII2FIFO GMII2FIFO9 RX0_PHYQ ASFIFO9 PHY#2 RX PHY#1 RX FIB6 FIB ※5 LOOKUPFIB ※7 PCI/PCIe CONTROLLER ※6 NIC0 NIC BUS Port ARP/NDP ARPNDP TX-BUF RX0-NC0 RX-BUF DualPort RAM SFIFO9 DualPort RAM ※2 RX0ROUTER ROUTER PHY#3 RX RX0-ARP0 SFIFO9 Instance Module FIFO/ Memory RX0-TX0 RX1-TX0 RX2-TX0 RX3-TX0 NC0-TX0 SFIFO SFIFO SFIFO SFIFO SFIFO Transmission ※3 TX0MIXER MIXER TX0_MIXQ SFIFO9 TX0_PHYQ ASFIFO9 ※4 TX0FIFO9TOGMII FIFO9TOGMII PHY#0 TX RX0-TX1 RX1-TX1 RX2-TX1 RX3-TX1 NC1-TX1 SFIFO SFIFO SFIFO SFIFO SFIFO ※3 TX1MIXER MIXER RX0-TX2 RX1-TX2 RX2-TX2 RX3-TX2 NC2-TX2 SFIFO SFIFO SFIFO SFIFO SFIFO ※3 TX2MIXER MIXER RX0-TX3 RX1-TX3 RX2-TX3 RX3-TX3 NC3-TX3 SFIFO SFIFO SFIFO SFIFO SFIFO ※3 TX3MIXER MIXER ※1 PHYとシステムクロック変換およびPREAMBLE,SFD等除去 ※2 フォワード先決定、フォワード時のDest MAC置換&TTLの減算&IP SUM再計算、ド ロップ付きフォワード処理、CRC除去 ※3 ToSによる優先度ミックスキューイング、ドロップ ※4 システムとPHYクロッック変換およびPREAMBLE,SFD,CRCの付与 ※5 FIBもしくはARPを調べ、Dest MACと転送先PORTを決定する ※6 NICとしての基本動作 ※7 PCIとしての基本動作 ※4 TX1FIFO9TOGMII FIFO9TOGMII PHY#1 TX ※4 TX2FIFO9TOGMII FIFO9TOGMII PHY#2 TX ※4 TX3FIFO9TOGMII FIFO9TOGMII PHY#3 TX FPGAの再コンフィグレーション • フィルタの条件はHDL言語でFPGAの回路として記述可能。 Reconfiguration時間は数秒。 • IP宛先が192.2.3/24でかつポートが22の場合パケットをドロップす る記述 if (ipv4_dest_ip[31:8]==24‘hc00203 && (ipv4_dest_port==16‘d22)) foward_port = 4‘b0000; // どのポートへも転送しない • iSCSI宛のパケットは4番ポートへ転送する記述 if (ipv4_dest_port==16‘d3260) foward_port = 4‘b1000; // 第4ポートへ転送する 39 NICへ転送する条件 HDL記述(例) • wire frame_type_ipv4 = (eth_type == 16'h0800); • wire frame_type_ipv6 = (eth_type == 16'h86dd); • wire forward_nic = (frame_type_ipv4 && (ipv4_dest_ip == interface_ipv4_addr || ipv4_dest_ip == 32'h0)) || eth_dest_addr[40] == 1'b || .............; 40
© Copyright 2024 ExpyDoc