flow_mod介紹

flow_mod主要用來做一些建構和修改路由器內的規則,包括篩選封包、封包的路由機制、修改封包標頭等等,以下介紹幾個幾個flow_mod相關的程式方法

of.ofp_flow_mod():把你的封包送到路由器內,並且在裡面新增此封包的路由表

of.ofp_match():若封包符合match內所寫的規則,就會啟動action內的動作

of.ofp_action_output(port = [port]):封包符合match時所做出的動作,將此封包送到特定的 port

of.ofp_action_dl_addr.set_src([hwsrc]):封包符合match時所做出的動作,將此封包的MAC改變成自訂的MAC

ofp_match class

macth內部有幾樣需要特別注意的方法

dl_src - 封包來源(MAC)符合時做action

dl_dst - 封包來源(MAC)符合時做action

in_port -封包進入交換器的port符合時做action

Exemple:

match = of.ofp_match()

match.in_port = 3

#若封包進入交換器的port是3做此動作

ofp_packet_out OpenFlow message

ofp_packet_out處理的範圍包括所有從switch送出的封包,可以是switch自行製造出來、從controller接收到的或是從其他port流入的,只要switch送出封包就可以利用此程式方法來進行處理

buffer_id :可以指定你傳出封包時所用的buffer,

data :你想要讓switch送出的資料內容

actions :可以設定送出封包時執行的動作

in_port:封包從哪個port傳出

Exemple:

action = of.ofp_action_output(port = out_port)

msg.actions.append(action)

# 送出訊息給switch

self.connection.send(msg)

把封包從特定的port(out_port)發出

ofp_flow_mod OpenFlow message

這裡講述switch接收controller下達的命令後,switch會執行的動作,先經由 ofp_match class檢測是否符合條件(類似ofp_packet_out)並下達命令

idle_timeout – 當命令下達到交換器命令存活時間(如果命令執行則重新計時)

hard_timeout – 當命令下達到交換器命令存活時間(強制)

actions – 如果封包標頭符合match條件時所執行的動作

priority – 優先權

buffer_id – 若action需要暫存器則配置,若不指定則設定none

Exemple:

fm = of.ofp_flow_mod()

fm.match.in_port = 3

fm.actions.append(of.ofp_action_output(port = 4))

#若封包由port 3 進入交換器則封包由port 4傳出