SlideShare una empresa de Scribd logo
1 de 30
OpenFlowコントローラ開発支援ツールの提案
∼ロジックおよびフロー識別ラベルの導入∼

Yutaka Yasuda, Kyoto Sangyo University
はじめに

• OpenFlow 
  プログラムによる各スイッチの転送先制御
• コントローラ・プログラミングにおける問題
  自分が書いたコードが実際にどのような転送先制御として
  反映されたのか直接的に確認する方法がない



   “このコードは、どのフローに対して、どう作用したのか?”
    “このフローは、どのコードによって生成されたのか?”
ゴール:開発支援ツールの提案

                             • コードとフロー制御情報を対応づける
                             • 影響を受けたフローを追跡可能にする

                Controller



            sw1               sw3
host1                                     host3




        host2                                     host4

                       sw2          sw4
step 1: 
ロジックとエントリを結びつける
例:2ポートスイッチとそのためのコード

             1     (inport=1) [output=2]   2
                                                       この場の記法:
                   (inport=2) [output=1]               (match fields) [actions]


NOX like pseudo code:
     def packet_in_callback(dpid, inport, reason, len, bufid, packet):    callback
        flow = extract_flow(packet)
                                             make match fields
        flow[core.IN_PORT] = inport
        if inport == 1 :
            outport = 2
        else:                                                     make actions
            outport = 1
        actions = [[openflow.OFPAT_OUTPUT, [0, outport]]]
        inst.install_datapath_flow(dpid, flow,..., actions, ...)  set flow entry
        return CONTINUE
