Prepare for post-1.6.0 (1.6.90).
[openvswitch] / lib / netdev-dummy.c
index 94dea765ef490c07e7275bb7a0486154b3ae67c0..57962d10e273242d7a5af7421fb6920c425fe7e9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011 Nicira Networks.
+ * Copyright (c) 2010, 2011, 2012 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@
 #include "packets.h"
 #include "poll-loop.h"
 #include "shash.h"
+#include "sset.h"
 #include "unixctl.h"
 #include "vlog.h"
 
@@ -156,6 +157,7 @@ netdev_dummy_recv(struct netdev *netdev_, void *buffer, size_t size)
 {
     struct netdev_dummy *netdev = netdev_dummy_cast(netdev_);
     struct ofpbuf *packet;
+    size_t packet_size;
 
     if (list_is_empty(&netdev->recv_queue)) {
         return -EAGAIN;
@@ -165,11 +167,12 @@ netdev_dummy_recv(struct netdev *netdev_, void *buffer, size_t size)
     if (packet->size > size) {
         return -EMSGSIZE;
     }
+    packet_size = packet->size;
 
     memcpy(buffer, packet->data, packet->size);
     ofpbuf_delete(packet);
 
-    return packet->size;
+    return packet_size;
 }
 
 static void
@@ -441,9 +444,28 @@ netdev_dummy_receive(struct unixctl_conn *conn,
 }
 
 void
-netdev_dummy_register(void)
+netdev_dummy_register(bool override)
 {
-    netdev_register_provider(&dummy_class);
     unixctl_command_register("netdev-dummy/receive", "NAME PACKET|FLOW...",
                              2, INT_MAX, netdev_dummy_receive, NULL);
+
+    if (override) {
+        struct sset types;
+        const char *type;
+
+        sset_init(&types);
+        netdev_enumerate_types(&types);
+        SSET_FOR_EACH (type, &types) {
+            if (!netdev_unregister_provider(type)) {
+                struct netdev_class *class;
+
+                class = xmalloc(sizeof *class);
+                *class = dummy_class;
+                class->type = xstrdup(type);
+                netdev_register_provider(class);
+            }
+        }
+        sset_destroy(&types);
+    }
+    netdev_register_provider(&dummy_class);
 }