projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[NET] NETNS: Omit sock->sk_net without CONFIG_NET_NS.
[deliverable/linux.git]
/
net
/
core
/
neighbour.c
diff --git
a/net/core/neighbour.c
b/net/core/neighbour.c
index 7bb6a9a1256df6a082d0792feca42db7d18ec0f5..065fbac7ecd38356fdff4157858f3cdca3445015 100644
(file)
--- a/
net/core/neighbour.c
+++ b/
net/core/neighbour.c
@@
-358,11
+358,12
@@
struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey,
{
struct neighbour *n;
int key_len = tbl->key_len;
{
struct neighbour *n;
int key_len = tbl->key_len;
- u32 hash_val
= tbl->hash(pkey, dev)
;
+ u32 hash_val;
NEIGH_CACHE_STAT_INC(tbl, lookups);
read_lock_bh(&tbl->lock);
NEIGH_CACHE_STAT_INC(tbl, lookups);
read_lock_bh(&tbl->lock);
+ hash_val = tbl->hash(pkey, dev);
for (n = tbl->hash_buckets[hash_val & tbl->hash_mask]; n; n = n->next) {
if (dev == n->dev && !memcmp(n->primary_key, pkey, key_len)) {
neigh_hold(n);
for (n = tbl->hash_buckets[hash_val & tbl->hash_mask]; n; n = n->next) {
if (dev == n->dev && !memcmp(n->primary_key, pkey, key_len)) {
neigh_hold(n);
@@
-379,14
+380,15
@@
struct neighbour *neigh_lookup_nodev(struct neigh_table *tbl, struct net *net,
{
struct neighbour *n;
int key_len = tbl->key_len;
{
struct neighbour *n;
int key_len = tbl->key_len;
- u32 hash_val
= tbl->hash(pkey, NULL)
;
+ u32 hash_val;
NEIGH_CACHE_STAT_INC(tbl, lookups);
read_lock_bh(&tbl->lock);
NEIGH_CACHE_STAT_INC(tbl, lookups);
read_lock_bh(&tbl->lock);
+ hash_val = tbl->hash(pkey, NULL);
for (n = tbl->hash_buckets[hash_val & tbl->hash_mask]; n; n = n->next) {
if (!memcmp(n->primary_key, pkey, key_len) &&
for (n = tbl->hash_buckets[hash_val & tbl->hash_mask]; n; n = n->next) {
if (!memcmp(n->primary_key, pkey, key_len) &&
-
(net == n->dev->nd_net)
) {
+
dev_net(n->dev) == net
) {
neigh_hold(n);
NEIGH_CACHE_STAT_INC(tbl, hits);
break;
neigh_hold(n);
NEIGH_CACHE_STAT_INC(tbl, hits);
break;
@@
-507,6
+509,7
@@
struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,
if (tbl->pconstructor && tbl->pconstructor(n)) {
if (dev)
dev_put(dev);
if (tbl->pconstructor && tbl->pconstructor(n)) {
if (dev)
dev_put(dev);
+ release_net(net);
kfree(n);
n = NULL;
goto out;
kfree(n);
n = NULL;
goto out;
@@
-834,12
+837,18
@@
static void neigh_timer_handler(unsigned long arg)
}
if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
struct sk_buff *skb = skb_peek(&neigh->arp_queue);
}
if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
struct sk_buff *skb = skb_peek(&neigh->arp_queue);
-
+ /* keep skb alive even if arp_queue overflows */
+ if (skb)
+ skb = skb_copy(skb, GFP_ATOMIC);
+ write_unlock(&neigh->lock);
neigh->ops->solicit(neigh, skb);
atomic_inc(&neigh->probes);
neigh->ops->solicit(neigh, skb);
atomic_inc(&neigh->probes);
- }
+ if (skb)
+ kfree_skb(skb);
+ } else {
out:
out:
- write_unlock(&neigh->lock);
+ write_unlock(&neigh->lock);
+ }
if (notify)
neigh_update_notify(neigh);
if (notify)
neigh_update_notify(neigh);
@@
-1275,9
+1284,7
@@
static inline struct neigh_parms *lookup_neigh_params(struct neigh_table *tbl,
struct neigh_parms *p;
for (p = &tbl->parms; p; p = p->next) {
struct neigh_parms *p;
for (p = &tbl->parms; p; p = p->next) {
- if (p->net != net)
- continue;
- if ((p->dev && p->dev->ifindex == ifindex) ||
+ if ((p->dev && p->dev->ifindex == ifindex && p->net == net) ||
(!p->dev && !ifindex))
return p;
}
(!p->dev && !ifindex))
return p;
}
@@
-1291,7
+1298,7
@@
struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
struct neigh_parms *p, *ref;
struct net *net;
struct neigh_parms *p, *ref;
struct net *net;
- net = dev
->nd_net
;
+ net = dev
_net(dev)
;
ref = lookup_neigh_params(tbl, net, 0);
if (!ref)
return NULL;
ref = lookup_neigh_params(tbl, net, 0);
if (!ref)
return NULL;
@@
-1380,10
+1387,10
@@
void neigh_table_init_no_netlink(struct neigh_table *tbl)
panic("cannot create neighbour cache statistics");
#ifdef CONFIG_PROC_FS
panic("cannot create neighbour cache statistics");
#ifdef CONFIG_PROC_FS
- tbl->pde = create_proc_entry(tbl->id, 0, init_net.proc_net_stat);
+ tbl->pde = proc_create(tbl->id, 0, init_net.proc_net_stat,
+ &neigh_stat_seq_fops);
if (!tbl->pde)
panic("cannot create neighbour proc dir entry");
if (!tbl->pde)
panic("cannot create neighbour proc dir entry");
- tbl->pde->proc_fops = &neigh_stat_seq_fops;
tbl->pde->data = tbl;
#endif
tbl->pde->data = tbl;
#endif
@@
-1471,7
+1478,7
@@
int neigh_table_clear(struct neigh_table *tbl)
static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
{
static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
{
- struct net *net = s
kb->sk->sk_net
;
+ struct net *net = s
ock_net(skb->sk)
;
struct ndmsg *ndm;
struct nlattr *dst_attr;
struct neigh_table *tbl;
struct ndmsg *ndm;
struct nlattr *dst_attr;
struct neigh_table *tbl;
@@
-1537,7
+1544,7
@@
out:
static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
{
static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
{
- struct net *net = s
kb->sk->sk_net
;
+ struct net *net = s
ock_net(skb->sk)
;
struct ndmsg *ndm;
struct nlattr *tb[NDA_MAX+1];
struct neigh_table *tbl;
struct ndmsg *ndm;
struct nlattr *tb[NDA_MAX+1];
struct neigh_table *tbl;
@@
-1805,7
+1812,7
@@
static const struct nla_policy nl_ntbl_parm_policy[NDTPA_MAX+1] = {
static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
{
static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
{
- struct net *net = s
kb->sk->sk_net
;
+ struct net *net = s
ock_net(skb->sk)
;
struct neigh_table *tbl;
struct ndtmsg *ndtmsg;
struct nlattr *tb[NDTA_MAX+1];
struct neigh_table *tbl;
struct ndtmsg *ndtmsg;
struct nlattr *tb[NDTA_MAX+1];
@@
-1930,7
+1937,7
@@
errout:
static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
{
static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
{
- struct net *net = s
kb->sk->sk_net
;
+ struct net *net = s
ock_net(skb->sk)
;
int family, tidx, nidx = 0;
int tbl_skip = cb->args[0];
int neigh_skip = cb->args[1];
int family, tidx, nidx = 0;
int tbl_skip = cb->args[0];
int neigh_skip = cb->args[1];
@@
-2030,7
+2037,7
@@
static void neigh_update_notify(struct neighbour *neigh)
static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
struct netlink_callback *cb)
{
static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
struct netlink_callback *cb)
{
- struct net * net = s
kb->sk->sk_net
;
+ struct net * net = s
ock_net(skb->sk)
;
struct neighbour *n;
int rc, h, s_h = cb->args[1];
int idx, s_idx = idx = cb->args[2];
struct neighbour *n;
int rc, h, s_h = cb->args[1];
int idx, s_idx = idx = cb->args[2];
@@
-2043,7
+2050,7
@@
static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
s_idx = 0;
for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) {
int lidx;
s_idx = 0;
for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) {
int lidx;
- if (
n->dev->nd_net
!= net)
+ if (
dev_net(n->dev)
!= net)
continue;
lidx = idx++;
if (lidx < s_idx)
continue;
lidx = idx++;
if (lidx < s_idx)
@@
-2148,7
+2155,7
@@
static struct neighbour *neigh_get_first(struct seq_file *seq)
n = tbl->hash_buckets[bucket];
while (n) {
n = tbl->hash_buckets[bucket];
while (n) {
- if (
n->dev->nd_net
!= net)
+ if (
dev_net(n->dev)
!= net)
goto next;
if (state->neigh_sub_iter) {
loff_t fakep = 0;
goto next;
if (state->neigh_sub_iter) {
loff_t fakep = 0;
@@
-2191,7
+2198,7
@@
static struct neighbour *neigh_get_next(struct seq_file *seq,
while (1) {
while (n) {
while (1) {
while (n) {
- if (
n->dev->nd_net
!= net)
+ if (
dev_net(n->dev)
!= net)
goto next;
if (state->neigh_sub_iter) {
void *v = state->neigh_sub_iter(state, n, pos);
goto next;
if (state->neigh_sub_iter) {
void *v = state->neigh_sub_iter(state, n, pos);
@@
-2475,7
+2482,7
@@
static inline size_t neigh_nlmsg_size(void)
static void __neigh_notify(struct neighbour *n, int type, int flags)
{
static void __neigh_notify(struct neighbour *n, int type, int flags)
{
- struct net *net =
n->dev->nd_net
;
+ struct net *net =
dev_net(n->dev)
;
struct sk_buff *skb;
int err = -ENOBUFS;
struct sk_buff *skb;
int err = -ENOBUFS;
@@
-2732,7
+2739,8
@@
int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
neigh_path[NEIGH_CTL_PATH_PROTO].procname = p_name;
neigh_path[NEIGH_CTL_PATH_PROTO].ctl_name = p_id;
neigh_path[NEIGH_CTL_PATH_PROTO].procname = p_name;
neigh_path[NEIGH_CTL_PATH_PROTO].ctl_name = p_id;
- t->sysctl_header = register_sysctl_paths(neigh_path, t->neigh_vars);
+ t->sysctl_header =
+ register_net_sysctl_table(p->net, neigh_path, t->neigh_vars);
if (!t->sysctl_header)
goto free_procname;
if (!t->sysctl_header)
goto free_procname;
This page took
0.029488 seconds
and
5
git commands to generate.