From 930138e306c4541fa1c5bee2f38ac53dd78fc89d Mon Sep 17 00:00:00 2001 From: Bob Lantz Date: Thu, 23 Jun 2016 18:53:19 -0700 Subject: [PATCH] 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 --- tools/dev/mininet/onos.py | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/tools/dev/mininet/onos.py b/tools/dev/mininet/onos.py index 00e4a40f20..8e163ad539 100755 --- a/tools/dev/mininet/onos.py +++ b/tools/dev/mininet/onos.py @@ -55,7 +55,6 @@ from sys import argv from glob import glob import time from functools import partial -from re import search ### ONOS Environment @@ -365,7 +364,7 @@ class ONOSCluster( Controller ): 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 @@ class ONOSCluster( Controller ): 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 @@ class ONOSCluster( Controller ): "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 ):