#!/usr/bin/python

"""
Custom topology for Mininet
"""
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import Host, RemoteController
from mininet.node import Node
from mininet.node import CPULimitedHost
from mininet.link import TCLink
from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.util import dumpNodeConnections
from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )

class VLANHost( Host ):
    def config( self, vlan=100, **params ):
		r = super( Host, self ).config( **params )
		intf = self.defaultIntf()
		self.cmd( 'ifconfig %s inet 0' % intf )
		self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
		self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
		newName = '%s.%d' % ( intf, vlan )
		intf.name = newName
		self.nameToIntf[ newName ] = intf
		return r

class IPv6Host( Host ):
    def config( self, v6Addr='1000:1/64', **params ):
		r = super( Host, self ).config( **params )
		intf = self.defaultIntf()
		self.cmd( 'ifconfig %s inet 0' % intf )
		self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
		return r

class dualStackHost( Host ):
    def config( self, v6Addr='2000:1/64', **params ):
		r = super( Host, self ).config( **params )
		intf = self.defaultIntf()
		self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
		return r

class MyTopo( Topo ):

	def __init__( self ):			 
		# Initialize topology
		Topo.__init__( self )
							  
		# Switch S5 Hosts
		host1=self.addHost( 'h1', ip='10.1.0.2/24' )
		host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
		host3=self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
		#VLAN hosts
		host4=self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
		host5=self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
		#VPN-1 and VPN-2 Hosts
		host6=self.addHost( 'h6', ip='11.1.0.2/24' )
		host7=self.addHost( 'h7', ip='12.1.0.2/24' )
		#Multicast Sender
		host8=self.addHost( 'h8', ip='10.1.0.4/24' )

		# Switch S6 Hosts
		host9=self.addHost( 'h9', ip='10.1.0.5/24' )
		host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
		host11=self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
		#VLAN hosts
		host12=self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
		host13=self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
		#VPN-1 and VPN-2 Hosts
		host14=self.addHost( 'h14', ip='11.1.0.3/24' )
		host15=self.addHost( 'h15', ip='12.1.0.3/24' )
		#Multicast Receiver
		host16=self.addHost( 'h16', ip='10.1.0.7/24' )

		# Switch S7 Hosts
		host17=self.addHost( 'h17', ip='10.1.0.8/24' )
		host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
		host19=self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
		#VLAN hosts
		host20=self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
		host21=self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
		#VPN-1 and VPN-2 Hosts
		host22=self.addHost( 'h22', ip='11.1.0.4/24' )
		host23=self.addHost( 'h23', ip='12.1.0.4/24' )
		#Multicast Receiver
		host24=self.addHost( 'h24', ip='10.1.0.10/24' )

		s1 = self.addSwitch( 's1' )
		s2 = self.addSwitch( 's2' )
		s3 = self.addSwitch( 's3' )
		s4 = self.addSwitch( 's4' )
		s5 = self.addSwitch( 's5' )
		s6 = self.addSwitch( 's6' )
		s7 = self.addSwitch( 's7' )
																								    
		self.addLink(s5,host1)
		self.addLink(s5,host2)
		self.addLink(s5,host3)
		self.addLink(s5,host4)
		self.addLink(s5,host5)
		self.addLink(s5,host6)
		self.addLink(s5,host7)
		self.addLink(s5,host8)

		self.addLink(s6,host9)
		self.addLink(s6,host10)
		self.addLink(s6,host11)
		self.addLink(s6,host12)
		self.addLink(s6,host13)
		self.addLink(s6,host14)
		self.addLink(s6,host15)
		self.addLink(s6,host16)

		self.addLink(s7,host17)
		self.addLink(s7,host18)
		self.addLink(s7,host19)
		self.addLink(s7,host20)
		self.addLink(s7,host21)
		self.addLink(s7,host22)
		self.addLink(s7,host23)
		self.addLink(s7,host24)

		self.addLink(s1,s2)																							 
		self.addLink(s1,s3)
		self.addLink(s1,s4)
		self.addLink(s1,s5)
		
		self.addLink(s2,s3)
		self.addLink(s2,s5)
		self.addLink(s2,s6)

		self.addLink(s3,s4)
		self.addLink(s3,s6)
		
		self.addLink(s4,s7)
		topos = { 'mytopo': ( lambda: MyTopo() ) }

# HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS

def setupNetwork():
    "Create network"
    topo = MyTopo()
    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
    network.start()
    CLI( network )
    network.stop()

if __name__ == '__main__':
    setLogLevel('info')
    #setLogLevel('debug')
    setupNetwork()
