Trema - コントロールパスからデータパスのMACとIPを取りたいが
データパスがコントロールパスに対して接続した時点では、コントロールパスはデータパスがどのような環境にいるかまったく分からず暗闇のような状態です。
データパスのMACもIPも分からないため、データパスの周りにどのようなネットワークアドレストゲートウェイがあるのかも分かりません。
例えばデータパスがリナックスだったとして、ルータのようにポートごとにIPが振られていたり、スイッチのようにホスト全体に一つ管理用IPを持っていたりするかもしれません。さらにルーティングも知っているかもしれません。
そのような場合にはコントロールパスよりもデータパスの方がずっと物知りなわけですよ
ね。
■■■ MACアドレスを取得 ■■■
MACについてはデータパスから教えてもらう方法があります。ネットや本にある通り、send_messageメソッドとfeatures_replyメソッドを使います。例は下記の通りです。
def switch_ready datapath_id
info "Switch #{ datapath_id.to_hex } is UP"
send_message datapath_id, FeaturesRequest.new
enddef features_reply datapath_id, message
ports_info = {} message.ports.each do | each | ports_info[each.number] = each puts "MAC: #{ each.hw_addr.to_s }" end end\
スイッチがアップになったら、データパスIDを指定してsend_messageメソッドを実行。戻りメッセージはfeatures_replyメソッドで受け取ります。そのメッセージ内のmessage -> ports -> hw_addr にMACアドレスが入っています。
■■■ IPアドレスは取得できない仕様 ■■■
Tremaのメーリングリストで聞いてみたのですが、現在のopen flowプロトコルではデータパスのIPを取得する項目はないそうです。ベンダー固有に実装するしかないと。
そのため現状ではsshなりsnmpなりで情報を収集するしかないようです。
考えてみれば確かにその通りで、Open Flowはスイッチのために作られたのであってルータやロードバランサ用ではないので、IPを持つことは想定外なのでしょうね。
私も追って考えてみますが、IP収集で便利な方法が分かり次第お知らせします。基本的にデータパスはNAT越しにありコントロールパスからは直接アクセスできないことを私は想定しているので、データパス側のTrema起動時に一緒に起動するスクリプトが良いのではと考えています。