OpenDaylight-Boron学习笔记: 5 OpenFlowPlugin模块

SDN 专栏收录该内容
6 篇文章 0 订阅

环境及软件版本说明

===

SN-Controller:

CPU: 2 Cores

RAM: 4GB

Disk: 32GB

Operating System: CentOS7 x86_64 1611(Linux 3.10.0-514) Infrastructure Server

IP1: 10.0.3.100/24 (Public Network)

IP2: 172.16.3.100/24 (SDN Network)

===

OpenDaylight: Boron

下载地址

参考文献

OpenFlow Plugin Project User Guide

《OpenDaylight应用指南》(唐宏 等编著)

安装OpenFlowPlugin模块

进入ODL的控制台karaf,执行以下命令安装OpenFlowPlugin:

opendaylight-user@root>feature:install odl-openflowplugin-nxm-extensions odl-openflowplugin-flow-services-ui odl-openflowplugin-flow-services-rest odl-openflowplugin-flow-services odl-openflowplugin-southbound odl-openflowplugin-nsf-model odl-openflowplugin-drop-test odl-openflowplugin-app-table-miss-enforcer odl-openflowplugin-app-config-pusher odl-openflowplugin-app-topology odl-openflowplugin-app-bulk-o-matic odl-openflowplugin-app-notifications odl-openflowplugin-app-forwardingrules-manager odl-openflowplugin-app-forwardingrules-sync
opendaylight-user@root>feature:install odl-openflowplugin-app-lldp-speaker-he
opendaylight-user@root>feature:install odl-restconf-all odl-restconf odl-restconf-noauth

功能体验

端到端库存(End to End Inventory)

通过ODL库存,可以查看到当前记录的节点信息。下面先使用Mininet创建一个简单的拓扑:

Mininet虚拟机参数:

  • HostName:mininet-vm1
  • CPU: 2核
  • RAM: 4GB
  • IP1:10.0.3.101(Public Network)
  • IP2: 172.16.3.101(SDN Network)
mininet@mininet-vm1:~$ sudo mn --topo=single,2 --mac --controller=remote,ip=10.0.3.100,port=6633 --switch ovsk,protocols=OpenFlow13
mininet> sh ovs-vsctl show
918037ec-b307-45d7-a75a-f1ac4337d135
    Bridge "s1"
        Controller "tcp:10.0.3.100:6633"
            is_connected: true
        Controller "ptcp:6654"
        fail_mode: secure
        Port "s1"
            Interface "s1"
                type: internal
        Port "s1-eth1"
            Interface "s1-eth1"
        Port "s1-eth2"
            Interface "s1-eth2"
    ovs_version: "2.0.2"

此时,往ODL发送下面Rest请求:

http://10.0.3.100:8181/restconf/operational/opendaylight-inventory:nodes/

Method:GET

Headers:
Accept : application/xml

发送请求后,按提示输入相应的用户名(admin)和密码(admin)后,可以得到一个接近两千多行的xml文件,里面包含s1的相关信息,包括端口、连接信息等。因为内容过长,所以不贴出来了。还可以只输出某个节点,展示该节点的信息,如往ODL发送Rest请求,查看openflow:1(对应s1)节点的信息:

http://10.0.3.100:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:1

Method:GET

Headers:
Accept : application/xml

由于当前只有一个节点(s1),所以返回的内容与查询所有节点的信息的内容一样。

端到端流(End to End Flows)

通过OpenFlow Plugin,可以使用Rest请求去添加、删除和修改库存节点的流表。接着上面的实验环境,先在mininet-vm1里的mn控制台查看s1的流表信息:

mininet> sh ovs-ofctl -O OpenFlow13 dump-flows s1
OFPST_FLOW reply (OF1.3) (xid=0x2):
 cookie=0x2b00000000000000, duration=1689.737s, table=0, n_packets=5, n_bytes=322, priority=2,in_port=1 actions=output:2,CONTROLLER:65535
 cookie=0x2b00000000000001, duration=1689.737s, table=0, n_packets=4, n_bytes=280, priority=2,in_port=2 actions=output:1,CONTROLLER:65535
 cookie=0x2b00000000000000, duration=1691.669s, table=0, n_packets=0, n_bytes=0, priority=100,dl_type=0x88cc actions=CONTROLLER:65535
 cookie=0xa, duration=1691.688s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=CONTROLLER:65535

往ODL控制器发送下面的Rest请求,对s1添加流表。

http://10.0.3.100:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/0/flow/1

Method:PUT

Headers:
Content-Type : application/xml
Accept : application/xml
Authentication :

Body:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<flow xmlns="urn:opendaylight:flow:inventory">
    <priority>2</priority>
    <flow-name>Foo</flow-name>
    <match>
        <ethernet-match>
            <ethernet-type>
                <type>2048</type>
            </ethernet-type>
        </ethernet-match>
        <ipv4-destination>10.0.3.0/24</ipv4-destination>
    </match>
    <id>1</id>
    <table_id>0</table_id>
    <instructions>
        <instruction>
            <order>0</order>
            <apply-actions>
                <action>
                   <order>0</order>
                   <dec-nw-ttl/>
                </action>
            </apply-actions>
        </instruction>
    </instructions>
</flow>

这里值得注意的是,Rest请求中table后的0和flow后面的1要分别和Body里的和要对应起来。

