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

Ethan Jackson ethan at nicira.com
Fri Feb 11 21:59:27 UTC 2011


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