読者です 読者をやめる 読者になる 読者になる

思考停止するな

ネットワークとかアプリケーションとかWebとか

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]

これは、表示結果の一部なのですが、このような表示がフローエントリの数だけ表示されます。
見やすく表示するには、ループで回してそれぞれの項目を表示させたり、データベースに格納してあげたほうがいいと思います。



おすすめの関連記事
shimonss.hatenablog.com
shimonss.hatenablog.com