aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/dpif.c15
-rw-r--r--lib/dpif.h1
-rw-r--r--tests/ofproto-macros.at8
-rw-r--r--vswitchd/ovs-vswitchd.c7
4 files changed, 25 insertions, 6 deletions
diff --git a/lib/dpif.c b/lib/dpif.c
index cc6e805f..5f5417b7 100644
--- a/lib/dpif.c
+++ b/lib/dpif.c
@@ -68,6 +68,7 @@ struct registered_dpif_class {
int refcount;
};
static struct shash dpif_classes = SHASH_INITIALIZER(&dpif_classes);
+static struct sset dpif_blacklist = SSET_INITIALIZER(&dpif_blacklist);
/* Rate limit for individual messages going to or from the datapath, output at
* DBG level. This is very high because, if these are enabled, it is because
@@ -108,6 +109,12 @@ dp_register_provider(const struct dpif_class *new_class)
{
struct registered_dpif_class *registered_class;
+ if (sset_contains(&dpif_blacklist, new_class->type)) {
+ VLOG_DBG("attempted to register blacklisted provider: %s",
+ new_class->type);
+ return EINVAL;
+ }
+
if (shash_find(&dpif_classes, new_class->type)) {
VLOG_WARN("attempted to register duplicate datapath provider: %s",
new_class->type);
@@ -151,6 +158,14 @@ dp_unregister_provider(const char *type)
return 0;
}
+/* Blacklists a provider. Causes future calls of dp_register_provider() with
+ * a dpif_class which implements 'type' to fail. */
+void
+dp_blacklist_provider(const char *type)
+{
+ sset_add(&dpif_blacklist, type);
+}
+
/* Clears 'types' and enumerates the types of all currently registered datapath
* providers into it. The caller must first initialize the sset. */
void
diff --git a/lib/dpif.h b/lib/dpif.h
index 223f990e..0ff2389d 100644
--- a/lib/dpif.h
+++ b/lib/dpif.h
@@ -40,6 +40,7 @@ struct dpif_class;
int dp_register_provider(const struct dpif_class *);
int dp_unregister_provider(const char *type);
+void dp_blacklist_provider(const char *type);
void dp_enumerate_types(struct sset *types);
const char *dpif_normalize_type(const char *);
diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
index 5bc431c1..fc5bba15 100644
--- a/tests/ofproto-macros.at
+++ b/tests/ofproto-macros.at
@@ -3,11 +3,7 @@ m4_define([STRIP_DURATION], [[sed 's/\bduration=[0-9.]*s/duration=?s/']])
m4_define([TESTABLE_LOG], [-vPATTERN:ANY:'%c|%p|%m'])
m4_define([OVS_VSWITCHD_START],
- [dnl Skip this test if running as root. Otherwise ovs-vswitchd will tear
- dnl down any existing datapaths if the kernel module is loaded.
- AT_SKIP_IF([test "`id -u`" = 0])
-
- OVS_RUNDIR=$PWD; export OVS_RUNDIR
+ [OVS_RUNDIR=$PWD; export OVS_RUNDIR
OVS_LOGDIR=$PWD; export OVS_LOGDIR
OVS_SYSCONFDIR=$PWD; export OVS_SYSCONFDIR
trap 'kill `cat ovsdb-server.pid ovs-vswitchd.pid`' 0
@@ -26,7 +22,7 @@ m4_define([OVS_VSWITCHD_START],
AT_CHECK([ovs-vsctl --no-wait init])
dnl Start ovs-vswitchd.
- AT_CHECK([ovs-vswitchd --detach --pidfile --enable-dummy --log-file], [0], [], [stderr])
+ AT_CHECK([ovs-vswitchd --detach --pidfile --enable-dummy --disable-system --log-file], [0], [], [stderr])
AT_CAPTURE_FILE([ovs-vswitchd.log])
AT_CHECK([[sed < stderr '
/vlog|INFO|opened log file/d
diff --git a/vswitchd/ovs-vswitchd.c b/vswitchd/ovs-vswitchd.c
index 359e3ab1..bdc35330 100644
--- a/vswitchd/ovs-vswitchd.c
+++ b/vswitchd/ovs-vswitchd.c
@@ -31,6 +31,7 @@
#include "compiler.h"
#include "daemon.h"
#include "dirs.h"
+#include "dpif.h"
#include "dummy.h"
#include "leak-checker.h"
#include "netdev.h"
@@ -121,6 +122,7 @@ parse_options(int argc, char *argv[])
LEAK_CHECKER_OPTION_ENUMS,
OPT_BOOTSTRAP_CA_CERT,
OPT_ENABLE_DUMMY,
+ OPT_DISABLE_SYSTEM,
DAEMON_OPTION_ENUMS
};
static struct option long_options[] = {
@@ -134,6 +136,7 @@ parse_options(int argc, char *argv[])
{"peer-ca-cert", required_argument, NULL, OPT_PEER_CA_CERT},
{"bootstrap-ca-cert", required_argument, NULL, OPT_BOOTSTRAP_CA_CERT},
{"enable-dummy", no_argument, NULL, OPT_ENABLE_DUMMY},
+ {"disable-system", no_argument, NULL, OPT_DISABLE_SYSTEM},
{NULL, 0, NULL, 0},
};
char *short_options = long_options_to_short_options(long_options);
@@ -181,6 +184,10 @@ parse_options(int argc, char *argv[])
dummy_enable();
break;
+ case OPT_DISABLE_SYSTEM:
+ dp_blacklist_provider("system");
+ break;
+
case '?':
exit(EXIT_FAILURE);