pox 中 openflow.webservice 组建的学习与使用

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 中运行没有错误。。。

你可能感兴趣的:(webservice,openflow,pox)