Exact Match を楽に作る

マッチングルールの中でもすべての条件が指定されたものを Exact Match と呼びます。たとえばよくある例ですが Packet In としてコントローラに入ってきたパケットと

  • スイッチの物理ポート番号
  • 送信元 MAC アドレス
  • 宛先 MAC アドレス

などなどマッチングルールが定義する 12 個の条件がすべてまったく同じ、というものが Exact Match です。これを普通にコードにするとこうなります。

def packet_in datapath_id, message
  # ...

  send_flow_mod_add(
    datapath_id,
    :match => Match.new(
      :in_port = message.in_port,
      :nw_src => message.ipv4_saddr,
      :nw_dst => message.ipv4_daddr,
      :dl_src => message.macsa,
      :dl_dst => message.macda,
      # ...

うーん。意味はわかりますが、マッチングルールを一つ作るのにこのようにいちいち 10 行以上も書いていたらしんどいですよね。

そこで、Trema ではこのような Exact Match を楽に書ける次のショートカットを用意しています。

def packet_in datapath_id, message
  # ...

  send_flow_mod_add(
    datapath_id,
    :match => ExactMatch.from( message ),
      # ...

なんとたった 1 行で書けました!

Trema にはこのようなプログラムを短くする工夫がたくさんありますので、このブログでこれからもおいおい説明して行きましょう。

Leave a Reply