./configureLagopusはどうやらソースをコンパイルしてインストールする形態のパッケージみたいですね。DPDKがインストール処理まで完了しちゃいます。DPDKで使用するドライバを実際にスイッチ対象とするポートに当てていきます。./configre時にビルドされたカーネルモジュールを取り込みます。./src/dpdk/build/kmod/rte_kni.kohugepageをDPDKが使用できるようにします。Startでは2つの手法が記載されていますが、私は1.の手法を採用しました。S2の今回の構成はこんな感じになっています。これは、まだDPDKを適用する前の状況なんですが、このような感じでNICは認識されています。Switchのポートとして認識出来るようにしていきます。--status出力結果がこんなふうに出ます。unused=igb_uio全部デフォルトのカーネルドライバを使っていることがわかります。--statusこんなふうに変わります。/usr/local/etc/lagopus/lagopus.dsl.orig既存ファイルを参考に、設定を起こしていきます。Lagopus側でやれることというのはOpenFlowコントローラの指定ハードウェア上のポートとインタフェースの紐付けインタフェースとポート番号の紐付けポート番号とコントローラ設定をひとまとめにブリッジとして形成みたいです。実際のコンフィグは以下のとおりです。enablechannelとして、openflowコントローラの指定を行うchannel設定をもって、openflowコントローラのオブジェクトを作成する(controller01)DPDKを適用したPHY順にinterfaceを作成する(interface0[123456])interface定義に基づき、portの設定を行う(port0[123456])ブリッジを作成する(bridge01)コントローラはcontroller01を指定ポートは定義した順に1から連番でport0[123456]を適用するdpidは0x1に指定するブリッジを有効にするというわけで、ここまでできたらLagopusの設定まで完了となります。今回はこんなことをしてみます。Lagopusスイッチを我が家のバックエンドセグメントに接続し、加えてメインノートPCを接続します。バックエンドセグメントはクライアントセグメントを兼ねており、DNS/NTPサーバがDHCP配信をします。スイッチとして動いていれば、このアドレス受信が可能なはずです。クライアントとしての通信も一通り出来るはずです。OpenFlowコントローラ起動OpenFlowコントローラ側で「simple_switch_13.py」を起動します。このサンプルアプリの「13」って、OpenFlow1.3って意味だったんですね。OFPHandlerコレで準備完了。Switchの起動スイッチを起動します。run」の引数で起動しました。-p3以下のように表示されれば大丈夫そうです。full-duplexRyu側ではSTPのコンバージェンスが終わったようです。Switchに接続してみます。スイッチ側にはこんなログが出ました。full-duplexRyu側にはこんなログが出ました。5若干スイッチ間接続で四苦八苦してたので、変なログが出てますが、最終的にはうまく繋がったようです。フレームも流れ始めてるように見えます。この状態でWindows側のEthernetポートのIP設定を確認します。有効その後、ネットサーフィンしてみたり、Mastodonしてみたりしましたが、快調でした。その間、ガンガンフレームの情報がRyu側のログに流れてました。デバッグモードで実行しているというのも一つの要因なんですかねー。Ryuの停止をしました。Lagopus/Ryuの停止は、それぞれCtrl+Cするだけです。フォアグラウンドで動作しているので。感じたことやっぱりPython勉強しないとダメだなぁと痛感しました。コントローラの処理の考え方がまずわからない。サンプルコードにしても、L2スイッチ、しかも802.1dなスイッチを実用させても何だかなぁという気がしますし、L3スイッチの設定はそもそも何が出来るか分かってない。サンプルコードベースにカスタマイズする形でもいいから、何らかの手を用いて理解を深める必要があると感じました。その他、現状だとRyuもLagopusもフォアグラウンドで動いてるので、コレを完全にバックグラウンド動作させないと運用には耐えられませんし、そのことも踏まえて稼働させることを考えないと実用には・・・・道のりはものすごく遠そうな気がします。いうわけで、アプリケーションコード読んで勉強します。開発能力ゼロで本当にすみませんOrzあとなぁ・・・・Ryu側とLagopus側で対応するポート番号にずれが生じているのが気になりますね。これもコントローラ側のソースが理解できたら、少しは補正することが出来るのかなぁなんて。Switchで遊ぼうと色々やってたらあることに気づきまして。simple_switch_stp_13.pyをRyuで稼働させた所、リンクダウン/アップを繰り返していつまでたってもSTPがコンバージェンスせんのです。プロセスを確認してみると、CPU使用率が100%。こりゃどういうことだということで調べてみると、DPDKに原因があることがわかりました。割り込みでは無くパケット来てなくてもポーリングし続けるので、割り当てたコアはパケット送受信してなくても100%になります。検索すると説明見つかります。自分の検索結果で最初に出て来た日本語ページにも簡単な説明がありました。2017年11月9日さて、どうしようDPDKがCPUをフル稼働させてパフォーマンスを叩き出すことはわかりました。リンクダウン/アップを繰り返す挙動はなんとかしないと、そもそもSDNの勉強ができまてん。いうわけで、渋々一旦はDPDKを無効化することにしました。installDPDKを無効化した場合、DPDKのビルドが発生しない分結構あっさりとconfigure/ビルドが片付きます。再起動を一旦行い、DPDKドライバが外れた状態で起動します。(DPDK適用する場合、一々手で適用しなきゃならんのですよ・・・)スイッチ用NICは普通のNICとして起動し、IPv4/IPv6有効状態で起動してしまいますので、これらすべてを無効に設定して回ります。設定変更lagopus.dslを修正します。実際のコンフィグは以下のとおりです。enable★箇所が修正しt箇所です。typeを「ethernet-rawsock」に変更し、物理インタフェースをNICデバイス名で指定します。Switchにスイッチ用ポートとして認識させられます。スイッチの起動スイッチを起動します。run」の引数で起動しました。-p3」はDPDKのオプションですので外します。ryu側では引き続きsimple_switch_stp_13.pyを稼働させましたが、ループ構成にしてもちゃんとコンバージェンスしましたし、通信も安定して行えました。AverageもDPDK有効時は1.8辺りを記録していたのが一気に落ち着きました。原因は未だにわかりませんが、流石に掘り下げる気力が残ってませんでした。今後やろうと思ってること実は現在かんたんなソースは読み始めていて、どちらかと言うと「あー、スイッチってこういうふうにMACアドレスを学習するのね」とか、「あー、BPDUはこうして回しているのね」など、色々学びがありました。APIと連携してルーターの設定とかをぶち込めるという仕様を知り、試しにrest_router.pyとrest_config_switch.pyを稼働させようかなと思ってます。APIって色んな所で使われてるじゃないですか。具体的に学びたいなとも思うので、そのあたりをやろうかなと思っています。今週から来週にかけてはもう色々予定が立て込んでいるので、その先2日位を使ってやろうかなと。その後また予定が立て込んでいるのでむむーん・・しばらく勉強のペースはセーブしたほうが良さげです。