ofp-util: Work on decoding OF1.1 flow_mods.
[openvswitch] / lib / netdev-dummy.c
index d94af415669f9b37470eedaa7ecfd0cbc91bb25b..b8c23c5835b4f9b20e655a991e4361b7a429a6a2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011, 2012 Nicira Networks.
+ * Copyright (c) 2010, 2011, 2012 Nicira, Inc.
  *
  * 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"
 
@@ -351,7 +352,7 @@ static const struct netdev_class dummy_class = {
     NULL,                       /* get_in6 */
     NULL,                       /* add_router */
     NULL,                       /* get_next_hop */
-    NULL,                       /* get_status */
+    NULL,                       /* get_drv_info */
     NULL,                       /* arp_lookup */
 
     netdev_dummy_update_flags,
@@ -409,7 +410,7 @@ netdev_dummy_receive(struct unixctl_conn *conn,
 
     dummy_dev = shash_find_data(&dummy_netdev_devs, argv[1]);
     if (!dummy_dev) {
-        unixctl_command_reply(conn, 501, "no such dummy netdev");
+        unixctl_command_reply_error(conn, "no such dummy netdev");
         return;
     }
 
@@ -420,7 +421,7 @@ netdev_dummy_receive(struct unixctl_conn *conn,
 
         packet = eth_from_packet_or_flow(argv[i]);
         if (!packet) {
-            unixctl_command_reply(conn, 501, "bad packet syntax");
+            unixctl_command_reply_error(conn, "bad packet syntax");
             return;
         }
 
@@ -436,16 +437,35 @@ netdev_dummy_receive(struct unixctl_conn *conn,
     }
 
     if (!n_listeners) {
-        unixctl_command_reply(conn, 202, "packets queued but nobody listened");
+        unixctl_command_reply(conn, "packets queued but nobody listened");
     } else {
-        unixctl_command_reply(conn, 200, "success");
+        unixctl_command_reply(conn, "success");
     }
 }
 
 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);
 }