openflow开发中,使用mininet最方便的地方 就在于他的平台结构。使用mininet就意味着可以不用花时间考虑拓扑建立(硬件、虚拟机方面实现),也不用考虑自搭系统联通性方面的问题,另外,也不用考虑如何兼容openflow协议。

不过,虽然mininet有这么多的优点,它的不足之处还是比较明显的。首先,命令行工具比较少(或者说,作为平台来讲,开发者还不多)。另外,拓扑建立方面功能也还不够。随mininet的app中实际上有一个图形化的拓扑建立应用,无奈它只是个不成熟的版本,没有办法生成拓扑文件。

所以,为了测试需要,我写了一段拓扑生成代码。

<br /> import sys<br /> import string</p> <p>#first handle input parameter<br /> if len(sys.argv) < 2: print 'please input: --switch xx --host xxn'

for i in range(1,len(sys.argv[1:])+1): if sys.argv[i] == ‘–switch’ or sys.argv[i] == ‘-s’: switch = string.atoi(sys.argv[i+1]) if sys.argv[i] == ‘–host’ or sys.argv[i] == ‘-h’: host = string.atoi(sys.argv[i+1]) print “host:”, host, “switch:”, switch

then about file we gonna write

fileHandle = open ( ‘newtopo.py’, ‘w’ ) init = “from mininet.topo import Topo, Nodennclass MyTopo( Topo ): n def init( self, enable_all = True ):n super( MyTopo, self ).init()n # Set Node IDs for hosts and switchesn”

now let’s create file

fileHandle.write( init ) for i in range(1,host+1): hostn = ‘ Host’ + str(i) + ‘ = ‘ + str(i) + ‘n’ fileHandle.write( hostn ) for i in range(host+1,switch+host+1): switchn = ‘ Switch’ + str(i-host) + ‘ = ‘ + str(i) + ‘n’ fileHandle.write( switchn )

fileHandle.write( ‘n’ ) fileHandle.write( ‘ # Add nodesn’ ) #then write defination for i in range(1,host+1): hostn = ‘ self.add_node( Host’ + str(i) + ‘, Node( is_switch=False ) )n’ #print hostn fileHandle.write( hostn ) for i in range(1,switch+1): switchn = ‘ self.add_node( Switch’ + str(i) + ‘, Node( is_switch=True ) )n’ #print switchn fileHandle.write( switchn )

at last, create edge

fileHandle.write( ‘n’ ) fileHandle.write( ‘ # Add edgen’ ) for i in range(1,switch+1): link = ‘ self.add_edge( Switch’ + str(i) + ‘, Switch’ + str(switch if i == switch-1 else (i+1)%switch) +’ )n’ fileHandle.write( link )

for i in range(1,host+1): link = ‘ self.add_edge( Host’ + str(i) + ‘, Switch’ + str(switch if i%switch == 0 else i%switch) +’ )n’ fileHandle.write( link )

fileHandle.write( “ self.enable_all()nn” ) fileHandle.write( “topos = { ‘mytopo’: ( lambda: MyTopo() ) }” ) </code>