Issue: The default controller within Mininet cannot handle loops within a topology. To fix this, we'll need to use the POX controller and some additional configuration for the switches.
You will need to run two terminals:
- one terminal will run POX controller as ./pox.py forwarding.hub
- the other terminal will run your custom topology python script
Please look at references #5 and #6, they display some decent examples
Code Solution
from mininet.net import Mininet
from mininet.node import Controller, RemoteController,
OVSKernelSwitch, UserSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.link import Link, TCLink
def topology():
"Create a network."
net = Mininet( controller=RemoteController, link=TCLink,
switch=OVSKernelSwitch )
print("*** Creating nodes")
h1 = net.addHost( 'h1', mac='00:00:00:00:00:01', ip='10.0.0.1/24' )
h2 = net.addHost( 'h2', mac='00:00:00:00:00:02', ip='10.0.0.2/24' )
h3 = net.addHost( 'h3', mac='00:00:00:00:00:03', ip='10.0.0.3/24' )
h4 = net.addHost( 'h4', mac='00:00:00:00:00:04', ip='10.0.0.4/24' )
h5 = net.addHost( 'h5', mac='00:00:00:00:00:05', ip='10.0.0.5/24' )
h6 = net.addHost( 'h6', mac='00:00:00:00:00:06', ip='10.0.0.6/24' )
h7 = net.addHost( 'h7', mac='00:00:00:00:00:07', ip='10.0.0.7/24' )
h8 = net.addHost( 'h8', mac='00:00:00:00:00:08', ip='10.0.0.8/24' )
s1 = net.addSwitch( 's1' )
s2 = net.addSwitch( 's2' )
s3 = net.addSwitch( 's3' )
s4 = net.addSwitch( 's4' )
s5 = net.addSwitch( 's5' )
s6 = net.addSwitch( 's6' )
c7 = net.addController( 'c7', controller=RemoteController,
ip='127.0.0.1', port=6633 )
print("*** Creating links")
net.addLink( h1, s1 )
net.addLink( h2, s2 )
net.addLink( h3, s3 )
net.addLink( h4, s4 )
net.addLink( h5, s4 )
net.addLink( h6, s5 )
net.addLink( h7, s5 )
net.addLink( h8, s6 )
net.addLink( s1, s2, cls=TCLink, bw=10 )
net.addLink( s2, s3, cls=TCLink, bw=10 )
net.addLink( s3, s4, cls=TCLink, bw=100, delay='5ms' )
net.addLink( s4, s5, cls=TCLink, bw=100, delay='5ms' )
net.addLink( s5, s6, cls=TCLink, bw=100 )
net.addLink( s6, s1, cls=TCLink, bw=10 )
print("*** Starting network")
net.build()
c7.start()
s1.start( [c7] )
s2.start( [c7] )
s3.start( [c7] )
s4.start( [c7] )
s5.start( [c7] )
s6.start( [c7] )
# Configuring switches
s1.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
s1.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.1.0/24,actions=output:1")
s1.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.2.0/24,actions=output:2")
s1.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.3.0/24,actions=output:3")
s1.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.4.0/24,actions=output:3")
s1.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.5.0/24,actions=output:3")
s1.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.6.0/24,actions=output:2")
s1.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.7.0/24,actions=output:2")
s1.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.8.0/24,actions=output:2")
s2.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
s2.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.1.0/24,actions=output:3")
s2.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.2.0/24,actions=output:1")
s2.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.3.0/24,actions=output:2")
s2.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.4.0/24,actions=output:2")
s2.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.5.0/24,actions=output:2")
s2.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.6.0/24,actions=output:3")
s2.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.7.0/24,actions=output:3")
s2.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.8.0/24,actions=output:3")
s3.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.1.0/24,actions=output:3")
s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.2.0/24,actions=output:3")
s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.3.0/24,actions=output:1")
s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.4.0/24,actions=output:2")
s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.5.0/24,actions=output:2")
s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.6.0/24,actions=output:2")
s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.7.0/24,actions=output:2")
s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.8.0/24,actions=output:3")
s4.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.1.0/24,actions=output:2")
s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.2.0/24,actions=output:2")
s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.3.0/24,actions=output:2")
s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.4.0/24,actions=output:1")
s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.5.0/24,actions=output:4")
s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.6.0/24,actions=output:3")
s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.7.0/24,actions=output:3")
s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.8.0/24,actions=output:3")
s5.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.1.0/24,actions=output:3")
s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.2.0/24,actions=output:3")
s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.3.0/24,actions=output:3")
s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.4.0/24,actions=output:2")
s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.5.0/24,actions=output:2")
s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.6.0/24,actions=output:1")
s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.7.0/24,actions=output:4")
s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.8.0/24,actions=output:3")
s6.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.1.0/24,actions=output:3")
s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.2.0/24,actions=output:3")
s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.3.0/24,actions=output:3")
s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.4.0/24,actions=output:2")
s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.5.0/24,actions=output:2")
s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.6.0/24,actions=output:2")
s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.7.0/24,actions=output:2")
s6.cmd("ovs-ofctl add-flow s1
priority=10,ip,nw_dst=10.0.8.0/24,actions=output:1")
print("*** Running CLI")
CLI( net )
print("*** Stopping network")
net.stop()
if __name__ == '__main__':
setLogLevel( 'info' )
topology()
References
- Dr. Chih-Heng Ke's Post #1
- Dr. Chih-Heng Ke's Post #2