shortest_forwording.py

ryu.base輸入app_managerから
ryu.ofprotoインポートofproto_v1_3から
ryu.controller輸入ofp_eventから
ryu.controller.handler輸入set_ev_clsから
ryu.controller.handler輸入CONFIG_DISPATCHER、MAIN_DISPATCHERから
ryu.lib.packet輸入パケットから
ryu.lib.packetから輸入イーサネット
ryu.topologyインポートイベントから
ryu.topology.api輸入get_switch、get_linkから
NXなどの輸入networkx

原則#:
#1)トポロジー情報の発見:LLDPパケットを送信し、定期的には、店舗のトポロジー情報へのリンク情報、利用networkxを発見しました。
#2)リンク情報の転送に基づいて最適な経路を計算する:最短パスはnetworkx使用して計算される
バッチエントリ実装される方法で最短経路、インストールフローエントリ、髪の流れに応じて#3)

クラスShortestForwarding(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]


__init __ DEF(セルフ、引数*、** kwargsから):
スーパー(ShortestForwarding、セルフ).__のinit __(* argsを、** kwargsから)
self.network nx.DiGraph =()#有向グラフ宣言
self.topology_api_appを=自己#そのトポロジーと
self.paths = {}

 

#handleスイッチは、インフォます
@set_ev_cls(ofp_event.EventOFPSwitchFeatures、CONFIG_DISPATCHER)
デフswitch_features_handler(自己、EV)
のデータパス= ev.msg.datapath
ofproto = datapath.ofproto
ofp_parser = datapath.ofproto_parserを

各データパスについては、表A-フローミス#installエントリ
一致ofp_parser.OFPMatch =()
#、このアクションの動作パラメータを参照して以下send_msg(MOD)を知るためにコントローラに要求を提出した
アクション= [ofp_parser.OFPActionOutput( ofproto.OFPP_CONTROLLER、
ofproto.OFPCML_NO_BUFFER)]

self.add_flow(データパス、0、試合、アクション)

#フローテーブルは、スイッチにインストールされている
DEFのadd_flow(セルフ、データパス、優先順位、試合、アクション):
ofproto = datapath.ofproto
ofp_parser = datapath.ofproto_parser
#研、MODが既に取得されている試合、アクションの基礎得られた下で、パラメータを介して渡すことができる
#contruct A flow_modデータパスにMSGして送信
工大= [ofp_parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS、
アクション)]
MOD = ofp_parser.OFPFlowMod(=データパスデータパス、優先順位=プライオリティ、
一致=一致、取扱説明書=研)

#コントローラへ送る情報
datapath.send_msg(MOD)

。INTO ITネットワークトポロジおよびストアオブジェクト#get
#2つの状態は、可能性が発生することがあるので、[]
@set_ev_cls(event.EventSwitchEnter、[CONFIG_DISPATCHER、MAIN_DISPATCHER])
DEFのGET_TOPOLOGY(セルフ、EV):

ノードは#get
switch_list = get_switch(self.topology_api_app、なし)が
格納されたキーと値のペアの形式で#datapath [switch_listにおけるスイッチのswitch.dp.id] =スイッチ
self.network.add_nodes_from(スイッチ)

#getリンク
links_list = get_link(self.topology_api_app、なし)
[:links_list内のリンクのための(link.src.dpid、link.dst.dpid、{link.src.port_no 'ポート'})]リンク=
self.network。 add_edges_from(リンク)

#get逆方向リンク
リンク= [(link.dst.dpid、link.src.dpid、{ 'ポート':link.dst.port_no})links_listにおけるリンクに対する]
self.network.add_edges_from(リンク)

OUT_PORT使用NetworkXの#getダイクストラアルゴリズムによる。
DEF get_out_port(セルフ、データパス、SRC、DST、IN_PORT):
DPID = datapath.id
#addリンクとホスト間のアクセススイッチ
IF SRCないself.network中:
self.network.add_node( SRC)
self.network.add_edge(DPID、SRC、{ 'ポート':IN_PORT})
スイッチリンクにself.network.add_edge(SRC、DPID)#ホスト、カードの通常名、一般的に役に立たないです。
self.paths.setdefault(SRC、{})

:self.networkでDST場合
:DSTないself.paths [ソース]であれば
パス= nx.shortest_path(self.network、SRC、DST)
self.paths [SRC] [DST] =パス

パス= self.paths [ソース] [DST ]# これは2次元配列であることを覚えておいてください
輸出を探して、私たちが探しているので、#はOUT_PORTです。
パス= NEXT_HOP [path.index(DPID)+ 1]
#[ 'ポート']は[NEXT_HOP]は、プロパティ内に存在
OUT_PORT = self.network [DPID] [NEXT_HOP] [ 'ポート']
印刷( "パス" 、パス)
他:
OUT_PORT = datapath.ofproto.OFPP_FLOOD
戻りOUT_PORT

MSGで#handleパケット
@set_ev_cls(ofp_event.EventOFPPacketIn、MAIN.DISPATCHER)
DEF packet_in_handler(自己、EV):
解析事件信息
MSG = ev.msg
データパス= msg.datapath
ofproto = datapath.ofproto
ofp_parser = datapath.ofproto_parser

#また、ネットワークデータを解析し、パケット
PKT = packet.Packet(msg.data)
のEth = pkt.get_protocol(ethernet.ethernet)
IN_PORT msg.match = [ "IN_PORT"]

OUT_PORT #get
OUT_PORT = self.get_out_port(データパス、eth.src、eth.dst、IN_PORT)#ポートも使用するポートを見つける必要があり
アクション= [ofp_parser.OFPActionOutput [OUT_PORT]]

フローは、それは#installエントリ
OUT_PORT ofproto.OFPP_FLOOD = :! IF
#私たちは自然のパラメータと一致し、最終的に一致するように、指定ポート、ポートを見ているので。
= ofp_parser.OFPMatch一致(IN_PORT = IN_PORT、eth_dst = eth_dst)
以降の動作フローテーブルガイドを発行#
self.add_flow(データパス1、マッチ、アクション)

上記の表の下のストリームとして送信され、以降の操作下記のみガイドバー:#Packet_out次のパケットは、スイッチの制御指定されたポートに送信される
OUT = ofp_parser.OFPPacketOut(
データパス=データパス、buffer_id = msg.buffer_id、IN_PORT = IN_PORT、=アクションアクション)
datapath.send_msg(OUT)

おすすめ

転載: www.cnblogs.com/yangrongkuan/p/12009331.html