git://git.onelab.eu
/
sliver-openvswitch.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
tests: Add 5-second timeout to ovs-vsctl tests.
[sliver-openvswitch.git]
/
datapath
/
brcompat.c
diff --git
a/datapath/brcompat.c
b/datapath/brcompat.c
index
dfcc768
..
2113eae
100644
(file)
--- a/
datapath/brcompat.c
+++ b/
datapath/brcompat.c
@@
-6,13
+6,13
@@
* kernel, by Linus Torvalds and others.
*/
* kernel, by Linus Torvalds and others.
*/
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
#include <linux/kernel.h>
#include <asm/uaccess.h>
#include <linux/completion.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>
#include <linux/completion.h>
-#include <linux/delay.h>
#include <linux/etherdevice.h>
#include <linux/if_bridge.h>
#include <linux/etherdevice.h>
#include <linux/if_bridge.h>
-#include <linux/rculist.h>
#include <linux/netdevice.h>
#include <linux/rtnetlink.h>
#include <net/genetlink.h>
#include <linux/netdevice.h>
#include <linux/rtnetlink.h>
#include <net/genetlink.h>
@@
-21,7
+21,6
@@
#include "openvswitch/brcompat-netlink.h"
#include "brc_procfs.h"
#include "datapath.h"
#include "openvswitch/brcompat-netlink.h"
#include "brc_procfs.h"
#include "datapath.h"
-#include "dp_dev.h"
static struct genl_family brc_genl_family;
static struct genl_multicast_group brc_mc_group;
static struct genl_family brc_genl_family;
static struct genl_multicast_group brc_mc_group;
@@
-45,8
+44,8
@@
static u32 brc_seq; /* Sequence number for current op. */
static struct sk_buff *brc_send_command(struct sk_buff *, struct nlattr **attrs);
static int brc_send_simple_command(struct sk_buff *);
static struct sk_buff *brc_send_command(struct sk_buff *, struct nlattr **attrs);
static int brc_send_simple_command(struct sk_buff *);
-static struct sk_buff *
-
brc_make_request(int op, const char *bridge,
const char *port)
+static struct sk_buff *
brc_make_request(int op, const char *bridge,
+
const char *port)
{
struct sk_buff *skb = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
if (!skb)
{
struct sk_buff *skb = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
if (!skb)
@@
-85,6
+84,9
@@
static int brc_add_del_bridge(char __user *uname, int add)
struct sk_buff *request;
char name[IFNAMSIZ];
struct sk_buff *request;
char name[IFNAMSIZ];
+ if (!capable(CAP_NET_ADMIN))
+ return -EPERM;
+
if (copy_from_user(name, uname, IFNAMSIZ))
return -EFAULT;
if (copy_from_user(name, uname, IFNAMSIZ))
return -EFAULT;
@@
-149,8
+151,7
@@
static int brc_get_bridges(int __user *uindices, int n)
}
/* Legacy deviceless bridge ioctl's. Called with br_ioctl_mutex. */
}
/* Legacy deviceless bridge ioctl's. Called with br_ioctl_mutex. */
-static int
-old_deviceless(void __user *uarg)
+static int old_deviceless(void __user *uarg)
{
unsigned long args[3];
{
unsigned long args[3];
@@
-192,13
+193,15
@@
brc_ioctl_deviceless_stub(struct net *net, unsigned int cmd, void __user *uarg)
return -EOPNOTSUPP;
}
return -EOPNOTSUPP;
}
-static int
-brc_add_del_port(struct net_device *dev, int port_ifindex, int add)
+static int brc_add_del_port(struct net_device *dev, int port_ifindex, int add)
{
struct sk_buff *request;
struct net_device *port;
int err;
{
struct sk_buff *request;
struct net_device *port;
int err;
+ if (!capable(CAP_NET_ADMIN))
+ return -EPERM;
+
port = __dev_get_by_index(&init_net, port_ifindex);
if (!port)
return -EINVAL;
port = __dev_get_by_index(&init_net, port_ifindex);
if (!port)
return -EINVAL;
@@
-217,8
+220,8
@@
brc_add_del_port(struct net_device *dev, int port_ifindex, int add)
return err;
}
return err;
}
-static int
-
brc_get_bridge_info(struct net_device *dev,
struct __bridge_info __user *ub)
+static int
brc_get_bridge_info(struct net_device *dev,
+
struct __bridge_info __user *ub)
{
struct __bridge_info b;
u64 id = 0;
{
struct __bridge_info b;
u64 id = 0;
@@
-237,8
+240,8
@@
brc_get_bridge_info(struct net_device *dev, struct __bridge_info __user *ub)
return 0;
}
return 0;
}
-static int
-
brc_get_port_list(struct net_device *dev, int __user *uindices,
int num)
+static int
brc_get_port_list(struct net_device *dev, int __user *uindices,
+
int num)
{
int retval;
{
int retval;
@@
-257,7
+260,7
@@
brc_get_port_list(struct net_device *dev, int __user *uindices, int num)
* (limited to a page for sanity)
* offset -- number of records to skip
*/
* (limited to a page for sanity)
* offset -- number of records to skip
*/
-static int brc_get_fdb_entries(struct net_device *dev, void __user *userbuf,
+static int brc_get_fdb_entries(struct net_device *dev, void __user *userbuf,
unsigned long maxnum, unsigned long offset)
{
struct nlattr *attrs[BRC_GENL_A_MAX + 1];
unsigned long maxnum, unsigned long offset)
{
struct nlattr *attrs[BRC_GENL_A_MAX + 1];
@@
-309,8
+312,7
@@
nla_put_failure:
}
/* Legacy ioctl's through SIOCDEVPRIVATE. Called with rtnl_lock. */
}
/* Legacy ioctl's through SIOCDEVPRIVATE. Called with rtnl_lock. */
-static int
-old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{
unsigned long args[4];
{
unsigned long args[4];
@@
-338,8
+340,7
@@
old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
}
/* Called with the rtnl_lock. */
}
/* Called with the rtnl_lock. */
-static int
-brc_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+static int brc_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{
int err;
{
int err;
@@
-377,7
+378,7
@@
static int brc_genl_query(struct sk_buff *skb, struct genl_info *info)
void *data;
ans_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
void *data;
ans_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
- if (!ans_skb)
+ if (!ans_skb)
return -ENOMEM;
data = genlmsg_put_reply(ans_skb, info, &brc_genl_family,
return -ENOMEM;
data = genlmsg_put_reply(ans_skb, info, &brc_genl_family,
@@
-416,8
+417,7
@@
static struct nla_policy brc_genl_policy[BRC_GENL_A_MAX + 1] = {
[BRC_GENL_A_FDB_DATA] = { .type = NLA_UNSPEC },
};
[BRC_GENL_A_FDB_DATA] = { .type = NLA_UNSPEC },
};
-static int
-brc_genl_dp_result(struct sk_buff *skb, struct genl_info *info)
+static int brc_genl_dp_result(struct sk_buff *skb, struct genl_info *info)
{
unsigned long int flags;
int err;
{
unsigned long int flags;
int err;
@@
-433,8
+433,7
@@
brc_genl_dp_result(struct sk_buff *skb, struct genl_info *info)
if (brc_seq == info->snd_seq) {
brc_seq++;
if (brc_seq == info->snd_seq) {
brc_seq++;
- if (brc_reply)
- kfree_skb(brc_reply);
+ kfree_skb(brc_reply);
brc_reply = skb;
complete(&brc_done);
brc_reply = skb;
complete(&brc_done);
@@
-464,7
+463,8
@@
static struct genl_ops brc_genl_ops_set_proc = {
.dumpit = NULL
};
.dumpit = NULL
};
-static struct sk_buff *brc_send_command(struct sk_buff *request, struct nlattr **attrs)
+static struct sk_buff *brc_send_command(struct sk_buff *request,
+ struct nlattr **attrs)
{
unsigned long int flags;
struct sk_buff *reply;
{
unsigned long int flags;
struct sk_buff *reply;
@@
-488,8
+488,10
@@
static struct sk_buff *brc_send_command(struct sk_buff *request, struct nlattr *
/* Wait for reply. */
error = -ETIMEDOUT;
/* Wait for reply. */
error = -ETIMEDOUT;
- if (!wait_for_completion_timeout(&brc_done, BRC_TIMEOUT))
+ if (!wait_for_completion_timeout(&brc_done, BRC_TIMEOUT)) {
+ pr_warn("timed out waiting for userspace\n");
goto error;
goto error;
+ }
/* Grab reply. */
spin_lock_irqsave(&brc_lock, flags);
/* Grab reply. */
spin_lock_irqsave(&brc_lock, flags);
@@
-512,8
+514,7
@@
error:
return ERR_PTR(error);
}
return ERR_PTR(error);
}
-static int
-__init brc_init(void)
+static int __init brc_init(void)
{
int err;
{
int err;
@@
-537,15
+538,15
@@
__init brc_init(void)
goto error;
err = genl_register_ops(&brc_genl_family, &brc_genl_ops_query_dp);
goto error;
err = genl_register_ops(&brc_genl_family, &brc_genl_ops_query_dp);
- if (err != 0)
+ if (err != 0)
goto err_unregister;
err = genl_register_ops(&brc_genl_family, &brc_genl_ops_dp_result);
goto err_unregister;
err = genl_register_ops(&brc_genl_family, &brc_genl_ops_dp_result);
- if (err != 0)
+ if (err != 0)
goto err_unregister;
err = genl_register_ops(&brc_genl_family, &brc_genl_ops_set_proc);
goto err_unregister;
err = genl_register_ops(&brc_genl_family, &brc_genl_ops_set_proc);
- if (err != 0)
+ if (err != 0)
goto err_unregister;
strcpy(brc_mc_group.name, "brcompat");
goto err_unregister;
strcpy(brc_mc_group.name, "brcompat");
@@
-558,12
+559,11
@@
__init brc_init(void)
err_unregister:
genl_unregister_family(&brc_genl_family);
error:
err_unregister:
genl_unregister_family(&brc_genl_family);
error:
- pr
intk(KERN_EMERG "brcompat: failed to install!
");
+ pr
_emerg("failed to install!\n
");
return err;
}
return err;
}
-static void
-brc_cleanup(void)
+static void brc_cleanup(void)
{
/* Unregister ioctl hooks */
dp_ioctl_hook = NULL;
{
/* Unregister ioctl hooks */
dp_ioctl_hook = NULL;