无法使用Ryu REST控制器在mininet中的两台主机之间建立连接

时间:2015-09-10 20:21:47

标签: python rest mininet ryu

我在Mininet Python-API的帮助下在Mininet中创建了一个自定义拓扑。创建自定义拓扑的代码是:

#!/usr/bin/python

from mininet.net import Mininet
from mininet.node import Controller, RemoteController
from mininet.cli import CLI
from mininet.link import TCLink
from mininet.log import setLogLevel, info

def myNet():


    #OpenDayLight controller
    #    ODL_CONTROLLER_IP='10.0.0.4'

    #Floodlight controller
    #    FL_CONTROLLER_IP='10.0.0.5'

    net = Mininet( topo=None, build=False, link=TCLink)

    # Create nodes
    h1 = net.addHost( 'h1' )
    h2 = net.addHost( 'h2' )

    # Create switches
    s1 = net.addSwitch( 's1' )

    print "*** Creating links"
    net.addLink(h1, s1, port1=1, port2=1, bw=100 )
    net.addLink(s1, h2, port1=2, port2=1, bw=100 )


    # Add Controllers
    ryu_ctrl_rest = net.addController( 'c0', controller=RemoteController, ip='127.0.0.1', port=6633)

    #    fl_ctrl = net.addController( 'c1', controller=RemoteController, ip=FL_CONTROLLER_IP, port=6633)


    net.build()

    # Connect each switch to the controller
    s1.start( [ryu_ctrl_rest] )

    s1.cmdPrint('ovs-vsctl show')

    CLI( net )
    #    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    myNet()

我使用以下命令启动拓扑:

sudo python topo_small.py

我使用Ryu控制器“ofctl_rest.py”来处理REST请求。发送到控制器的REST请求包含控制器用于在交换机中安装流条目的信息。我使用以下命令启动控制器:

cd /usr/local/lib/python2.7/dist-packages/ryu/app
PYTHONPATH=. ryu-manager --verbose ofctl_rest.py

我使用以下命令在交换机中安装flowentries:

curl -X POST -d '{
    "dpid": 1,
    "cookie": 1,
    "cookie_mask": 1,
    "table_id": 0,
    "idle_timeout": 300,
    "hard_timeout": 300,
    "priority": 11111,
    "flags": 1,
    "match":{
        "nw_dst": "10.0.0.2",
        "dl_type": "2048"
    },
    "actions":[
        {
            "type":"OUTPUT",
            "port": 2
        }
    ]
}' http://localhost:8080/stats/flowentry/add

curl -X POST -d '{
    "dpid": 1,
    "cookie": 1,
    "cookie_mask": 1,
    "table_id": 0,
    "idle_timeout": 300,
    "hard_timeout": 300,
    "priority": 11111,
    "flags": 1,
    "match":{
        "nw_dst": "10.0.0.1",
        "dl_type": "2048"
    },
    "actions":[
        {
            "type":"OUTPUT",
            "port": 1
        }
    ]
}' http://localhost:8080/stats/flowentry/add

规则安装在交换机中:

mininet@mininet-vm:~$ sudo ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
cookie=0x1, duration=16.327s, table=0, n_packets=0, n_bytes=0, idle_timeout=300, hard_timeout=300, idle_age=16, priority=11111,ip,nw_dst=10.0.0.2 actions=output:2
cookie=0x1, duration=16.317s, table=0, n_packets=0, n_bytes=0, idle_timeout=300, hard_timeout=300, idle_age=16, priority=11111,ip,nw_dst=10.0.0.1 actions=output:1

但我无法建立联系。 如果我在mininet-CLI中发出以下命令:

mininet> h1 ping h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
From 10.0.0.1 icmp_seq=1 Destination Host Unreachable
From 10.0.0.1 icmp_seq=2 Destination Host Unreachable
From 10.0.0.1 icmp_seq=3 Destination Host Unreachable
^C
--- 10.0.0.2 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 3015ms
pipe 3

如果我在REST请求的匹配部分中使用switch-ports,我可以建立连接。我错了什么?请帮帮我。

1 个答案:

答案 0 :(得分:2)

您错过了本地网络主机之前发生的事情(我假设它是本地的,因为您在流匹配字段中显示的IP地址)能够交换IP数据包。连接到主机的OpenFlow交换机不会更改主机网络堆栈和执行地址解析的方式。

当你试图使h1 ping h2的IP地址时,h1需要知道h2的以太网地址(即:MAC)。然后,它将在网络ARP请求帧中广播以下问题:"谁具有硬件地址h2?"。

ARP frame中显示的TCP/IP guide不包含IP标头。这意味着您指定的匹配将永远不会匹配ARP数据包,因为它只查找数据包的目标IP。因此,一旦ARP请求被丢弃或发送到控制器(我不知道你的交换机的默认操作是什么),你就无法在主机之间执行ping操作,这意味着h1永远不会从h2获得ARP回复。 / p>

Here是了解ARP如何工作的好资源。另外,我会推荐这个好OpenFlow Tutorial。阅读本教程对于理解SDN和OpenFlow非常重要。此外,您可能会在实践中理解为什么您无法在主机之间ping通。