Enable global port forwarding in root namespace
This should fix the problem seen in VirtualBox where you
may have some random interface which is host-only which needs
to have port forwarding set up on it.
Change-Id: Iacdbb129d52529783bdab1c3d768131f6eaf0364
diff --git a/tools/dev/mininet/onos.py b/tools/dev/mininet/onos.py
index 00e4a40..8e163ad 100755
--- a/tools/dev/mininet/onos.py
+++ b/tools/dev/mininet/onos.py
@@ -55,7 +55,6 @@
from glob import glob
import time
from functools import partial
-from re import search
### ONOS Environment
@@ -365,7 +364,7 @@
args = list( args )
name = args.pop( 0 )
topo = kwargs.pop( 'topo', None )
- nat = kwargs.pop( 'nat', 'nat0' )
+ self.nat = kwargs.pop( 'nat', 'nat0' )
nodeOpts = kwargs.pop( 'nodeOpts', {} )
# Default: single switch with 1 ONOS node
if not topo:
@@ -384,8 +383,8 @@
host=partial( ONOSNode, **nodeOpts ),
switch=LinuxBridge,
controller=None )
- if nat:
- self.net.addNAT( nat ).configDefault()
+ if self.nat:
+ self.net.addNAT( self.nat ).configDefault()
updateNodeIPs( self.env, self.nodes() )
self._remoteControllers = []
@@ -420,32 +419,21 @@
"Return list of ONOS nodes"
return [ h for h in self.net.hosts if isinstance( h, ONOSNode ) ]
- def defaultIntf( self ):
- "Call ip route to determine default interface"
- result = quietRun( 'ip route | grep default', shell=True ).strip()
- match = search( r'dev\s+([^\s]+)', result )
- if match:
- intf = match.group( 1 )
- else:
- warn( "Can't find default network interface - using eth0\n" )
- intf = 'eth0'
- return intf
-
- def configPortForwarding( self, ports=[], intf='', action='A' ):
- """Start or stop forwarding on intf to all nodes
+ def configPortForwarding( self, ports=[], action='A' ):
+ """Start or stop port forwarding (any intf) for all nodes
+ ports: list of ports to forward
action: A=add/start, D=delete/stop (default: A)"""
- if not intf:
- intf = self.defaultIntf()
+ self.cmd( 'iptables -' + action, 'FORWARD -d', self.ipBase,
+ '-j ACCEPT' )
for port in ports:
for index, node in enumerate( self.nodes() ):
ip, inport = node.IP(), port + index
# Configure a destination NAT rule
- cmd = ( 'iptables -t nat -{action} PREROUTING -t nat '
- '-i {intf} -p tcp --dport {inport} '
- '-j DNAT --to-destination {ip}:{port}' )
- self.cmd( cmd.format( **locals() ) )
+ self.cmd( 'iptables -t nat -' + action,
+ 'PREROUTING -t nat -p tcp --dport', inport,
+ '-j DNAT --to-destination %s:%s' % ( ip, port ) )
-
+
class ONOSSwitchMixin( object ):
"Mixin for switches that connect to an ONOSCluster"
def start( self, controllers ):