提交 ec834baa 编写于 作者: D Daniel P. Berrange

Remove use of libsysfs from bridge code

上级 dd8b3c6e
Tue Jun 26 18:57:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
* qemud/Makefile.am, qemud/bridge.c, configure.in, libvirt.spec.in
Don't use libsysfs for bridge APIs, call brctl directly.
* qemud/driver.c: Set the STP and forward-delay params if provided
Tue Jun 26 18:56:00 EST 2007 Daniel P. Berrange <berrange@redhat.com> Tue Jun 26 18:56:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
* src/test.c: Don't try to handle URIs with a hostname * src/test.c: Don't try to handle URIs with a hostname
......
...@@ -221,22 +221,6 @@ else ...@@ -221,22 +221,6 @@ else
fi fi
fi fi
dnl
dnl check for libsyfs (>= 2.0.0); allow disabling bridge parameters support altogether
dnl
AC_ARG_ENABLE(bridge-params,
AC_HELP_STRING([--disable-bridge-params],
[disable support for setting bridge parameters using libsysfs [default=no]]),,
enable_bridge_params=yes)
if test x"$enable_bridge_params" == "xyes"; then
AC_CHECK_LIB(sysfs, sysfs_open_device,
[AC_CHECK_HEADER(sysfs/libsysfs.h,
AC_DEFINE(ENABLE_BRIDGE_PARAMS, , [enable setting bridge parameters using libsysfs])
SYSFS_LIBS="-lsysfs" AC_SUBST(SYSFS_LIBS),
AC_MSG_ERROR([You must install libsysfs in order to compile libvirt]))])
fi
dnl dnl
dnl check for kernel headers required by qemud/bridge.c dnl check for kernel headers required by qemud/bridge.c
dnl dnl
......
...@@ -14,13 +14,13 @@ Requires: libxml2 ...@@ -14,13 +14,13 @@ Requires: libxml2
Requires: readline Requires: readline
Requires: ncurses Requires: ncurses
Requires: dnsmasq Requires: dnsmasq
Requires: bridge-utils
Requires: iptables
BuildRequires: xen-devel BuildRequires: xen-devel
BuildRequires: libxml2-devel BuildRequires: libxml2-devel
BuildRequires: readline-devel BuildRequires: readline-devel
BuildRequires: ncurses-devel BuildRequires: ncurses-devel
BuildRequires: gettext BuildRequires: gettext
BuildRequires: libsysfs-devel
BuildRequires: /sbin/iptables
BuildRequires: gnutls-devel BuildRequires: gnutls-devel
Obsoletes: libvir Obsoletes: libvir
ExclusiveArch: i386 x86_64 ia64 ExclusiveArch: i386 x86_64 ia64
......
...@@ -28,7 +28,7 @@ libvirt_qemud_CFLAGS = \ ...@@ -28,7 +28,7 @@ libvirt_qemud_CFLAGS = \
-DREMOTE_PID_FILE="\"$(REMOTE_PID_FILE)\"" \ -DREMOTE_PID_FILE="\"$(REMOTE_PID_FILE)\"" \
-DGETTEXT_PACKAGE=\"$(PACKAGE)\" -DGETTEXT_PACKAGE=\"$(PACKAGE)\"
libvirt_qemud_LDFLAGS = $(WARN_CFLAGS) $(LIBXML_LIBS) $(SYSFS_LIBS) libvirt_qemud_LDFLAGS = $(WARN_CFLAGS) $(LIBXML_LIBS)
libvirt_qemud_DEPENDENCIES = ../src/libvirt.la libvirt_qemud_DEPENDENCIES = ../src/libvirt.la
libvirt_qemud_LDADD = ../src/libvirt.la libvirt_qemud_LDADD = ../src/libvirt.la
......
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <paths.h>
#include <sys/wait.h>
#include <linux/param.h> /* HZ */ #include <linux/param.h> /* HZ */
#include <linux/sockios.h> /* SIOCBRADDBR etc. */ #include <linux/sockios.h> /* SIOCBRADDBR etc. */
...@@ -43,6 +45,7 @@ ...@@ -43,6 +45,7 @@
#define MAX_BRIDGE_ID 256 #define MAX_BRIDGE_ID 256
#define BRCTL_PATH "/usr/sbin/brctl"
#define JIFFIES_TO_MS(j) (((j)*1000)/HZ) #define JIFFIES_TO_MS(j) (((j)*1000)/HZ)
#define MS_TO_JIFFIES(ms) (((ms)*HZ)/1000) #define MS_TO_JIFFIES(ms) (((ms)*HZ)/1000)
...@@ -423,185 +426,138 @@ brGetInetNetmask(brControl *ctl, ...@@ -423,185 +426,138 @@ brGetInetNetmask(brControl *ctl,
return brGetInetAddr(ctl, ifname, SIOCGIFNETMASK, addr, maxlen); return brGetInetAddr(ctl, ifname, SIOCGIFNETMASK, addr, maxlen);
} }
#ifdef ENABLE_BRIDGE_PARAMS
#include <sysfs/libsysfs.h>
static int static int
brSysfsPrep(struct sysfs_class_device **dev, brctlSpawn(char * const *argv)
struct sysfs_attribute **attr,
const char *bridge,
const char *attrname)
{ {
*dev = NULL; pid_t pid, ret;
*attr = NULL; int status;
int null = -1;
if (!(*dev = sysfs_open_class_device("net", bridge))) if ((null = open(_PATH_DEVNULL, O_RDONLY)) < 0)
return errno; return errno;
if (!(*attr = sysfs_get_classdev_attr(*dev, attrname))) { pid = fork();
int err = errno; if (pid == -1) {
int saved_errno = errno;
sysfs_close_class_device(*dev); close(null);
*dev = NULL; return saved_errno;
return err;
} }
return 0; if (pid == 0) { /* child */
} dup2(null, STDIN_FILENO);
dup2(null, STDOUT_FILENO);
dup2(null, STDERR_FILENO);
close(null);
static int execvp(argv[0], argv);
brSysfsWriteInt(struct sysfs_attribute *attr,
int value) _exit (1);
{ }
char buf[32];
int len;
len = snprintf(buf, sizeof(buf), "%d\n", value); close(null);
if (len > (int)sizeof(buf)) while ((ret = waitpid(pid, &status, 0) == -1) && errno == EINTR);
len = sizeof(buf); /* paranoia, shouldn't happen */ if (ret == -1)
return errno;
return sysfs_write_attribute(attr, buf, len) == 0 ? 0 : errno; return (WIFEXITED(status) && WEXITSTATUS(status) == 0) ? 0 : EINVAL;
} }
int int
brSetForwardDelay(brControl *ctl, brSetForwardDelay(brControl *ctl ATTRIBUTE_UNUSED,
const char *bridge, const char *bridge,
int delay) int delay)
{ {
struct sysfs_class_device *dev; char **argv;
struct sysfs_attribute *attr; int retval = ENOMEM;
int err = 0; int n;
char delayStr[30];
if (!ctl || !bridge) n = 1 + /* brctl */
return EINVAL; 1 + /* setfd */
1 + /* brige name */
1; /* value */
if ((err = brSysfsPrep(&dev, &attr, bridge, SYSFS_BRIDGE_ATTR "/forward_delay"))) snprintf(delayStr, sizeof(delayStr), "%d", delay);
return err;
err = brSysfsWriteInt(attr, MS_TO_JIFFIES(delay)); if (!(argv = (char **)calloc(n + 1, sizeof(char *))))
goto error;
sysfs_close_class_device(dev); n = 0;
return err; if (!(argv[n++] = strdup(BRCTL_PATH)))
} goto error;
int if (!(argv[n++] = strdup("setfd")))
brGetForwardDelay(brControl *ctl, goto error;
const char *bridge,
int *delayp)
{
struct sysfs_class_device *dev;
struct sysfs_attribute *attr;
int err = 0;
if (!ctl || !bridge || !delayp) if (!(argv[n++] = strdup(bridge)))
return EINVAL; goto error;
if ((err = brSysfsPrep(&dev, &attr, bridge, SYSFS_BRIDGE_ATTR "/forward_delay"))) if (!(argv[n++] = strdup(delayStr)))
return err; goto error;
*delayp = strtoul(attr->value, NULL, 0); argv[n++] = NULL;
if (errno != ERANGE) { retval = brctlSpawn(argv);
*delayp = JIFFIES_TO_MS(*delayp);
} else {
err = errno;
}
sysfs_close_class_device(dev); error:
if (argv) {
n = 0;
while (argv[n])
free(argv[n++]);
free(argv);
}
return err; return retval;
} }
int int
brSetEnableSTP(brControl *ctl, brSetEnableSTP(brControl *ctl ATTRIBUTE_UNUSED,
const char *bridge, const char *bridge,
int enable) int enable)
{ {
struct sysfs_class_device *dev; char **argv;
struct sysfs_attribute *attr; int retval = ENOMEM;
int err = 0; int n;
if (!ctl || !bridge) n = 1 + /* brctl */
return EINVAL; 1 + /* setfd */
1 + /* brige name */
1; /* value */
if ((err = brSysfsPrep(&dev, &attr, bridge, SYSFS_BRIDGE_ATTR "/stp_state"))) if (!(argv = (char **)calloc(n + 1, sizeof(char *))))
return err; goto error;
err = brSysfsWriteInt(attr, (enable == 0) ? 0 : 1); n = 0;
sysfs_close_class_device(dev); if (!(argv[n++] = strdup(BRCTL_PATH)))
goto error;
return err; if (!(argv[n++] = strdup("setfd")))
} goto error;
int if (!(argv[n++] = strdup(bridge)))
brGetEnableSTP(brControl *ctl, goto error;
const char *bridge,
int *enablep)
{
struct sysfs_class_device *dev;
struct sysfs_attribute *attr;
int err = 0;
if (!ctl || !bridge || !enablep) if (!(argv[n++] = strdup(enable ? "on" : "off")))
return EINVAL; goto error;
if ((err = brSysfsPrep(&dev, &attr, bridge, SYSFS_BRIDGE_ATTR "/stp_state"))) argv[n++] = NULL;
return err;
*enablep = strtoul(attr->value, NULL, 0); retval = brctlSpawn(argv);
if (errno != ERANGE) { error:
*enablep = (*enablep == 0) ? 0 : 1; if (argv) {
} else { n = 0;
err = errno; while (argv[n])
free(argv[n++]);
free(argv);
} }
sysfs_close_class_device(dev); return retval;
return err;
}
#else /* ENABLE_BRIDGE_PARAMS */
int
brSetForwardDelay(brControl *ctl ATTRIBUTE_UNUSED,
const char *bridge ATTRIBUTE_UNUSED,
int delay ATTRIBUTE_UNUSED)
{
return 0;
}
int
brGetForwardDelay(brControl *ctl ATTRIBUTE_UNUSED,
const char *bridge ATTRIBUTE_UNUSED,
int *delay ATTRIBUTE_UNUSED)
{
return 0;
} }
int
brSetEnableSTP(brControl *ctl ATTRIBUTE_UNUSED,
const char *bridge ATTRIBUTE_UNUSED,
int enable ATTRIBUTE_UNUSED)
{
return 0;
}
int
brGetEnableSTP(brControl *ctl ATTRIBUTE_UNUSED,
const char *bridge ATTRIBUTE_UNUSED,
int *enable ATTRIBUTE_UNUSED)
{
return 0;
}
#endif /* ENABLE_BRIDGE_PARAMS */
/* /*
* Local variables: * Local variables:
* indent-tabs-mode: nil * indent-tabs-mode: nil
......
...@@ -1154,6 +1154,22 @@ int qemudStartNetworkDaemon(struct qemud_driver *driver, ...@@ -1154,6 +1154,22 @@ int qemudStartNetworkDaemon(struct qemud_driver *driver,
return -1; return -1;
} }
if (network->def->forwardDelay &&
(err = brSetForwardDelay(driver->brctl, network->bridge, network->def->forwardDelay))) {
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
"failed to set bridge forward delay to %d\n",
network->def->forwardDelay);
goto err_delbr;
}
if ((err = brSetForwardDelay(driver->brctl, network->bridge, network->def->disableSTP ? 0 : 1))) {
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
"failed to set bridge STP to %s\n",
network->def->disableSTP ? "off" : "on");
goto err_delbr;
}
if (network->def->ipAddress[0] && if (network->def->ipAddress[0] &&
(err = brSetInetAddress(driver->brctl, network->bridge, network->def->ipAddress))) { (err = brSetInetAddress(driver->brctl, network->bridge, network->def->ipAddress))) {
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册