X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fbrcompat.c;h=15cec9c912d467a807ab27c98d52dfdcb0bc9c9f;hb=23cad98c869ef5b7682f68c41db6403c1e855f5e;hp=f68b698c47b4d8d95228a1fe42293a9585910ff2;hpb=d295e8e97acae13552a5b220d3fbcff8201064a2;p=openvswitch diff --git a/datapath/brcompat.c b/datapath/brcompat.c index f68b698c..15cec9c9 100644 --- a/datapath/brcompat.c +++ b/datapath/brcompat.c @@ -1,11 +1,13 @@ /* - * Copyright (c) 2009 Nicira Networks. + * 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. */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + #include #include #include @@ -15,7 +17,6 @@ #include #include -#include "compat.h" #include "openvswitch/brcompat-netlink.h" #include "brc_procfs.h" #include "datapath.h" @@ -82,6 +83,9 @@ static int brc_add_del_bridge(char __user *uname, int add) struct sk_buff *request; char name[IFNAMSIZ]; + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + if (copy_from_user(name, uname, IFNAMSIZ)) return -EFAULT; @@ -194,6 +198,9 @@ static int brc_add_del_port(struct net_device *dev, int port_ifindex, int add) 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; @@ -216,14 +223,13 @@ static int brc_get_bridge_info(struct net_device *dev, struct __bridge_info __user *ub) { struct __bridge_info b; - u64 id = 0; - int i; memset(&b, 0, sizeof(struct __bridge_info)); - for (i=0; idev_addr[i] << (8*(ETH_ALEN-1 - i)); - b.bridge_id = cpu_to_be64(id); + /* First two bytes are the priority, which we should skip. This comes + * from struct bridge_id in br_private.h, which is unavailable to us. + */ + memcpy((u8 *)&b.bridge_id + 2, dev->dev_addr, ETH_ALEN); b.stp_enabled = 0; if (copy_to_user(ub, &b, sizeof(struct __bridge_info))) @@ -481,7 +487,7 @@ static struct sk_buff *brc_send_command(struct sk_buff *request, /* Wait for reply. */ error = -ETIMEDOUT; if (!wait_for_completion_timeout(&brc_done, BRC_TIMEOUT)) { - printk(KERN_WARNING "brcompat: timed out waiting for userspace\n"); + pr_warn("timed out waiting for userspace\n"); goto error; } @@ -551,7 +557,7 @@ static int __init brc_init(void) err_unregister: genl_unregister_family(&brc_genl_family); error: - printk(KERN_EMERG "brcompat: failed to install!"); + pr_emerg("failed to install!\n"); return err; }