猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

OpenFlowコントローラRyuを用いてのフローエントリの設定

 Ryu3.4でルールおよびアクションの実装をまとめました。スイッチはOpenvSwitchを利用しています。

 ソースコードにはマッチとアクションのみを記載しました。実際にスイッチにフローエントリを書き込むには、Ryuのフローエントリ書き込みAPIであるparser.OFPFlowModの引数にマッチとアクションおよびその他必要な引数を指定します。

APIへの使用例

 matchおよびactionsは下の例のように指定する。datapath,priorityは環境に応じて適切なものを設定する。

inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
                                             actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=priority,
                                match=match, instructions=inst)
datapath.send_msg(mod)

L2のルールおよびアクション

 送信元MACアドレスがaa:aa:aa:bb:bb:bbなら、宛先MACアドレスを12:34:56:78:90:abに書き換えを行う。

ソースコードの記載例

match = parser.OFPMatch(eth_src="aa:aa:aa:bb:bb:bb")
actions = [parser.OFPActionSetField(eth_dst = "12:34:56:78:90:ab")]

実行結果

# ovs-ofctl dump-flows br0
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=2.865s, table=0, n_packets=0, n_bytes=0, idle_age=2, priority=1,dl_src=aa:aa:aa:bb:bb:bb actions=mod_dl_dst:12:34:56:78:90:ab

VLANのルールおよびアクション

ソースコードの記載例

match.set_vlan_vid(vlanId)
field = datapath.ofproto_parser.MTVlanVid(ofproto_v1_2.OXM_OF_VLAN_VID, vlanId)
actions.append(datapath.ofproto_parser.OFPActionSetField(field)) 

実行結果

# ovs-ofctl dump-flows br0
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=1.086s, table=0, n_packets=0, n_bytes=0, idle_age=1, priority=1,ip,dl_vlan=10,nw_src=1.1.1.1 actions=load:0x64->OXM_OF_VLAN_VID[]

MPLSのルールおよびアクション

 MPLSラベルの値が10ならば、値が11でTTLが1であるMPLSラベルのプッシュを行う。

ソースコードの記載例

match = parser.OFPMatch(eth_type=0x8847, mpls_label=10)
actions = [datapath.ofproto_parser.OFPActionPushMpls(0x8847),datapath.ofproto_parser.OFPActionSetField(mpls_label=11), datapath.ofproto_parser.OFPActionSetField(mpls_tc=1) ]

実行結果

# ovs-ofctl dump-flows br0
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=1.158s, table=0, n_packets=0, n_bytes=0, idle_age=1, priority=1,mpls,mpls_label=10 actions=push_mpls:0x8847,load:0xb->OXM_OF_MPLS_LABEL[],load:0x1->OXM_OF_MPLS_TC[]

L3のルールおよびアクション

 送信元IPアドレスが192.168.1.1なら、送信元IPアドレスを10.10.10.10に書き換えを行う。

ソースコードの記載例

match = parser.OFPMatch(eth_type=0x0800, ipv4_src="192.168.1.1")
actions = [parser.OFPActionSetField(ipv4_src="10.10.10.10")]

実行結果

# ovs-ofctl dump-flows br0
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=0.887s, table=0, n_packets=0, n_bytes=0, idle_age=0, priority=1,ip,nw_src=192.168.1.1 actions=mod_nw_src:10.10.10.10