結論
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)
が入るのでした。