スイッチを作ろう OpenFlow1.3編 コントローラ
スイッチを作ろうOpenFlow1.3編
コントローラ
HelloWorld
スイッチ
トポロジディスカバリ
ルーティングスイッチ
仮想NW
おさらいOpenFlow1.0でのパケット処理
処理1フィルタリング
処理2転送
ラーニングスイッチ
• 802.1D/802.1Qreserved MAC
• マルチキャスト
ポートn番へ or
宛先 MAC =
FDB
をドロップ
FLOODING
処理1フィルタリング
処理2書き換え
処理3転送
例: ルータ
送信元/宛先 MACアドレス
ルーティングテーブル
OpenFlow1.3でのパケット処理
フローテーブルA
フローテーブルB
フローテーブルC
マルチプルテーブル
コントローラ
Goto Goto
処理ごとにテーブルを分けるとデバッグしやすくなる
ラーニングスイッチ
フィルタリングテーブル (ID=0)
dropルールdropルール
GoTo 1
Pri.
2
2
1
Flow Entry
…
転送テーブル(ID=1)
• 宛先が 192.168.0.30 でHTTP だったら
send_flow_mod_add(
datapath_id,
table_id: 0,
idle_timeout: 0,
priority: 2,
match: Match.new(ether_destination_address: '01:00:5e:00:00:00',
ether_destination_address_mask: 'ff:ff:ff:00:00:00')
)
• マルチキャストを落とす• 最初のテーブル (ID=0) で処理
• 宛先が 192.168.0.30 でHTTP だったら
send_flow_mod_add(
datapath_id,
table_id: 0,
idle_timeout: 0,
priority: 1,
match: Match.new,
instructions: GotoTable.new(1)
)
• フィルタにかからなかったら、 処理をテーブル1へ移行
• フィルタリング (pri=2) の後に このルール (pri=1) にヒット
ラーニングスイッチ(再掲)
フィルタリングテーブル (ID=0)
dropルールdropルール
GoTo 1
Pri.
2
2
1
Flow Entry
…
転送テーブル(ID=1)
フィルタリングテーブル (ID=0)
転送テーブル(ID=1)
CONTROLLER
Pri.
1
コントローラ
PacketIn
• 宛先が 192.168.0.30 でHTTP だったら
send_flow_mod_add(
datapath_id,
table_id: 1,
idle_timeout: 0,
priority: 1,
match: Match.new,
instructions: Apply.new(SendOutPort.new(:controller))
)
• 明示的にPacketInを起こす• OpenFlow1.3ではデフォルトドロップ
デフォルトドロップ(OpenFLow 1.3)
• OpenFlow1.0はデフォルトPacketIn
• フィルタ用フローエントリを打ち込むより前にパケットが大量に到着すると、最悪コントローラがパンク
• そこでOpenFlow1.3ではPacketInを明示的に起こすように修正された
転送テーブル(ID=1)
CONTROLLER
Pri.
1
コントローラ
転送ルール2
FlowMod
フィルタリングテーブル (ID=0)
FDB
• 宛先が 192.168.0.30 でHTTP だったら
send_flow_mod_add(
datapath_id,
table_id: FORWARDING_TABLE_ID,
idle_timeout: AGING_TIME,
priority: 2,
match: Match.new(in_port: packet_in.in_port,
ether_destination_address: packet_in.destination_mac,
ether_source_address: packet_in.source_mac),
instructions: Apply.new(SendOutPort.new(port_no))
)
• packet_inの送信元+ポートをフローエントリとして追加
• 優先度はPacketInより高い
フィルタリングテーブル (ID=0)
dropルールdropルール
GoTo 2
Pri.
2
2
1
Flow Entry
…
転送テーブル(ID=1)
CONTROLLER
Pri.
1
コントローラ
転送ルール2
転送ルール2…
まとめラーニングスイッチをOpenFlow1.3化
• マルチプルテーブルでデバッグしやすく• GotoTableインストラクションでテーブル (処理ステージ) を推移
• デフォルトでパケットをドロップ万が一の大量のPacketInが防げる