From 9d2e6404b34cbaeb66496064976dfc05ddc6450e Mon Sep 17 00:00:00 2001
From: Bob Lantz <rlantz@cs.stanford.edu>
Date: Sat, 10 Jan 2015 03:05:31 -0800
Subject: [PATCH] add fastIntfPair to speed up link creation

---
 mininet/link.py | 42 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 5 deletions(-)

diff --git a/mininet/link.py b/mininet/link.py
index b5eca520..ba85a337 100644
--- a/mininet/link.py
+++ b/mininet/link.py
@@ -50,7 +50,11 @@ def __init__( self, name, node=None, port=None, link=None,
         if self.name == 'lo':
             self.ip = '127.0.0.1'
         # Add to node (and move ourselves if necessary )
-        node.addIntf( self, port=port )
+        moveIntfFn = params.pop( 'moveIntfFn', None )
+        if moveIntfFn:
+            node.addIntf( self, port=port, moveIntfFn=moveIntfFn )
+        else:
+            node.addIntf( self, port=port )
         # Save params for future reference
         self.params = params
         self.config( **params )
@@ -371,7 +375,7 @@ class Link( object ):
     def __init__( self, node1, node2, port1=None, port2=None,
                   intfName1=None, intfName2=None, addr1=None, addr2=None,
                   intf=Intf, cls1=None, cls2=None, params1=None,
-                  params2=None ):
+                  params2=None, fast=True ):
         """Create veth link to another node, making two new interfaces.
            node1: first node
            node2: second node
@@ -406,7 +410,15 @@ def __init__( self, node1, node2, port1=None, port2=None,
         if not intfName2:
             intfName2 = self.intfName( node2, params2[ 'port' ] )
 
-        self.makeIntfPair( intfName1, intfName2, addr1, addr2 )
+        self.fast = fast
+        if fast:
+            params1.setdefault( 'moveIntfFn', self._ignore )
+            params2.setdefault( 'moveIntfFn', self._ignore )
+            self.fastIntfPair( intfName1, intfName2, addr1, addr2,
+                               node1=node1, node2=node2)
+        else:
+            self.makeIntfPair( intfName1, intfName2, addr1, addr2,
+                               node1=node1, node2=node2)
 
         if not cls1:
             cls1 = intf
@@ -421,6 +433,11 @@ def __init__( self, node1, node2, port1=None, port2=None,
         # All we are is dust in the wind, and our two interfaces
         self.intf1, self.intf2 = intf1, intf2
 
+    @staticmethod
+    def _ignore( *args, **kwargs ):
+        "Ignore any arguments"
+        pass
+
     def intfName( self, node, n ):
         "Construct a canonical interface name node-ethN for interface n."
         # Leave this as an instance method for now
@@ -428,7 +445,8 @@ def intfName( self, node, n ):
         return node.name + '-eth' + repr( n )
 
     @classmethod
-    def makeIntfPair( cls, intfname1, intfname2, addr1=None, addr2=None ):
+    def makeIntfPair( cls, intfname1, intfname2, addr1=None, addr2=None,
+                      node1=None, node2=None ):
         """Create pair of interfaces
            intfname1: name of interface 1
            intfname2: name of interface 2
@@ -438,6 +456,18 @@ def makeIntfPair( cls, intfname1, intfname2, addr1=None, addr2=None ):
         assert cls
         return makeIntfPair( intfname1, intfname2, addr1, addr2 )
 
+    @classmethod
+    def fastIntfPair( cls, intfname1, intfname2, addr1=None, addr2=None,
+                     node1=None, node2=None ):
+        """Create pair of interfaces
+            'fast' version: no checking, only works with Nodes.
+            intf1: name of interface 1
+            intf2: name of interface 2
+            (override this class method [and possibly delete()]
+            to change link type)"""
+        return node1.cmd( 'ip link add', intfname1, 'type veth '
+                         'peer name', intfname2, 'netns', node2.pid )
+
     def delete( self ):
         "Delete this link"
         self.intf1.delete()
@@ -478,10 +508,12 @@ def __init__( self, node1, node2, **kwargs ):
              kwargs.update( cls1=OVSIntf, cls2=OVSIntf )
         Link.__init__( self, node1, node2, **kwargs )
 
-    def makeIntfPair( self, *args, **kwargs ):
+    def fastIntfPair( self, *args, **kwargs ):
         "Usually delegated to OVSSwitch"
         if self.isPatchLink:
             return None, None
+        elif self.fast:
+            return Link.fastIntfPair( *args, **kwargs )
         else:
             return Link.makeIntfPair( *args, **kwargs )
 
-- 
GitLab