datapath: Enforce mutual exclusion between bridge and brcompat_mod.
[sliver-openvswitch.git] / datapath / compat.h
index c484a5d..8dc52a9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011 Nicira Networks.
+ * Copyright (c) 2011, 2012 Nicira Networks.
  * Distributed under the terms of the GNU GPL version 2.
  *
  * Significant portions of this file may be copied from parts of the Linux
@@ -36,4 +36,24 @@ static inline int CHECK_NUL_STRING(struct nlattr *attr, int maxlen)
 }
 #endif  /* !HAVE_NLA_NUL_STRING */
 
+/*
+ * Enforces mutual exclusion with the Linux bridge module, by declaring and
+ * exporting br_should_route_hook.  Because the bridge module also exports the
+ * same symbol, the module loader will refuse to load both modules at the same
+ * time (e.g. "bridge: exports duplicate symbol br_should_route_hook (owned by
+ * openvswitch_mod)").
+ *
+ * Before Linux 2.6.36, Open vSwitch cannot safely coexist with the Linux
+ * bridge module, so openvswitch_mod uses this macro in those versions.  In
+ * Linux 2.6.36 and later, Open vSwitch can coexist with the bridge module, but
+ * it makes no sense to load both bridge and brcompat_mod, so brcompat_mod uses
+ * this macro in those versions.
+ *
+ * The use of "typeof" here avoids the need to track changes in the type of
+ * br_should_route_hook over various kernel versions.
+ */
+#define BRIDGE_MUTUAL_EXCLUSION                                        \
+       typeof(br_should_route_hook) br_should_route_hook;      \
+       EXPORT_SYMBOL(br_should_route_hook)
+
 #endif /* compat.h */