发送请求后,会返回一个201 Created的状态码。说明添加流表成功。在mininet-vm1的mn控制台中验证:

mininet> sh ovs-ofctl -O OpenFlow13 dump-flows s1
OFPST_FLOW reply (OF1.3) (xid=0x2):

此时发现,s1的流表变成了空??这个我无法解释,以为是之前某一步出现了问题,于是继续下面的操作,打算重新再来一次:

mininet> exit
mininet@mininet-vm1:~$ sudo mn -c
mininet@mininet-vm1:~$ sudo ovs-vsctl show
918037ec-b307-45d7-a75a-f1ac4337d135
    ovs_version: "2.0.2"
mininet@mininet-vm1:~$ sudo mn --topo=single,2 --mac --controller=remote,ip=10.0.3.100,port=6633 --switch ovsk,protocols=OpenFlow13
mininet> pingall
*** Ping: testing ping reachability
h1 -> h2
h2 -> h1
*** Results: 0% dropped (2/2 received)
mininet> sh ovs-ofctl -O OpenFlow13 dump-flows s1
OFPST_FLOW reply (OF1.3) (xid=0x2):
 cookie=0x2a00000000000009, duration=44.424s, table=0, n_packets=1, n_bytes=98, idle_timeout=600, hard_timeout=300, priority=10,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02 actions=output:2
 cookie=0x2a00000000000008, duration=44.424s, table=0, n_packets=2, n_bytes=140, idle_timeout=600, hard_timeout=300, priority=10,dl_src=00:00:00:00:00:02,dl_dst=00:00:00:00:00:01 actions=output:1
 cookie=0x0, duration=51.902s, table=0, n_packets=0, n_bytes=0, priority=2,ip,nw_dst=10.0.3.0/24 actions=dec_ttl
 cookie=0x2b00000000000002, duration=50.003s, table=0, n_packets=5, n_bytes=322, priority=2,in_port=1 actions=output:2,CONTROLLER:65535
 cookie=0x2b00000000000003, duration=50.003s, table=0, n_packets=4, n_bytes=280, priority=2,in_port=2 actions=output:1,CONTROLLER:65535
 cookie=0x2b00000000000001, duration=51.942s, table=0, n_packets=0, n_bytes=0, priority=100,dl_type=0x88cc actions=CONTROLLER:65535
 cookie=0x2b00000000000001, duration=51.974s, table=0, n_packets=0, n_bytes=0, priority=0 actions=drop

这时神奇的事情发生了。因为这时我还没有向ODL发送添加流表的请求,却发现,s1有上一次添加流表后的流表。难道之前不能显示流表是因为mininet本身的一个bug??无法解释。这时我决定再把添加的流表删除看看:

http://10.0.3.100:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/0/flow/1

Method:DELETE

Headers:
Accept : application/xml

此时返回一个200 OK的状态码。再在mininet-vm1的mn控制器中查看s1的流表。

mininet> sh ovs-ofctl -O OpenFlow13 dump-flows s1
OFPST_FLOW reply (OF1.3) (xid=0x2):
 cookie=0x2b00000000000002, duration=1866.44s, table=0, n_packets=5, n_bytes=322, priority=2,in_port=1 actions=output:2,CONTROLLER:65535
 cookie=0x2b00000000000003, duration=1866.44s, table=0, n_packets=4, n_bytes=280, priority=2,in_port=2 actions=output:1,CONTROLLER:65535
 cookie=0x2b00000000000001, duration=1868.379s, table=0, n_packets=0, n_bytes=0, priority=100,dl_type=0x88cc actions=CONTROLLER:65535
 cookie=0x2b00000000000001, duration=1868.411s, table=0, n_packets=0, n_bytes=0, priority=0 actions=drop

这时却能发现那条流表没有了。分析一下:一开始发送的Rest请求是加到MD-SAL的config配置里的,至于为什么加完后mn显示不出来,可能是一个bug。也由于是因为加到config配置里,所以当我第二次重做的时候,就会自动地把这一条流表加进来。可能可以这么理解吧,在config配置里的配置是永久生效的,而在operational配置里的只是临时生效的。然而后来我也试过,把Rest请求改为用operational配置,发现会得到没有这个Rest接口,说明添加的流表只能加在config配置里。另外,在删除流表后,我又重新做了一次,发现发送Rest请求添加流表后,在mn里再查看s1的流表,发现又可以显示流表了,所以可以更加确定这应该是mininet的一个bug。

ODL官网给出了一些流表设置的xml范例:
ofp-example-flows

端到端拓扑(End to End Topology)

同样继续使用上面的实验环境,使用下面的Rest请求可以看到当前的拓扑信息:

http://10.0.3.100:8181/restconf/operational/network-topology:network-topology/

Method:GET

Headers:
Accept : application/xml

返回的xml里,可以看到topology-id有4种,分别是:

  • flow:1
  • netvirt:1
  • ovsdb:1
  • hwvtep:1

而目前的这4个topology-id中,只有flow:1有内容,其它3个都为空。回想之前做OVSDB模块的相关实验时,我觉得,当mn中的ovs只要一连接controller时,就会在flow:1中出现节点信息,当mn设置好manager时,就会在ovsdb:1中出现节点信息。至于其它2个暂时还没有涉及到,所以还不知道什么情况下这两个topology-id会有内容。

端到端拓扑的内容官网也就只介绍这么多,Rest请求也只提供查询作用。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值