Tremaでフローエントリを取得する方法
スポンサーリンク
今日もTrema(OpenFlow)ネタです。
今日はTremaでフローエントリを取得する方法について書いてみます。
今日紹介する内容はTremaの仮想ネットワーク以外にも、実機スイッチでも使える方法です。
OpenFlowでフローエントリの情報を取得するには、FlowStatsRequestメッセージを送り、スイッチからFlowStatsReplyメッセージを受け取ることで、フローエントリの情報を取得することができます。
フローエントリの情報を取得できると、何が嬉しいかというと、フローエントリ毎のパケットの量やバイト数を取得できます。
ただし、最新のフローエントリの情報を取得するには、FlowStatsRequestを定期的に送り、FlowStatsReplyをもらう必要があります。
今回の使用環境はTrema0.4.7です。
定期的にFlowStatsRequestを送信する処理
periodic_timer_event :send_message_flowstatsrequest, 5
上記はクラス定義の下に書いておいてください。
class Testcontroller < Controller
次に、@dpidにデータパスID(dpid)を入れる処理を書いてください。
def switch_ready dpid puts "#{dpid}が起動しました" @dpid = dpid end
次に、FlowStatsRequestメッセージを送信するメソッドを追加します。
private def send_message_flowstatsrequest send_message(@dpid, FlowStatsRequest.new(:match => Match.new())) end
次に、FlowStatsReplyメッセージを受信した時に呼び出されるメソッドを記述します。
def stats_reply dpid, message puts "#{message.stats}" if message.type == Trema::StatsReply::OFPST_FLOW end
まとめたコードはこんな感じです。
# encoding: utf-8 class Testcontroller < Controller periodic_timer_event :send_message_flowstatsrequest, 5 def switch_ready dpid puts "#{dpid}が起動しました" @dpid=dpid end def stats_reply dpid, message puts "#{message.stats}" if message.type == Trema::StatsReply::OFPST_FLOW end private def send_message_flowstatsrequest send_message(@dpid,FlowStatsRequest.new(:match => Match.new())) end end
ただ、上記プログラムではパケットインした時の処理は書いていません。
なので、何かしらパケットインした時の処理を入れておくといいと思います。
上記のプログラムに、パケットインの処理を入れて、実行した時の表示結果は以下のようになります。
[<Trema::FlowStatsReply:0x000000015c4508>\nactions: [Trema::SendOutPort: port_number=65531, max_len=65535]\nbyte_count: 0\ncookie: 1327717465144164378\nduration_nsec: 703000000\nduration_sec: 2\nhard_timeout: 0\nidle_timeout: 0\nlength: 96\nmatch: wildcards = 0(none), in_port = 2, dl_src = ae:15:b7:65:d5:46, dl_dst = ff:ff:ff:ff:ff:ff, dl_vlan = 0xffff, dl_vlan_pcp = 0, dl_type = 0x800, nw_tos = 16, nw_proto = 17, nw_src = 0.0.0.0/32, nw_dst = 255.255.255.255/32, tp_src = 68, tp_dst = 67\npacket_count: 0\npriority: 65535\ntable_id: 0]
これは、表示結果の一部なのですが、このような表示がフローエントリの数だけ表示されます。
見やすく表示するには、ループで回してそれぞれの項目を表示させたり、データベースに格納してあげたほうがいいと思います。