今日も秋田で IoT

旧 Trema 日記

OpenWRT with OpenFlow を trema と接続する(その2)

OpenWRT/WHR-G301N 側の設定 前回の記事で /lib/openflow/ofprotocol.sh の修正を行いましたが、それに加え、今回は以下の修正を行いました。 /etc/config/network : switch_vlan の設定を変更しています。 /etc/config/openflow : OpenFlow の設定は、inban…

OpenWRT with OpenFlow を trema と接続する(その1)

srchack さんの patch により、OpenWRT を OpenFlow スイッチとして動作させることができるようになりました。OpenWRT の OpenFlow 化については こちら をご参照いただくとして、ここでは trema に繋いでみる方法について簡単に紹介します。 OpenWRT 側の変…

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 クラスとして表現されています(ソース)。このクラ…

ネットワークエミュレーション機能の中身

Trema のネットワークエミュレーション機能の中身を見てみたいと思います。例えば、以下のようなコンフィグファイルを Trema から起動したとします。 vswitch ( "vsw" ) { datapath_id "0xabc" } vhost ( "host1" ) vhost ( "host2" ) link "host1", "vsw" l…

Trema アプリの起動方法 (ネットワークエミュレータ編)

今回は、ネットワークエミュレータ機能を使う場合の OpenFlow アプリケーションの起動方法について、解説します。 ネットワークエミュレータを使った起動方法 例えば、一台のスイッチに二台のホストが接続されているネットワークをエミューレートすることを…

Trema アプリの起動方法 (基本編)

Trema 上で開発した OpenFlow アプリケーションの起動方法について、解説します。基本的には、コマンドから直接オブジェクトを指定する方法と、コンフィグファイルに経由で起動する方法の二通りがあります。 コマンドから直接オブジェクトを指定する方法 ま…

Routing Switch の紹介

SD 2 月号に書いた Routing Switch をもう少しだけ詳しく説明します。Routing Switch は、複数の OpenFlow スイッチで構成されたネットワークをあたかも一つの L2 スイッチとして動作させる Trema アプリケーションです(図1)。C 言語で書かれています。起動…

ブログはじめました。

ブログはじめてみました。OpenFlow コントローラを書くためのフレームワークである Trema について書いてみようかなと思っています。http://trema.github.com/trema