今日も秋田で IoT

旧 Trema 日記

2012-01-01から1年間の記事一覧

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 に分けて使うイメージです。…

オープンルータ・コンペティション

Interop 2012 の併催イベントとして、オープンルータ・コンペティションが開催されました。6/13 に最終審査会が開かれたので、見学してきました。最終審査会では、一次審査を通過した10チームのプレゼンが行われました。 FPGA 付きの NIC を使ってワイヤーレ…

Openvswitch を userspace で動かす

今回は Openvswitch (ovs-vswitchd) を userspace で動作させる方法を試してみたので紹介します。以前にも openvswitch の userspace での動作について紹介しましたが、その時用いていたのは ovs-openflowd でした。こちらの方は 1.4.0 にはすでに同梱されて…

GRE を使って OpenFlow ネットワークを作る

前回は etherip を使ってトンネルを組む方法について紹介しましたが、今回は GRE を使う方法について紹介します。 Linux には kernel module として動作する GRE ドライバが存在しますが、今回は Openvswitch に組み込まれている GRE 機能を使用します。その…

EtherIP を使って OpenFlow ネットワークを作る

今回は EtherIP を使って、openvswitch 同士を接続してみたいと思います。ハードウェア OpenFlow スイッチを持っていなくても、トンネルを使うことで、オーバーレイで OpenFlow ネットワークを作ることが出来ます。今回は、以下のような構成を作ることが目標…

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…

Openvswitch を OpenFlow スイッチとして使う

以前 userspace で動作する openvswitch について紹介しましたが、今回は kernel-mode で転送動作を行う openvswitch を OpenFlow スイッチとして動作させる方法をまとめてみました。 ソースは ここ にあるものを利用し、INSTALL.Linux を参考にインストール…

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…

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

今回は、OpenWRT/WHR-G301N がきちんと OpenFlow スイッチとして動作するのかを確認してみたいと思います。今回使うコントローラは、loopback-test.rb を用います。 さっそく動かす。 それでは起動してみましょう。OpenWRT/WHR-G301N 中の OpenFlow スイッチ…

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 スイッチから構成されるネットワークを、コントロ…