AM_CONDITIONAL([ENABLE_API_DOCS], [test "x$HAVE_DOXYGEN" != "x"])
+# Openvswitch
+AC_PATH_PROG([OVS_CTL_PATH],[ovs-vsctl])
+if test "x$OVS_CTL_PATH" != "x"; then
+ enable_ovs="yes"
+ AS_AC_EXPAND(OVS_CTL_PATH, "$OVS_CTL_PATH")
+else
+ enable_ovs="no"
+fi
+AM_CONDITIONAL([HAVE_OVS], [test "x$enable_ovs" = "xyes"])
+
# Apparmor
AC_ARG_ENABLE([apparmor],
[AC_HELP_STRING([--enable-apparmor], [enable apparmor support [default=auto]])],
- rpath: $enable_rpath
- GnuTLS: $enable_gnutls
- Bash integration: $enable_bash
+ - Openvswitch: $enable_ovs
Security features:
- Apparmor: $enable_apparmor
#include "nl.h"
#include "network.h"
#include "conf.h"
+#include "utils.h"
#if HAVE_IFADDRS_H
#include <ifaddrs.h>
return ip_route_dest_add(AF_INET6, ifindex, dest);
}
+#ifdef HAVE_OVS
+static bool is_ovs_bridge(const char *bridge)
+{
+ char brdirname[22 + IFNAMSIZ + 1] = {0};
+ struct stat sb;
+
+ snprintf(brdirname, 22 +IFNAMSIZ + 1, "/sys/class/net/%s/bridge", bridge);
+ if (stat(brdirname, &sb) == -1 && errno == ENOENT)
+ return true;
+ return false;
+}
+
+static int attach_to_ovs_bridge(const char *bridge, const char *nic)
+{
+ pid_t pid;
+ const char *progname;
+
+ pid = fork();
+ if (pid < 0)
+ return -1;
+ if (pid > 0)
+ return wait_for_pid(pid);
+
+ progname = strrchr(OVS_CTL_PATH, '/');
+ if (!progname) // not sane, should we just fail?
+ progname = OVS_CTL_PATH;
+ if (execl(OVS_CTL_PATH, progname, "add-port", bridge, nic, NULL))
+ exit(1);
+ // not reached
+ exit(1);
+}
+#else
+static inline bool is_ovs_bridge(const char *bridge) { return false; }
+static inline int attach_to_ovs_bridge(const char *bridge, const char *nic)
+{
+ retun -1;
+}
+#endif
+
/*
* There is a lxc_bridge_attach, but no need of a bridge detach
* as automatically done by kernel when a netdev is deleted.
if (!index)
return -EINVAL;
+ if (is_ovs_bridge(bridge))
+ return attach_to_ovs_bridge(bridge, ifname);
+
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0)
return -errno;