LoginSignup
3
3

More than 5 years have passed since last update.

RyuでOFスイッチのIPアドレスを知るには

Last updated at Posted at 2016-06-19

結論

datapath.address[0]で取れる。

動機

Ryuを使っていて、OpenFlowスイッチのIPアドレスが取りたくなった。

環境

  • Ryu 4.3
  • スイッチはOpen vSwitch 2.5.0を使用
  • OpenFlow1.3で接続

まずはリファレンスを

入っているとしたらdatapathオブジェクトかなーと思ったので、まずはDatapathクラスのリファレンスを読む。

…ない(´・ω・`)

ググる

同じこと考えてる人いないかな、と思って色々ググって探すと、NCLC様のブログ記事を発見。

そこで以下の情報もついでに取得します。
[スイッチ全体]
・ 動作OpenFlowバージョン
・ IPアドレス
・ 保持しているポートの数

取れてる!

早速ソースを読むと、どうやらdatapath.address[0]で取れているっぽい。

再度リファレンスを確認…やっぱり載ってない(´・ω・`)

試す

早速試してみる。Ryuのサンプルコードsimple_switch_13.pyのswitch_features_handlerに、以下の行を足す。

# print IP address of the switch
self.logger.info(datapath.address[0])

立ち上げてローカルホストのスイッチから繋ぎに行くと…

$ ryu run simple_switch_13.py
loading app simple_switch_13.py
loading app ryu.controller.ofp_handler
instantiating app simple_switch_13.py of SimpleSwitch13
instantiating app ryu.controller.ofp_handler of OFPHandler
127.0.0.1

取れた!!

ちなみに、[0]を外して出力してみると、('127.0.0.1', 35148)とかになる。IPアドレスとポート番号のタプル。

コードを追っかけよう

取れた…はいいけど、リファレンスに載ってないAPIを使うのはちょっと怖いので、コードを追っかけてみる。

Dapapathクラスの定義を見ると、確かにaddress属性は格納されており、この変数の受け渡しを遡っていくと、ここに行きつく。

sock, addr = self.server.accept()

self.serverはeventlet.listenの戻り値でありsocketである。socket.acceptの戻り値なので、addrには(host, port)が入るのでした。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3