diff --git a/include/nuttx/net.h b/include/nuttx/net.h
index 51f21d83565a6b80572a8ece159f5d7a1b843dc7..d4d7ec75480431345e195f3b02d51728310617fd 100644
--- a/include/nuttx/net.h
+++ b/include/nuttx/net.h
@@ -112,6 +112,11 @@ struct socketlist
 
 typedef uint16 sockopt_t;
 
+/* Callback from netdev_foreach() */
+
+struct uip_driver_s; /* Forward reference.  See net/uip/uip-arch.h */
+typedef int (*netdev_callback_t)(FAR struct uip_driver_s *dev, void *arg);
+
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
@@ -148,16 +153,20 @@ EXTERN int net_close(int sockfd);
 struct ifreq; /* Forward reference -- see net/ioctls.h */
 EXTERN int netdev_ioctl(int sockfd, int cmd, struct ifreq *req);
 
-/* net-register.c ************************************************************/
+/* netdev-register.c *********************************************************/
 /* This function is called by network interface device drivers to inform the
  * socket layer of their existence.  This registration is necesary to support
  * ioctl() operations on network devices to, for example, set MAC and IP
  * addresses
  */
 
-struct uip_driver_s; /* Forward reference.  See net/uip/uip-arch.h */
 EXTERN int netdev_register(FAR struct uip_driver_s *dev);
 
+/* net-foreach.c ************************************************************/
+/* Enumerates all registered network devices */
+
+EXTERN int netdev_foreach(netdev_callback_t callback, void *arg);
+
 #undef EXTERN
 #ifdef __cplusplus
 }
diff --git a/net/Makefile b/net/Makefile
index 082b0a0d797dfc90d05f7da8927c8ece449da78c..a56e5942e1931c87c987f15c8454d1e3c24e36bb 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -1,5 +1,5 @@
 ############################################################################
-# Makefile
+# net/Makefile
 #
 #   Copyright (C) 2007 Gregory Nutt. All rights reserved.
 #   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
@@ -56,7 +56,8 @@ endif
 
 NETDEV_ASRCS	=
 NETDEV_CSRCS	= netdev-register.c netdev-ioctl.c netdev-txnotify.c \
-		  netdev-findbyname.c netdev-findbyaddr.c netdev-count.c 
+		  netdev-findbyname.c netdev-findbyaddr.c netdev-count.c \
+		  netdev-foreach.c
 
 include uip/Make.defs
 endif
diff --git a/net/netdev-foreach.c b/net/netdev-foreach.c
new file mode 100644
index 0000000000000000000000000000000000000000..54472eb98bc7686417e606f12e3ff479c5d2732a
--- /dev/null
+++ b/net/netdev-foreach.c
@@ -0,0 +1,115 @@
+/****************************************************************************
+ * net/netdev-foreach.c
+ *
+ *   Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#if defined(CONFIG_NET) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+#include <sys/types.h>
+#include <debug.h>
+#include <nuttx/net.h>
+#include <net/uip/uip-arch.h>
+
+#include "net-internal.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Priviate Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Global Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Function: netdev_foreach
+ *
+ * Description:
+ *   Enumerate each registered network device.
+ *
+ *   NOTE: netdev semaphore held throughout enumeration.
+ *
+ * Parameters:
+ *   callback - Will be called for each registered device
+ *   arg      - User argument passed to callback()
+ *
+ * Returned Value:
+ *  0:Enumeration completed 1:Enumeration terminated early by callback
+ *
+ * Assumptions:
+ *  Called from normal user mode
+ *
+ ****************************************************************************/
+
+int netdev_foreach(netdev_callback_t callback, void *arg)
+{
+  struct uip_driver_s *dev;
+  int ret = 0;
+
+  if (callback)
+    {
+      netdev_semtake();
+      for (dev = g_netdevices; dev; dev = dev->flink)
+        {
+          if (callback(dev, arg) != 0)
+            {
+              ret = 1;
+              break;
+            }
+        }
+      netdev_semgive();
+    }
+  return ret;
+}
+
+#endif /* CONFIG_NET && CONFIG_NSOCKET_DESCRIPTORS */