datapath: Fix build with Linux 2.6.31.
[openvswitch] / lib / dpif.c
index 21f1173fa8fe132479e1e03255aad9db7a20d0d9..4475913cea42037780271697f938d9c311c2c70e 100644 (file)
@@ -43,6 +43,7 @@
 #include "ofpbuf.h"
 #include "packets.h"
 #include "poll-loop.h"
+#include "svec.h"
 #include "util.h"
 #include "valgrind.h"
 
@@ -64,6 +65,35 @@ static int open_by_minor(unsigned int minor, struct dpif *);
 static int make_openvswitch_device(unsigned int minor, char **fnp);
 static void check_rw_odp_flow(struct odp_flow *);
 
+
+/* Clears 'all_dps' and enumerates the names of all known created
+ * datapaths into it.  Returns 0 if successful, otherwise a positive 
+ * errno value. */
+int
+dp_enumerate(struct svec *all_dps)
+{
+    int error;
+    int i;
+
+    svec_clear(all_dps);
+    error = 0;
+    for (i = 0; i < ODP_MAX; i++) {
+        struct dpif dpif;
+        char devname[16];
+        int retval;
+
+        sprintf(devname, "dp%d", i);
+        retval = dpif_open(devname, &dpif);
+        if (!retval) {
+            svec_add(all_dps, devname);
+            dpif_close(&dpif);
+        } else if (retval != ENODEV && !error) {
+            error = retval;
+        }
+    }
+    return error;
+}
+
 int
 dpif_open(const char *name, struct dpif *dpif)
 {
@@ -322,6 +352,28 @@ dpif_port_query_by_name(const struct dpif *dpif, const char *devname,
     }
 }
 
+/* Looks up port number 'port_no' in 'dpif'.  On success, returns 0 and copies
+ * the port's name into the 'name_size' bytes in 'name', ensuring that the
+ * result is null-terminated.  On failure, returns a positive errno value and
+ * makes 'name' the empty string. */
+int
+dpif_port_get_name(struct dpif *dpif, uint16_t port_no,
+                   char *name, size_t name_size)
+{
+    struct odp_port port;
+    int error;
+
+    assert(name_size > 0);
+
+    error = dpif_port_query_by_number(dpif, port_no, &port);
+    if (!error) {
+        ovs_strlcpy(name, port.devname, name_size);
+    } else {
+        *name = '\0';
+    }
+    return error;
+}
+
 int
 dpif_port_list(const struct dpif *dpif,
                struct odp_port **ports, size_t *n_ports)