From 7a4a865bdb16370468b6733f2c15d6b625b9a0fc Mon Sep 17 00:00:00 2001
From: Bob Lantz <rlantz@cs.stanford.edu>
Date: Wed, 14 Jan 2015 20:10:12 -0800
Subject: [PATCH] customize makeIntfPair to eliminate fastIntfPair

---
 mininet/link.py | 42 +++++++++++++-----------------------------
 mininet/util.py | 38 +++++++++++++++++++++++++++-----------
 2 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/mininet/link.py b/mininet/link.py
index 5d921510..14e31cb0 100644
--- a/mininet/link.py
+++ b/mininet/link.py
@@ -415,8 +415,8 @@ def __init__( self, node1, node2, port1=None, port2=None,
         if fast:
             params1.setdefault( 'moveIntfFn', self._ignore )
             params2.setdefault( 'moveIntfFn', self._ignore )
-            self.fastIntfPair( intfName1, intfName2, addr1, addr2,
-                               node1=node1, node2=node2)
+            self.makeIntfPair( intfName1, intfName2, addr1, addr2,
+                               node1, node2, deleteIntfs=False )
         else:
             self.makeIntfPair( intfName1, intfName2, addr1, addr2 )
 
@@ -446,35 +446,21 @@ 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, deleteIntfs=True ):
         """Create pair of interfaces
-           intfname1: name of interface 1
-           intfname2: name of interface 2
+           intfname1: name for interface 1
+           intfname2: name for interface 2
+           addr1: MAC address for interface 1 (optional)
+           addr2: MAC address for interface 2 (optional)
+           node1: home node for interface 1 (optional)
+           node2: home node for interface 2 (optional)
            (override this method [and possibly delete()]
            to change link type)"""
         # Leave this as a class method for now
         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)"""
-        if addr1 is None and addr2 is None:
-            return node1.cmd( 'ip link add name', intfname1,
-                              'type veth peer name',
-                              intfname2, 'netns', node2.pid )
-        else:
-            return node1.cmd( 'ip link add name', intfname1,
-                              'address', addr1,
-                              'type veth peer name', intfname2,
-                              'address', addr2,
-                              'netns', node2.pid )
+        return makeIntfPair( intfname1, intfname2, addr1, addr2, node1, node2,
+                             deleteIntfs=deleteIntfs )
 
     def delete( self ):
         "Delete this link"
@@ -519,12 +505,10 @@ def __init__( self, node1, node2, **kwargs ):
             kwargs.update( cls1=OVSIntf, cls2=OVSIntf )
         Link.__init__( self, node1, node2, **kwargs )
 
-    def fastIntfPair( self, *args, **kwargs ):
+    def makeIntfPair( 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 )
 
diff --git a/mininet/util.py b/mininet/util.py
index 90bf03dd..1fb56c1d 100644
--- a/mininet/util.py
+++ b/mininet/util.py
@@ -145,22 +145,38 @@ def isShellBuiltin( cmd ):
 # live in the root namespace and thus do not have to be
 # explicitly moved.
 
-def makeIntfPair( intf1, intf2, addr1=None, addr2=None, runCmd=quietRun ):
-    """Make a veth pair connecting intf1 and intf2.
-       intf1: string, interface
-       intf2: string, interface
+def makeIntfPair( intf1, intf2, addr1=None, addr2=None, node1=None, node2=None,
+                  deleteIntfs=True, runCmd=None ):
+    """Make a veth pair connnecting new interfaces intf1 and intf2
+       intf1: name for interface 1
+       intf2: name for interface 2
+       addr1: MAC address for interface 1 (optional)
+       addr2: MAC address for interface 2 (optional)
+       node1: home node for interface 1 (optional)
+       node2: home node for interface 2 (optional)
+       deleteIntfs: delete intfs before creating them
        runCmd: function to run shell commands (quietRun)
        returns: ip link add result"""
-    # Delete any old interfaces with the same names
-    runCmd( 'ip link del ' + intf1 )
-    runCmd( 'ip link del ' + intf2 )
+    if not runCmd:
+        runCmd = quietRun if not node1 else node1.cmd
+        runCmd2 = quietRun if not node2 else node2.cmd
+    if deleteIntfs:
+        # Delete any old interfaces with the same names
+        runCmd( 'ip link del ' + intf1 )
+        runCmd2( 'ip link del ' + intf2 )
     # Create new pair
+    netns = 1 if not node2 else node2.pid
     if addr1 is None and addr2 is None:
-        cmd = 'ip link add name ' + intf1 + ' type veth peer name ' + intf2
+        cmdOutput = runCmd( 'ip link add name %s '
+                            'type veth peer name %s '
+                            'netns %s' % ( intf1, intf2, netns ) )
     else:
-        cmd = ( 'ip link add name ' + intf1 + ' address ' + addr1 +
-                ' type veth peer name ' + intf2 + ' address ' + addr2 )
-    cmdOutput = runCmd( cmd )
+        cmdOutput = runCmd( 'ip link add name %s '
+                            'address %s '
+                            'type veth peer name %s '
+                            'address %s '
+                            'netns %s' %
+                            (  intf1, addr1, intf2, addr2, netns ) )
     if cmdOutput == '':
         return True
     else:
-- 
GitLab