您好,登錄后才能下訂單哦!
Openflow的一個簡單JSON-RPC-ish web service交互式接口,由of_service信息服務派生而來,依賴于webcore組件。可以使用HTTP POST方式發送JSON進行訪問。
目前支持的方法有:
,
method | 介紹 | 參數 |
get_flow_stats | 獲取流表的表項 | dpid - 一個字符串形式的dpid,例如:'00-00-00-00-00-01' flows -所有流表的列表 |
get_switch_desc | 獲取指定交換機詳細信息 | dpid - 同上 |
get_switches | 獲取交換機列表和基本信息 | dpid - 同上 match - 流表的匹配條目 (默認匹配所有) table_id - 流表的id (默認是所有) out_port - filter by out port (defaults to all) |
set_table | 設置指定交換機的流表 | None. |
在使用pox的過程中 基本只能在./pox.py 后面增加 組建一起運行,而webservice組建提供了一個可以通過web訪問交換機和流表的接口,如上所示,只支持4個功能,我會在接下來的過程中進行演示~ 我基本是看的 pox wiki里面的資料然后進行驗證 得出的結果,不過wiki中有一點bug,我也做了修正。大家也可以參考 pox wiki的內容~ 我用的是curl這個東東 執行上面的方法,這個東東的具體介紹這里就略過了~下面直接說我的運行過程把~
首先,這里用到兩個基本的東東 mininet和pox,既然能看本文章的估計也不陌生,所以也不進行講解,本文章指向寫一些,國內網站中難以找到的一些東東。廢話不多說~
首先運行 pox 和mininet(我基本都是su root 用root權限運行,比較個人使用,不用考慮什么安全問題),我們使用mininet默認的拓撲,比較只是功能的演示。
進入pox的目錄 啟動pox和相應的組建,為了驗證測試獲取信息我們開啟了l3_learning組建,這個組建會在ping操作時下發流表:
cd pox ./pox.py openflow.of_01 web.webcore openflow.webservice forwarding.l3_learning
開啟mininet:
mn --controller=remote
一般默認的都會連上~并在pox中輸出如下信息:
INFO:openflow.of_01:[00-00-00-00-00-01 2] connected
我們先在mininet中進行ping操作讓控制器下發流表~
mininet> h2 ping h3
如果能ping通,交換機中就已經有控制器下發的流表了
現在我們就可以通過,curl訪問web接口,獲取信息了~
我們先獲取交換機的流表
curl -i -X POST -d '{"method":"get_flow_stats","params":{"dpid":"00-00-00-00-00-01"},"id" : 1}' http://127.0.0.1:8000/OF/
這個操作分三個部分,前面的是curl命令,在此不講,中間一對大括號中,就是我們要請求的數據,我們是以post的形式,請求數據的,最后就是我們要請求數據的網址,pox wiki中 寫的網址是 http://127.0.0.1:8000 不過根據我自己的測試網站 應該是上面那個。下面我們來具體說下中間那對大括號里的內容;
一般我們發送表單都是一對一對數據的形式發送的,這種形式在python中稱為字典,其他地方可能稱為,哈希表,映射之類的東東~現在說說具體參數把,此方法中有三個參數,method,對應4個選項,已經在開頭列出來了,params 對應的又是一個字典 ,里面包括一些對應方法的參數,比如例子中的方法,method,他就必須指定 我們所要獲取的流表來自那個交換機,而交換機一般由dpid所標識,所以我們輸入的參數就是 dpid,因為獲取交換機的信息只是簡單的操作 所以只有一個參數。在liux終端中執行上面那個命令 就可以獲取控制器所連接的交換機的信息,本例子中的輸出如下:
{"result": {"flowstats": [{"packet_count": 2, "hard_timeout": 0, "byte_count": 196, "duration_sec": 3, "actions": [{"dl_addr": "be:48:cb:78:60:92", "type": "OFPAT_SET_DL_DST"}, {"max_len": 0, "type": "OFPAT_OUTPUT", "port": 2}], "duration_nsec": 194000000, "priority": 65535, "idle_timeout": 10, "cookie": 0, "table_id": 0, "match": {"dl_type": "IP", "nw_dst": "10.0.0.2/32", "dl_src": "52:9d:f5:2b:88:d4", "nw_proto": 1, "nw_tos": 0, "tp_dst": 0, "tp_src": 8, "dl_dst": "be:48:cb:78:60:92", "dl_vlan": 65535, "nw_src": "10.0.0.1", "in_port": 1}}, {"packet_count": 2, "hard_timeout": 0, "byte_count": 196, "duration_sec": 3, "actions": [{"dl_addr": "52:9d:f5:2b:88:d4", "type": "OFPAT_SET_DL_DST"}, {"max_len": 0, "type": "OFPAT_OUTPUT", "port": 1}], "duration_nsec": 193000000, "priority": 65535, "idle_timeout": 10, "cookie": 0, "table_id": 0, "match": {"dl_type": "IP", "nw_dst": "10.0.0.1/32", "dl_src": "be:48:cb:78:60:92", "nw_proto": 1, "nw_tos": 0, "tp_dst": 0, "tp_src": 0, "dl_dst": "52:9d:f5:2b:88:d4", "dl_vlan": 65535, "nw_src": "10.0.0.2", "in_port": 2}}], "dpid": "00-00-00-00-00-01"}, "id": 1}
如果沒自己下發過流表,可能看起來有點艱難,但如果自己下發過流表,基本都能看懂。
獲取指定交換機的信息(用 dpid指定不同的交換機):
curl -i -X POST -d '{"method":"get_switch_desc","params":{"dpid":"00-00-00-00-00-01"},"id" : 1}' http://127.0.0.1:8000/OF/
結果:
{"result": {"switchdesc": {"dp_desc": "None", "sw_desc": "2.3.2", "hw_desc": "Open vSwitch", "serial_num": "None", "mfr_desc": "Nicira, Inc."}, "dpid": "00-00-00-00-00-01"}, "id": 1}
其實什么內容都木有。。。咳咳。。
獲取交換機列表和基本信息:
curl -i -X POST -d '{"method":"get_switches","id" : 1}'
結果:
{"result": [{"n_tables": 254, "ports": [{"hw_addr": "9e:0f:91:2d:a0:8e", "name": "s1-eth2", "port_no": 1}, {"hw_addr": "de:d6:d4:55:9e:e0", "name": "s1-eth3", "port_no": 2}, {"hw_addr": "7a:2a:44:cf:ff:4f", "port_down": true, "link_down": true, "name": "s1", "port_no": 65534}], "dpid": "00-00-00-00-00-01"}], "id": 1}
因為只有一個交換機,所以就獲得了一組信息~
最后就是下發流表了~
curl -i -X POST -d '{"method":"set_table","params":{"dpid":"00-00-00-00-00-01","flows":[{"actions": [{"type":"OFPAT_OUTPUT","port":2}],"match": {"dl_type": "IP","in_port":1 }}]}}' http://127.0.0.1:8000/OF/
params 里面除了指定了dpid 還多了一個flow,在python中中括號里面的是列表的形式,也就是可以同時下發好幾條流表,同理 actions對應的也是列表的形式,對應多個動作。flows里面就是一條一條的流表了,我們指定了流表的匹配那些信息,首先它得是一個ip數據包,然后必須是從1號端口進來的數據包,我們還指定了它匹配成功后的動作是從2號端口轉發~
我們再演示下如何同時下發多條流表:
curl -i -X POST -d '{"method":"set_table","params":{"dpid":"00-00-00-00-00-01","flows":[{"actions": [{"type":"OFPAT_OUTPUT","port":2}],"match": {"dl_type": "IP","in_port":1 }},{"actions":[{"type":"OFPAT_OUTPUT","port":"OFPP_ALL"}]}]}}' http://127.0.0.1:8000/OF/
我們在flows列表中 又加入了一條~
然后我們在mininet中查看流表,執行以下代碼:
mininet> dpctl dump-flows
我們就可以獲取以下信息:
*** s1 ------------------------------------------------------------------------ NXST_FLOW reply (xid=0x4): cookie=0x0, duration=203.063s, table=0, n_packets=0, n_bytes=0, idle_age=203, actions=ALL cookie=0x0, duration=203.102s, table=0, n_packets=0, n_bytes=0, idle_age=203, ip,in_port=1 actions=output:2
到此 所有的內容就結束了,有可能講的不夠明白,也有可能講的太羅嗦,又不懂地方,大家可以留言,或者給我發郵件~ 當然,留言 的話我是不知道幾個世紀才會 上一次博客,所以最好是 發郵件~
最后還有一個問題,當我match 源ip地址的時候老是出現問題
curl -i -X POST -d '{"method":"set_table","params":{"dpid":"00-00-00-00-00-01","flows":[{"actions": [{"type":"OFPAT_OUTPUT","port":2}],"match": {"dl_type": "IP","nw_dst":"192.168.42.0/255.255.255.0" }}]}}' http://127.0.0.1:8000/OF/
如果我這樣下發 就會出現問題,目前無解。。。別人說他在ovs2.5的版本 和 POX eel 中運行沒有錯誤。。。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。