[ovs-dev] [PATCH 2/2] Remove /proc/net compatibility support.

Ben Pfaff blp at nicira.com
Fri Feb 11 22:07:59 UTC 2011


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 <blp at nicira.com> 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 <blp at nicira.com>
> > ---
> > ?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
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
> >




More information about the dev mailing list