diff --git a/mininet/cli.py b/mininet/cli.py
index dc531c1433aff4fe504d3a0185905aa5e4a075fb..a2c6ff1cffdfbcb998819a9955a9ba13cda604f8 100644
--- a/mininet/cli.py
+++ b/mininet/cli.py
@@ -36,7 +36,8 @@
 
 from mininet.log import info, output, error
 from mininet.term import makeTerms, runX11
-from mininet.util import quietRun, isShellBuiltin, dumpNodeConnections
+from mininet.util import ( quietRun, isShellBuiltin, dumpNodeConnections,
+                         dumpPorts )
 
 class CLI( Cmd ):
     "Simple command-line interface to talk to nodes."
@@ -127,6 +128,10 @@ def do_nodes( self, _line ):
         nodes = ' '.join( sorted( self.mn ) )
         output( 'available nodes are: \n%s\n' % nodes )
 
+    def do_ports( self, line ):
+        "display ports and interfaces for each switch"
+        dumpPorts( self.mn.switches )
+
     def do_net( self, _line ):
         "List network connections."
         dumpNodeConnections( self.mn.values() )
diff --git a/mininet/util.py b/mininet/util.py
index 3ebe6a2fd1db0c6ae38f17f5976bd2ecaa628030..3dbbea6c758cb80ce5c0268b91e74efafd7c41a1 100644
--- a/mininet/util.py
+++ b/mininet/util.py
@@ -234,6 +234,15 @@ def dumpNetConnections( net ):
     nodes = net.controllers + net.switches + net.hosts
     dumpNodeConnections( nodes )
 
+def dumpPorts( switches ):
+    "dump interface to openflow port mappings for each switch"
+    for switch in switches:
+        output( '%s ' % switch.name )
+        for intf in switch.intfList():
+            port = switch.ports[ intf ]
+            output( '%s:%d ' % ( intf, port ) )
+        output( '\n' )
+
 # IP and Mac address formatting and parsing
 
 def _colonHex( val, bytecount ):