Features Request でスイッチから情報を取得する (その5)

前回からだいぶ時間がたってしまいましたが、Features Request を用いた情報取得に関する記事の最終回です。今回は、第一回で作成した ShowFeatures コントローラを改造して、Features Request で取得できる情報を更に出力できるようにしてみます。

class ShowFeatures < Controller
  def switch_ready datapath_id
    send_message datapath_id, FeaturesRequest.new
  end

  def features_reply datapath_id, message
    puts "Datapath ID: #{ datapath_id.to_hex }"
    puts "Max packets: #{ message.n_buffers }"
    puts "Number of tables: #{ message.n_tables }"
    puts "Capabilities: #{ message.capabilities.to_s( 2 ) }"
    puts "Supported actions: #{ message.actions.to_s( 2 ) }"

    message.ports.each do | each |
      puts "Port no: #{ each.number }"
      puts "  Hardware address: #{ each.hw_addr.to_s }"
      puts "  Port name: #{ each.name }"
      puts "  Config: #{ each.config.to_s( 2 ) }"
      puts "  State: #{ each.state.to_s( 2 ) }"
      puts "  Features: #{ each.curr.to_s( 2 ) }"
      puts "    Advertised: #{ each.advertised.to_s( 2 ) }"
      puts "    Supported: #{ each.supported.to_s( 2 ) }"
      puts "    Peer: #{ each.peer.to_s( 2 ) }"
    end
  end
end

実行してみる

ShowFeatures コントローラを実行してみましょう。

$ sudo trema run ./show-features.rb -c ./network.conf 
Datapath ID: 0xabc
Max packets: 256
Number of tables: 1
Capabilities: 10000111
Supported actions: 111111111111
Port no: 2
  Hardware address: 1a:18:a9:7d:35:75
  Port name: trema0-1
  Config: 0
  State: 0
  Features: 11000000
    Advertised: 0
    Supported: 0
    Peer: 0
Port no: 65534
  Hardware address: 02:2a:33:5d:6c:bd
  Port name: vsw_0xabc
  Config: 1
  State: 1
  Features: 10000010
    Advertised: 0
    Supported: 0
    Peer: 0
Port no: 1
  Hardware address: 56:e5:fe:83:bc:9f
  Port name: trema1-1
  Config: 0
  State: 0
  Features: 11000000
    Advertised: 0
    Supported: 0
    Peer: 0
^C
terminated

スイッチのケイパビリティは、10000111 と表示されています。第三回の記事に記載した enum ofp_capabilities と見比べると、このスイッチでは OFPC_FLOW_STATS, OFPC_TABLE_STATS, OFPC_PORT_STATS, OFPC_ARP_MATCH_IP がサポートされていることがわかります。一方で、OFPC_STP, OFPC_RESERVED, OFPC_IP_REASM, OFPC_QUEUE_STATS はサポートされていません。

また、サポートアクションに関しては、111111111111 と表示されています。OpenFlow 1.0 の仕様で定義されているアクションの数は 12 ですので、このスイッチはこれらをすべてサポートしていることを意味しています。

次に各ポートごとの情報を見ていきます。Config と State に関しては、Port 番号 1 と 2 に関しては両方共 0 となっています。Config が 0 ということは定義されている設定は特に行われていないことを意味します。また State が 0 ということは、STP も特に利用していないので、単に Link up していることを意味します。一方で Port 番号 65534 に関しては、Administrative down されていることがわかります。

ポートのフィーチャーに関しては、Port 番号 1, 2 のポートでは OFPPF_10GB_FD, OFPPF_COPPER のフラグが立っています。今回使用している OpenFlow スイッチでは 10GbE のカッパーを使用しておらず、リンクに関してはソフトウェア的に仮想的に作られてものです。今回使用しているソフトウェアスイッチは、ソフトウェア的なリンクを 10GbE のカッパーとして返す実装を行なっているようです。