Lagopus as OpenFlow
Hybrid Switch
Dec 8, 2015
Masaru OKI @masaru0714
OpenFlow?
● 受信したパケットを、「フローエントリ」に書かれた条件に従って(エントリの指示によっ
ては加工し)送信する、という一連の機能について定めた仕様
● OpenFlowの機能を持ったスイッチをOpenFlow switchと呼ぶ
● OpenFlow switchの制御にはOpenFlow Protocolが使われる
OpenFlow switch
Flow Table
OpenFlow
Controller
OpenFlow Protocol
Flow entry
パケット
Hybrid switch?
● OpenFlowスイッチと、いわゆる従来のパケット処理が組み合わさったもの
● 組み合わせ方についてはベンダー次第
● OpenFlow仕様では、OFPP_NORMALにoutputすると従来の処理に渡される
● standaloneモードに設定されていれば、コントローラと未接続の時も従来の処理
● いわゆる従来の処理とは: ブリッジ、ルーティング等
OpenFlow switch Legacy Protocol
(bridge, router, …)
1
2
3
NORMAL
Lagopus
● Intel DPDKを利用しマルチコア・マルチスレッドで動作するOpenFlowスイッチ。
● DPDKは、パケット送受信するNICをLinuxの制御下から奪い取って動作する。
● よって、Lagopusでパケット送受信している様子をtcpdumpなどで観察できない。
● ipコマンドを使ってlink up, downなどの操作もできない。
● brctlなどでブリッジにDPDKポートを追加することもできない。
Linux kernel
eth2 eth3
DPDK apps (i.e. Lagopus)
NIC1 NIC2 NIC3 NIC4
port0 port1
eth0 eth1
いわゆる従来の処理をどう用意するか
まじめにブリッジ処理・ルーティング処理を実装する
● MACアドレス学習し、学習したポートへ転送
● 学習されてないアドレス宛の場合flooding
● ルーティングの場合ARP, ICMP, ルーティングテーブルなど多数の機能実装が必要
カーネルに任せる
● 丸投げ。
第一段階: 丸投げの実装
● /dev/net/tun (OSによりパスが異なる)をopenしてioctlすればtapが作られる
● tapインタフェースにデータを書き込み→kernelからみるとパケット受信
● kernelからパケット送信→tapインタフェースからデータを読める
● Lagopusが扱う(DPDK)ポートと1:1でtapインタフェースを作成
● tapインタフェースをLinux bridgeにつなげばOFPP_NORMALのブリッジ完成
Linux kernel
tap0 tap1
Lagopus
NIC1 NIC2
port0 port1
eth0 eth1
Linux bridge
tapの応用: ホワイトボックススイッチの方法
Cumulus Linuxでは、
● 物理スイッチのポートに対応するダミーのインタフェースを用意しておく
● ダミーのインタフェースに対してipコマンドを使用すると、
switchdがそれを検知して、物理スイッチのポートに対して設定を行う
これと似たようなことができるのではないだろうか?
Linux kernel
eth2 eth3
switchd
port0 port1 port2 port3
eth0 eth1
Switch ASIC
2.検知ipコマンド 1.設定
3.設定
同様の手段がとれるか考えてみる
● Lagopus interfaceと1:1対応のtap interfaceを用意する
● netlink socketを使ってtap interfaceに対する操作を監視
● tap interfaceがlink downされたらLagopus interfaceをdown
● tap interfaceがlink upされたらLagopus interfaceをup
実現できそう?
Linux kernel
tap0 tap1
Lagopus
NIC1 NIC2
port0 port1
eth0 eth1
ipコマンド
1.設定
2.検知
3.設定
第二段階: 自前のL2bridge実装
● tapを用意せずともブリッジ動作が実現できる
● が、tapはtapで利用価値がある
● 全パケットをtapにコピーして送るとtcpdumpできる
○ コピーは重いので、リファレンスカウントを +1する
● MACやIPアドレスからkernelが取捨選択して適宜通信できる
Linux kernel
tap0 tap1
Lagopus
NIC1 NIC2
port0 port1
eth0 eth1
転送
tcpdumpなど
転送
実装状況
● tapインタフェースの作成: 完了
● tapインタフェースを使ったパケットの送受信: 完了
○ lagopusを経由してpingがとおります
● 自前L2bridge: 動き始めている
TODO
● netlinkを使ったtapインタフェース操作の監視とLagopusへの動作反映: これから
● tapについてLinux以外ではまだ実装できていない
● 転送性能も未確認
近日リリース予定……です!

Lagopus as open flow hybrid switch