『 how to make fpga router for high-speed networks』
DESCRIPTION
『 How to make FPGA router for high-speed networks』. Keio University SFC Murai lab Takeshi Matsuya [email protected]. Open Router Competition. INTEROP 2012 event at Makuhari Messe 13.June.2012 Theme Improve OpenRouter regardless of software or hardware. - PowerPoint PPT PresentationTRANSCRIPT
1
『 How to make FPGA router for high-speed
networks 』Keio University SFC
Murai labTakeshi Matsuya
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/
2
WHAT’S FPGA?
3
RAM16MB
Address24bit
Data8bit
FPGA4LUT
Address4bit
Data1bit
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
AB
CD
(A == 1 and B == 1) and (C == 1 or D == 1)
AND
AND
OR
Field Programmable Gate Array
16bit memory
HI-SPEED NETWORK• Throughput• Wire speed• Low latency• Frame/Packet forwarding
4
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/expresslane/switches
L3 Switch(1G bps)
Wire speed 6,000 ns(64 Byte Frame)
Gigabit Interface64*8(ns) = 512(ns)
PC Router(1G bps)
≦ Wire speed 24,000 ns(64 Byte Frame)
Gigabit Interface64*8(ns) = 512(ns)
FPGA Interface for Ethernet
5
SPEED BUS WIDTH@CLOCK
100M Ethernet 4bit @25MHz2bit @50MHz
Giga Ethernet 8bit @125MHz4bit @250MHz
10G Ethernet 64bit @156MHz32bit @312MHz
40G Ethernet 320bit @125MHz128bit @312.5MHz
100G Ethernet 320bit @312.5MHz
User logic6
4b
it
64b
it
PCSPMAPMD
PH
Y
Rece
ive
Tra
nsm
it
10G Ethernet
15
6M
Hz
Implement Buffered Repeater
6
module repeater (input clock,input rx0_data_valid, // 0: invalid 1:
validinput [7:0] rx0_data, output reg tx1_enable, // 0: disable 1:
enableoutput reg [7:0] tx1_data
always @(posedge clock) beginif ( r0x_data_valid ) begin
tx1_enable <= 1;tx1_data <= rx0_data;
end else begintx1_enable <= 0;
endend
User logic(repeater.v)
rx_d
ata
8bit
tx_d
ata
8bit
PCSPMAPMD
PH
Y
Rece
ive
Tra
nsm
it
GigaPort #0
Clo
ck1
25
MH
z
GigaPort #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
8
IDEAL ROUTING LATENCYPHYRX
PROCESS
Giga Ethernet 8ns/cycle@125MHzDest
IPIP OPT
0-40 Byte
PMDPMAPCS
IP LO
OK
UP
SUMIP
Dest
MAC
TTLIP
SrcIP
FRAME
PROCESSDest
IPIP OPT
0-40 ByteSUM
IP
Dest
MAC
TTLIP
SrcIP
FRAMEPHYTX
PMDPMAPCS
Calc S
UM
180ns336ns
336 ~ 656ns
336 ~ 384ns
64ns
180+384+180 = 744ns ?
Rece
ive
Tra
nsm
it
DESIGN
• IP Address Lookup
• Pipeline
• Priority Control
9
IP ADDR LOOKUP• TCAM
• SRAM• Hash and sequential• Direct addressing
• Cache
10
RAMAddress Data CAMData Address
CAM(Content Addressable
Memory)
• Examples• MAC address table• ARP table• CPU cache controller, TLB• Database engines
11
0012E258C9820023DFDFFAB60012F27C0AE0001192230842
search data(ex.0012F27C0AE0
)encoder
matchlines
※ http://www.pagiamtz.com/pubs/pagiamtzis-jssc2006.pdf
port 4port 12port 7port 1
0123
CAM (48bit × 4 words) SRAM
deco
der
02
TCAM(Ternary CAM)
• Examples• Forwarding Information Base• Access Control List• QoS List• Intrusion Prevention System
12
0101???? (1.1.?.?)080808?? (8.8.8.?)851B04??
(133.27.4.?)851B????(133.27.?.?)search data
(ex.133.27.4.130)
Priority
encoder
matchlines
※ http://www.pagiamtz.com/pubs/pagiamtzis-jssc2006.pdf
203.178.5.23203.178.1.5203.178.4.1203.178.9.19
0123
TCAM (32bit × 4 words) SRAM
deco
der
02
Next hop
Hash and Sequential
13
Direct addressing
14
RAM4GB
Address32bit
Data8bit
IP v4 Addr[31:0]
http://bgp.potaroo.net/as2.0/bgp-active.html
203.178.5.23203.178.1.5203.178.4.1203.178.9.19
SRAM
deco
der
Next hop
Basic idea
RAM8MB
Address23bit
Data4bit
IP v4 Addr[31:9]
Subnet/32
Subnet/24V4 Addr [8:8]
C code
15
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
16
always @(posedge sys_clk) begincase (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)
beginip4lookup_req <= 1'b1;search_ip4 <= {ipv4_dest_ip[31:8], dout[7:0]};
endend
endend
PIPELINE (1/2)
17
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
05 00 01 02 03
06 00 01 02
07 00 01
08 00
Stage
03 00 01 02 03 04 05
04 00 01 02 03 04
PIPELINE (2/2)
18
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
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
Stage
03 26 27 28 29 30 31 32 33 34
04 25 26 27 28 29 30 31 32 33
Receive Destination IP addressRequest IP addr lookupReply IP addr lookupTransmit packet
Verilog code
19
always @(posedge sys_clk) begindout01<={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];
endcaseelse
counter00 <= 16’d0;endif (dout42[8] == 1’b1) begin
counter42 <= counter42 + 16’d1;case (counter42)
16'd00: begintx_fifo <= {1'b1,etht_dest[47:40]};forward_port <= 16’b0000000000001000;
end16'd01: tx_fifo<= {1'b1,etht_dest[39:32]};16'd02: tx_fifo<= {1'b1,etht_dest[31:24]};
endcaseelse
counter42 <= 16’d0;end
end
20
PRIORITY CONTROL1
FORW
ARD
IP DST
.....
IP SUM
IP TOS (0)
MAC Dest
.....
IP DST
.....
IP SUM
IP TOS (7)
MAC Dest
.....
Port#1(RX) Port#2(RX)
Port#3(TX)
FORW
ARD
FIFO
FIFO
FIFO
21
PRIORITY CONTROL2
FORW
ARD
IP DST
.....
IP SUM
IP TOS (0)
IP DST
.....
IP SUM
IP TOS (7)
MAC Dest
.....
MAC Dest
.....
Port#1(RX) Port#2(RX)
Port#3(TX)
FORW
ARD
FIFO
FIFO
FIFO
PIPELINE (2/2)
22
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
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
Stage
03 26 27 28 29 30 31 32 33 34
04 25 26 27 28 29 30 31 32 33
Adding frame TOS
23
PRIORITY CONTROL3
FORW
ARD
IP DST
.....
IP SUM
FRAME TOS (0)
MAC Dest
.....
IP DST
.....
IP SUM
Port#1(RX) Port#2(RX)
Port#3(TX)
FORW
ARD
FRAME TOS (7)
MAC Dest
.....FIFO
FIFO
FIFO
24
PRIORITY CONTROL4
FORW
ARD
IP DST
.....
IP SUM
FRAME TOS (0)
MAC Dest
.....
IP DST
.....
IP SUM
MAC Dest
.....
Port#1(RX) Port#2(RX)
Port#3(TX)
FORW
ARD
FIFO
FIFO
FIFO
IMPLEMENT OF FIBNIC
25
26
背景と目標• 高機能で入手が手軽な PC ルータ、しかし専用機に劣る転送能力
• pps(packet per second) 問題• 1パケットあたりにかけられる処理時間の問題
• バスとメモリの帯域問題• 高速 Ethernet に対する PCI Express 、メモリ帯域の問題
• ネットワークは発展途上• L 1のインターフェイス仕様は固定しているのに対し L 2/ L 3技術は変化が早い
• PC ルータの高機能と専用機の高性能のハイブリッド(いいとこどり)• PC NIC に L2/L3 スイッチの専用 ASIC に代わり自分で再構成可能な汎用 FPGAを採用
• オープンなハードウェア技術によって、個人でもアイディアがあれば専用機並(以上?)の性能をひきだすことが証明できたらいいなあ。。。
27
pps 問題速度
Frame Size 64 Frame 1518
packet per second
time/packet
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 clock3,250,972
pps
100G148,809,500
pps7 ns 28 clock
8,127,433 pps
※ 1 ポート、片方向通信の場合CPU コア数を増やしたり GPU 併用で処理の負担を軽減することができる
28
バスとメモリの帯域問題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 10 20
※片方向通信
29
概要図テスタ ルータ
30
デモデモ 1 http://web.sfc.wide.ad.jp/~macchan/fibnic_demo1.mov
デモ 2(40.5 万ルート ) http://web.sfc.wide.ad.jp/~macchan/fibnic_demo2.mov
31
IPv4 性能評価 ( 参考値 )64 バイトフレー
ム1518 バイトフレー
ム 条件
遅延(ns)
フレーム間GAP/pps
※ 1
遅延(ns)
フレーム間GAP/pps
ポート数IPv4 Route
NIC+PC ルータi5 2.8GHz (Linux
3.3.7)
24,144
270 byte365,497 pps
101,152
580 byte59,355
pps
Giga×2 ポート2 Route
FIBNIC+PC ルータCeleron2.53G(Lin
ux 3.3.7)976
12 byte1,488,095
pps976
12 byte81,274
pps
Giga×4 ポート405,452
Route
某社 L3 スイッチ 6,600
13 byte1,470,588
pps20,608
13 byte81,222
pps
Giga×4 ポート4 Route
※1 パケットをロストしない時のフレーム間ギャップ最小値( Ethernet の規格上は 12 が最小 )
※2 理論値と同じ
31
32
IPv6 性能評価 ( 参考値 )80 バイトフレー
ム1518 バイトフレー
ム 条件
遅延(ns)
フレーム間GAP/pps
※ 1
遅延(ns)
フレーム間GAP/pps
ポート数
FIBNIC+PC ルータ
Celeron2.53G(Linux 3.3.7)
1,06412 byte
1,250,000 pps
1,06412 byte81,274
pps
Giga×4 ポート
某社 L3 スイッチ 6,552
13 byte1,237,624
pps20,480
13 byte81,222
pps
Giga×4 ポート
※1 パケットをロストしない時のフレーム間ギャップ最小値( Ethernet の規格上は 12 が最小 )
※2 理論値と同じ
32
33
FIBNIC 遅延内訳
• FIBNIC 回路
• IP Lookup 、 Fowarding 、 Filtering 、Priority 処理
• DestIP までの 8+34 バイトフレーム
• IP ルーティングに必要な DestIP を受信するまでのフレーム内サイズ( 8 はプリアンプル部+StartFrameDelimiter )
• RGMII/GMII 変換回路
• 4bit@250MHz 、 8bit@125MHz 変換
• PHY チップ
• ケーブルの信号を ASIC や FPGA で接続可能なディジタル信号に変換
PHY チップ
RGMII/GMII 変換
DestIP までの8+34 バイト
フー
FIBNIC
320ns
40ns
336ns
280ns
IPv4 976ns IPv4(IPv6 1,064ns)
5cycle
42cycle
35cycle
40cycle
@125MHz
34
まとめ• 市販の Gigabit Ether FPGA ボード上で H/W IPv4/IPv6 ルーティングが可能な PC 用
NIC を実装
• ワイヤーレートでのパケットルーティング
• 1,488,095 経路探索 /秒 ( IPv4 40 万経路時、回路単体では 125M 経路探索 /秒)
• ハードウェアの高速性とソフトウェアの高機能性の融合
• 簡単なパケットはハードウェア、複雑なプロトコルは NIC にて処理
• 10/40G 以上の高速 Ethernet を考慮した回路設計
• インターフェイスの入口から出口まで同じクロック、バス幅、ウェイト無し設計
• ハードウェア記述言語による回路の再構成
• フィルタリング、フォワーディング条件等。回路の再構成時間は数秒
• ワイヤーレートでの NAT 、トンネリング、4と6共存技術など色々できそう!?!
34
35
オープンソースネットワークテスタ
•Magukara•FPGA ベースのオープンソースハードウェア
•Lattice ECP3 Versa Development Kit ($299ドル !!)
•1000Base-T, IPv4/v6 サポート
•URL: https://github.com/Murailab-arch/magukara
Workshop 紹介
36
37
ここから予備スライド
PHY#0RX
PHY#0RX
※1 RX0GMII2FIFOGMII2FIFO9
※1 RX0GMII2FIFOGMII2FIFO9
InstanceModuleInstanceModule
FIFO/Memory
FIFO/Memory
PortPort※6 NIC0NIC
※6 NIC0NIC
※5 LOOKUPFIB※5 LOOKUPFIB
※2 RX0ROUTERROUTER
※2 RX0ROUTERROUTER
RX0_PHYQASFIFO9
RX0_PHYQASFIFO9
※3 TX0MIXERMIXER
※3 TX0MIXERMIXER
TX0_MIXQSFIFO9
TX0_MIXQSFIFO9
TX0_PHYQASFIFO9
TX0_PHYQASFIFO9
※4 TX0FIFO9TOGMIIFIFO9TOGMII
※4 TX0FIFO9TOGMIIFIFO9TOGMII
PHY#0TX
PHY#0TX
RX0-NC0SFIFO9
RX0-NC0SFIFO9
ARP/NDPARPNDPARP/NDPARPNDP
※7 PCI/PCIe CONTROLLER※7 PCI/PCIe
CONTROLLER
PHY#1TX
PHY#1TX
PHY#2TX
PHY#2TX
PHY#3TX
PHY#3TX
BUS
Rece
ive
Tra
nsm
ission
PHY#1RX
PHY#1RX
PHY#2RX
PHY#2RX
PHY#3RX
PHY#3RX
※3 TX1MIXERMIXER
※3 TX1MIXERMIXER
※3 TX2MIXERMIXER
※3 TX2MIXERMIXER
※3 TX3MIXERMIXER
※3 TX3MIXERMIXER
FIB6FIB6FIBFIB
※4 TX1FIFO9TOGMIIFIFO9TOGMII
※4 TX1FIFO9TOGMIIFIFO9TOGMII
※4 TX2FIFO9TOGMIIFIFO9TOGMII
※4 TX2FIFO9TOGMIIFIFO9TOGMII
※4 TX3FIFO9TOGMIIFIFO9TOGMII
※4 TX3FIFO9TOGMIIFIFO9TOGMII
※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 としての基本動作
※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 としての基本動作
RX-BUFDualPort RAM
RX-BUFDualPort RAM
TX-BUFDualPort RAM
TX-BUFDualPort RAM
RX0-TX0SFIFO
RX0-TX0SFIFO
RX1-TX0SFIFO
RX1-TX0SFIFO
RX2-TX0SFIFO
RX2-TX0SFIFO
RX3-TX0SFIFO
RX3-TX0SFIFO
NC0-TX0SFIFO
NC0-TX0SFIFO
RX0-TX1SFIFO
RX0-TX1SFIFO
RX1-TX1SFIFO
RX1-TX1SFIFO
RX2-TX1SFIFO
RX2-TX1SFIFO
RX3-TX1SFIFO
RX3-TX1SFIFO
NC1-TX1SFIFO
NC1-TX1SFIFO
RX0-TX2SFIFO
RX0-TX2SFIFO
RX1-TX2SFIFO
RX1-TX2SFIFO
RX2-TX2SFIFO
RX2-TX2SFIFO
RX3-TX2SFIFO
RX3-TX2SFIFO
NC2-TX2SFIFO
NC2-TX2SFIFO
RX0-TX3SFIFO
RX0-TX3SFIFO
RX1-TX3SFIFO
RX1-TX3SFIFO
RX2-TX3SFIFO
RX2-TX3SFIFO
RX3-TX3SFIFO
RX3-TX3SFIFO
NC3-TX3SFIFO
NC3-TX3SFIFO
RX0-ARP0SFIFO9
RX0-ARP0SFIFO9
39
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
40
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 || .............;