« ◆ OpenFlowフレームワーク Trema 0.4 のインストール | トップページ | ◆ 単純なブリッジの実装【OpenFlow1.0をTremaの土管として使う】 »

2013年10月14日 (月)

◆ 【OpenFlow1.0スイッチをTremaの土管として使う】検討してみた→いけそう

OpenFlowを本来あるべき姿ではなくて、ネットワーク機器を自分で手軽にプログラミングするためのツールとして使えると面白いのではないか思い、実現性を検討してみました。

やりたいことは、
1) OpenFlow スイッチは純粋にパケットの出し入れだけに使う
2) パケットをどう処理するかはすべてOpenFlowコントローラ側にまかせる
ということです。すべてのパケットをコントローラで制御しなければならないので性能はでませんが、求めているのは性能ではありません。

OpenFlowスイッチからOpenFlowコントローラにパケットのデータを丸投げさせることができるのかを検討していきます。

OpenFlow コントローラには、OpenFlow フレームワークである Trema を用いることを想定します。

■ 課題:OpenFlowコントローラはデータに欠落なくパケットを受け取れるか?

OpenFlow1.0において、OpenFlowスイッチがフローエントリに一致しないパケットを受け取ったときにはOpenFlowコントローラにパケットを送ることになっています。が、そのパケットの全データを送っているでしょうか?

OpenFlow1.0の仕様書 P.36 には以下の記載があります:

If the packet is sent because of a flow table miss, then at least miss_send_len bytes from the OFPT_SET_CONFIG message are sent. The default miss_send_len is 128 bytes.

つまり、デフォルトでは128バイトまでしか送らないことになっています。

一方で、上記の直前には以下が書かれています(同じくP.36):

If the packet is sent because of a “send to controller” action, then max_len bytes from the action_output of the flow setup request are sent.

と、いうことで、フローエントリを追加してコントローラに送信するようにしてやれば、そのフローエントリで指定しているmax_len バイト分までのサイズのパケットを送ってくれるということです。max_len に十分な大きさを指定すれば、課題はクリアできそうです。

■フローエントリの max_len って何?

さて、次の疑問は max_len が何かということです。

OpenFlow1.0 の仕様書 P.22 には以下の記載があります:

An action_output has the following fields:

/* Action structure for OFPAT_OUTPUT, which sends packets out ’port’.
 * When the ’port’ is the OFPP_CONTROLLER, ’max_len’ indicates the max
 * number of bytes to send.  A ’max_len’ of zero means no bytes of the
 * packet should be sent.*/

struct ofp_action_output {
    uint16_t type;                  /* OFPAT_OUTPUT. */
    uint16_t len;                   /* Length is 8. */
    uint16_t port;                  /* Output port. */
    uint16_t max_len;               /* Max length to send to controller. */
};
OFP_ASSERT(sizeof(struct ofp_action_output) == 8);

The max_len indicates the maximum amount of data from a packet that should be sent when the port is OFPP_CONTROLLER.

つまり、フローエントリのアクションにmax_lenを指定すれば最大でそのサイズまでは送ると書いてあります。

■Tremaでアクションにmax_lenを指定するには?

今度はTremaのAPIを調べてみます。

パケットをポートに送るアクションはTrema では SendOutPort クラスですのでこの API を調べます:
http://rubydoc.info/github/trema/trema/master/Trema/SendOutPort

ここでコンストラクタのメソッドを見ると、max_len を引数に指定する形式と指定をしない形式の2つがありますが、引数の説明文には以下の記載があります:

:max_len (Number) —

the maximum number of bytes from a packet to send to controller when port is set to OFPP_CONTROLLER. A zero length means no bytes of the packet should be sent. It defaults to 64K.

つまり、Trema では max_len のデフォルトが64kバイトです。
max_len の型は先ほど確認したOpenFlow1.0 の仕様書での記載個所においてuint16_t max_len と宣言されていることから64Kバイトは最大値になります。

以上から、Trema を使えば何も気にせずに最大サイズのパケットを送るようにOpenFlowスイッチにフローエントリを登録できます。

■結論

以下とすればよい:

1) どんなパケットもコントローラに送るフローエントリをOpenFlowスイッチに登録する。
2) Tremaから、アクションでコントローラへ送信するOFPP_CONTROLLERを指定してフローエントリを登録する。このとき、パケットサイズについて特に特別なことはいらない。(デフォルトでmax_lenに最大値64Kバイトが指定されるため)

次回は、Tremaで2ポートのブリッジを作ってみたいと思います。

p.s.
OpenFlow 1.0 では mtu について何も書いてありません。イーサネットなら1518バイトだし、ジャンボフレームでもさすがに64Kバイトはないでしょうから(いまのところはですが)、64Kバイトあれば大丈夫でしょう。


OpenFlow 1.0 の仕様書:
  http://archive.openflow.org/documents/openflow-spec-v1.0.0.pdf

« ◆ OpenFlowフレームワーク Trema 0.4 のインストール | トップページ | ◆ 単純なブリッジの実装【OpenFlow1.0をTremaの土管として使う】 »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1776113/53597796

この記事へのトラックバック一覧です: ◆ 【OpenFlow1.0スイッチをTremaの土管として使う】検討してみた→いけそう:

« ◆ OpenFlowフレームワーク Trema 0.4 のインストール | トップページ | ◆ 単純なブリッジの実装【OpenFlow1.0をTremaの土管として使う】 »

最近のトラックバック

無料ブログはココログ