今日も秋田で IoT

旧 Trema 日記

trema

rvm を使って trema/trema-edge 共存環境をつくる

今回から OpenFlow 1.3 に対応した trema-edge に挑戦してみます。 streocat さんに先をこされた気もしますが、気にしないこととします。trema と trema-edge では必要とする ruby のバージョンが異なります。両者を扱える環境では、複数のバージョンの ruby…

Flow エントリをポート指定で消す (その2)

今回は、ポート番号の指定によりフローエントリを消す方法について、実際に動かして試してみましょう。以下の内容のコントローラを outport_test.rb というファイル名で用意します。 class OutportTest < Controller def switch_ready dpid send_flow_mod_ad…

Flow エントリをポート指定で消す (その1)

今回は、出力ポートが同じである複数のフローエントリを消す方法を紹介します。早速ですが、Flow Mod メッセージフォーマットを見てみましょう。 /* Flow setup and teardown (controller -> datapath). */ struct ofp_flow_mod { struct ofp_header header;…

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

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

OpenFlow実践入門 Kindle 版

拙著の OpenFlow 実践入門ですが、Kindle 版が 5/10 に発売になるようです。持ち運びに便利な Kindle 版の方も、ぜひよろしくお願いします。クラウド時代のネットワーク技術 OpenFlow実践入門作者: 高宮安仁,鈴木一哉出版社/メーカー: 技術評論社発売日: 201…

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

今回もTremaを少し離れて、OpenFlow 1.0 の仕様の話です。今回は Features Request/Reply で取得できるポートの情報について見ていきます。ポート情報を格納するための構造体 struct ofp_phy_port は、以下のように定義されています。 struct ofp_phy_port {…

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

今回は Trema の話はすこしお休みして、OpenFlow spec 1.0 の仕様書を見てみましょう。Features Reply の中身は以下のように定義されています。 /* Switch features. */ struct ofp_switch_features { struct ofp_header header; uint64_t datapath_id; /* D…

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

前回、Ruby でコントローラを書きましたが、もちろん C 言語でも同様なことができます。 #include <stdio.h> #include "trema.h" static void handle_switch_ready( uint64_t dpid, void *user_data ) { UNUSED( user_data ); buffer *features_request = create_feat</stdio.h>…

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

OpenFlow プロトコルでは、スイッチから情報を取得するために、Features Request/Reply メッセージが定義されています。今回は、これらのメッセージを用いたコントローラを作り、実行することで、どのような情報が取得できるかを確認してみます。 class Show…

Sliceable Switch を使う (その2)

Sliceable Switch のスライス設定は、前節で紹介したようにコマンドで行うこともできますが、REST ベースの API で行うこともできます。今回はこの REST API を使った設定方法を、試しながら紹介していきたいと思います。 まずは、コマンド設定と REST API …

Sliceable Switch を使う (その1)

今回は Trema Apps にある Sliceable Switch について紹介します。このアプリを使うと、OpenFlow ネットワーク全体をスライスに分割し,複数の L2 ネットワークとして動かすことができます。ちょうど,L2 スイッチを複数の VLAN に分けて使うイメージです。…

C 言語で Match を書く (その1)

今回は、C 言語で Match を書いてみましょう。送信元 IP アドレス 192.168.1.0/24、宛先 IP アドレス 192.168.2.0/24 とマッチさせる Flow_mod を設定するコントローラは、以下のようになります。 ポイントは二点です。 宛先 IP アドレスをマッチ条件に用い…

Match 条件の wildcard について

Match 中の wildcard について説明します。前回記事で作成した matchtest.rb を動かしてみましょう。 $ ./trema run ./matchtest.rb -c ./network.conf -d $ TREMA_HOME=. ../apps/flow_dumper/flow_dumper [0x00000000000001] priority = 65535, match = [w…

Ruby で Match を書く (その2)

今回は Match を書く際の注意点について説明します。nw_dst を Matching の条件として使ってみましょう。 上記のサンプルを動かして、どのようなフローエントリが設定されたか確認してみましょう。 $ ./trema run ./matchtest.rb -c ./network.conf -d $ TRE…

Ruby で Match を書く (その1)

今回は Match の書き方について説明します。今回は C 言語よりもシンプルにかける Ruby を使います。OpenFlow 1.0 の仕様では、Packet の Matching に 12-tuple の情報を用いることができます。Trema において Match を作る際に、使用したい引数に値を設定す…

C 言語で flow_mod を送る (その2)

今回は、flow_mod メッセージの作り方について、少し詳しく説明したいと思います。openflow-message.h 中にて、以下のように create_flow_mod() のプロトタイプが宣言されています。 buffer *create_flow_mod( const uint32_t transaction_id, const struct …

C 言語で flow_mod を送る (その1)

今回は、flow_mod をスイッチに送る方法について説明します。packet_in ハンドラ中で、flow_mod を作り、送ってみましょう。 flow_mod を送る際のポイントは、以下の 4 つです。 match を作る 今回の例では、set_match_from_packet() 関数を使って、packet_i…

C 言語で packet_in ハンドラを書く (その4)

前回紹介した packet_info 型のデータを取り出す関数として、get_packet_info() 関数を用意しています。この関数を使って packet_info 型の構造体の値を取り出すことで、パケット中の値を簡単に参照することができます。 例えば packet_in ハンドラを以下の…

C 言語で packet_in ハンドラを書く (その3)

今回は packet_in ハンドラにどのような情報が渡ってくるかについて解説します。packet_in ハンドラに引数として渡ってくる packet_in 構造体は、以下のように定義されています。 typedef struct { uint64_t datapath_id; uint32_t transaction_id; uint32_t…

C 言語で packet_in ハンドラを書く (その2)

今回は packet_in ハンドラを使って、簡単なコントローラを書いてみましょう。以下のソースの handle_packet_in() がハンドラです。packet_in メッセージの送りもとのスイッチの datapath_id および受信ポートを表示する簡単なハンドラです。 1. #include <stdio.h> 2</stdio.h>…

C 言語で packet_in ハンドラを書く (その1)

C 言語を使った Trema 上でのコントローラプログラミングに関する話です。今回は packet_in を扱う方法について解説します。 packet_in は、OpenFlow スイッチがフローエントリにマッチしなかったパケットをコントローラに送るためのメッセージです。このメ…

LLDP でトポロジー検出

topology_discovery が LLDP でトポロジー検出を行う仕組みをみてみます。topology_discovery は LLDP メッセージを作り、packet_out でスイッチへと送ります。スイッチから出力された LLDP は隣接するスイッチに届き、packet_in でコントローラへと戻ってき…

show_description でスイッチの情報を取得する

前回の flow_dumper に似たアプリとして show_description があります。さっそく起動してみましょう。 $ ./trema run -c ../apps/routing_switch/routing_switch.conf -d $ TREMA_HOME=`pwd` ../apps/show_description/show_description Manufacturer descri…

flow_dumper を使ってフローエントリを取得する

Trema を使ってコントローラの開発をしていると、OpenFlow スイッチにちゃんとフローが設定できているのか気になります。OpenFlow の仕様では、OpenFlow スイッチに設定されているフローを取得するために、stats_request メッセージの OFPST_FLOW タイプが用…

セキュアチャネルのポート番号を変える

作成した OpenFlow コントローラを trema 上で起動すると、セキュアチャネル用にデフォルトで tcp/6633 ポートを Listen します。このポート番号を変えるためには、コンフィグファイルに以下のような 1 行を付け加えます。 config.port = 6644 ネットワーク…

Trema アプリを複数同時に起動する方法

前回の記事で用いた topology_fullmesh.conf には run で始まる箇所が三つあり、それぞれ topology, topology_discovery, dumper という3つのアプリケーションを起動しています。このように trema では複数のアプリを同時に立ち上げることができます。しかし…

Topology を動かしてみよう

前回紹介した topology モジュールを動かしてみましょう。 ビルドと実行 trema 本体と topology のビルドを行ってください。 $ (cd trema/; ./build.rb) $ (cd apps/topology/; make) ビルドができたら、以下のように実行してみてください。 $ (cd trema/; .…

Topology の紹介

github 上の以下のリポジトリに、Trema を使ったアプリケーションがいくつか登録されています。https://github.com/trema/appsこの中にある topology について紹介します。 Topology とは? 複数の OpenFlow スイッチから構成されるネットワークを、コントロ…

cruise.rb 失敗への対策

./cruise.rb が最近失敗するようになった。こんな感じに。 kazuya@ubuntu0:~/proj/trema$ ./cruise.rb /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- bundler/setup (LoadError) from /…

ネットワークエミュレーション機能 (openvswitch の起動)

質問を頂いたので、Trema のネットワークエミュレーション機能において、openvswitch がどのように起動されるかを解説します。 openvswitch の起動 openvswitch は、Trema 内の Ruby において、OpenVswitch クラスとして表現されています(ソース)。このクラ…