超高速ネットワークのためのFPGAルータの作り方 』 チ

『 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