« ◆ 単純なブリッジの実装【OpenFlow1.0をTremaの土管として使う】 | トップページ | ◆ Trema 0.4.7インストール失敗とバージョン指定インストール »

2013年11月 2日 (土)

◆ 単純なブリッジの実装その2~複数ポート対応~【OpenFlow1.0をTremaの土管として使う】

前回作成した簡単なブリッジは2ポートのみにしか対応していませんでしたが、今回は3ポート以上にも対応するように修正しました。

■Trema のソースコード

class SimpleBridge2 < Controller

  def start
    @port_list = [ 1, 2, 3 ]    # all port numbers
  end

  def switch_ready( datapath_id )
    info "Switch[0x%016x] is up." % datapath_id

    send_flow_mod_add( datapath_id, :priority => 100 )

    @port_list.each do | port |
      send_flow_mod_add( datapath_id,
        :match => Match.new( :in_port => port ),
        :actions => SendOutPort.new( OFPP_CONTROLLER ) )
    end
  end

  def switch_disconnected( datapath_id )
    info "Switch[0x%016x] is disconnected." % datapath_id
  end

  def packet_in( datapath_id, message )
    return unless message.reason == Trema::PacketIn::OFPR_ACTION

    actions = [ ]
    @port_list.each do | port |
      if ( message.in_port != port )
        actions.push( SendOutPort.new( port ) )
      end
    end

    send_packet_out( datapath_id,
      :packet_in => message,
      :actions => actions )
  end

end

■解説

変更箇所を赤字にしています。

start

対象とするポート番号を持つ配列である @port_list には、上記コードでは例として1,2,3の3つのポート番号を指定しています。ここには3つでも4つでも対象のポート番号を指定できます。

packet_in

変数 actions は新規に追加した変数です。SendOutPort.new で生成した出力先ポート番号指定の配列です。パケットが入って来たポート(message.in_port) 以外の対象ポート番号すべてに出力するようにしています。

« ◆ 単純なブリッジの実装【OpenFlow1.0をTremaの土管として使う】 | トップページ | ◆ Trema 0.4.7インストール失敗とバージョン指定インストール »

Tremaでネットワーク機器プログラミング」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック

« ◆ 単純なブリッジの実装【OpenFlow1.0をTremaの土管として使う】 | トップページ | ◆ Trema 0.4.7インストール失敗とバージョン指定インストール »

最近のトラックバック

無料ブログはココログ