Mininets 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
REST リクエストを処理する Ryu コントローラー「ofctl_rest.py」を使用します。コントローラに送信される REST 要求には、スイッチにフロー エントリをインストールするためにコントローラが使用する情報が含まれています。次のコマンドでコントローラーを起動します。
cd /usr/local/lib/python2.7/dist-packages/ryu/app
PYTHONPATH=. ryu-manager --verbose ofctl_rest.py
次のコマンドを使用して、スイッチにフローエントリをインストールします。
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 要求の一致する部分でスイッチ ポートを使用すると、接続を確立できます。私は何を間違っていますか?私を助けてください。