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> h1 ping h2
如果能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-eth1", "port_no": 1}, {"hw_addr": "de:d6:d4:55:9e:e0", "name": "s1-eth2", "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 中运行没有错误。。。