From 39a3b73f856f4df1a4d6064473ed4099cbeff895 Mon Sep 17 00:00:00 2001
From: Tomasz Buchert <tomek.buchert@gmail.com>
Date: Wed, 13 Aug 2014 16:51:41 +0200
Subject: [PATCH] fallback to ovsb when no OF controller is unavailable

---
 bin/mn          | 16 ++++++++++++++--
 mininet/node.py | 12 +++++++++++-
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/bin/mn b/bin/mn
index e94515d3..02639954 100755
--- a/bin/mn
+++ b/bin/mn
@@ -27,7 +27,8 @@ from mininet.net import Mininet, MininetWithControlNet, VERSION
 from mininet.node import ( Host, CPULimitedHost, Controller, OVSController,
                            NOX, RemoteController, DefaultController,
                            UserSwitch, OVSBridge, OVSSwitch,
-                           OVSLegacyKernelSwitch, IVSSwitch )
+                           OVSLegacyKernelSwitch, IVSSwitch,
+                           getAvailableController )
 from mininet.nodelib import LinuxBridge
 from mininet.link import Link, TCLink
 from mininet.topo import SingleSwitchTopo, LinearTopo, SingleSwitchReversedTopo
@@ -65,7 +66,7 @@ CONTROLLERS = { 'ref': Controller,
                 'ovsc': OVSController,
                 'nox': NOX,
                 'remote': RemoteController,
-                'default': DefaultController,
+                'default': None,
                 'none': lambda name: None }
 
 LINKDEF = 'default'
@@ -230,6 +231,17 @@ class MininetRunner( object ):
 
         start = time.time()
 
+        if self.options.controller == "default":
+            controller_name = getAvailableController()
+            if controller_name is not None:
+                self.options.controller = controller_name
+            else:
+                # fallback to OVS Bridge switch, which does not use OF controller
+                info('*** No default OpenFlow implementation found!\n')
+                info('    Fallback to ovsb switch implementation.\n')
+                self.options.switch = 'ovsb'
+                self.options.controller = 'none'
+
         topo = buildTopo( TOPOS, self.options.topo )
         switch = customConstructor( SWITCHES, self.options.switch )
         host = customConstructor( HOSTS, self.options.host )
diff --git a/mininet/node.py b/mininet/node.py
index a10abbf2..922b442a 100644
--- a/mininet/node.py
+++ b/mininet/node.py
@@ -1382,9 +1382,19 @@ def checkListening( self ):
             warn( "Unable to contact the remote controller"
                   " at %s:%d\n" % ( self.ip, self.port ) )
 
+DEFAULT_CONTROLLERS = [ ('ref', Controller), ('ovsc', OVSController) ]
+DEFAULT_CONTROLLERS_CLASSES = [ klass for _, klass in DEFAULT_CONTROLLERS ]
 
-def DefaultController( name, order=[ Controller, OVSController ], **kwargs ):
+def getAvailableController():
+    "find name of any default controller that is available; None if nothing is available"
+    for name, controller in DEFAULT_CONTROLLERS:
+        if controller.isAvailable():
+            return name
+    return None
+
+def DefaultController( name, order = DEFAULT_CONTROLLERS_CLASSES, **kwargs ):
     "find any controller that is available and run it"
     for controller in order:
         if controller.isAvailable():
             return controller( name, **kwargs )
+    return None
-- 
GitLab