ロジック識別ラベルの設定

                         def packet_in_callback(dpid, inport, reason, len, bufid, p
                            flow = extract_flow(packet)
                            flow[core.IN_PORT] = inport
                            if inport == 1 :
 (inport=1) [output=2]          outport = 2
                            else:
 (inport=2) [output=1]          outport = 1
                            actions = [[openflow.OFPAT_OUTPUT, [0, outport]]]
                            inst.install_datapath_flow(dpid, flow,..., actions, ...)
                            return CONTINUE




                 フローエントリとそれに対応するコードに注目
ロジック識別ラベルの設定

                               def packet_in_callback(dpid, inport, reason, len, bufid,
                                  flow = extract_flow(packet)
                                  flow[core.IN_PORT] = inport
                                  if inport == 1 :
                                      inst.markLogicPoint( 101 )
#101   (inport=1) [output=2]          outport = 2
#102   (inport=2) [output=1]      else:
                                      inst.markLogicPoint( 102 )
                                      outport = 1
                                  actions = [[openflow.OFPAT_OUTPUT, [0, outport]]]
                                  inst.install_datapath_flow(dpid, flow,..., actions, ...)
                                  return CONTINUE



        このような関数を追加してフローエントリに識別ラベルを設定する
ロジック識別ラベルの設定

                                       def packet_in_callback(dpid, inport, reason, len, bufid,
                                          flow = extract_flow(packet)
                                          flow[core.IN_PORT] = inport
                                          if inport == 1 :
                                              inst.markLogicPoint( 101 )
#101       (inport=1) [output=2]              outport = 2
#102       (inport=2) [output=1]          else:
                                              inst.markLogicPoint( 102 )
                                              outport = 1
                                          actions = [[openflow.OFPAT_OUTPUT, [0, outport]]]
                                          inst.install_datapath_flow(dpid, flow,..., actions, ...)
                                          return CONTINUE

                     #102           ( inport=1 )                            [ outport=2 ]

       flow entry:   cookie         Match Fields         Counters              Actions
                     (64bits)


                                ラベルは Cookie フィールドに書き込む
結果:フローエントリとコードの相互参照
                switch                                                           controller program


  1
      flow entries                              6
       cookie        match fields, etc..
  2                                            7
                    (inport=1) [ outport=6 ]
  3                                            8
        101            …………………                      def getOutport(dpid, vport, packet):
                                               9      if not OPORTS.has_key(dpid):
  4                    …………………                            log.err('Unknown dpid=%x on getoutput' % (dpid),system='paniersw')
                                                          return False
  5                    …………………                 10     if not OPORTS[dpid].has_key(vport):
                                                          log.err('Invalid (dpid,vport)=(%x,%d) on getOutport' % (dpid, vport),system='paniersw')
                       …………………                            return False
                                                      ops=OPORTS[dpid][vport]
                                                      for (rule, outport, cookie) in ops:
                                                          if rule == RULE80 and testTCPport(80, packet):
                                                              inst.setLogicMark( 101 )
                                                              return (outport, cookie)
                                                          elif rule == RULE443 and testTCPport(443, packet):
フローからコードへの参照:                                                 inst.setLogicMark( 102 )
                                                              return (outport, cookie )
「このフローエントリにはこのコードが関わった」                                   elif rule == RULE25 and testTCPport(25, packet):
                                                              return (outport, cookie)
                                                          elif rule == ANY:
                                                              return (outport, cookie)
コードからフローへの参照:                                         return False

「このコードが影響を与えたフローエントリはどれか」
                                                    def forward_l2_packet(dpid, inport, vport, packet, buf, bufid):
                                                      dstaddr = packet.dst.tostring()
                                                      if not ord(dstaddr[0]) & 1 and inst.st[dpid].has_key(dstaddr):
                                                          prt = inst.st[dpid][dstaddr]
                                                          if prt[0] == vport:
                                                             inst.setLogicMark( 122 )
                                                             log.err('**warning** learned port = inport', system="paniersw")
                                                             myFlood(dpid, bufid, buf, vport, packet)
                                                          else:
                                                             inst.setLogicMark( 123 )
一つだけの分岐:問題なし
                switch                              controller program


  1
      flow entries                              6
       cookie        match fields, etc..
  2                                            7
                    (inport=1) [ outport=6 ]
  3                                            8
        101            …………………                                     def getOutport(dpid, vport, packet):
                                               9                     if not OPORTS.has_key(dpid):
  4                    …………………                                           log.err('Unknown dpid=%x on getoutput' % (
                                                                         return False
  5                    …………………                 10                    if not OPORTS[dpid].has_key(vport):
                                                                         log.err('Invalid (dpid,vport)=(%x,%d) on getOu
                       …………………                                           return False
                                                                     ops=OPORTS[dpid][vport]
                                                                     for (rule, outport, cookie) in ops:
                                                                         if rule == RULE80 and testTCPport(80, packe
                                                                             inst.setLogicMark( 101 )
                                                                             return (outport, cookie)
                                                                         elif rule == RULE443 and testTCPport(443, p
                                                                             inst.setLogicMark( 102 )
                                                                             return (outport, cookie )
                                                                         elif rule == RULE25 and testTCPport(25, pac
                                                                             return (outport, cookie)
コードとの対象は事実上、分岐との対象と見なせる                                                  elif rule == ANY:
                                                                             return (outport, cookie)
(分岐や関数呼び出しなどの重要な通過点に識別ラベル                                            return False

 をつけるため)
                                                                   def forward_l2_packet(dpid, inport, vport, packet,
                                                                     dstaddr = packet.dst.tostring()
                                                                     if not ord(dstaddr[0]) & 1 and inst.st[dpid].has_k
                                                                         prt = inst.st[dpid][dstaddr]
                                                                         if prt[0] == vport:
                                                                            inst.setLogicMark( 122 )
                                                                            log.err('**warning** learned port = inport', s
                                                                            myFlood(dpid, bufid, buf, vport, packet)
                                                                         else:
                                                                            inst.setLogicMark( 123 )
複数段の分岐:以前の記録が必要
                                                                        def getOutport(dpid, vport, packet):
                                                                          if not OPORTS.has_key(dpid):
                                                                              log.err('Unknown dpid=%x on getoutp
                                                                              return False
                                                                          if not OPORTS[dpid].has_key(vport):
                                                                              log.err('Invalid (dpid,vport)=(%x,%d) o
                                                                              return False
                                                    102                   ops=OPORTS[dpid][vport]
      flow entries
  1                                            6                101       for (rule, outport, cookie) in ops:
                                                                              if rule == RULE80 and testTCPport(80
       cookie        match fields, etc..                                           inst.setLogicMark( 101 )
  2                                            7                                  return (outport, cookie)
                    (inport=1) [ outport=6 ]                                  elif rule == RULE443 and testTCPport
  3                                            8                                  inst.setLogicMark( 102 )
        101            …………………
                                                                                  return (outport, cookie )
  4                    …………………                 9                              elif rule == RULE25 and testTCPport(2
                                                                                  return (outport, cookie)
                       …………………                 10                             elif rule == ANY:
  5                                                                               return (outport, cookie)
                       …………………                                            return False



                                                                        def forward_l2_packet(dpid, inport, vport, p
                                                                          dstaddr = packet.dst.tostring()
                         123                        125                   if not ord(dstaddr[0]) & 1 and inst.st[dpid
                                                                              prt = inst.st[dpid][dstaddr]
                    上書き                                                       if prt[0] == vport:
                                                          123         122        inst.setLogicMark( 122 )
                                                                                 log.err('**warning** learned port = in
                                                                                 myFlood(dpid, bufid, buf, vport, pac
記録すべき重要な分岐が二重にあった場合、その両方                                                      else:
                                                                                 inst.setLogicMark( 123 )
(右図では101と123)を記録する必要がある。                                                         log.msg('installing flow for ' + str(pa
                                                                                 flow = extract_flow(packet)
単純に直近のラベル(123)で上書きしてはならない。                                                       flow[core.IN_PORT] = inport
                                                                                 (outport, cookie) = getOutport(dpid
                                                                                 actions = [[openflow.OFPAT_OUTP
                                                                                 inst.install_datapath_flow(dpid, flow
                                                                                                    openflow.OFP_FL
                                                                                                    bufid, openflow.O
                                                                                                    inport, buf, cookie
                                                                          else:
                                                                              inst.setLogicMark( 124 )
                                                                              myFlood(dpid, bufid, buf, vport, packe
キューイングによる複数ラベルの記録
                上書き方式                                                           キュー方式



  1
      flow entries                              6         1                                                   6
       cookie        match fields, etc..                             cookie        match fields, etc..
  2                                            7         2                                                   7
                    (inport=1) [ outport=6 ]                                     (inport=1) [ outport=6 ]
  3                                            8         3                                                   8
        101            …………………                                     101,123            …………………
  4                    …………………                 9         4                            …………………                9

  5                    …………………                 10        5         102,124            …………………                10
                       …………………                                                        …………………




                         123
                                                                                                                  123
                    上書き                                  (8 x 8 bits)

                                                             ...    ...   ...   ...    ...    ... 101 123

                                                    38                                                      キューイング



そのためにキューイングして最近64bitに収まる分だけ記録。右図の例では8bit幅でラベルを作り、8段階
を保存している。bit幅と段数は必要に合わせて決めればよい。
制限事項:フローとロジックの結びつけ

• コントローラ SDK が Cookie を使う場合

 Floodlightは 32bit を予約(12bit AppID, 20bit reserve)

• フローエントリ収集によるスイッチ側の負荷

 “In short, the existing statistics mechanisms are (both)
 relatively high overhead” (J. Mogul et al., 2010)

     J. Mogul et al. “DevoFlow: Cost-Effective Flow Management for High Performance
     Enterprise Networks”, In Proc. ACM SIGCOMM HotNets-IX, 2010
step 2:  
複数スイッチを越えたフローの追跡
フロー追跡(アイディア)

• 欲求:フローの行く末を知りたい

 コードとフローエントリの対照は可能になった

 それ以降のスイッチでの挙動を知りたい

• 問題:スイッチ間でのフローエントリの対照では不十分

• 理由:ワイルドカードの存在

 フローエントリの照合だけでは追えないケースがある
Wi




wildcard / maskbit によるフローの流合

• フローエントリの照合だけでは追えないケース
   異なるマッチフィールドにワイルドカードがあり、フローエントリ照合ではフローが
   追跡できない


例:次のスイッチでフローが分かれるケース
(どちらのフローにどれだけ出たか判らない)
                      sw1                            sw2
 host1               1                           4   1                       4   to http proxy
                          (1.0.0.1, *, *) [#4]             (*, 80, *) [#4]
                     2                           5   2                       5
                     3    (1.0.0.2, *, *) [#4]   6   3     (*, 25, *) [#5]   6   to smtp gateway
 host2

 表記:( IP, src port, dst port ) [ outport ]



もし全フローエントリが同じマッチフィールドを使っておれば照合可能
典型例:全マッチフィールドをexactに指定する
フロー追跡(方法)

• パケット自体にラベルを付けて運ばせる

• 設定・検出はスイッチ自身が行う
→フローエントリに現れるフィールドにラベルを設定する

• Action によってラベルを設定し、次のスイッチに送る

• Match Field によってラベルが設定されたパケットを選別

 識別のために「ラベル無し」の状態を用意する
Wi




wildcard / maskbit に対応したフローの分離

• パケットに含まれるラベルを用いたフローの分離

    転送先でエントリが新しく作られ、完全な追跡が可能

例:次のスイッチでフローが分かれるケースへの対応
(ラベルつきとラベル無しのフローエントリがそれぞれ作成される)

                      sw1                                 sw2
host1                1                                4   1   (*, 80, *, 5) [ =, #4]   4   to http proxy
                         (1.0.0.1, *, *, 0) [5, #4]
                     2                                5   2                            5
                                                              (*, 80, *, 0) [ =, #4]
                     3   (1.0.0.2, *, *, 0) [=, #4]   6   3                            6   to smtp gateway
host2                                                         (*, 25, *, 5) [ =, #5]

                                                              (*, 25, *, 0) [ =, #5]


表記:( IP, src port, dst port, label ) [ label, outport ]
フロー追跡(構成図)

                                                                      flow table
                                       flow table




                              (to servers)
                                                                      flow table
                                       flow table


    Controller
                              (to servers)




   cookie     Match      Counter   Action            cookie   Match   Counter     Action
  101, 123   IP(dst)=X             out=6             ?????    ?????               out=3




        追跡用の情報をパケット自体に持たせ、それを                      にフローエントリを照合する
例:IPアドレスによって振り分けるコード

                                          この場の記法:
  1     (1.0.0.1, *, * ) [ #4]   4
  2                              5        (IP, port-dst, port-src) [ #outport ] 
  3                              6




   def packet_in_callback(dpid, inport, reason, len, bufid, packet):
     match = extract_flow(packet)
     iph = packet.find('ipv4')
     if ip_to_str(iph.dstip) == "1.0.0.1" :
         outport = 4
     else
         outport = 5
     actions = [[openflow.OFPAT_OUTPUT, [0, outport]]]
     inst.install_datapath_flow(dpid, flow,..., actions, ...)
     return CONTINUE



          宛先IPアドレスによって出力ポートを変えるスイッチを想定する
フロー識別ラベルの設定
                                         def packet_in_callback(dpid, inport, reason, len, bufid, pac
                                           match = extract_flow(packet)
                                           iph = packet.find('ipv4')
                                           if ip_to_str(iph.dstip) == "1.0.0.1" :
                                               outport = 4
                                               inst.markFlowLabel( 5 )
(1.0.0.1, *, *, 0 ) [ 5, #4]               else
                                               outport = 5
                                           actions = [[openflow.OFPAT_OUTPUT, [0, outport]]]
                                           inst.install_datapath_flow(dpid, flow,..., actions, ...)
                                           return CONTINUE



                                ( label=0 )                            [ set label=5 ]

       flow entry:              Match Fields         Counters              Actions


                               ラベルをつける関数を追加し、Actionによって設定させる。
識別ラベルの記録先

• IPv4 では ToS フィールド(6bit)を利用

  Match Field, Action に含まれている

  そのようなフィールドの中では最も利用率が低い

• VLAN id, MPS label による実現も可能だが・・・

  利用率の高さ

  予定外のタグ追加による既存プログラムの誤動作

• IPv6 では Flow Label (20bit) の利用を予定
ラベルの重なり:bit 割り当て

• ラベルの重なり:sw1, sw2の両方で別のラベルを設定

 既存のラベルを上書きしてはならない

• ラベルを bit パターンとして設定する
→ label = n のとき ToS = 2^(n-1) とすれば独立に設定可能

• 設定可能なラベルの種類が少ない (ToS なら 6)

 ラベルは文字列(名前)で指定→利用時に番号割当 (要対照表)

 コントローラをリモート操作して動的に(名前で) on/off
制限事項:フローの追跡

• 流用したフィールドが使えない( v4: ToS / v6: flowlabel )

• エッジでのラベル回収

 設定された ToS 情報による一般機器の誤動作防止

 トポロジ調査の研究例あり
 ・ OFDP : OpenFlow Discovery Protocol by GENI
 ・ Topology module by Trema (LLDP base)

• IP以外への対応
IP以外への対応

• 理想的には
“OpenFlow Switch Spec に追跡用フィールドの追加を提案”
 普及が先か、標準化が先か
 既存のスイッチ機器に適用できない可能性
• 現実的には
“大きな問題ではない?”
 OpenFlow は IP(それもv4)に集中している
 L2 利用では MAC 完全マッチで処理する場合が多い
 →ラベル不要・単純にフローエントリ照合で済む
40=2^(5-1)
  全体図                                                            cookie    Match     Counter   Action          +2^(3-1)
                                                                 99, 121   tos=16              tos=20



if dpid == 25

  markLogicPoint( 121 )
  markFlowLabel( 3 )                                                                           dpid 25



else if dpid == 11

  markLogicPoint( 101 )            Controller
  markFlowLabel( 5 )
                                                dpid 11




                 cookie    Match     Counter    Action                      cookie    Match    Counter     Action
                                                          16=2^(5-1)
                 88, 101   tos=0                tos=16                                tos=16             ( keep tos )
OpenFlow standard !
システム構成・実装箇所

実装が必要な箇
                                                             flow table                flow table
所を赤色で表記

                        Controller

                                                             flow table                flow table

            label    Controller
            on/off   App
operation              tool
 console
                     Controller SDK



                                                                          flow table
                                                                         aggregator
                                                  statistics data

                                     visualizer
まとめ

• OpenFlow コントローラ開発支援ツールの提案
• コードとフローを対応づける仕組み
 ロジックとフローの相互参照を可能にする
 スイッチを越えたフローの追跡を可能にする
• 必要な処置
 コントローラSDKに機能追加
• 利用
 開発中のコードに関数を挿入
 スイッチは OpenFlow 標準であればよい
まとめ

• 今後

 NOX 実装の残り・汎用性の確認(他SDKへの移植)

 可視化処理

 新フィールドの OpenFlow 標準への追加提案


             on/off   Controller App                 flow table                flow table

 operation             tool
  console             Controller SDK                 flow table                flow table



                                       statistics data
                                                                  flow table
                          visualizer                             aggregator
Thank you.

Más contenido relacionado

La actualidad más candente

traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話infinite_loop
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutinemelpon
 
MySQL5.6検証レポート
MySQL5.6検証レポートMySQL5.6検証レポート
MySQL5.6検証レポートHironori Miura
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~Fujio Kojima
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~Akabane Hiroyuki
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
メタプログラミング C#
メタプログラミング C#メタプログラミング C#
メタプログラミング C#Fujio Kojima
 
Java puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanJava puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanYoshio Terada
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!Masami Ichikawa
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPIDaisuke Igarashi
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成眞樹 冨澤
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目hecomi
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方Satoshi Nagayasu
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことdcubeio
 
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リーリナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リーCODE BLUE
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Yoshio Terada
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyHiroshi Nakamura
 

La actualidad más candente (20)

traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 
Slide
SlideSlide
Slide
 
MySQL5.6検証レポート
MySQL5.6検証レポートMySQL5.6検証レポート
MySQL5.6検証レポート
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
メタプログラミング C#
メタプログラミング C#メタプログラミング C#
メタプログラミング C#
 
Java puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanJava puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta Japan
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
C#6.0の新機能紹介
C#6.0の新機能紹介C#6.0の新機能紹介
C#6.0の新機能紹介
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだこと
 
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リーリナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRuby
 

Destacado

HoloLens x Graphics 入門
HoloLens x Graphics 入門HoloLens x Graphics 入門
HoloLens x Graphics 入門hecomi
 
社内勉強会02 ターミナルマルチプレクサ[公開用]
社内勉強会02 ターミナルマルチプレクサ[公開用]社内勉強会02 ターミナルマルチプレクサ[公開用]
社内勉強会02 ターミナルマルチプレクサ[公開用]Keme Sato
 
Cognitive Foreplay
Cognitive ForeplayCognitive Foreplay
Cognitive ForeplayPK Rasam
 
The Benefits of Social Media Listening for Advancement in Higher Education
The Benefits of Social Media Listening for Advancement in Higher Education The Benefits of Social Media Listening for Advancement in Higher Education
The Benefits of Social Media Listening for Advancement in Higher Education Lisa Kalner Williams
 
How to build an environment that enables Innovation.
How to build an environment that enables Innovation.How to build an environment that enables Innovation.
How to build an environment that enables Innovation.Johanna Green
 
Twitter, una sonda permanente de opinión y una vía para canalizar acciones ci...
Twitter, una sonda permanente de opinión y una vía para canalizar acciones ci...Twitter, una sonda permanente de opinión y una vía para canalizar acciones ci...
Twitter, una sonda permanente de opinión y una vía para canalizar acciones ci...Mª Luz Congosto
 
Gamification - Elements for a Gamification Learning Strategy
Gamification - Elements for a Gamification Learning StrategyGamification - Elements for a Gamification Learning Strategy
Gamification - Elements for a Gamification Learning StrategyAndrew Hughes
 
Inspirational Quotes
Inspirational QuotesInspirational Quotes
Inspirational QuotesMark Gilroy
 
Videostream compression in iOS
Videostream compression in iOSVideostream compression in iOS
Videostream compression in iOS*instinctools
 
20160521謝昇佑-不安分的創業:好食機的社會企業
20160521謝昇佑-不安分的創業:好食機的社會企業20160521謝昇佑-不安分的創業:好食機的社會企業
20160521謝昇佑-不安分的創業:好食機的社會企業youthsummit
 
CVPR2015勉強会 Global Refinement of Random Forest
CVPR2015勉強会 Global Refinement of Random ForestCVPR2015勉強会 Global Refinement of Random Forest
CVPR2015勉強会 Global Refinement of Random ForestKoichi Takahashi
 
The Arrival Discussion Questions - Chapter 1
The Arrival Discussion Questions - Chapter 1The Arrival Discussion Questions - Chapter 1
The Arrival Discussion Questions - Chapter 1grantthomasonline
 
Heroku Dyno再起動時の振る舞い
Heroku Dyno再起動時の振る舞いHeroku Dyno再起動時の振る舞い
Heroku Dyno再起動時の振る舞いShunji Konishi
 
実装だって楽したい!〜リアルタイム通信はじめの一歩〜
実装だって楽したい!〜リアルタイム通信はじめの一歩〜実装だって楽したい!〜リアルタイム通信はじめの一歩〜
実装だって楽したい!〜リアルタイム通信はじめの一歩〜Yuka Tokuyama
 
IETF remote participation via Meetecho @ WebRTC Meetup Stockholm
IETF remote participation via Meetecho @ WebRTC Meetup StockholmIETF remote participation via Meetecho @ WebRTC Meetup Stockholm
IETF remote participation via Meetecho @ WebRTC Meetup StockholmLorenzo Miniero
 
Ch.08 บรรจุภัณฑ์เพื่อการนำเข้าและส่งออก (Shipping Packages)
Ch.08 บรรจุภัณฑ์เพื่อการนำเข้าและส่งออก (Shipping Packages)Ch.08 บรรจุภัณฑ์เพื่อการนำเข้าและส่งออก (Shipping Packages)
Ch.08 บรรจุภัณฑ์เพื่อการนำเข้าและส่งออก (Shipping Packages)Thanaphat Tachaphan
 

Destacado (20)

HoloLens x Graphics 入門
HoloLens x Graphics 入門HoloLens x Graphics 入門
HoloLens x Graphics 入門
 
El Modelo de los Tres Tableros
El Modelo de los Tres TablerosEl Modelo de los Tres Tableros
El Modelo de los Tres Tableros
 
社内勉強会02 ターミナルマルチプレクサ[公開用]
社内勉強会02 ターミナルマルチプレクサ[公開用]社内勉強会02 ターミナルマルチプレクサ[公開用]
社内勉強会02 ターミナルマルチプレクサ[公開用]
 
Math
MathMath
Math
 
Cognitive Foreplay
Cognitive ForeplayCognitive Foreplay
Cognitive Foreplay
 
The Benefits of Social Media Listening for Advancement in Higher Education
The Benefits of Social Media Listening for Advancement in Higher Education The Benefits of Social Media Listening for Advancement in Higher Education
The Benefits of Social Media Listening for Advancement in Higher Education
 
How to build an environment that enables Innovation.
How to build an environment that enables Innovation.How to build an environment that enables Innovation.
How to build an environment that enables Innovation.
 
A history of programming
A history of programmingA history of programming
A history of programming
 
Twitter, una sonda permanente de opinión y una vía para canalizar acciones ci...
Twitter, una sonda permanente de opinión y una vía para canalizar acciones ci...Twitter, una sonda permanente de opinión y una vía para canalizar acciones ci...
Twitter, una sonda permanente de opinión y una vía para canalizar acciones ci...
 
Gamification - Elements for a Gamification Learning Strategy
Gamification - Elements for a Gamification Learning StrategyGamification - Elements for a Gamification Learning Strategy
Gamification - Elements for a Gamification Learning Strategy
 
Inspirational Quotes
Inspirational QuotesInspirational Quotes
Inspirational Quotes
 
Videostream compression in iOS
Videostream compression in iOSVideostream compression in iOS
Videostream compression in iOS
 
20160521謝昇佑-不安分的創業:好食機的社會企業
20160521謝昇佑-不安分的創業:好食機的社會企業20160521謝昇佑-不安分的創業:好食機的社會企業
20160521謝昇佑-不安分的創業:好食機的社會企業
 
Atelier Lean Feedback
Atelier Lean FeedbackAtelier Lean Feedback
Atelier Lean Feedback
 
CVPR2015勉強会 Global Refinement of Random Forest
CVPR2015勉強会 Global Refinement of Random ForestCVPR2015勉強会 Global Refinement of Random Forest
CVPR2015勉強会 Global Refinement of Random Forest
 
The Arrival Discussion Questions - Chapter 1
The Arrival Discussion Questions - Chapter 1The Arrival Discussion Questions - Chapter 1
The Arrival Discussion Questions - Chapter 1
 
Heroku Dyno再起動時の振る舞い
Heroku Dyno再起動時の振る舞いHeroku Dyno再起動時の振る舞い
Heroku Dyno再起動時の振る舞い
 
実装だって楽したい!〜リアルタイム通信はじめの一歩〜
実装だって楽したい!〜リアルタイム通信はじめの一歩〜実装だって楽したい!〜リアルタイム通信はじめの一歩〜
実装だって楽したい!〜リアルタイム通信はじめの一歩〜
 
IETF remote participation via Meetecho @ WebRTC Meetup Stockholm
IETF remote participation via Meetecho @ WebRTC Meetup StockholmIETF remote participation via Meetecho @ WebRTC Meetup Stockholm
IETF remote participation via Meetecho @ WebRTC Meetup Stockholm
 
Ch.08 บรรจุภัณฑ์เพื่อการนำเข้าและส่งออก (Shipping Packages)
Ch.08 บรรจุภัณฑ์เพื่อการนำเข้าและส่งออก (Shipping Packages)Ch.08 บรรจุภัณฑ์เพื่อการนำเข้าและส่งออก (Shipping Packages)
Ch.08 บรรจุภัณฑ์เพื่อการนำเข้าและส่งออก (Shipping Packages)
 

Similar a OpenFlowコントローラ開発支援ツールの提案

DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519Yasuhiro Ishii
 
Easy caching and logging package using annotation in Python
Easy caching and logging package using annotation in PythonEasy caching and logging package using annotation in Python
Easy caching and logging package using annotation in PythonYasunori Horikoshi
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)ryos36
 
Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!KAIKenzo
 
PBL1-v1-006j.pptx
PBL1-v1-006j.pptxPBL1-v1-006j.pptx
PBL1-v1-006j.pptxNAIST
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code ReadingKenichirou Oyama
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングComputational Materials Science Initiative
 
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化翔新 史
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮JAVA DM
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)NTT DATA OSS Professional Services
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみるftnk
 

Similar a OpenFlowコントローラ開発支援ツールの提案 (20)

DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
Easy caching and logging package using annotation in Python
Easy caching and logging package using annotation in PythonEasy caching and logging package using annotation in Python
Easy caching and logging package using annotation in Python
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
 
Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!
 
Clojure
ClojureClojure
Clojure
 
PBL1-v1-006j.pptx
PBL1-v1-006j.pptxPBL1-v1-006j.pptx
PBL1-v1-006j.pptx
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code Reading
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
 
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
 
Poolboy
PoolboyPoolboy
Poolboy
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
Boost Tour 1.50.0
Boost Tour 1.50.0Boost Tour 1.50.0
Boost Tour 1.50.0
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
 

Más de Yutaka Yasuda

課題提出日の傾向から見る締切の期間設定
課題提出日の傾向から見る締切の期間設定課題提出日の傾向から見る締切の期間設定
課題提出日の傾向から見る締切の期間設定Yutaka Yasuda
 
ジェンガブロックの押しにくさを推定する試み
ジェンガブロックの押しにくさを推定する試みジェンガブロックの押しにくさを推定する試み
ジェンガブロックの押しにくさを推定する試みYutaka Yasuda
 
Domain Specific Architecture は今どこまで来ていて、これからどこに向かうか
Domain Specific Architecture は今どこまで来ていて、これからどこに向かうかDomain Specific Architecture は今どこまで来ていて、これからどこに向かうか
Domain Specific Architecture は今どこまで来ていて、これからどこに向かうかYutaka Yasuda
 
力のある情報系学生をうまく採用して欲しいのです
力のある情報系学生をうまく採用して欲しいのです力のある情報系学生をうまく採用して欲しいのです
力のある情報系学生をうまく採用して欲しいのですYutaka Yasuda
 
RISC-V の現況と Esperanto Technologies のアプローチ
RISC-V の現況と Esperanto Technologies のアプローチRISC-V の現況と Esperanto Technologies のアプローチ
RISC-V の現況と Esperanto Technologies のアプローチYutaka Yasuda
 
Segue, Landscape, Touch events, Alpha and User Defined Runtime Attributes
Segue, Landscape, Touch events, Alpha and User Defined Runtime AttributesSegue, Landscape, Touch events, Alpha and User Defined Runtime Attributes
Segue, Landscape, Touch events, Alpha and User Defined Runtime AttributesYutaka Yasuda
 
教育側から見たセキュリティ人材教育の「明日はどっちだ」
教育側から見たセキュリティ人材教育の「明日はどっちだ」教育側から見たセキュリティ人材教育の「明日はどっちだ」
教育側から見たセキュリティ人材教育の「明日はどっちだ」Yutaka Yasuda
 
セキュリティ人材育成 最初の一步
セキュリティ人材育成 最初の一步セキュリティ人材育成 最初の一步
セキュリティ人材育成 最初の一步Yutaka Yasuda
 
京都産業大学におけるセキュリティ人材育成の考え方
京都産業大学におけるセキュリティ人材育成の考え方京都産業大学におけるセキュリティ人材育成の考え方
京都産業大学におけるセキュリティ人材育成の考え方Yutaka Yasuda
 
Lake Crest について調べてみた
Lake Crest について調べてみたLake Crest について調べてみた
Lake Crest について調べてみたYutaka Yasuda
 
FPGA based 10G Performance Tester for HW OpenFlow Switch
FPGA based 10G Performance Tester for HW OpenFlow SwitchFPGA based 10G Performance Tester for HW OpenFlow Switch
FPGA based 10G Performance Tester for HW OpenFlow SwitchYutaka Yasuda
 
京都産業大学AO入試「情報」試験 – 実施報告と今後の展望
京都産業大学AO入試「情報」試験 – 実施報告と今後の展望京都産業大学AO入試「情報」試験 – 実施報告と今後の展望
京都産業大学AO入試「情報」試験 – 実施報告と今後の展望Yutaka Yasuda
 
A proposal of the OpenFlow controller development support tool
A proposal of the OpenFlow controller development support tool A proposal of the OpenFlow controller development support tool
A proposal of the OpenFlow controller development support tool Yutaka Yasuda
 

Más de Yutaka Yasuda (13)

課題提出日の傾向から見る締切の期間設定
課題提出日の傾向から見る締切の期間設定課題提出日の傾向から見る締切の期間設定
課題提出日の傾向から見る締切の期間設定
 
ジェンガブロックの押しにくさを推定する試み
ジェンガブロックの押しにくさを推定する試みジェンガブロックの押しにくさを推定する試み
ジェンガブロックの押しにくさを推定する試み
 
Domain Specific Architecture は今どこまで来ていて、これからどこに向かうか
Domain Specific Architecture は今どこまで来ていて、これからどこに向かうかDomain Specific Architecture は今どこまで来ていて、これからどこに向かうか
Domain Specific Architecture は今どこまで来ていて、これからどこに向かうか
 
力のある情報系学生をうまく採用して欲しいのです
力のある情報系学生をうまく採用して欲しいのです力のある情報系学生をうまく採用して欲しいのです
力のある情報系学生をうまく採用して欲しいのです
 
RISC-V の現況と Esperanto Technologies のアプローチ
RISC-V の現況と Esperanto Technologies のアプローチRISC-V の現況と Esperanto Technologies のアプローチ
RISC-V の現況と Esperanto Technologies のアプローチ
 
Segue, Landscape, Touch events, Alpha and User Defined Runtime Attributes
Segue, Landscape, Touch events, Alpha and User Defined Runtime AttributesSegue, Landscape, Touch events, Alpha and User Defined Runtime Attributes
Segue, Landscape, Touch events, Alpha and User Defined Runtime Attributes
 
教育側から見たセキュリティ人材教育の「明日はどっちだ」
教育側から見たセキュリティ人材教育の「明日はどっちだ」教育側から見たセキュリティ人材教育の「明日はどっちだ」
教育側から見たセキュリティ人材教育の「明日はどっちだ」
 
セキュリティ人材育成 最初の一步
セキュリティ人材育成 最初の一步セキュリティ人材育成 最初の一步
セキュリティ人材育成 最初の一步
 
京都産業大学におけるセキュリティ人材育成の考え方
京都産業大学におけるセキュリティ人材育成の考え方京都産業大学におけるセキュリティ人材育成の考え方
京都産業大学におけるセキュリティ人材育成の考え方
 
Lake Crest について調べてみた
Lake Crest について調べてみたLake Crest について調べてみた
Lake Crest について調べてみた
 
FPGA based 10G Performance Tester for HW OpenFlow Switch
FPGA based 10G Performance Tester for HW OpenFlow SwitchFPGA based 10G Performance Tester for HW OpenFlow Switch
FPGA based 10G Performance Tester for HW OpenFlow Switch
 
京都産業大学AO入試「情報」試験 – 実施報告と今後の展望
京都産業大学AO入試「情報」試験 – 実施報告と今後の展望京都産業大学AO入試「情報」試験 – 実施報告と今後の展望
京都産業大学AO入試「情報」試験 – 実施報告と今後の展望
 
A proposal of the OpenFlow controller development support tool
A proposal of the OpenFlow controller development support tool A proposal of the OpenFlow controller development support tool
A proposal of the OpenFlow controller development support tool
 

OpenFlowコントローラ開発支援ツールの提案

  • 2. はじめに • OpenFlow  プログラムによる各スイッチの転送先制御 • コントローラ・プログラミングにおける問題 自分が書いたコードが実際にどのような転送先制御として 反映されたのか直接的に確認する方法がない “このコードは、どのフローに対して、どう作用したのか?” “このフローは、どのコードによって生成されたのか?”
  • 3. ゴール:開発支援ツールの提案 • コードとフロー制御情報を対応づける • 影響を受けたフローを追跡可能にする Controller sw1 sw3 host1 host3 host2 host4 sw2 sw4
  • 5. 例:2ポートスイッチとそのためのコード 1 (inport=1) [output=2] 2 この場の記法: (inport=2) [output=1] (match fields) [actions] NOX like pseudo code: def packet_in_callback(dpid, inport, reason, len, bufid, packet): callback flow = extract_flow(packet) make match fields flow[core.IN_PORT] = inport if inport == 1 : outport = 2 else: make actions outport = 1 actions = [[openflow.OFPAT_OUTPUT, [0, outport]]] inst.install_datapath_flow(dpid, flow,..., actions, ...) set flow entry return CONTINUE
  • 6. ロジック識別ラベルの設定 def packet_in_callback(dpid, inport, reason, len, bufid, p flow = extract_flow(packet) flow[core.IN_PORT] = inport if inport == 1 : (inport=1) [output=2] outport = 2 else: (inport=2) [output=1] outport = 1 actions = [[openflow.OFPAT_OUTPUT, [0, outport]]] inst.install_datapath_flow(dpid, flow,..., actions, ...) return CONTINUE フローエントリとそれに対応するコードに注目
  • 7. ロジック識別ラベルの設定 def packet_in_callback(dpid, inport, reason, len, bufid, flow = extract_flow(packet) flow[core.IN_PORT] = inport if inport == 1 : inst.markLogicPoint( 101 ) #101 (inport=1) [output=2] outport = 2 #102 (inport=2) [output=1] else: inst.markLogicPoint( 102 ) outport = 1 actions = [[openflow.OFPAT_OUTPUT, [0, outport]]] inst.install_datapath_flow(dpid, flow,..., actions, ...) return CONTINUE このような関数を追加してフローエントリに識別ラベルを設定する
  • 8. ロジック識別ラベルの設定 def packet_in_callback(dpid, inport, reason, len, bufid, flow = extract_flow(packet) flow[core.IN_PORT] = inport if inport == 1 : inst.markLogicPoint( 101 ) #101 (inport=1) [output=2] outport = 2 #102 (inport=2) [output=1] else: inst.markLogicPoint( 102 ) outport = 1 actions = [[openflow.OFPAT_OUTPUT, [0, outport]]] inst.install_datapath_flow(dpid, flow,..., actions, ...) return CONTINUE #102 ( inport=1 ) [ outport=2 ] flow entry: cookie Match Fields Counters Actions (64bits) ラベルは Cookie フィールドに書き込む
  • 9. 結果:フローエントリとコードの相互参照 switch controller program 1 flow entries 6 cookie match fields, etc.. 2 7 (inport=1) [ outport=6 ] 3 8 101 ………………… def getOutport(dpid, vport, packet): 9 if not OPORTS.has_key(dpid): 4 ………………… log.err('Unknown dpid=%x on getoutput' % (dpid),system='paniersw') return False 5 ………………… 10 if not OPORTS[dpid].has_key(vport): log.err('Invalid (dpid,vport)=(%x,%d) on getOutport' % (dpid, vport),system='paniersw') ………………… return False ops=OPORTS[dpid][vport] for (rule, outport, cookie) in ops: if rule == RULE80 and testTCPport(80, packet): inst.setLogicMark( 101 ) return (outport, cookie) elif rule == RULE443 and testTCPport(443, packet): フローからコードへの参照: inst.setLogicMark( 102 ) return (outport, cookie ) 「このフローエントリにはこのコードが関わった」 elif rule == RULE25 and testTCPport(25, packet): return (outport, cookie) elif rule == ANY: return (outport, cookie) コードからフローへの参照: return False 「このコードが影響を与えたフローエントリはどれか」 def forward_l2_packet(dpid, inport, vport, packet, buf, bufid): dstaddr = packet.dst.tostring() if not ord(dstaddr[0]) & 1 and inst.st[dpid].has_key(dstaddr): prt = inst.st[dpid][dstaddr] if prt[0] == vport: inst.setLogicMark( 122 ) log.err('**warning** learned port = inport', system="paniersw") myFlood(dpid, bufid, buf, vport, packet) else: inst.setLogicMark( 123 )
  • 10. 一つだけの分岐:問題なし switch controller program 1 flow entries 6 cookie match fields, etc.. 2 7 (inport=1) [ outport=6 ] 3 8 101 ………………… def getOutport(dpid, vport, packet): 9 if not OPORTS.has_key(dpid): 4 ………………… log.err('Unknown dpid=%x on getoutput' % ( return False 5 ………………… 10 if not OPORTS[dpid].has_key(vport): log.err('Invalid (dpid,vport)=(%x,%d) on getOu ………………… return False ops=OPORTS[dpid][vport] for (rule, outport, cookie) in ops: if rule == RULE80 and testTCPport(80, packe inst.setLogicMark( 101 ) return (outport, cookie) elif rule == RULE443 and testTCPport(443, p inst.setLogicMark( 102 ) return (outport, cookie ) elif rule == RULE25 and testTCPport(25, pac return (outport, cookie) コードとの対象は事実上、分岐との対象と見なせる elif rule == ANY: return (outport, cookie) (分岐や関数呼び出しなどの重要な通過点に識別ラベル return False  をつけるため) def forward_l2_packet(dpid, inport, vport, packet, dstaddr = packet.dst.tostring() if not ord(dstaddr[0]) & 1 and inst.st[dpid].has_k prt = inst.st[dpid][dstaddr] if prt[0] == vport: inst.setLogicMark( 122 ) log.err('**warning** learned port = inport', s myFlood(dpid, bufid, buf, vport, packet) else: inst.setLogicMark( 123 )
  • 11. 複数段の分岐:以前の記録が必要 def getOutport(dpid, vport, packet): if not OPORTS.has_key(dpid): log.err('Unknown dpid=%x on getoutp return False if not OPORTS[dpid].has_key(vport): log.err('Invalid (dpid,vport)=(%x,%d) o return False 102 ops=OPORTS[dpid][vport] flow entries 1 6 101 for (rule, outport, cookie) in ops: if rule == RULE80 and testTCPport(80 cookie match fields, etc.. inst.setLogicMark( 101 ) 2 7 return (outport, cookie) (inport=1) [ outport=6 ] elif rule == RULE443 and testTCPport 3 8 inst.setLogicMark( 102 ) 101 ………………… return (outport, cookie ) 4 ………………… 9 elif rule == RULE25 and testTCPport(2 return (outport, cookie) ………………… 10 elif rule == ANY: 5 return (outport, cookie) ………………… return False def forward_l2_packet(dpid, inport, vport, p dstaddr = packet.dst.tostring() 123 125 if not ord(dstaddr[0]) & 1 and inst.st[dpid prt = inst.st[dpid][dstaddr] 上書き if prt[0] == vport: 123 122 inst.setLogicMark( 122 ) log.err('**warning** learned port = in myFlood(dpid, bufid, buf, vport, pac 記録すべき重要な分岐が二重にあった場合、その両方 else: inst.setLogicMark( 123 ) (右図では101と123)を記録する必要がある。 log.msg('installing flow for ' + str(pa flow = extract_flow(packet) 単純に直近のラベル(123)で上書きしてはならない。 flow[core.IN_PORT] = inport (outport, cookie) = getOutport(dpid actions = [[openflow.OFPAT_OUTP inst.install_datapath_flow(dpid, flow openflow.OFP_FL bufid, openflow.O inport, buf, cookie else: inst.setLogicMark( 124 ) myFlood(dpid, bufid, buf, vport, packe
  • 12. キューイングによる複数ラベルの記録 上書き方式 キュー方式 1 flow entries 6 1 6 cookie match fields, etc.. cookie match fields, etc.. 2 7 2 7 (inport=1) [ outport=6 ] (inport=1) [ outport=6 ] 3 8 3 8 101 ………………… 101,123 ………………… 4 ………………… 9 4 ………………… 9 5 ………………… 10 5 102,124 ………………… 10 ………………… ………………… 123 123 上書き (8 x 8 bits) ... ... ... ... ... ... 101 123 38 キューイング そのためにキューイングして最近64bitに収まる分だけ記録。右図の例では8bit幅でラベルを作り、8段階 を保存している。bit幅と段数は必要に合わせて決めればよい。
  • 13. 制限事項:フローとロジックの結びつけ • コントローラ SDK が Cookie を使う場合 Floodlightは 32bit を予約(12bit AppID, 20bit reserve) • フローエントリ収集によるスイッチ側の負荷 “In short, the existing statistics mechanisms are (both) relatively high overhead” (J. Mogul et al., 2010) J. Mogul et al. “DevoFlow: Cost-Effective Flow Management for High Performance Enterprise Networks”, In Proc. ACM SIGCOMM HotNets-IX, 2010
  • 15. フロー追跡(アイディア) • 欲求:フローの行く末を知りたい コードとフローエントリの対照は可能になった それ以降のスイッチでの挙動を知りたい • 問題:スイッチ間でのフローエントリの対照では不十分 • 理由:ワイルドカードの存在 フローエントリの照合だけでは追えないケースがある
  • 16. Wi wildcard / maskbit によるフローの流合 • フローエントリの照合だけでは追えないケース 異なるマッチフィールドにワイルドカードがあり、フローエントリ照合ではフローが 追跡できない 例:次のスイッチでフローが分かれるケース (どちらのフローにどれだけ出たか判らない) sw1 sw2 host1 1 4 1 4 to http proxy (1.0.0.1, *, *) [#4] (*, 80, *) [#4] 2 5 2 5 3 (1.0.0.2, *, *) [#4] 6 3 (*, 25, *) [#5] 6 to smtp gateway host2 表記:( IP, src port, dst port ) [ outport ] もし全フローエントリが同じマッチフィールドを使っておれば照合可能 典型例:全マッチフィールドをexactに指定する
  • 17. フロー追跡(方法) • パケット自体にラベルを付けて運ばせる • 設定・検出はスイッチ自身が行う →フローエントリに現れるフィールドにラベルを設定する • Action によってラベルを設定し、次のスイッチに送る • Match Field によってラベルが設定されたパケットを選別 識別のために「ラベル無し」の状態を用意する
  • 18. Wi wildcard / maskbit に対応したフローの分離 • パケットに含まれるラベルを用いたフローの分離 転送先でエントリが新しく作られ、完全な追跡が可能 例:次のスイッチでフローが分かれるケースへの対応 (ラベルつきとラベル無しのフローエントリがそれぞれ作成される) sw1 sw2 host1 1 4 1 (*, 80, *, 5) [ =, #4] 4 to http proxy (1.0.0.1, *, *, 0) [5, #4] 2 5 2 5 (*, 80, *, 0) [ =, #4] 3 (1.0.0.2, *, *, 0) [=, #4] 6 3 6 to smtp gateway host2 (*, 25, *, 5) [ =, #5] (*, 25, *, 0) [ =, #5] 表記:( IP, src port, dst port, label ) [ label, outport ]
  • 19. フロー追跡(構成図) flow table flow table (to servers) flow table flow table Controller (to servers) cookie Match Counter Action cookie Match Counter Action 101, 123 IP(dst)=X out=6 ????? ????? out=3 追跡用の情報をパケット自体に持たせ、それを にフローエントリを照合する
  • 20. 例:IPアドレスによって振り分けるコード この場の記法: 1 (1.0.0.1, *, * ) [ #4] 4 2 5 (IP, port-dst, port-src) [ #outport ]  3 6 def packet_in_callback(dpid, inport, reason, len, bufid, packet): match = extract_flow(packet) iph = packet.find('ipv4') if ip_to_str(iph.dstip) == "1.0.0.1" : outport = 4 else outport = 5 actions = [[openflow.OFPAT_OUTPUT, [0, outport]]] inst.install_datapath_flow(dpid, flow,..., actions, ...) return CONTINUE 宛先IPアドレスによって出力ポートを変えるスイッチを想定する
  • 21. フロー識別ラベルの設定 def packet_in_callback(dpid, inport, reason, len, bufid, pac match = extract_flow(packet) iph = packet.find('ipv4') if ip_to_str(iph.dstip) == "1.0.0.1" : outport = 4 inst.markFlowLabel( 5 ) (1.0.0.1, *, *, 0 ) [ 5, #4] else outport = 5 actions = [[openflow.OFPAT_OUTPUT, [0, outport]]] inst.install_datapath_flow(dpid, flow,..., actions, ...) return CONTINUE ( label=0 ) [ set label=5 ] flow entry: Match Fields Counters Actions ラベルをつける関数を追加し、Actionによって設定させる。
  • 22. 識別ラベルの記録先 • IPv4 では ToS フィールド(6bit)を利用 Match Field, Action に含まれている そのようなフィールドの中では最も利用率が低い • VLAN id, MPS label による実現も可能だが・・・ 利用率の高さ 予定外のタグ追加による既存プログラムの誤動作 • IPv6 では Flow Label (20bit) の利用を予定
  • 23. ラベルの重なり:bit 割り当て • ラベルの重なり:sw1, sw2の両方で別のラベルを設定 既存のラベルを上書きしてはならない • ラベルを bit パターンとして設定する → label = n のとき ToS = 2^(n-1) とすれば独立に設定可能 • 設定可能なラベルの種類が少ない (ToS なら 6) ラベルは文字列(名前)で指定→利用時に番号割当 (要対照表) コントローラをリモート操作して動的に(名前で) on/off
  • 24. 制限事項:フローの追跡 • 流用したフィールドが使えない( v4: ToS / v6: flowlabel ) • エッジでのラベル回収 設定された ToS 情報による一般機器の誤動作防止 トポロジ調査の研究例あり ・ OFDP : OpenFlow Discovery Protocol by GENI ・ Topology module by Trema (LLDP base) • IP以外への対応
  • 25. IP以外への対応 • 理想的には “OpenFlow Switch Spec に追跡用フィールドの追加を提案” 普及が先か、標準化が先か 既存のスイッチ機器に適用できない可能性 • 現実的には “大きな問題ではない?” OpenFlow は IP(それもv4)に集中している L2 利用では MAC 完全マッチで処理する場合が多い →ラベル不要・単純にフローエントリ照合で済む
  • 26. 40=2^(5-1) 全体図 cookie Match Counter Action +2^(3-1) 99, 121 tos=16 tos=20 if dpid == 25 markLogicPoint( 121 ) markFlowLabel( 3 ) dpid 25 else if dpid == 11 markLogicPoint( 101 ) Controller markFlowLabel( 5 ) dpid 11 cookie Match Counter Action cookie Match Counter Action 16=2^(5-1) 88, 101 tos=0 tos=16 tos=16 ( keep tos )
  • 27. OpenFlow standard ! システム構成・実装箇所 実装が必要な箇 flow table flow table 所を赤色で表記 Controller flow table flow table label Controller on/off App operation tool console Controller SDK flow table aggregator statistics data visualizer
  • 28. まとめ • OpenFlow コントローラ開発支援ツールの提案 • コードとフローを対応づける仕組み ロジックとフローの相互参照を可能にする スイッチを越えたフローの追跡を可能にする • 必要な処置 コントローラSDKに機能追加 • 利用 開発中のコードに関数を挿入 スイッチは OpenFlow 標準であればよい
  • 29. まとめ • 今後 NOX 実装の残り・汎用性の確認(他SDKへの移植) 可視化処理 新フィールドの OpenFlow 標準への追加提案 on/off Controller App flow table flow table operation tool console Controller SDK flow table flow table statistics data flow table visualizer aggregator

Notas del editor

  1. \n\n
  2. \n
  3. 先に全体像を出しておく\n\n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. ロジック識別ラベルのときと同じように具体的な例を示す。\n宛先IPアドレスによって出力ポートを変えるようなコントローラがあったとする。\nここで 1.0.0.1 によって反応するコードが作ったフローに対してマークを入れたい。\n\n
  21. この関数は、その後に作られたフローに対してラベル (5) をつける。\nその結果、フローエントリの Actions に label (今回は ToS)を 5 にセットする処理が追加される。\n対してマッチフィールドでは入力パケットの条件、ここではラベルなし、つまりToSがゼロだったとして、そのままマッチ条件に ToS = 0 を入れる。\n\n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n