aboutsummaryrefslogtreecommitdiff
path: root/vswitchd/ovs-brcompatd.c
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2009-08-19 13:03:46 -0700
committerBen Pfaff <blp@nicira.com>2009-08-19 13:03:46 -0700
commit8fef8c7121222233075a03d57db7e0b48d5f6be5 (patch)
tree5cb9822a490c41694be2c8af80ec6a5300ad7a28 /vswitchd/ovs-brcompatd.c
parentd2cd45db48e2713b74c3a31f746f923a72294e46 (diff)
parent6dd3fad481b5d801695c2b0529c7d37cac2c9b19 (diff)
Merge citrix into master.
This was a somewhat difficult merge since there was a fair amount of superficially divergent development on the two branches, especially in the datapath. This has been build-tested against XenServer 5.5.0 and XenServer 5.7.0 build 15122. It has been booted and connected to XenCenter on 5.5.0. The merge revealed a couple of outstanding bugs, which will be fixed on citrix and then merged back into master.
Diffstat (limited to 'vswitchd/ovs-brcompatd.c')
-rw-r--r--vswitchd/ovs-brcompatd.c47
1 files changed, 12 insertions, 35 deletions
diff --git a/vswitchd/ovs-brcompatd.c b/vswitchd/ovs-brcompatd.c
index a510f166..39844f69 100644
--- a/vswitchd/ovs-brcompatd.c
+++ b/vswitchd/ovs-brcompatd.c
@@ -38,7 +38,6 @@
#include "coverage.h"
#include "daemon.h"
#include "dirs.h"
-#include "dpif.h"
#include "dynamic-string.h"
#include "fatal-signal.h"
#include "fault.h"
@@ -304,7 +303,6 @@ static void
prune_ports(void)
{
int i, j;
- int error;
struct svec bridges, delete;
if (cfg_lock(NULL, 0)) {
@@ -324,7 +322,6 @@ prune_ports(void)
get_bridge_ifaces(br_name, &ifaces, -1);
for (j = 0; j < ifaces.n; j++) {
const char *iface_name = ifaces.names[j];
- enum netdev_flags flags;
/* The local port and internal ports are created and destroyed by
* ovs-vswitchd itself, so don't bother checking for them at all.
@@ -335,14 +332,10 @@ prune_ports(void)
continue;
}
- error = netdev_nodev_get_flags(iface_name, &flags);
- if (error == ENODEV) {
+ if (!netdev_exists(iface_name)) {
VLOG_INFO_RL(&rl, "removing dead interface %s from %s",
iface_name, br_name);
svec_add(&delete, iface_name);
- } else if (error) {
- VLOG_INFO_RL(&rl, "unknown error %d on interface %s from %s",
- error, iface_name, br_name);
}
}
svec_destroy(&ifaces);
@@ -364,29 +357,6 @@ prune_ports(void)
svec_destroy(&delete);
}
-/* Checks whether a network device named 'name' exists and returns true if so,
- * false otherwise.
- *
- * XXX it is possible that this doesn't entirely accomplish what we want in
- * context, since ovs-vswitchd.conf may cause vswitchd to create or destroy
- * network devices based on iface.*.internal settings.
- *
- * XXX may want to move this to lib/netdev.
- *
- * XXX why not just use netdev_nodev_get_flags() or similar function? */
-static bool
-netdev_exists(const char *name)
-{
- struct stat s;
- char *filename;
- int error;
-
- filename = xasprintf("/sys/class/net/%s", name);
- error = stat(filename, &s);
- free(filename);
- return !error;
-}
-
static int
add_bridge(const char *br_name)
{
@@ -685,8 +655,14 @@ handle_fdb_query_cmd(struct ofpbuf *buffer)
for (i = 0; i < ifaces.n; i++) {
const char *iface_name = ifaces.names[i];
struct mac *mac = &local_macs[n_local_macs];
- if (!netdev_nodev_get_etheraddr(iface_name, mac->addr)) {
- n_local_macs++;
+ struct netdev *netdev;
+
+ error = netdev_open(iface_name, NETDEV_ETH_TYPE_NONE, &netdev);
+ if (netdev) {
+ if (!netdev_get_etheraddr(netdev, mac->addr)) {
+ n_local_macs++;
+ }
+ netdev_close(netdev);
}
}
svec_destroy(&ifaces);
@@ -992,7 +968,6 @@ rtnl_recv_update(void)
char br_name[IFNAMSIZ];
uint32_t br_idx = nl_attr_get_u32(attrs[IFLA_MASTER]);
struct svec ports;
- enum netdev_flags flags;
if (!if_indextoname(br_idx, br_name)) {
ofpbuf_delete(buf);
@@ -1006,7 +981,7 @@ rtnl_recv_update(void)
return;
}
- if (netdev_nodev_get_flags(port_name, &flags) == ENODEV) {
+ if (!netdev_exists(port_name)) {
/* Network device is really gone. */
VLOG_INFO("network device %s destroyed, "
"removing from bridge %s", port_name, br_name);
@@ -1110,6 +1085,7 @@ main(int argc, char *argv[])
for (;;) {
unixctl_server_run(unixctl);
brc_recv_update();
+ netdev_run();
/* If 'prune_timeout' is non-zero, we actively prune from the
* config file any 'bridge.<br_name>.port' entries that are no
@@ -1131,6 +1107,7 @@ main(int argc, char *argv[])
nl_sock_wait(brc_sock, POLLIN);
unixctl_server_wait(unixctl);
+ netdev_wait();
poll_block();
}