blob: 7739d5849ea699141ea859163cde10d1576fb332 [file] [log] [blame]
#!/usr/bin/env python
from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.node import Link, Host
from mininet.net import Mininet
from mininet.node import RemoteController, OVSSwitch, OVSBridge
from mininet.term import makeTerm
from mininet.topo import Topo
from functools import partial
from routinglib import RoutingCli as CLI
from routinglib import AutonomousSystem, BasicAutonomousSystem, SdnAutonomousSystem
from routinglib import generateRoutes
class SdnIpTopo( Topo ):
"SDN-IP topology"
def __init__( self, onoses, **kwargs ):
Topo.__init__( self, **kwargs )
coreMesh = []
# Create first 4 switches
for i in range( 1, 5 ):
coreMesh.append( self.addSwitch( 's%s' %i ) )
# create full mesh between middle 4 switches
remaining = list( coreMesh )
while True:
first = remaining[ 0 ]
for switch in tuple( remaining ):
if switch is not first:
self.addLink( switch, first )
remaining.remove( first )
if not remaining:
break
# Add more switches
s5 = self.addSwitch( 's5', dpid='00:00:00:00:00:00:00:05' )
s6 = self.addSwitch( 's6', dpid='00:00:00:00:00:00:00:06' )
s7 = self.addSwitch( 's7', dpid='00:00:00:00:00:00:00:07' )
s8 = self.addSwitch( 's8', dpid='00:00:00:00:00:00:00:08' )
s9 = self.addSwitch( 's9', dpid='00:00:00:00:00:00:00:09' )
s10 = self.addSwitch( 's10', dpid='00:00:00:00:00:00:00:0A' )
# Add more links
self.addLink( s5, s6 )
self.addLink( s5, s8 )
self.addLink( s6, s7 )
self.addLink( s8, s9 )
self.addLink( s9, s10 )
self.addLink( coreMesh[ 0 ], s5 )
self.addLink( coreMesh[ 0 ], s6 )
self.addLink( coreMesh[ 0 ], s7 )
self.addLink( coreMesh[ 1 ], s8 )
self.addLink( coreMesh[ 1 ], s9 )
self.addLink( coreMesh[ 1 ], s10 )
self.addLink( coreMesh[ 2 ], s7 )
self.addLink( coreMesh[ 3 ], s10 )
# SDN AS
sdnAs = SdnAutonomousSystem(onoses, numBgpSpeakers=3, asNum=65000, externalOnos=True)
cs0 = self.addSwitch('cs0', cls=OVSBridge)
numRoutesPerAs = 32
# Add external ASes
as1 = BasicAutonomousSystem(1, generateRoutes(u'192.168.1.0/24', numRoutesPerAs))
AutonomousSystem.addPeering(as1, sdnAs)
AutonomousSystem.addPeering(as1, sdnAs, router2=3, intf1=2)
as1.addLink(s5)
as1.addLink(s6)
as1.build(self)
as2 = BasicAutonomousSystem(2, generateRoutes(u'192.168.2.0/24', numRoutesPerAs))
AutonomousSystem.addPeering(as2, sdnAs)
AutonomousSystem.addPeering(as2, sdnAs, router2=2)
as2.addLink(s7)
as2.build(self)
as3 = BasicAutonomousSystem(3, generateRoutes(u'192.168.3.0/24', numRoutesPerAs))
AutonomousSystem.addPeering(as3, sdnAs, router2=2)
AutonomousSystem.addPeering(as3, sdnAs, router2=3)
as3.addLink(s8)
as3.build(self)
as4 = BasicAutonomousSystem(4, generateRoutes(u'192.168.4.0/24', numRoutesPerAs), numRouters=2)
AutonomousSystem.addPeering(as4, sdnAs)
AutonomousSystem.addPeering(as4, sdnAs, router1=2, router2=3)
as4.addLink(s9)
as4.addLink(s10, router=2)
as4.build(self)
# add links between nets
#self.addLink( BGP1, coreMesh[ 0 ], port2=10 )
#self.addLink( BGP2, coreMesh[ 1 ], port2=10 )
#self.addLink( BGP3, coreMesh[ 2 ], port2=10 )
sdnAs.build(self, coreMesh[ 0 ], cs0)
# TODO multihome the BGP speakers to different switches
topos = { 'sdnip': ( lambda: SdnIpTopo() ) }
if __name__ == '__main__':
setLogLevel( 'debug' )
from onosnet import run, parse_args
run(SdnIpTopo(onoses=parse_args().ipAddrs))