Thanks. I hadn't actually tried distcheck but it's running now. Assuming it passes I'll push this.
On Fri, Feb 11, 2011 at 01:59:27PM -0800, Ethan Jackson wrote: > Yay! That stuff was so ugly, glad it's gone. > > I didn't closely review all of the deleted files, but I did look > closely at the vswitchd/bridge.c changes. Assuming this passes make > distcheck I think it's good. > > Ethan > > On Fri, Feb 11, 2011 at 1:48 PM, Ben Pfaff <[email protected]> wrote: > > This feature was included only to allow Citrix QA to run some tests that > > interacted directly with the bridge. ?This feature hasn't been turned on > > for some time, so it should not be necessary any longer. > > > > Signed-off-by: Ben Pfaff <[email protected]> > > --- > > ?datapath/brc_procfs.c ? ? ? ? ? ? ? ? ?| ?186 ---------------- > > ?datapath/brc_procfs.h ? ? ? ? ? ? ? ? ?| ? 22 -- > > ?datapath/brcompat.c ? ? ? ? ? ? ? ? ? ?| ? 16 -- > > ?datapath/linux-2.6/.gitignore ? ? ? ? ?| ? ?1 - > > ?datapath/linux-2.6/Modules.mk ? ? ? ? ?| ? ?8 +- > > ?include/openvswitch/brcompat-netlink.h | ? ?8 +- > > ?vswitchd/automake.mk ? ? ? ? ? ? ? ? ? | ? ?2 - > > ?vswitchd/bridge.c ? ? ? ? ? ? ? ? ? ? ?| ?137 +------------ > > ?vswitchd/ovs-vswitchd.8.in ? ? ? ? ? ? | ? ?9 - > > ?vswitchd/ovs-vswitchd.c ? ? ? ? ? ? ? ?| ? 16 +-- > > ?vswitchd/proc-net-compat.c ? ? ? ? ? ? | ?371 > > -------------------------------- > > ?vswitchd/proc-net-compat.h ? ? ? ? ? ? | ? 49 ----- > > ?12 files changed, 6 insertions(+), 819 deletions(-) > > ?delete mode 100644 datapath/brc_procfs.c > > ?delete mode 100644 datapath/brc_procfs.h > > ?delete mode 100644 vswitchd/proc-net-compat.c > > ?delete mode 100644 vswitchd/proc-net-compat.h > > > > diff --git a/datapath/brc_procfs.c b/datapath/brc_procfs.c > > deleted file mode 100644 > > index 3665948..0000000 > > --- a/datapath/brc_procfs.c > > +++ /dev/null > > @@ -1,186 +0,0 @@ > > -/* > > - * Copyright (c) 2009, 2010, 2011 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 > > - * kernel, by Linus Torvalds and others. > > - */ > > - > > -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > - > > -#include <linux/kernel.h> > > -#include <linux/module.h> > > -#include <linux/netdevice.h> > > -#include <linux/proc_fs.h> > > -#include <linux/seq_file.h> > > -#include <net/genetlink.h> > > -#include "brc_procfs.h" > > -#include "openvswitch/brcompat-netlink.h" > > - > > -/* This code implements a Generic Netlink command BRC_GENL_C_SET_PROC that > > can > > - * be used to add, modify, and delete arbitrary files in selected > > - * subdirectories of /proc. ?It's a horrible kluge prompted by the need to > > - * simulate certain /proc/net/vlan and /proc/net/bonding files for software > > - * that wants to read them, and with any luck it will go away eventually. > > - * > > - * The implementation is a kluge too. ?In particular, we want to release > > the > > - * strings copied into the 'data' members of proc_dir_entry when the > > - * proc_dir_entry structures are freed, but there doesn't appear to be a > > way to > > - * hook that, so instead we have to rely on being the only entity > > modifying the > > - * directories in question. > > - */ > > - > > -static int brc_seq_show(struct seq_file *seq, void *unused) > > -{ > > - ? ? ? seq_puts(seq, seq->private); > > - ? ? ? return 0; > > -} > > - > > -static int brc_seq_open(struct inode *inode, struct file *file) > > -{ > > - ? ? ? return single_open(file, brc_seq_show, PDE(inode)->data); > > -} > > - > > -static struct file_operations brc_fops = { > > - ? ? ? .owner = THIS_MODULE, > > - ? ? ? .open ? ?= brc_seq_open, > > - ? ? ? .read ? ?= seq_read, > > - ? ? ? .llseek ?= seq_lseek, > > - ? ? ? .release = single_release, > > -}; > > - > > -static struct proc_dir_entry *proc_vlan_dir; > > -static struct proc_dir_entry *proc_bonding_dir; > > - > > -static struct proc_dir_entry *brc_lookup_entry(struct proc_dir_entry *de, > > const char *name) > > -{ > > - ? ? ? int namelen = strlen(name); > > - ? ? ? for (de = de->subdir; de; de = de->next) { > > - ? ? ? ? ? ? ? if (de->namelen != namelen) > > - ? ? ? ? ? ? ? ? ? ? ? continue; > > - ? ? ? ? ? ? ? if (!memcmp(name, de->name, de->namelen)) > > - ? ? ? ? ? ? ? ? ? ? ? return de; > > - ? ? ? } > > - ? ? ? return NULL; > > -} > > - > > -static struct proc_dir_entry *brc_open_dir(const char *dir_name, > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct proc_dir_entry *parent, > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct proc_dir_entry **dirp) > > -{ > > - ? ? ? if (!*dirp) { > > - ? ? ? ? ? ? ? struct proc_dir_entry *dir; > > - ? ? ? ? ? ? ? if (brc_lookup_entry(parent, dir_name)) { > > - ? ? ? ? ? ? ? ? ? ? ? pr_warn("%s proc directory exists, can't simulate--" > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "probably its real module is loaded\n", > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dir_name); > > - ? ? ? ? ? ? ? ? ? ? ? return NULL; > > - ? ? ? ? ? ? ? } > > - ? ? ? ? ? ? ? dir = *dirp = proc_mkdir(dir_name, parent); > > - ? ? ? } > > - ? ? ? return *dirp; > > -} > > - > > -int brc_genl_set_proc(struct sk_buff *skb, struct genl_info *info) > > -{ > > - ? ? ? struct proc_dir_entry *dir, *entry; > > - ? ? ? const char *dir_name, *name; > > - ? ? ? char *data; > > - > > - ? ? ? if (!info->attrs[BRC_GENL_A_PROC_DIR] || > > - ? ? ? ? ? VERIFY_NUL_STRING(info->attrs[BRC_GENL_A_PROC_DIR], > > BRC_NAME_LEN_MAX) || > > - ? ? ? ? ? !info->attrs[BRC_GENL_A_PROC_NAME] || > > - ? ? ? ? ? VERIFY_NUL_STRING(info->attrs[BRC_GENL_A_PROC_NAME], > > BRC_NAME_LEN_MAX) || > > - ? ? ? ? ? (info->attrs[BRC_GENL_A_PROC_DATA] && > > - ? ? ? ? ? ?VERIFY_NUL_STRING(info->attrs[BRC_GENL_A_PROC_DATA], INT_MAX))) > > - ? ? ? ? ? ? ? return -EINVAL; > > - > > - ? ? ? dir_name = nla_data(info->attrs[BRC_GENL_A_PROC_DIR]); > > - ? ? ? name = nla_data(info->attrs[BRC_GENL_A_PROC_NAME]); > > - > > - ? ? ? if (!strcmp(dir_name, "net/vlan")) > > - ? ? ? ? ? ? ? dir = brc_open_dir("vlan", proc_net, &proc_vlan_dir); > > - ? ? ? else if (!strcmp(dir_name, "net/bonding")) > > - ? ? ? ? ? ? ? dir = brc_open_dir("bonding", proc_net, &proc_bonding_dir); > > - ? ? ? else > > - ? ? ? ? ? ? ? return -EINVAL; > > - ? ? ? if (!dir) { > > - ? ? ? ? ? ? ? /* Probably failed because the module that really implements > > - ? ? ? ? ? ? ? ?* the function in question is loaded and already owns the > > - ? ? ? ? ? ? ? ?* directory in question.*/ > > - ? ? ? ? ? ? ? return -EBUSY; > > - ? ? ? } > > - > > - ? ? ? entry = brc_lookup_entry(dir, name); > > - ? ? ? if (!info->attrs[BRC_GENL_A_PROC_DATA]) { > > - ? ? ? ? ? ? ? if (!entry) > > - ? ? ? ? ? ? ? ? ? ? ? return -ENOENT; > > - > > - ? ? ? ? ? ? ? data = entry->data; > > - ? ? ? ? ? ? ? remove_proc_entry(name, dir); > > - ? ? ? ? ? ? ? if (brc_lookup_entry(dir, name)) > > - ? ? ? ? ? ? ? ? ? ? ? return -EBUSY; /* Shouldn't happen */ > > - > > - ? ? ? ? ? ? ? kfree(data); > > - ? ? ? } else { > > - ? ? ? ? ? ? ? data = kstrdup(nla_data(info->attrs[BRC_GENL_A_PROC_DATA]), > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GFP_KERNEL); > > - ? ? ? ? ? ? ? if (!data) > > - ? ? ? ? ? ? ? ? ? ? ? return -ENOMEM; > > - > > - ? ? ? ? ? ? ? if (entry) { > > - ? ? ? ? ? ? ? ? ? ? ? char *old_data = entry->data; > > - ? ? ? ? ? ? ? ? ? ? ? entry->data = data; > > - ? ? ? ? ? ? ? ? ? ? ? kfree(old_data); > > - ? ? ? ? ? ? ? ? ? ? ? return 0; > > - ? ? ? ? ? ? ? } > > - > > - ? ? ? ? ? ? ? entry = create_proc_entry(name, S_IFREG|S_IRUSR|S_IWUSR, > > dir); > > - ? ? ? ? ? ? ? if (!entry) { > > - ? ? ? ? ? ? ? ? ? ? ? kfree(data); > > - ? ? ? ? ? ? ? ? ? ? ? return -ENOBUFS; > > - ? ? ? ? ? ? ? } > > - ? ? ? ? ? ? ? entry->proc_fops = &brc_fops; > > - ? ? ? ? ? ? ? entry->data = data; > > - ? ? ? } > > - ? ? ? return 0; > > -} > > - > > -static void kill_proc_dir(const char *dir_name, > > - ? ? ? ? ? ? ? ? ? ? ? ? struct proc_dir_entry *parent, > > - ? ? ? ? ? ? ? ? ? ? ? ? struct proc_dir_entry *dir) > > -{ > > - ? ? ? if (!dir) > > - ? ? ? ? ? ? ? return; > > - ? ? ? for (;;) { > > - ? ? ? ? ? ? ? struct proc_dir_entry *e; > > - ? ? ? ? ? ? ? char *data; > > - ? ? ? ? ? ? ? char name[BRC_NAME_LEN_MAX + 1]; > > - > > - ? ? ? ? ? ? ? e = dir->subdir; > > - ? ? ? ? ? ? ? if (!e) > > - ? ? ? ? ? ? ? ? ? ? ? break; > > - > > - ? ? ? ? ? ? ? if (e->namelen >= sizeof(name)) { > > - ? ? ? ? ? ? ? ? ? ? ? /* Can't happen: we prevent adding names this long > > by > > - ? ? ? ? ? ? ? ? ? ? ? ?* limiting the BRC_GENL_A_PROC_NAME string to > > - ? ? ? ? ? ? ? ? ? ? ? ?* BRC_NAME_LEN_MAX bytes. ?*/ > > - ? ? ? ? ? ? ? ? ? ? ? WARN_ON(1); > > - ? ? ? ? ? ? ? ? ? ? ? break; > > - ? ? ? ? ? ? ? } > > - ? ? ? ? ? ? ? strcpy(name, e->name); > > - > > - ? ? ? ? ? ? ? data = e->data; > > - ? ? ? ? ? ? ? e->data = NULL; > > - ? ? ? ? ? ? ? kfree(data); > > - > > - ? ? ? ? ? ? ? remove_proc_entry(name, dir); > > - ? ? ? } > > - ? ? ? remove_proc_entry(dir_name, parent); > > -} > > - > > -void brc_procfs_exit(void) > > -{ > > - ? ? ? kill_proc_dir("vlan", proc_net, proc_vlan_dir); > > - ? ? ? kill_proc_dir("bonding", proc_net, proc_bonding_dir); > > -} > > diff --git a/datapath/brc_procfs.h b/datapath/brc_procfs.h > > deleted file mode 100644 > > index 05afe40..0000000 > > --- a/datapath/brc_procfs.h > > +++ /dev/null > > @@ -1,22 +0,0 @@ > > -/* > > - * Copyright (c) 2009, 2011 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 > > - * kernel, by Linus Torvalds and others. > > - */ > > - > > -#ifndef BRC_PROCFS_H > > -#define BRC_PROCFS_H 1 > > - > > -struct sk_buff; > > -struct genl_info; > > - > > -/* Maximum length of BRC_GENL_A_PROC_DIR and BRC_GENL_A_PROC_NAME strings. > > */ > > -#define BRC_NAME_LEN_MAX 32 > > - > > -void brc_procfs_exit(void); > > -int brc_genl_set_proc(struct sk_buff *skb, struct genl_info *info); > > - > > -#endif /* brc_procfs.h */ > > - > > diff --git a/datapath/brcompat.c b/datapath/brcompat.c > > index 3e91dc5..f9d0083 100644 > > --- a/datapath/brcompat.c > > +++ b/datapath/brcompat.c > > @@ -18,7 +18,6 @@ > > ?#include <net/genetlink.h> > > > > ?#include "openvswitch/brcompat-netlink.h" > > -#include "brc_procfs.h" > > ?#include "datapath.h" > > > > ?static struct genl_family brc_genl_family; > > @@ -399,15 +398,6 @@ nla_put_failure: > > ?/* Attribute policy: what each attribute may contain. ?*/ > > ?static struct nla_policy brc_genl_policy[BRC_GENL_A_MAX + 1] = { > > ? ? ? ?[BRC_GENL_A_ERR_CODE] = { .type = NLA_U32 }, > > - > > -#ifdef HAVE_NLA_NUL_STRING > > - ? ? ? [BRC_GENL_A_PROC_DIR] = { .type = NLA_NUL_STRING, > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .len = BRC_NAME_LEN_MAX }, > > - ? ? ? [BRC_GENL_A_PROC_NAME] = { .type = NLA_NUL_STRING, > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .len = BRC_NAME_LEN_MAX }, > > - ? ? ? [BRC_GENL_A_PROC_DATA] = { .type = NLA_NUL_STRING }, > > -#endif > > - > > ? ? ? ?[BRC_GENL_A_FDB_DATA] = { .type = NLA_UNSPEC }, > > ?}; > > > > @@ -452,11 +442,6 @@ static struct genl_ops brc_genl_ops[] = { > > ? ? ? ? ?.policy = brc_genl_policy, > > ? ? ? ? ?.doit = brc_genl_dp_result, > > ? ? ? ?}, > > - ? ? ? { .cmd = BRC_GENL_C_SET_PROC, > > - ? ? ? ? .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privelege. */ > > - ? ? ? ? .policy = brc_genl_policy, > > - ? ? ? ? .doit = brc_genl_set_proc, > > - ? ? ? }, > > ?}; > > > > ?static struct sk_buff *brc_send_command(struct sk_buff *request, > > @@ -555,7 +540,6 @@ static void brc_cleanup(void) > > ? ? ? ?brioctl_set(NULL); > > > > ? ? ? ?genl_unregister_family(&brc_genl_family); > > - ? ? ? brc_procfs_exit(); > > ?} > > > > ?module_init(brc_init); > > diff --git a/datapath/linux-2.6/.gitignore b/datapath/linux-2.6/.gitignore > > index ed7250f..f5edd50 100644 > > --- a/datapath/linux-2.6/.gitignore > > +++ b/datapath/linux-2.6/.gitignore > > @@ -4,7 +4,6 @@ > > ?/Module.markers > > ?/actions.c > > ?/addrconf_core-openvswitch.c > > -/brc_procfs.c > > ?/brc_sysfs_dp.c > > ?/brc_sysfs_if.c > > ?/brcompat.c > > diff --git a/datapath/linux-2.6/Modules.mk b/datapath/linux-2.6/Modules.mk > > index 88c5769..3fb9e9b 100644 > > --- a/datapath/linux-2.6/Modules.mk > > +++ b/datapath/linux-2.6/Modules.mk > > @@ -58,9 +58,5 @@ openvswitch_headers += \ > > ? ? ? ?linux-2.6/compat-2.6/genetlink.inc > > > > ?both_modules += brcompat > > -brcompat_sources = \ > > - ? ? ? linux-2.6/compat-2.6/genetlink-brcompat.c \ > > - ? ? ? brcompat.c \ > > - ? ? ? brc_procfs.c > > -brcompat_headers = \ > > - ? ? ? brc_procfs.h > > +brcompat_sources = linux-2.6/compat-2.6/genetlink-brcompat.c brcompat.c > > +brcompat_headers = > > diff --git a/include/openvswitch/brcompat-netlink.h > > b/include/openvswitch/brcompat-netlink.h > > index 7d5ac4c..d238a16 100644 > > --- a/include/openvswitch/brcompat-netlink.h > > +++ b/include/openvswitch/brcompat-netlink.h > > @@ -1,5 +1,5 @@ > > ?/* > > - * Copyright (c) 2008, 2009 Nicira Networks. > > + * Copyright (c) 2008, 2009, 2011 Nicira Networks. > > ?* > > ?* This file is offered under your choice of two licenses: Apache 2.0 or GNU > > ?* GPL 2.0 or later. ?The permission statements for each of these licenses > > is > > @@ -64,11 +64,6 @@ enum { > > ? ? ? ?/* BRC_GENL_C_QUERY_MC. */ > > ? ? ? ?BRC_GENL_A_MC_GROUP, ? ?/* K: Generic netlink multicast group. */ > > > > - ? ? ? /* BRC_GENL_C_SET_PROC. */ > > - ? ? ? BRC_GENL_A_PROC_DIR, ? ?/* U: Name of subdirectory in /proc. */ > > - ? ? ? BRC_GENL_A_PROC_NAME, ? /* U: Name of file in /proc. */ > > - ? ? ? BRC_GENL_A_PROC_DATA, ? /* U: Contents of file in /proc. */ > > - > > ? ? ? ?/* BRC_GENL_C_FDB_QUERY. */ > > ? ? ? ?BRC_GENL_A_FDB_COUNT, ? /* K: Number of FDB entries to read. */ > > ? ? ? ?BRC_GENL_A_FDB_SKIP, ? ?/* K: Record offset into FDB to start > > reading. */ > > @@ -95,7 +90,6 @@ enum brc_genl_command { > > ? ? ? ?BRC_GENL_C_PORT_ADD, ? ?/* K: Port added to datapath. */ > > ? ? ? ?BRC_GENL_C_PORT_DEL, ? ?/* K: Port removed from datapath. */ > > ? ? ? ?BRC_GENL_C_QUERY_MC, ? ?/* U: Get multicast group for brcompat. */ > > - ? ? ? BRC_GENL_C_SET_PROC, ? ?/* U: Set contents of file in /proc. */ > > ? ? ? ?BRC_GENL_C_FDB_QUERY, ? /* K: Read records from forwarding database. > > */ > > ? ? ? ?BRC_GENL_C_GET_BRIDGES, /* K: Get ifindexes of all bridges. */ > > ? ? ? ?BRC_GENL_C_GET_PORTS, ? /* K: Get ifindexes of all ports on a > > bridge. */ > > diff --git a/vswitchd/automake.mk b/vswitchd/automake.mk > > index 0a2c7ff..b8ee5b3 100644 > > --- a/vswitchd/automake.mk > > +++ b/vswitchd/automake.mk > > @@ -9,8 +9,6 @@ DISTCLEANFILES += \ > > ?vswitchd_ovs_vswitchd_SOURCES = \ > > ? ? ? ?vswitchd/bridge.c \ > > ? ? ? ?vswitchd/bridge.h \ > > - ? ? ? vswitchd/proc-net-compat.c \ > > - ? ? ? vswitchd/proc-net-compat.h \ > > ? ? ? ?vswitchd/ovs-vswitchd.c \ > > ? ? ? ?vswitchd/system-stats.c \ > > ? ? ? ?vswitchd/system-stats.h \ > > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c > > index e92dd62..197b6ed 100644 > > --- a/vswitchd/bridge.c > > +++ b/vswitchd/bridge.c > > @@ -55,7 +55,6 @@ > > ?#include "ovsdb-data.h" > > ?#include "packets.h" > > ?#include "poll-loop.h" > > -#include "proc-net-compat.h" > > ?#include "process.h" > > ?#include "sha1.h" > > ?#include "shash.h" > > @@ -191,7 +190,6 @@ struct port { > > ? ? tag_type active_iface_tag; ?/* Tag for bcast flows. */ > > ? ? tag_type no_ifaces_tag; ? ? /* Tag for flows when all ifaces disabled. > > */ > > ? ? int updelay, downdelay; ? ? /* Delay before iface goes up/down, in ms. > > */ > > - ? ?bool bond_compat_is_stale; ?/* Need to call port_update_bond_compat()? > > */ > > ? ? bool bond_fake_iface; ? ? ? /* Fake a bond interface for legacy compat? > > */ > > ? ? bool miimon; ? ? ? ? ? ? ? ?/* Use miimon instead of carrier? */ > > ? ? long long int bond_miimon_interval; /* Miimon status refresh interval. > > */ > > @@ -303,8 +301,6 @@ static struct port *port_lookup(const struct bridge *, > > const char *name); > > ?static struct iface *port_lookup_iface(const struct port *, const char > > *name); > > ?static struct port *port_from_dp_ifidx(const struct bridge *, > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?uint16_t dp_ifidx); > > -static void port_update_bond_compat(struct port *); > > -static void port_update_vlan_compat(struct port *); > > ?static void port_update_bonding(struct port *); > > ?static void port_update_lacp(struct port *); > > > > @@ -915,7 +911,6 @@ bridge_reconfigure(const struct ovsrec_open_vswitch > > *ovs_cfg) > > ? ? ? ? ? ? struct port *port = br->ports[i]; > > ? ? ? ? ? ? int j; > > > > - ? ? ? ? ? ?port_update_vlan_compat(port); > > ? ? ? ? ? ? port_update_bonding(port); > > ? ? ? ? ? ? port_update_lacp(port); > > > > @@ -2210,7 +2205,6 @@ choose_output_iface(const struct port *port, const > > struct flow *flow, > > ? ? ? ? ? ? ? ? return false; > > ? ? ? ? ? ? } > > ? ? ? ? ? ? e->iface_tag = tag_create_random(); > > - ? ? ? ? ? ?((struct port *) port)->bond_compat_is_stale = true; > > ? ? ? ? } > > ? ? ? ? *tags |= e->iface_tag; > > ? ? ? ? iface = port->ifaces[e->iface_idx]; > > @@ -2340,7 +2334,6 @@ bond_enable_slave(struct iface *iface, bool enable) > > ? ? } > > > > ? ? moving_active_iface = false; > > - ? ?port->bond_compat_is_stale = true; > > ?} > > > > ?/* Attempts to make the sum of the bond slaves' statistics appear on the > > fake > > @@ -2393,7 +2386,6 @@ bond_link_carrier_update(struct iface *iface, bool > > carrier) > > > > ? ? iface->up = carrier; > > ? ? iface->lacp_tx = 0; > > - ? ?iface->port->bond_compat_is_stale = true; > > ?} > > > > ?static void > > @@ -2452,11 +2444,6 @@ bond_run(struct bridge *br) > > ? ? ? ? ? ? ? ? port->bond_next_fake_iface_update = time_msec() + 1000; > > ? ? ? ? ? ? } > > ? ? ? ? } > > - > > - ? ? ? ?if (port->bond_compat_is_stale) { > > - ? ? ? ? ? ?port->bond_compat_is_stale = false; > > - ? ? ? ? ? ?port_update_bond_compat(port); > > - ? ? ? ?} > > ? ? } > > ?} > > > > @@ -3595,7 +3582,6 @@ bond_rebalance_port(struct port *port) > > ? ? ? ? ? ? } > > ? ? ? ? ? ? if (i < from->n_hashes) { > > ? ? ? ? ? ? ? ? bond_shift_load(from, to, i); > > - ? ? ? ? ? ? ? ?port->bond_compat_is_stale = true; > > > > ? ? ? ? ? ? ? ? /* If the result of the migration changed the relative > > order of > > ? ? ? ? ? ? ? ? ?* 'from' and 'to' swap them back to maintain invariants. */ > > @@ -4008,7 +3994,6 @@ bond_unixctl_migrate(struct unixctl_conn *conn, const > > char *args_, > > ? ? ofproto_revalidate(port->bridge->ofproto, entry->iface_tag); > > ? ? entry->iface_idx = iface->port_ifidx; > > ? ? entry->iface_tag = tag_create_random(); > > - ? ?port->bond_compat_is_stale = true; > > ? ? unixctl_command_reply(conn, 200, "migrated"); > > ?} > > > > @@ -4440,9 +4425,6 @@ port_destroy(struct port *port) > > ? ? ? ? struct port *del; > > ? ? ? ? int i; > > > > - ? ? ? ?proc_net_compat_update_vlan(port->name, NULL, 0); > > - ? ? ? ?proc_net_compat_update_bond(port->name, NULL); > > - > > ? ? ? ? for (i = 0; i < MAX_MIRRORS; i++) { > > ? ? ? ? ? ? struct mirror *m = br->mirrors[i]; > > ? ? ? ? ? ? if (m && m->out_port == port) { > > @@ -4545,12 +4527,8 @@ port_update_bonding(struct port *port) > > ? ? } > > ? ? if (port->n_ifaces < 2) { > > ? ? ? ? /* Not a bonded port. */ > > - ? ? ? ?if (port->bond_hash) { > > - ? ? ? ? ? ?free(port->bond_hash); > > - ? ? ? ? ? ?port->bond_hash = NULL; > > - ? ? ? ? ? ?port->bond_compat_is_stale = true; > > - ? ? ? ?} > > - > > + ? ? ? ?free(port->bond_hash); > > + ? ? ? ?port->bond_hash = NULL; > > ? ? ? ? port->bond_fake_iface = false; > > ? ? } else { > > ? ? ? ? size_t i; > > @@ -4574,7 +4552,6 @@ port_update_bonding(struct port *port) > > ? ? ? ? ? ? free(port->bond_hash); > > ? ? ? ? ? ? port->bond_hash = NULL; > > ? ? ? ? } > > - ? ? ? ?port->bond_compat_is_stale = true; > > ? ? ? ? port->bond_fake_iface = port->cfg->bond_fake_iface; > > > > ? ? ? ? if (!port->miimon) { > > @@ -4585,116 +4562,6 @@ port_update_bonding(struct port *port) > > ? ? ? ? } > > ? ? } > > ?} > > - > > -static void > > -port_update_bond_compat(struct port *port) > > -{ > > - ? ?struct compat_bond_hash compat_hashes[BOND_MASK + 1]; > > - ? ?struct compat_bond bond; > > - ? ?size_t i; > > - > > - ? ?if (port->n_ifaces < 2 || port->bond_mode != BM_SLB) { > > - ? ? ? ?proc_net_compat_update_bond(port->name, NULL); > > - ? ? ? ?return; > > - ? ?} > > - > > - ? ?bond.up = false; > > - ? ?bond.updelay = port->updelay; > > - ? ?bond.downdelay = port->downdelay; > > - > > - ? ?bond.n_hashes = 0; > > - ? ?bond.hashes = compat_hashes; > > - ? ?if (port->bond_hash) { > > - ? ? ? ?const struct bond_entry *e; > > - ? ? ? ?for (e = port->bond_hash; e <= &port->bond_hash[BOND_MASK]; e++) { > > - ? ? ? ? ? ?if (e->iface_idx >= 0 && e->iface_idx < port->n_ifaces) { > > - ? ? ? ? ? ? ? ?struct compat_bond_hash *cbh = > > &bond.hashes[bond.n_hashes++]; > > - ? ? ? ? ? ? ? ?cbh->hash = e - port->bond_hash; > > - ? ? ? ? ? ? ? ?cbh->netdev_name = port->ifaces[e->iface_idx]->name; > > - ? ? ? ? ? ?} > > - ? ? ? ?} > > - ? ?} > > - > > - ? ?bond.n_slaves = port->n_ifaces; > > - ? ?bond.slaves = xmalloc(port->n_ifaces * sizeof *bond.slaves); > > - ? ?for (i = 0; i < port->n_ifaces; i++) { > > - ? ? ? ?struct iface *iface = port->ifaces[i]; > > - ? ? ? ?struct compat_bond_slave *slave = &bond.slaves[i]; > > - ? ? ? ?slave->name = iface->name; > > - > > - ? ? ? ?/* We need to make the same determination as the Linux bonding > > - ? ? ? ? * code to determine whether a slave should be consider "up". > > - ? ? ? ? * The Linux function bond_miimon_inspect() supports four > > - ? ? ? ? * BOND_LINK_* states: > > - ? ? ? ? * > > - ? ? ? ? * ? ?- BOND_LINK_UP: carrier detected, updelay has passed. > > - ? ? ? ? * ? ?- BOND_LINK_FAIL: carrier lost, downdelay in progress. > > - ? ? ? ? * ? ?- BOND_LINK_DOWN: carrier lost, downdelay has passed. > > - ? ? ? ? * ? ?- BOND_LINK_BACK: carrier detected, updelay in progress. > > - ? ? ? ? * > > - ? ? ? ? * The function bond_info_show_slave() only considers BOND_LINK_UP > > - ? ? ? ? * to be "up" and anything else to be "down". > > - ? ? ? ? */ > > - ? ? ? ?slave->up = iface->enabled && iface->delay_expires == LLONG_MAX; > > - ? ? ? ?if (slave->up) { > > - ? ? ? ? ? ?bond.up = true; > > - ? ? ? ?} > > - ? ? ? ?netdev_get_etheraddr(iface->netdev, slave->mac); > > - ? ?} > > - > > - ? ?if (port->bond_fake_iface) { > > - ? ? ? ?struct netdev *bond_netdev; > > - > > - ? ? ? ?if (!netdev_open_default(port->name, &bond_netdev)) { > > - ? ? ? ? ? ?if (bond.up) { > > - ? ? ? ? ? ? ? ?netdev_turn_flags_on(bond_netdev, NETDEV_UP, true); > > - ? ? ? ? ? ?} else { > > - ? ? ? ? ? ? ? ?netdev_turn_flags_off(bond_netdev, NETDEV_UP, true); > > - ? ? ? ? ? ?} > > - ? ? ? ? ? ?netdev_close(bond_netdev); > > - ? ? ? ?} > > - ? ?} > > - > > - ? ?proc_net_compat_update_bond(port->name, &bond); > > - ? ?free(bond.slaves); > > -} > > - > > -static void > > -port_update_vlan_compat(struct port *port) > > -{ > > - ? ?struct bridge *br = port->bridge; > > - ? ?char *vlandev_name = NULL; > > - > > - ? ?if (port->vlan > 0) { > > - ? ? ? ?/* Figure out the name that the VLAN device should actually have, > > if it > > - ? ? ? ? * existed. ?This takes some work because the VLAN device would not > > - ? ? ? ? * have port->name in its name; rather, it would have the trunk > > port's > > - ? ? ? ? * name, and 'port' would be attached to a bridge that also had the > > - ? ? ? ? * VLAN device one of its ports. ?So we need to find a trunk port > > that > > - ? ? ? ? * includes port->vlan. > > - ? ? ? ? * > > - ? ? ? ? * There might be more than one candidate. ?This doesn't happen on > > - ? ? ? ? * XenServer, so if it happens we just pick the first choice in > > - ? ? ? ? * alphabetical order instead of creating multiple VLAN devices. */ > > - ? ? ? ?size_t i; > > - ? ? ? ?for (i = 0; i < br->n_ports; i++) { > > - ? ? ? ? ? ?struct port *p = br->ports[i]; > > - ? ? ? ? ? ?if (port_trunks_vlan(p, port->vlan) > > - ? ? ? ? ? ? ? ?&& p->n_ifaces > > - ? ? ? ? ? ? ? ?&& (!vlandev_name || strcmp(p->name, vlandev_name) <= 0)) > > - ? ? ? ? ? ?{ > > - ? ? ? ? ? ? ? ?uint8_t ea[ETH_ADDR_LEN]; > > - ? ? ? ? ? ? ? ?netdev_get_etheraddr(p->ifaces[0]->netdev, ea); > > - ? ? ? ? ? ? ? ?if (!eth_addr_is_multicast(ea) && > > - ? ? ? ? ? ? ? ? ? ?!eth_addr_is_reserved(ea) && > > - ? ? ? ? ? ? ? ? ? ?!eth_addr_is_zero(ea)) { > > - ? ? ? ? ? ? ? ? ? ?vlandev_name = p->name; > > - ? ? ? ? ? ? ? ?} > > - ? ? ? ? ? ?} > > - ? ? ? ?} > > - ? ?} > > - ? ?proc_net_compat_update_vlan(port->name, vlandev_name, port->vlan); > > -} > > > > ?/* Interface functions. */ > > > > diff --git a/vswitchd/ovs-vswitchd.8.in b/vswitchd/ovs-vswitchd.8.in > > index 163ad20..f0badf0 100644 > > --- a/vswitchd/ovs-vswitchd.8.in > > +++ b/vswitchd/ovs-vswitchd.8.in > > @@ -93,15 +93,6 @@ only allow privileged users, such as the superuser, to > > use it. > > ?\fBovs\-vswitchd\fR emits a log message if \fBmlockall()\fR is > > ?unavailable or unsuccessful. > > ?. > > -.IP "\fB\-\-fake\-proc\-net\fR" > > -Causes \fBovs\-vswitchd\fR to simulate some files in \fB/proc/net/vlan\fR > > -and \fB/proc/net/bonding\fR that some legacy software expects to > > -exist. ?This option should only be used if such legacy software is > > -actually in use. ?It requires the \fBbrcompat_mod.ko\fR kernel module > > -to be loaded. > > -.IP > > -On non-Linux hosts, this option is accepted but has no effect. > > -. > > ?.ds DD \ > > ?\fBovs\-vswitchd\fR detaches only after it has connected to the \ > > ?database, retrieved the initial configuration, and set up that \ > > diff --git a/vswitchd/ovs-vswitchd.c b/vswitchd/ovs-vswitchd.c > > index 2181e82..1303e08 100644 > > --- a/vswitchd/ovs-vswitchd.c > > +++ b/vswitchd/ovs-vswitchd.c > > @@ -36,7 +36,6 @@ > > ?#include "netdev.h" > > ?#include "ovsdb-idl.h" > > ?#include "poll-loop.h" > > -#include "proc-net-compat.h" > > ?#include "process.h" > > ?#include "signals.h" > > ?#include "stream-ssl.h" > > @@ -117,7 +116,6 @@ parse_options(int argc, char *argv[]) > > ? ? enum { > > ? ? ? ? OPT_PEER_CA_CERT = UCHAR_MAX + 1, > > ? ? ? ? OPT_MLOCKALL, > > - ? ? ? ?OPT_FAKE_PROC_NET, > > ? ? ? ? VLOG_OPTION_ENUMS, > > ? ? ? ? LEAK_CHECKER_OPTION_ENUMS, > > ? ? ? ? OPT_BOOTSTRAP_CA_CERT, > > @@ -128,7 +126,6 @@ parse_options(int argc, char *argv[]) > > ? ? ? ? {"help", ? ? ? ?no_argument, 0, 'h'}, > > ? ? ? ? {"version", ? ? no_argument, 0, 'V'}, > > ? ? ? ? {"mlockall", ? ?no_argument, 0, OPT_MLOCKALL}, > > - ? ? ? ?{"fake-proc-net", no_argument, 0, OPT_FAKE_PROC_NET}, > > ? ? ? ? DAEMON_LONG_OPTIONS, > > ? ? ? ? VLOG_LONG_OPTIONS, > > ? ? ? ? LEAK_CHECKER_LONG_OPTIONS, > > @@ -141,7 +138,6 @@ parse_options(int argc, char *argv[]) > > ? ? ? ? {0, 0, 0, 0}, > > ? ? }; > > ? ? char *short_options = long_options_to_short_options(long_options); > > - ? ?int error; > > > > ? ? for (;;) { > > ? ? ? ? int c; > > @@ -170,14 +166,6 @@ parse_options(int argc, char *argv[]) > > ?#endif > > ? ? ? ? ? ? break; > > > > - ? ? ? ?case OPT_FAKE_PROC_NET: > > - ? ? ? ? ? ?error = proc_net_compat_init(); > > - ? ? ? ? ? ?if (error) { > > - ? ? ? ? ? ? ? ?ovs_fatal(error, "failed to initialize /proc/net " > > - ? ? ? ? ? ? ? ? ? ? ? ? ?"compatibility"); > > - ? ? ? ? ? ?} > > - ? ? ? ? ? ?break; > > - > > ? ? ? ? VLOG_OPTION_HANDLERS > > ? ? ? ? DAEMON_OPTION_HANDLERS > > ? ? ? ? LEAK_CHECKER_OPTION_HANDLERS > > @@ -228,9 +216,7 @@ usage(void) > > ? ? stream_usage("DATABASE", true, false, true); > > ? ? daemon_usage(); > > ? ? vlog_usage(); > > - ? ?printf("\nLegacy compatibility options:\n" > > - ? ? ? ? ? " --fake-proc-net ? ? ? ? ?simulate some files in /proc/net\n" > > - ? ? ? ? ? "\nOther options:\n" > > + ? ?printf("\nOther options:\n" > > ? ? ? ? ? ?" ?-h, --help ? ? ? ? ? ? ?display this help message\n" > > ? ? ? ? ? ?" ?-V, --version ? ? ? ? ? display version information\n"); > > ? ? leak_checker_usage(); > > diff --git a/vswitchd/proc-net-compat.c b/vswitchd/proc-net-compat.c > > deleted file mode 100644 > > index 3b7596a..0000000 > > --- a/vswitchd/proc-net-compat.c > > +++ /dev/null > > @@ -1,371 +0,0 @@ > > -/* Copyright (c) 2009, 2010, 2011 Nicira Networks > > - * > > - * Licensed under the Apache License, Version 2.0 (the "License"); > > - * you may not use this file except in compliance with the License. > > - * You may obtain a copy of the License at: > > - * > > - * ? ? http://www.apache.org/licenses/LICENSE-2.0 > > - * > > - * Unless required by applicable law or agreed to in writing, software > > - * distributed under the License is distributed on an "AS IS" BASIS, > > - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > > - * See the License for the specific language governing permissions and > > - * limitations under the License. > > - */ > > - > > -#include <config.h> > > -#include "proc-net-compat.h" > > - > > -#ifdef HAVE_NETLINK > > -#include <assert.h> > > -#include <dirent.h> > > -#include <errno.h> > > -#include <inttypes.h> > > -#include <string.h> > > -#include "dynamic-string.h" > > -#include "hash.h" > > -#include "netlink-protocol.h" > > -#include "netlink-socket.h" > > -#include "netlink.h" > > -#include "ofpbuf.h" > > -#include "openvswitch/brcompat-netlink.h" > > -#include "hmap.h" > > -#include "shash.h" > > -#include "svec.h" > > -#include "vlog.h" > > - > > -VLOG_DEFINE_THIS_MODULE(proc_net_compat); > > - > > -/* Netlink socket to bridge compatibility kernel module. */ > > -static struct nl_sock *brc_sock; > > - > > -/* The Generic Netlink family number used for bridge compatibility. */ > > -static int brc_family = 0; > > - > > -/* Rate limiting for log messages. */ > > -static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 5); > > - > > -static void flush_dir(const char *dir); > > -static int set_proc_file(const char *dir, const char *file, const char > > *data); > > - > > -/* Initializes the /proc/net compatibility layer. ?Returns 0 if successful, > > - * otherwise a positive errno value. */ > > -int > > -proc_net_compat_init(void) > > -{ > > - ? ?if (!brc_sock) { > > - ? ? ? ?int retval = nl_lookup_genl_family(BRC_GENL_FAMILY_NAME, > > &brc_family); > > - ? ? ? ?if (retval) { > > - ? ? ? ? ? ?return retval; > > - ? ? ? ?} > > - > > - ? ? ? ?retval = nl_sock_create(NETLINK_GENERIC, &brc_sock); > > - ? ? ? ?if (retval) { > > - ? ? ? ? ? ?return retval; > > - ? ? ? ?} > > - > > - ? ? ? ?flush_dir("/proc/net/vlan"); > > - ? ? ? ?flush_dir("/proc/net/bonding"); > > - ? ?} > > - ? ?return 0; > > -} > > - > > -static int > > -set_proc_file(const char *dir, const char *file, const char *data) > > -{ > > - ? ?struct ofpbuf request; > > - ? ?int retval; > > - > > - ? ?ofpbuf_init(&request, 0); > > - ? ?nl_msg_put_genlmsghdr(&request, 1024, brc_family, NLM_F_REQUEST, > > - ? ? ? ? ? ? ? ? ? ? ? ? ?BRC_GENL_C_SET_PROC, 1); > > - ? ?nl_msg_put_string(&request, BRC_GENL_A_PROC_DIR, dir); > > - ? ?nl_msg_put_string(&request, BRC_GENL_A_PROC_NAME, file); > > - ? ?if (data) { > > - ? ? ? ?nl_msg_put_string(&request, BRC_GENL_A_PROC_DATA, data); > > - ? ?} > > - > > - ? ?retval = nl_sock_transact(brc_sock, &request, NULL); > > - ? ?ofpbuf_uninit(&request); > > - ? ?if (retval) { > > - ? ? ? ?VLOG_WARN_RL(&rl, "failed to %s /proc/%s/%s (%s)", > > - ? ? ? ? ? ? ? ? ? ? data ? "update" : "remove", dir, file, > > strerror(retval)); > > - ? ?} > > - ? ?return retval; > > -} > > - > > -static void > > -flush_dir(const char *dir) > > -{ > > - ? ?const char *subdir; > > - ? ?struct dirent *de; > > - ? ?DIR *stream; > > - > > - ? ?assert(!memcmp(dir, "/proc/", 6)); > > - ? ?subdir = dir + 6; > > - > > - ? ?stream = opendir(dir); > > - ? ?if (!stream) { > > - ? ? ? ?if (errno != ENOENT) { > > - ? ? ? ? ? ?VLOG_WARN_RL(&rl, "%s: open failed (%s)", dir, > > strerror(errno)); > > - ? ? ? ?} > > - ? ? ? ?return; > > - ? ?} > > - > > - ? ?while ((de = readdir(stream)) != NULL) { > > - ? ? ? ?if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) { > > - ? ? ? ? ? ?set_proc_file(subdir, de->d_name, NULL); > > - ? ? ? ?} > > - ? ?} > > - ? ?closedir(stream); > > -} > > - > > -/* If 'bond' is nonnull, creates a file in /proc/net/bonding for a bond > > with > > - * the given 'name' and the details in 'bond'. ?If 'bond' is null, deletes > > - * the /proc/net/bonding file with the given 'name'. > > - * > > - * This function has no effect unless proc_net_compat_init() has been > > - * called. */ > > -void > > -proc_net_compat_update_bond(const char *name, const struct compat_bond > > *bond) > > -{ > > - ? ?struct ds ds; > > - ? ?int i; > > - > > - ? ?if (!brc_sock) { > > - ? ? ? ?return; > > - ? ?} > > - > > - ? ?if (!bond) { > > - ? ? ? ?set_proc_file("net/bonding", name, NULL); > > - ? ? ? ?return; > > - ? ?} > > - > > - ? ?ds_init(&ds); > > - ? ?ds_put_format( > > - ? ? ? ?&ds, > > - ? ? ? ?"Ethernet Channel Bonding Driver: ovs-vswitchd " > > - ? ? ? ?VERSION BUILDNR" ("__DATE__" "__TIME__")\n" > > - ? ? ? ?"Bonding Mode: source load balancing\n" > > - ? ? ? ?"Primary Slave: None\n" > > - ? ? ? ?"Currently Active Slave: None\n" > > - ? ? ? ?"MII Status: %s\n" > > - ? ? ? ?"MII Polling Interval (ms): 100\n" > > - ? ? ? ?"Up Delay (ms): %d\n" > > - ? ? ? ?"Down Delay (ms): %d\n" > > - ? ? ? ?"\n" > > - ? ? ? ?"Source load balancing info:\n", > > - ? ? ? ?bond->up ? "up" : "down", bond->updelay, bond->downdelay); > > - > > - ? ?for (i = 0; i < bond->n_hashes; i++) { > > - ? ? ? ?const struct compat_bond_hash *cbh = &bond->hashes[i]; > > - ? ? ? ?ds_put_format(&ds, " [%03d] = %s\n", cbh->hash, cbh->netdev_name); > > - ? ?} > > - > > - ? ?for (i = 0; i < bond->n_slaves; i++) { > > - ? ? ? ?const struct compat_bond_slave *slave = &bond->slaves[i]; > > - ? ? ? ?ds_put_format( > > - ? ? ? ? ? ?&ds, > > - ? ? ? ? ? ?"\n" > > - ? ? ? ? ? ?"Slave Interface: %s\n" > > - ? ? ? ? ? ?"MII Status: %s\n" > > - ? ? ? ? ? ?"Link Failure Count: 0\n" > > - ? ? ? ? ? ?"Permanent HW addr: "ETH_ADDR_FMT"\n", > > - ? ? ? ? ? ?slave->name, slave->up ? "up" : "down", > > - ? ? ? ? ? ?ETH_ADDR_ARGS(slave->mac)); > > - ? ?} > > - ? ?set_proc_file("net/bonding", name, ds_cstr(&ds)); > > - ? ?ds_destroy(&ds); > > -} > > - > > -/* /proc/net/vlan compatibility. > > - * > > - * This is much more complex than I expected it to be. */ > > - > > -struct compat_vlan { > > - ? ?/* Hash key. */ > > - ? ?struct hmap_node trunk_node; /* Hash map node. */ > > - ? ?char *trunk_dev; ? ? ? ? ? ? /* Name of trunk network device. */ > > - ? ?int vid; ? ? ? ? ? ? ? ? ? ? /* VLAN number. */ > > - > > - ? ?/* Auxiliary data. */ > > - ? ?char *vlan_dev; ? ? ? ? ? ? /* sprintf("%s.%d", trunk_dev, vid); */ > > - ? ?struct svec tagged_devs; ? ?/* Name of tagged network device(s). */ > > -}; > > - > > -/* Current set of VLAN devices, indexed two different ways. */ > > -static struct hmap vlans_by_trunk = HMAP_INITIALIZER(&vlans_by_trunk); > > -static struct shash vlans_by_tagged = SHASH_INITIALIZER(&vlans_by_tagged); > > - > > -static bool remove_tagged_dev(struct shash_node *, const char *tagged_dev); > > -static void update_vlan_config(void); > > -static void set_vlan_proc_file(const struct compat_vlan *); > > -static uint32_t hash_vlan(const char *trunk_dev, uint32_t vid); > > - > > -/* Updates the /proc/net/vlan compatibility layer's idea of what trunk > > device > > - * and VLAN the given 'tagged_dev' is associated with. ?If 'tagged_dev' > > has an > > - * implicit VLAN tag, then 'trunk_dev' should be the name of a network > > device > > - * on the same bridge that trunks that VLAN, and 'vid' should be the VLAN > > tag > > - * number. ?If 'tagged_dev' does not have an implicit VLAN tag, then > > - * 'trunk_dev' should be NULL and 'vid' should be -1. > > - * > > - * This function has no effect unless proc_net_compat_init() has been > > - * called. */ > > -void > > -proc_net_compat_update_vlan(const char *tagged_dev, const char *trunk_dev, > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ?int vid) > > -{ > > - ? ?struct compat_vlan *vlan; > > - ? ?struct shash_node *node; > > - > > - ? ?if (!brc_sock) { > > - ? ? ? ?return; > > - ? ?} > > - > > - ? ?/* Find the compat_vlan that we currently have for 'tagged_dev' (if > > - ? ? * any). */ > > - ? ?node = shash_find(&vlans_by_tagged, tagged_dev); > > - ? ?vlan = node ? node->data : NULL; > > - ? ?if (vid <= 0 || !trunk_dev) { > > - ? ? ? ?if (vlan) { > > - ? ? ? ? ? ?if (remove_tagged_dev(node, tagged_dev)) { > > - ? ? ? ? ? ? ? ?update_vlan_config(); > > - ? ? ? ? ? ?} > > - ? ? ? ?} > > - ? ?} else { > > - ? ? ? ?if (vlan) { > > - ? ? ? ? ? ?if (!strcmp(trunk_dev, vlan->trunk_dev) && vid == vlan->vid) { > > - ? ? ? ? ? ? ? ?/* No change. */ > > - ? ? ? ? ? ? ? ?return; > > - ? ? ? ? ? ?} else { > > - ? ? ? ? ? ? ? ?/* 'tagged_dev' is attached to the wrong compat_vlan. > > ?Start > > - ? ? ? ? ? ? ? ? * by removing it from that one. */ > > - ? ? ? ? ? ? ? ?remove_tagged_dev(node, tagged_dev); > > - ? ? ? ? ? ? ? ?node = NULL; > > - ? ? ? ? ? ? ? ?vlan = NULL; > > - ? ? ? ? ? ?} > > - ? ? ? ?} > > - > > - ? ? ? ?/* 'tagged_dev' is not attached to any compat_vlan. ?Find the > > - ? ? ? ? * compat_vlan corresponding to (trunk_dev,vid) to attach it to, or > > - ? ? ? ? * create a new compat_vlan if none exists for (trunk_dev,vid). */ > > - ? ? ? ?HMAP_FOR_EACH_WITH_HASH (vlan, trunk_node, hash_vlan(trunk_dev, > > vid), > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &vlans_by_trunk) { > > - ? ? ? ? ? ?if (!strcmp(trunk_dev, vlan->trunk_dev) && vid == vlan->vid) { > > - ? ? ? ? ? ? ? ?break; > > - ? ? ? ? ? ?} > > - ? ? ? ?} > > - ? ? ? ?if (!vlan) { > > - ? ? ? ? ? ?/* Create a new compat_vlan for (trunk_dev,vid). */ > > - ? ? ? ? ? ?vlan = xzalloc(sizeof *vlan); > > - ? ? ? ? ? ?vlan->trunk_dev = xstrdup(trunk_dev); > > - ? ? ? ? ? ?vlan->vid = vid; > > - ? ? ? ? ? ?vlan->vlan_dev = xasprintf("%s.%d", trunk_dev, vid); > > - ? ? ? ? ? ?svec_init(&vlan->tagged_devs); > > - ? ? ? ? ? ?hmap_insert(&vlans_by_trunk, &vlan->trunk_node, > > - ? ? ? ? ? ? ? ? ? ? ? ?hash_vlan(trunk_dev, vid)); > > - ? ? ? ? ? ?set_vlan_proc_file(vlan); > > - ? ? ? ?} > > - > > - ? ? ? ?/* Attach 'tagged_dev' to 'vlan'. */ > > - ? ? ? ?svec_add(&vlan->tagged_devs, tagged_dev); > > - ? ? ? ?shash_add(&vlans_by_tagged, tagged_dev, vlan); > > - ? ? ? ?svec_sort(&vlan->tagged_devs); > > - ? ? ? ?update_vlan_config(); > > - ? ?} > > -} > > - > > -/* Remove 'tagged_dev' from the compat_vlan in 'node'. ?If that causes the > > - * compat_vlan to have no tagged_devs left, destroy the compat_vlan too. */ > > -static bool > > -remove_tagged_dev(struct shash_node *node, const char *tagged_dev) > > -{ > > - ? ?struct compat_vlan *vlan = node->data; > > - > > - ? ?svec_del(&vlan->tagged_devs, tagged_dev); > > - ? ?shash_delete(&vlans_by_tagged, node); > > - ? ?if (!vlan->tagged_devs.n) { > > - ? ? ? ?set_proc_file("net/vlan", vlan->vlan_dev, NULL); > > - > > - ? ? ? ?hmap_remove(&vlans_by_trunk, &vlan->trunk_node); > > - ? ? ? ?svec_destroy(&vlan->tagged_devs); > > - ? ? ? ?free(vlan->trunk_dev); > > - ? ? ? ?free(vlan->vlan_dev); > > - ? ? ? ?free(vlan); > > - ? ? ? ?return true; > > - ? ?} > > - ? ?return false; > > -} > > - > > -/* Returns a hash value for (trunk_dev,vid). */ > > -static uint32_t > > -hash_vlan(const char *trunk_dev, uint32_t vid) > > -{ > > - ? ?return hash_int(vid, hash_string(trunk_dev, 0)); > > -} > > - > > -/* Update /proc/net/vlan/<vlan_dev> for 'vlan'. */ > > -static void > > -set_vlan_proc_file(const struct compat_vlan *vlan) > > -{ > > - ? ?struct ds ds; > > - > > - ? ?ds_init(&ds); > > - ? ?ds_put_format( > > - ? ? ? ?&ds, > > - ? ? ? ?"%s ?VID: %d\t REORDER_HDR: 1 ?dev->priv_flags: 81\n" > > - ? ? ? ?" ? ? ? ? total frames received ? ? ? ? ? ?0\n" > > - ? ? ? ?" ? ? ? ? ?total bytes received ? ? ? ? ? ?0\n" > > - ? ? ? ?" ? ? ?Broadcast/Multicast Rcvd ? ? ? ? ? ?0\n" > > - ? ? ? ?"\n" > > - ? ? ? ?" ? ? ?total frames transmitted ? ? ? ? ? ?0\n" > > - ? ? ? ?" ? ? ? total bytes transmitted ? ? ? ? ? ?0\n" > > - ? ? ? ?" ? ? ? ? ? ?total headroom inc ? ? ? ? ? ?0\n" > > - ? ? ? ?" ? ? ? ? ? total encap on xmit ? ? ? ? ? ?0\n" > > - ? ? ? ?"Device: %s\n" > > - ? ? ? ?"INGRESS priority mappings: 0:0 ?1:0 ?2:0 ?3:0 ?4:0 ?5:0 ?6:0 > > 7:0\n" > > - ? ? ? ?"EGRESSS priority Mappings: \n", > > - ? ? ? ?vlan->vlan_dev, vlan->vid, vlan->trunk_dev); > > - ? ?set_proc_file("net/vlan", vlan->vlan_dev, ds_cstr(&ds)); > > - ? ?ds_destroy(&ds); > > -} > > - > > -/* Update /proc/net/vlan/config. */ > > -static void > > -update_vlan_config(void) > > -{ > > - ? ?struct compat_vlan *vlan; > > - ? ?struct ds ds; > > - > > - ? ?ds_init(&ds); > > - ? ?ds_put_cstr(&ds, "VLAN Dev name ? ? | VLAN ID\n" > > - ? ? ? ? ? ? ? ?"Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD\n"); > > - ? ?HMAP_FOR_EACH (vlan, trunk_node, &vlans_by_trunk) { > > - ? ? ? ?ds_put_format(&ds, "%-15s| %d ?| %s\n", > > - ? ? ? ? ? ? ? ? ? ? ?vlan->vlan_dev, vlan->vid, vlan->trunk_dev); > > - ? ?} > > - ? ?set_proc_file("net/vlan", "config", ds_cstr(&ds)); > > - ? ?ds_destroy(&ds); > > -} > > -#else ?/* !HAVE_NETLINK */ > > -#include "compiler.h" > > - > > -int > > -proc_net_compat_init(void) > > -{ > > - ? ?return 0; > > -} > > - > > -void > > -proc_net_compat_update_bond(const char *name OVS_UNUSED, > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ?const struct compat_bond *bond OVS_UNUSED) > > -{ > > -} > > - > > -void > > -proc_net_compat_update_vlan(const char *tagged_dev OVS_UNUSED, > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ?const char *trunk_dev OVS_UNUSED, > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ?int vid OVS_UNUSED) > > -{ > > -} > > -#endif ?/* !HAVE_NETLINK */ > > diff --git a/vswitchd/proc-net-compat.h b/vswitchd/proc-net-compat.h > > deleted file mode 100644 > > index 82d550f..0000000 > > --- a/vswitchd/proc-net-compat.h > > +++ /dev/null > > @@ -1,49 +0,0 @@ > > -/* Copyright (c) 2009 Nicira Networks > > - * > > - * Licensed under the Apache License, Version 2.0 (the "License"); > > - * you may not use this file except in compliance with the License. > > - * You may obtain a copy of the License at: > > - * > > - * ? ? http://www.apache.org/licenses/LICENSE-2.0 > > - * > > - * Unless required by applicable law or agreed to in writing, software > > - * distributed under the License is distributed on an "AS IS" BASIS, > > - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > > - * See the License for the specific language governing permissions and > > - * limitations under the License. > > - */ > > - > > -#ifndef VSWITCHD_PROC_NET_COMPAT_H > > -#define VSWITCHD_PROC_NET_COMPAT_H 1 > > - > > -#include "packets.h" > > - > > -struct compat_bond { > > - ? ?bool up; > > - ? ?int updelay; > > - ? ?int downdelay; > > - > > - ? ?int n_hashes; > > - ? ?struct compat_bond_hash *hashes; > > - > > - ? ?int n_slaves; > > - ? ?struct compat_bond_slave *slaves; > > -}; > > - > > -struct compat_bond_hash { > > - ? ?int hash; > > - ? ?const char *netdev_name; > > -}; > > - > > -struct compat_bond_slave { > > - ? ?const char *name; > > - ? ?bool up; > > - ? ?uint8_t mac[ETH_ADDR_LEN]; > > -}; > > - > > -int proc_net_compat_init(void); > > -void proc_net_compat_update_bond(const char *name, const struct > > compat_bond *); > > -void proc_net_compat_update_vlan(const char *dev, const char *vlandev, > > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int vlan); > > - > > -#endif /* vswitchd/proc-net-compat.h */ > > -- > > 1.7.1 > > > > > > _______________________________________________ > > dev mailing list > > [email protected] > > http://openvswitch.org/mailman/listinfo/dev_openvswitch.org > > _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
