Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1623 commits) netxen: update copyright netxen: fix tx timeout recovery netxen: fix file firmware leak netxen: improve pci memory access netxen: change firmware write size tg3: Fix return ring size breakage netxen: build fix for INET=n cdc-phonet: autoconfigure Phonet address Phonet: back-end for autoconfigured addresses Phonet: fix netlink address dump error handling ipv6: Add IFA_F_DADFAILED flag net: Add DEVTYPE support for Ethernet based devices mv643xx_eth.c: remove unused txq_set_wrr() ucc_geth: Fix hangs after switching from full to half duplex ucc_geth: Rearrange some code to avoid forward declarations phy/marvell: Make non-aneg speed/duplex forcing work for 88E1111 PHYs drivers/net/phy: introduce missing kfree drivers/net/wan: introduce missing kfree net: force bridge module(s) to be GPL Subject: [PATCH] appletalk: Fix skb leak when ipddp interface is not loaded ... Fixed up trivial conflicts: - arch/x86/include/asm/socket.h converted to <asm-generic/socket.h> in the x86 tree. The generic header has the same new #define's, so that works out fine. - drivers/net/tun.c fix conflict between89f56d1e9
("tun: reuse struct sock fields") that switched over to using 'tun->socket.sk' instead of the redundantly available (and thus removed) 'tun->sk', and2b980dbd
("lsm: Add hooks to the TUN driver") which added a new 'tun->sk' use. Noted in 'next' by Stephen Rothwell.
This commit is contained in:
@@ -55,6 +55,7 @@
|
||||
#include <net/checksum.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/tcp_states.h>
|
||||
#include <trace/events/skb.h>
|
||||
|
||||
/*
|
||||
* Is a socket 'connection oriented' ?
|
||||
@@ -284,6 +285,8 @@ int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset,
|
||||
int i, copy = start - offset;
|
||||
struct sk_buff *frag_iter;
|
||||
|
||||
trace_skb_copy_datagram_iovec(skb, len);
|
||||
|
||||
/* Copy header. */
|
||||
if (copy > 0) {
|
||||
if (copy > len)
|
||||
|
666
net/core/dev.c
666
net/core/dev.c
File diff suppressed because it is too large
Load Diff
@@ -52,6 +52,7 @@ struct per_cpu_dm_data {
|
||||
|
||||
struct dm_hw_stat_delta {
|
||||
struct net_device *dev;
|
||||
unsigned long last_rx;
|
||||
struct list_head list;
|
||||
struct rcu_head rcu;
|
||||
unsigned long last_drop_val;
|
||||
@@ -180,17 +181,25 @@ static void trace_napi_poll_hit(struct napi_struct *napi)
|
||||
struct dm_hw_stat_delta *new_stat;
|
||||
|
||||
/*
|
||||
* Ratelimit our check time to dm_hw_check_delta jiffies
|
||||
* Don't check napi structures with no associated device
|
||||
*/
|
||||
if (!time_after(jiffies, napi->dev->last_rx + dm_hw_check_delta))
|
||||
if (!napi->dev)
|
||||
return;
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(new_stat, &hw_stats_list, list) {
|
||||
/*
|
||||
* only add a note to our monitor buffer if:
|
||||
* 1) this is the dev we received on
|
||||
* 2) its after the last_rx delta
|
||||
* 3) our rx_dropped count has gone up
|
||||
*/
|
||||
if ((new_stat->dev == napi->dev) &&
|
||||
(time_after(jiffies, new_stat->last_rx + dm_hw_check_delta)) &&
|
||||
(napi->dev->stats.rx_dropped != new_stat->last_drop_val)) {
|
||||
trace_drop_common(NULL, NULL);
|
||||
new_stat->last_drop_val = napi->dev->stats.rx_dropped;
|
||||
new_stat->last_rx = jiffies;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -286,6 +295,7 @@ static int dropmon_net_event(struct notifier_block *ev_block,
|
||||
goto out;
|
||||
|
||||
new_stat->dev = dev;
|
||||
new_stat->last_rx = jiffies;
|
||||
INIT_RCU_HEAD(&new_stat->rcu);
|
||||
spin_lock(&trace_state_lock);
|
||||
list_add_rcu(&new_stat->list, &hw_stats_list);
|
||||
|
@@ -30,10 +30,17 @@ u32 ethtool_op_get_link(struct net_device *dev)
|
||||
return netif_carrier_ok(dev) ? 1 : 0;
|
||||
}
|
||||
|
||||
u32 ethtool_op_get_rx_csum(struct net_device *dev)
|
||||
{
|
||||
return (dev->features & NETIF_F_ALL_CSUM) != 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ethtool_op_get_rx_csum);
|
||||
|
||||
u32 ethtool_op_get_tx_csum(struct net_device *dev)
|
||||
{
|
||||
return (dev->features & NETIF_F_ALL_CSUM) != 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ethtool_op_get_tx_csum);
|
||||
|
||||
int ethtool_op_set_tx_csum(struct net_device *dev, u32 data)
|
||||
{
|
||||
@@ -891,6 +898,19 @@ static int ethtool_set_value(struct net_device *dev, char __user *useraddr,
|
||||
return actor(dev, edata.data);
|
||||
}
|
||||
|
||||
static int ethtool_flash_device(struct net_device *dev, char __user *useraddr)
|
||||
{
|
||||
struct ethtool_flash efl;
|
||||
|
||||
if (copy_from_user(&efl, useraddr, sizeof(efl)))
|
||||
return -EFAULT;
|
||||
|
||||
if (!dev->ethtool_ops->flash_device)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return dev->ethtool_ops->flash_device(dev, &efl);
|
||||
}
|
||||
|
||||
/* The main entry point in this file. Called from net/core/dev.c */
|
||||
|
||||
int dev_ethtool(struct net *net, struct ifreq *ifr)
|
||||
@@ -1004,7 +1024,9 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
|
||||
break;
|
||||
case ETHTOOL_GRXCSUM:
|
||||
rc = ethtool_get_value(dev, useraddr, ethcmd,
|
||||
dev->ethtool_ops->get_rx_csum);
|
||||
(dev->ethtool_ops->get_rx_csum ?
|
||||
dev->ethtool_ops->get_rx_csum :
|
||||
ethtool_op_get_rx_csum));
|
||||
break;
|
||||
case ETHTOOL_SRXCSUM:
|
||||
rc = ethtool_set_rx_csum(dev, useraddr);
|
||||
@@ -1068,7 +1090,9 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
|
||||
break;
|
||||
case ETHTOOL_GFLAGS:
|
||||
rc = ethtool_get_value(dev, useraddr, ethcmd,
|
||||
dev->ethtool_ops->get_flags);
|
||||
(dev->ethtool_ops->get_flags ?
|
||||
dev->ethtool_ops->get_flags :
|
||||
ethtool_op_get_flags));
|
||||
break;
|
||||
case ETHTOOL_SFLAGS:
|
||||
rc = ethtool_set_value(dev, useraddr,
|
||||
@@ -1100,6 +1124,9 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
|
||||
case ETHTOOL_SGRO:
|
||||
rc = ethtool_set_gro(dev, useraddr);
|
||||
break;
|
||||
case ETHTOOL_FLASHDEV:
|
||||
rc = ethtool_flash_device(dev, useraddr);
|
||||
break;
|
||||
default:
|
||||
rc = -EOPNOTSUPP;
|
||||
}
|
||||
@@ -1116,7 +1143,6 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
|
||||
EXPORT_SYMBOL(ethtool_op_get_link);
|
||||
EXPORT_SYMBOL(ethtool_op_get_sg);
|
||||
EXPORT_SYMBOL(ethtool_op_get_tso);
|
||||
EXPORT_SYMBOL(ethtool_op_get_tx_csum);
|
||||
EXPORT_SYMBOL(ethtool_op_set_sg);
|
||||
EXPORT_SYMBOL(ethtool_op_set_tso);
|
||||
EXPORT_SYMBOL(ethtool_op_set_tx_csum);
|
||||
|
@@ -692,75 +692,74 @@ static void neigh_connect(struct neighbour *neigh)
|
||||
hh->hh_output = neigh->ops->hh_output;
|
||||
}
|
||||
|
||||
static void neigh_periodic_timer(unsigned long arg)
|
||||
static void neigh_periodic_work(struct work_struct *work)
|
||||
{
|
||||
struct neigh_table *tbl = (struct neigh_table *)arg;
|
||||
struct neigh_table *tbl = container_of(work, struct neigh_table, gc_work.work);
|
||||
struct neighbour *n, **np;
|
||||
unsigned long expire, now = jiffies;
|
||||
unsigned int i;
|
||||
|
||||
NEIGH_CACHE_STAT_INC(tbl, periodic_gc_runs);
|
||||
|
||||
write_lock(&tbl->lock);
|
||||
write_lock_bh(&tbl->lock);
|
||||
|
||||
/*
|
||||
* periodically recompute ReachableTime from random function
|
||||
*/
|
||||
|
||||
if (time_after(now, tbl->last_rand + 300 * HZ)) {
|
||||
if (time_after(jiffies, tbl->last_rand + 300 * HZ)) {
|
||||
struct neigh_parms *p;
|
||||
tbl->last_rand = now;
|
||||
tbl->last_rand = jiffies;
|
||||
for (p = &tbl->parms; p; p = p->next)
|
||||
p->reachable_time =
|
||||
neigh_rand_reach_time(p->base_reachable_time);
|
||||
}
|
||||
|
||||
np = &tbl->hash_buckets[tbl->hash_chain_gc];
|
||||
tbl->hash_chain_gc = ((tbl->hash_chain_gc + 1) & tbl->hash_mask);
|
||||
for (i = 0 ; i <= tbl->hash_mask; i++) {
|
||||
np = &tbl->hash_buckets[i];
|
||||
|
||||
while ((n = *np) != NULL) {
|
||||
unsigned int state;
|
||||
while ((n = *np) != NULL) {
|
||||
unsigned int state;
|
||||
|
||||
write_lock(&n->lock);
|
||||
write_lock(&n->lock);
|
||||
|
||||
state = n->nud_state;
|
||||
if (state & (NUD_PERMANENT | NUD_IN_TIMER)) {
|
||||
state = n->nud_state;
|
||||
if (state & (NUD_PERMANENT | NUD_IN_TIMER)) {
|
||||
write_unlock(&n->lock);
|
||||
goto next_elt;
|
||||
}
|
||||
|
||||
if (time_before(n->used, n->confirmed))
|
||||
n->used = n->confirmed;
|
||||
|
||||
if (atomic_read(&n->refcnt) == 1 &&
|
||||
(state == NUD_FAILED ||
|
||||
time_after(jiffies, n->used + n->parms->gc_staletime))) {
|
||||
*np = n->next;
|
||||
n->dead = 1;
|
||||
write_unlock(&n->lock);
|
||||
neigh_cleanup_and_release(n);
|
||||
continue;
|
||||
}
|
||||
write_unlock(&n->lock);
|
||||
goto next_elt;
|
||||
}
|
||||
|
||||
if (time_before(n->used, n->confirmed))
|
||||
n->used = n->confirmed;
|
||||
|
||||
if (atomic_read(&n->refcnt) == 1 &&
|
||||
(state == NUD_FAILED ||
|
||||
time_after(now, n->used + n->parms->gc_staletime))) {
|
||||
*np = n->next;
|
||||
n->dead = 1;
|
||||
write_unlock(&n->lock);
|
||||
neigh_cleanup_and_release(n);
|
||||
continue;
|
||||
}
|
||||
write_unlock(&n->lock);
|
||||
|
||||
next_elt:
|
||||
np = &n->next;
|
||||
np = &n->next;
|
||||
}
|
||||
/*
|
||||
* It's fine to release lock here, even if hash table
|
||||
* grows while we are preempted.
|
||||
*/
|
||||
write_unlock_bh(&tbl->lock);
|
||||
cond_resched();
|
||||
write_lock_bh(&tbl->lock);
|
||||
}
|
||||
|
||||
/* Cycle through all hash buckets every base_reachable_time/2 ticks.
|
||||
* ARP entry timeouts range from 1/2 base_reachable_time to 3/2
|
||||
* base_reachable_time.
|
||||
*/
|
||||
expire = tbl->parms.base_reachable_time >> 1;
|
||||
expire /= (tbl->hash_mask + 1);
|
||||
if (!expire)
|
||||
expire = 1;
|
||||
|
||||
if (expire>HZ)
|
||||
mod_timer(&tbl->gc_timer, round_jiffies(now + expire));
|
||||
else
|
||||
mod_timer(&tbl->gc_timer, now + expire);
|
||||
|
||||
write_unlock(&tbl->lock);
|
||||
schedule_delayed_work(&tbl->gc_work,
|
||||
tbl->parms.base_reachable_time >> 1);
|
||||
write_unlock_bh(&tbl->lock);
|
||||
}
|
||||
|
||||
static __inline__ int neigh_max_probes(struct neighbour *n)
|
||||
@@ -1316,7 +1315,7 @@ void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
|
||||
}
|
||||
EXPORT_SYMBOL(pneigh_enqueue);
|
||||
|
||||
static inline struct neigh_parms *lookup_neigh_params(struct neigh_table *tbl,
|
||||
static inline struct neigh_parms *lookup_neigh_parms(struct neigh_table *tbl,
|
||||
struct net *net, int ifindex)
|
||||
{
|
||||
struct neigh_parms *p;
|
||||
@@ -1337,7 +1336,7 @@ struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
|
||||
struct net *net = dev_net(dev);
|
||||
const struct net_device_ops *ops = dev->netdev_ops;
|
||||
|
||||
ref = lookup_neigh_params(tbl, net, 0);
|
||||
ref = lookup_neigh_parms(tbl, net, 0);
|
||||
if (!ref)
|
||||
return NULL;
|
||||
|
||||
@@ -1442,10 +1441,8 @@ void neigh_table_init_no_netlink(struct neigh_table *tbl)
|
||||
get_random_bytes(&tbl->hash_rnd, sizeof(tbl->hash_rnd));
|
||||
|
||||
rwlock_init(&tbl->lock);
|
||||
setup_timer(&tbl->gc_timer, neigh_periodic_timer, (unsigned long)tbl);
|
||||
tbl->gc_timer.expires = now + 1;
|
||||
add_timer(&tbl->gc_timer);
|
||||
|
||||
INIT_DELAYED_WORK_DEFERRABLE(&tbl->gc_work, neigh_periodic_work);
|
||||
schedule_delayed_work(&tbl->gc_work, tbl->parms.reachable_time);
|
||||
setup_timer(&tbl->proxy_timer, neigh_proxy_process, (unsigned long)tbl);
|
||||
skb_queue_head_init_class(&tbl->proxy_queue,
|
||||
&neigh_table_proxy_queue_class);
|
||||
@@ -1482,7 +1479,8 @@ int neigh_table_clear(struct neigh_table *tbl)
|
||||
struct neigh_table **tp;
|
||||
|
||||
/* It is not clean... Fix it to unload IPv6 module safely */
|
||||
del_timer_sync(&tbl->gc_timer);
|
||||
cancel_delayed_work(&tbl->gc_work);
|
||||
flush_scheduled_work();
|
||||
del_timer_sync(&tbl->proxy_timer);
|
||||
pneigh_queue_purge(&tbl->proxy_queue);
|
||||
neigh_ifdown(tbl, NULL);
|
||||
@@ -1752,7 +1750,6 @@ static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl,
|
||||
.ndtc_last_rand = jiffies_to_msecs(rand_delta),
|
||||
.ndtc_hash_rnd = tbl->hash_rnd,
|
||||
.ndtc_hash_mask = tbl->hash_mask,
|
||||
.ndtc_hash_chain_gc = tbl->hash_chain_gc,
|
||||
.ndtc_proxy_qlen = tbl->proxy_queue.qlen,
|
||||
};
|
||||
|
||||
@@ -1906,7 +1903,7 @@ static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
|
||||
if (tbp[NDTPA_IFINDEX])
|
||||
ifindex = nla_get_u32(tbp[NDTPA_IFINDEX]);
|
||||
|
||||
p = lookup_neigh_params(tbl, net, ifindex);
|
||||
p = lookup_neigh_parms(tbl, net, ifindex);
|
||||
if (p == NULL) {
|
||||
err = -ENOENT;
|
||||
goto errout_tbl_lock;
|
||||
|
@@ -141,7 +141,7 @@ static ssize_t show_dormant(struct device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static const char *operstates[] = {
|
||||
static const char *const operstates[] = {
|
||||
"unknown",
|
||||
"notpresent", /* currently unused */
|
||||
"down",
|
||||
|
@@ -6,6 +6,8 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/netns/generic.h>
|
||||
|
||||
@@ -127,7 +129,7 @@ static struct net *net_create(void)
|
||||
rv = setup_net(net);
|
||||
if (rv == 0) {
|
||||
rtnl_lock();
|
||||
list_add_tail(&net->list, &net_namespace_list);
|
||||
list_add_tail_rcu(&net->list, &net_namespace_list);
|
||||
rtnl_unlock();
|
||||
}
|
||||
mutex_unlock(&net_mutex);
|
||||
@@ -156,9 +158,16 @@ static void cleanup_net(struct work_struct *work)
|
||||
|
||||
/* Don't let anyone else find us. */
|
||||
rtnl_lock();
|
||||
list_del(&net->list);
|
||||
list_del_rcu(&net->list);
|
||||
rtnl_unlock();
|
||||
|
||||
/*
|
||||
* Another CPU might be rcu-iterating the list, wait for it.
|
||||
* This needs to be before calling the exit() notifiers, so
|
||||
* the rcu_barrier() below isn't sufficient alone.
|
||||
*/
|
||||
synchronize_rcu();
|
||||
|
||||
/* Run all of the network namespace exit methods */
|
||||
list_for_each_entry_reverse(ops, &pernet_list, list) {
|
||||
if (ops->exit)
|
||||
@@ -193,6 +202,26 @@ struct net *copy_net_ns(unsigned long flags, struct net *old_net)
|
||||
}
|
||||
#endif
|
||||
|
||||
struct net *get_net_ns_by_pid(pid_t pid)
|
||||
{
|
||||
struct task_struct *tsk;
|
||||
struct net *net;
|
||||
|
||||
/* Lookup the network namespace */
|
||||
net = ERR_PTR(-ESRCH);
|
||||
rcu_read_lock();
|
||||
tsk = find_task_by_vpid(pid);
|
||||
if (tsk) {
|
||||
struct nsproxy *nsproxy;
|
||||
nsproxy = task_nsproxy(tsk);
|
||||
if (nsproxy)
|
||||
net = get_net(nsproxy->net_ns);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
return net;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_net_ns_by_pid);
|
||||
|
||||
static int __init net_ns_init(void)
|
||||
{
|
||||
struct net_generic *ng;
|
||||
@@ -219,7 +248,7 @@ static int __init net_ns_init(void)
|
||||
panic("Could not setup the initial network namespace");
|
||||
|
||||
rtnl_lock();
|
||||
list_add_tail(&init_net.list, &net_namespace_list);
|
||||
list_add_tail_rcu(&init_net.list, &net_namespace_list);
|
||||
rtnl_unlock();
|
||||
|
||||
mutex_unlock(&net_mutex);
|
||||
|
@@ -9,6 +9,7 @@
|
||||
* Copyright (C) 2002 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/string.h>
|
||||
@@ -50,6 +51,9 @@ static atomic_t trapped;
|
||||
static void zap_completion_queue(void);
|
||||
static void arp_reply(struct sk_buff *skb);
|
||||
|
||||
static unsigned int carrier_timeout = 4;
|
||||
module_param(carrier_timeout, uint, 0644);
|
||||
|
||||
static void queue_process(struct work_struct *work)
|
||||
{
|
||||
struct netpoll_info *npinfo =
|
||||
@@ -737,7 +741,7 @@ int netpoll_setup(struct netpoll *np)
|
||||
}
|
||||
|
||||
atleast = jiffies + HZ/10;
|
||||
atmost = jiffies + 4*HZ;
|
||||
atmost = jiffies + carrier_timeout * HZ;
|
||||
while (!netif_carrier_ok(ndev)) {
|
||||
if (time_after(jiffies, atmost)) {
|
||||
printk(KERN_NOTICE
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -35,7 +35,6 @@
|
||||
#include <linux/security.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/if_addr.h>
|
||||
#include <linux/nsproxy.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/system.h>
|
||||
@@ -52,6 +51,7 @@
|
||||
#include <net/pkt_sched.h>
|
||||
#include <net/fib_rules.h>
|
||||
#include <net/rtnetlink.h>
|
||||
#include <net/net_namespace.h>
|
||||
|
||||
struct rtnl_link
|
||||
{
|
||||
@@ -606,7 +606,6 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
||||
int type, u32 pid, u32 seq, u32 change,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct netdev_queue *txq;
|
||||
struct ifinfomsg *ifm;
|
||||
struct nlmsghdr *nlh;
|
||||
const struct net_device_stats *stats;
|
||||
@@ -637,9 +636,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
||||
if (dev->master)
|
||||
NLA_PUT_U32(skb, IFLA_MASTER, dev->master->ifindex);
|
||||
|
||||
txq = netdev_get_tx_queue(dev, 0);
|
||||
if (txq->qdisc_sleeping)
|
||||
NLA_PUT_STRING(skb, IFLA_QDISC, txq->qdisc_sleeping->ops->id);
|
||||
if (dev->qdisc)
|
||||
NLA_PUT_STRING(skb, IFLA_QDISC, dev->qdisc->ops->id);
|
||||
|
||||
if (dev->ifalias)
|
||||
NLA_PUT_STRING(skb, IFLA_IFALIAS, dev->ifalias);
|
||||
@@ -725,25 +723,6 @@ static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {
|
||||
[IFLA_INFO_DATA] = { .type = NLA_NESTED },
|
||||
};
|
||||
|
||||
static struct net *get_net_ns_by_pid(pid_t pid)
|
||||
{
|
||||
struct task_struct *tsk;
|
||||
struct net *net;
|
||||
|
||||
/* Lookup the network namespace */
|
||||
net = ERR_PTR(-ESRCH);
|
||||
rcu_read_lock();
|
||||
tsk = find_task_by_vpid(pid);
|
||||
if (tsk) {
|
||||
struct nsproxy *nsproxy;
|
||||
nsproxy = task_nsproxy(tsk);
|
||||
if (nsproxy)
|
||||
net = get_net(nsproxy->net_ns);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
return net;
|
||||
}
|
||||
|
||||
static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[])
|
||||
{
|
||||
if (dev) {
|
||||
@@ -993,12 +972,20 @@ struct net_device *rtnl_create_link(struct net *net, char *ifname,
|
||||
{
|
||||
int err;
|
||||
struct net_device *dev;
|
||||
unsigned int num_queues = 1;
|
||||
unsigned int real_num_queues = 1;
|
||||
|
||||
if (ops->get_tx_queues) {
|
||||
err = ops->get_tx_queues(net, tb, &num_queues, &real_num_queues);
|
||||
if (err)
|
||||
goto err;
|
||||
}
|
||||
err = -ENOMEM;
|
||||
dev = alloc_netdev(ops->priv_size, ifname, ops->setup);
|
||||
dev = alloc_netdev_mq(ops->priv_size, ifname, ops->setup, num_queues);
|
||||
if (!dev)
|
||||
goto err;
|
||||
|
||||
dev->real_num_tx_queues = real_num_queues;
|
||||
if (strchr(dev->name, '%')) {
|
||||
err = dev_alloc_name(dev, dev->name);
|
||||
if (err < 0)
|
||||
|
@@ -559,9 +559,6 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
|
||||
#endif
|
||||
#endif
|
||||
new->vlan_tci = old->vlan_tci;
|
||||
#if defined(CONFIG_MAC80211) || defined(CONFIG_MAC80211_MODULE)
|
||||
new->do_not_encrypt = old->do_not_encrypt;
|
||||
#endif
|
||||
|
||||
skb_copy_secmark(new, old);
|
||||
}
|
||||
|
@@ -142,7 +142,7 @@ static struct lock_class_key af_family_slock_keys[AF_MAX];
|
||||
* strings build-time, so that runtime initialization of socket
|
||||
* locks is fast):
|
||||
*/
|
||||
static const char *af_family_key_strings[AF_MAX+1] = {
|
||||
static const char *const af_family_key_strings[AF_MAX+1] = {
|
||||
"sk_lock-AF_UNSPEC", "sk_lock-AF_UNIX" , "sk_lock-AF_INET" ,
|
||||
"sk_lock-AF_AX25" , "sk_lock-AF_IPX" , "sk_lock-AF_APPLETALK",
|
||||
"sk_lock-AF_NETROM", "sk_lock-AF_BRIDGE" , "sk_lock-AF_ATMPVC" ,
|
||||
@@ -158,7 +158,7 @@ static const char *af_family_key_strings[AF_MAX+1] = {
|
||||
"sk_lock-AF_IEEE802154",
|
||||
"sk_lock-AF_MAX"
|
||||
};
|
||||
static const char *af_family_slock_key_strings[AF_MAX+1] = {
|
||||
static const char *const af_family_slock_key_strings[AF_MAX+1] = {
|
||||
"slock-AF_UNSPEC", "slock-AF_UNIX" , "slock-AF_INET" ,
|
||||
"slock-AF_AX25" , "slock-AF_IPX" , "slock-AF_APPLETALK",
|
||||
"slock-AF_NETROM", "slock-AF_BRIDGE" , "slock-AF_ATMPVC" ,
|
||||
@@ -174,7 +174,7 @@ static const char *af_family_slock_key_strings[AF_MAX+1] = {
|
||||
"slock-AF_IEEE802154",
|
||||
"slock-AF_MAX"
|
||||
};
|
||||
static const char *af_family_clock_key_strings[AF_MAX+1] = {
|
||||
static const char *const af_family_clock_key_strings[AF_MAX+1] = {
|
||||
"clock-AF_UNSPEC", "clock-AF_UNIX" , "clock-AF_INET" ,
|
||||
"clock-AF_AX25" , "clock-AF_IPX" , "clock-AF_APPLETALK",
|
||||
"clock-AF_NETROM", "clock-AF_BRIDGE" , "clock-AF_ATMPVC" ,
|
||||
@@ -482,6 +482,8 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
sk->sk_reuse = valbool;
|
||||
break;
|
||||
case SO_TYPE:
|
||||
case SO_PROTOCOL:
|
||||
case SO_DOMAIN:
|
||||
case SO_ERROR:
|
||||
ret = -ENOPROTOOPT;
|
||||
break;
|
||||
@@ -764,6 +766,14 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
||||
v.val = sk->sk_type;
|
||||
break;
|
||||
|
||||
case SO_PROTOCOL:
|
||||
v.val = sk->sk_protocol;
|
||||
break;
|
||||
|
||||
case SO_DOMAIN:
|
||||
v.val = sk->sk_family;
|
||||
break;
|
||||
|
||||
case SO_ERROR:
|
||||
v.val = -sock_error(sk);
|
||||
if (v.val == 0)
|
||||
|
Reference in New Issue
Block a user