diff --git a/mininet/net.py b/mininet/net.py index 7a01ecb..ebe02a8 100755 --- a/mininet/net.py +++ b/mininet/net.py @@ -102,8 +102,9 @@ from mininet.node import ( Node, Host, OVSKernelSwitch, DefaultController, Controller ) from mininet.nodelib import NAT from mininet.link import Link, Intf -from mininet.util import quietRun, fixLimits, numCores, ensureRoot -from mininet.util import macColonHex, ipStr, ipParse, netParse, ipAdd +from mininet.util import ( quietRun, fixLimits, numCores, ensureRoot, + macColonHex, ipStr, ipParse, netParse, ipAdd, + waitListening ) from mininet.term import cleanUpScreens, makeTerms # Mininet version: should be consistent with README and LICENSE @@ -729,27 +730,25 @@ class Mininet( object ): # XXX This should be cleaned up def iperf( self, hosts=None, l4Type='TCP', udpBw='10M', fmt=None, - seconds=5): + seconds=5, port=5001): """Run iperf between two hosts. hosts: list of hosts; if None, uses first and last hosts l4Type: string, one of [ TCP, UDP ] udpBw: bandwidth target for UDP test fmt: iperf format argument if any seconds: iperf time to transmit + port: iperf port returns: two-element array of [ server, client ] speeds note: send() is buffered, so client rate can be much higher than the actual transmission rate; on an unloaded system, server rate should be much closer to the actual receive rate""" - if not quietRun( 'which telnet' ): - error( 'Cannot find telnet in $PATH - required for iperf test' ) - return hosts = hosts or [ self.hosts[ 0 ], self.hosts[ -1 ] ] assert len( hosts ) == 2 client, server = hosts - output( '*** Iperf: testing ' + l4Type + ' bandwidth between ' ) - output( "%s and %s\n" % ( client.name, server.name ) ) + output( '*** Iperf: testing', l4Type, 'bandwidth between', + client, 'and', server, '\n' ) server.cmd( 'killall -9 iperf' ) - iperfArgs = 'iperf ' + iperfArgs = 'iperf -p %d ' % port bwArgs = '' if l4Type == 'UDP': iperfArgs += '-u ' @@ -758,20 +757,16 @@ class Mininet( object ): raise Exception( 'Unexpected l4 type: %s' % l4Type ) if fmt: iperfArgs += '-f %s ' % fmt - server.sendCmd( iperfArgs + '-s', printPid=True ) - servout = '' - while server.lastPid is None: - servout += server.monitor() + server.sendCmd( iperfArgs + '-s' ) if l4Type == 'TCP': - while 'Connected' not in client.cmd( - 'sh -c "echo A | telnet -e A %s 5001"' % server.IP()): - info( 'Waiting for iperf to start up...' ) - sleep(.5) + if not waitListening( client, server.IP(), port ): + raise Exception( 'Could not connect to iperf on port %d' + % port ) cliout = client.cmd( iperfArgs + '-t %d -c ' % seconds + server.IP() + ' ' + bwArgs ) debug( 'Client output: %s\n' % cliout ) server.sendInt() - servout += server.waitOutput() + servout = server.waitOutput() debug( 'Server output: %s\n' % servout ) result = [ self._parseIperf( servout ), self._parseIperf( cliout ) ] if l4Type == 'UDP': diff --git a/mininet/util.py b/mininet/util.py index 1f5f64d..006aa36 100644 --- a/mininet/util.py +++ b/mininet/util.py @@ -587,18 +587,20 @@ def waitListening( client=None, server='127.0.0.1', port=80, timeout=None ): raise Exception('Could not find telnet' ) # pylint: disable=maybe-no-member serverIP = server if isinstance( server, basestring ) else server.IP() - cmd = ( 'sh -c "echo A | telnet -e A %s %s"' % - ( serverIP, port ) ) + cmd = ( 'echo A | telnet -e A %s %s' % ( serverIP, port ) ) time = 0 - while 'Connected' not in runCmd( cmd ): - if timeout: - print time - if time >= timeout: - error( 'could not connect to %s on port %d\n' - % ( server, port ) ) - return False - output('waiting for', server, - 'to listen on port', port, '\n') + result = runCmd( cmd ) + while 'Connected' not in result: + if 'No route' in result: + rtable = runCmd( 'route' ) + error( 'no route to %s:\n%s' % ( server, rtable ) ) + return False + if timeout and time >= timeout: + error( 'could not connect to %s on port %d\n' % ( server, port ) ) + return False + debug( 'waiting for', server, 'to listen on port', port, '\n' ) + info( '.' ) sleep( .5 ) time += .5 + result = runCmd( cmd ) return True