410 likes | 764 Views
『 How to make FPGA router for high-speed networks』. Keio University SFC Murai lab Takeshi Matsuya macchan@sfc.wide.ad.jp. Open Router Competition. INTEROP 2012 event at Makuhari Messe 13.June.2012 Theme Improve OpenRouter regardless of software or hardware.
E N D
『 How to make FPGA router for high-speed networks』 • Keio UniversitySFC • Murai lab • Takeshi Matsuya • macchan@sfc.wide.ad.jp
Open Router Competition • INTEROP 2012 event at Makuhari Messe • 13.June.2012 • Theme • Improve OpenRouter regardless of software or hardware. • http://www.interop.jp/2012/orc/
WHAT’S FPGA? Field Programmable Gate Array Address 24bit Data 8bit RAM 16MB Address 4bit FPGA 4LUT Data 1bit 16bit memory A AND B AND C OR D (A == 1 and B == 1) and (C == 1 or D == 1)
HI-SPEED NETWORK • Throughput • Wire speed • Low latency • Frame/Packet forwarding
FPGA Interface for Ethernet User logic 64bit 64bit 156MHz PCS PHY PMA PMD Receive Transmit 10G Ethernet
Implement Buffered Repeater User logic (repeater.v) 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 always @(posedge clock) begin if ( r0x_data_valid ) begin tx1_enable <= 1; tx1_data <= rx0_data; end else begin tx1_enable <= 0; end end rx_data 8bit tx_data 8bit Clock 125MHz PCS PHY PMA PMD Receive Transmit Giga Port #0 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
IDEAL ROUTING LATENCY PHY RX FRAME PROCESS Giga Ethernet 8ns/cycle@125MHz Dest MAC SUM IP Dest IP Src IP PMD PMA PCS TTL IP IP OPT 0-40 Byte Receive 180+384+180 = 744ns? 180ns IP LOOKUP Calc SUM 336ns 336~656ns PHY TX FRAME PROCESS Transmit Dest MAC PMD PMA PCS SUM IP Dest IP Src IP TTL IP IP OPT 0-40 Byte 64ns 336~384ns
DESIGN • IP Address Lookup • Pipeline • Priority Control
IP ADDR LOOKUP • TCAM • SRAM • Hash and sequential • Direct addressing • Cache RAM CAM Address Data Data Address
CAM(Content Addressable Memory) matchlines CAM (48bit × 4 words) SRAM 0 1 2 3 0012E258C982 port 4 • Examples • MAC address table • ARP table • CPU cache controller, TLB • Database engines 02 0023DFDFFAB6 port 12 decoder encoder 0012F27C0AE0 port 7 001192230842 port 1 search data (ex.0012F27C0AE0) ※ http://www.pagiamtz.com/pubs/pagiamtzis-jssc2006.pdf
TCAM(Ternary CAM) matchlines TCAM (32bit × 4 words) SRAM 0 1 2 3 0101???? (1.1.?.?) 203.178.5.23 • Examples • Forwarding Information Base • Access Control List • QoS List • Intrusion Prevention System 02 080808?? (8.8.8.?) 203.178.1.5 Priority encoder decoder 851B04??(133.27.4.?) 203.178.4.1 851B????(133.27.?.?) 203.178.9.19 search data (ex.133.27.4.130) Next hop ※ http://www.pagiamtz.com/pubs/pagiamtzis-jssc2006.pdf
Direct addressing Basic idea SRAM 203.178.5.23 Address 32bit RAM 4GB Data 8bit IP v4 Addr [31:0] 203.178.1.5 decoder 203.178.4.1 203.178.9.19 Subnet/32 Next hop Address 23bit RAM 8MB Data 4bit IP v4 Addr [31:9] V4 Addr [8:8] Subnet/24 http://bgp.potaroo.net/as2.0/bgp-active.html
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 ] ); }
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
PIPELINE (1/2) Stage 00 00 01 02 03 04 05 06 07 08 01 00 01 02 03 04 05 06 07 02 00 01 02 03 04 05 06 03 00 01 02 03 04 05 04 00 01 02 03 04 05 00 01 02 03 06 00 01 02 07 00 01 08 00
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 IP addr lookup Receive Destination IP address Request IP addr lookup Transmit packet
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 counter42 <= 16’d0; end end
PRIORITY CONTROL1 Port#1(RX) Port#2(RX) ..... ..... IP DST IP DST IP SUM IP SUM FIFO FIFO IP TOS (0) IP TOS (7) ..... ..... MAC Dest MAC Dest FORWARD FORWARD FIFO Port#3(TX)
PRIORITY CONTROL2 Port#1(RX) Port#2(RX) ..... IP DST IP SUM FIFO ..... FIFO IP TOS (7) IP DST ..... IP SUM MAC Dest IP TOS (0) FORWARD FORWARD FIFO ..... MAC Dest Port#3(TX)
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 Adding frame TOS
PRIORITY CONTROL3 Port#1(RX) Port#2(RX) ..... ..... IP DST IP DST IP SUM IP SUM FIFO FIFO ..... ..... MAC Dest MAC Dest FRAME TOS (0) FRAME TOS (7) FORWARD FORWARD FIFO Port#3(TX)
PRIORITY CONTROL4 Port#1(RX) Port#2(RX) ..... IP DST IP SUM FIFO FIFO ..... ..... MAC Dest IP DST FRAME TOS (0) IP SUM FORWARD FORWARD FIFO ..... MAC Dest Port#3(TX)
背景と目標 • 高機能で入手が手軽なPCルータ、しかし専用機に劣る転送能力 • pps(packet per second)問題 • 1パケットあたりにかけられる処理時間の問題 • バスとメモリの帯域問題 • 高速Ethernetに対するPCI Express、メモリ帯域の問題 • ネットワークは発展途上 • L1のインターフェイス仕様は固定しているのに対しL2/L3技術は変化が早い • PCルータの高機能と専用機の高性能のハイブリッド(いいとこどり) • PC NICにL2/L3スイッチの専用ASICに代わり自分で再構成可能な汎用FPGAを採用 • オープンなハードウェア技術によって、個人でもアイディアがあれば専用機並(以上?)の性能をひきだすことが証明できたらいいなあ。。。
pps問題 ※1ポート、片方向通信の場合 CPUコア数を増やしたりGPU併用で処理の負担を軽減することができる
バスとメモリの帯域問題 DDR3-160012.8GB/s※1 ※片方向通信 PCI-Express G2×8 4GB/s 10G Ethernet 1.25GB/s 送信 受信 40G Ethernet 5GB/s 100G Ethernet 12.5GB/s 0 10 20
概要図 テスタ ルータ
デモ デモ1 http://web.sfc.wide.ad.jp/~macchan/fibnic_demo1.mov デモ2(40.5万ルート) http://web.sfc.wide.ad.jp/~macchan/fibnic_demo2.mov
IPv4性能評価(参考値) ※2 理論値と同じ ※1パケットをロストしない時のフレーム間ギャップ最小値(Ethernetの規格上は12 が最小) 31
IPv6性能評価(参考値) ※2 理論値と同じ ※1パケットをロストしない時のフレーム間ギャップ最小値(Ethernetの規格上は12 が最小) 32
FIBNIC遅延内訳 IPv4 976ns IPv4 (IPv6 1,064ns) @125MHz • FIBNIC回路 • IP Lookup、Fowarding、Filtering、Priority処理 • DestIPまでの8+34バイトフレーム • IPルーティングに必要なDestIPを受信するまでのフレーム内サイズ(8はプリアンプル部+StartFrameDelimiter) • RGMII/GMII変換回路 • 4bit@250MHz、8bit@125MHz変換 • PHYチップ • ケーブルの信号をASICやFPGAで接続可能なディジタル信号に変換 FIBNIC 280ns 35cycle DestIPまでの 8+34バイトフー 336ns 42cycle RGMII/GMII変換 40ns 5cycle PHYチップ 320ns 40cycle
まとめ • 市販のGigabit Ether FPGAボード上でH/W IPv4/IPv6 ルーティングが可能なPC用NICを実装 • ワイヤーレートでのパケットルーティング • 1,488,095 経路探索/秒 (IPv4 40万経路時、回路単体では125M 経路探索/秒) • ハードウェアの高速性とソフトウェアの高機能性の融合 • 簡単なパケットはハードウェア、複雑なプロトコルはNICにて処理 • 10/40G以上の高速Ethernetを考慮した回路設計 • インターフェイスの入口から出口まで同じクロック、バス幅、ウェイト無し設計 • ハードウェア記述言語による回路の再構成 • フィルタリング、フォワーディング条件等。回路の再構成時間は数秒 • ワイヤーレートでのNAT、トンネリング、4と6共存技術など色々できそう!?! 34
オープンソースネットワークテスタ • Magukara • FPGAベースのオープンソースハードウェア • Lattice ECP3 Versa Development Kit ($299ドル !!) • 1000Base-T, IPv4/v6サポート • URL: https://github.com/Murailab-arch/magukara
PHY#2 RX PHY#3 RX PHY#0 RX PHY#1 RX Receive ※7 PCI/PCIe CONTROLLER FIB6 ※1 RX0GMII2FIFO GMII2FIFO9 FIB BUS Port ※5 LOOKUPFIB ※6 NIC0 NIC ARP/NDP ARPNDP RX0_PHYQ ASFIFO9 Instance Module ※2 RX0ROUTER ROUTER TX-BUF DualPort RAM RX0-NC0 SFIFO9 RX-BUF DualPort RAM RX0-ARP0 SFIFO9 RX0-TX3 SFIFO RX1-TX3 SFIFO RX2-TX3 SFIFO RX3-TX3 SFIFO NC3-TX3 SFIFO RX0-TX2 SFIFO RX1-TX2 SFIFO RX2-TX2 SFIFO RX3-TX2 SFIFO NC2-TX2 SFIFO RX0-TX1 SFIFO RX1-TX1 SFIFO RX2-TX1 SFIFO RX3-TX1 SFIFO NC1-TX1 SFIFO RX0-TX0 SFIFO RX1-TX0 SFIFO RX2-TX0 SFIFO RX3-TX0 SFIFO NC0-TX0 SFIFO FIFO/ Memory Transmission ※3 TX1MIXER MIXER ※3 TX2MIXER MIXER ※3 TX0MIXER MIXER ※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としての基本動作 TX0_MIXQ SFIFO9 TX0_PHYQ ASFIFO9 ※4 TX2FIFO9TOGMII FIFO9TOGMII ※4 TX3FIFO9TOGMII FIFO9TOGMII ※4 TX1FIFO9TOGMII FIFO9TOGMII ※4 TX0FIFO9TOGMII FIFO9TOGMII PHY#0 TX PHY#3 TX PHY#1 TX PHY#2 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 || .............;