diff options
author | Jiri Pirko <jiri@resnulli.us> | 2013-12-07 13:26:56 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-12-09 20:56:12 -0500 |
commit | 1d4c8c29841b9991cdf3c7cc4ba7f96a94f104ca (patch) | |
tree | 735b39613dad7918e27f2348fa07c6f101d27e17 /include/net/neighbour.h | |
parent | 73af614aedd221df8495fc8c9993c50e87f899f2 (diff) |
neigh: restore old behaviour of default parms values
Previously inet devices were only constructed when addresses are added.
Therefore the default neigh parms values they get are the ones at the
time of these operations.
Now that we're creating inet devices earlier, this changes the behaviour
of default neigh parms values in an incompatible way (see bug #8519).
This patch creates a compromise by setting the default values at the
same point as before but only for those that have not been explicitly
set by the user since the inet device's creation.
Introduced by:
commit 8030f54499925d073a88c09f30d5d844fb1b3190
Author: Herbert Xu <herbert@gondor.apana.org.au>
Date: Thu Feb 22 01:53:47 2007 +0900
[IPV4] devinet: Register inetdev earlier.
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/neighbour.h')
-rw-r--r-- | include/net/neighbour.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/include/net/neighbour.h b/include/net/neighbour.h index 95615c9ad13a..41b1ce6c96a8 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/skbuff.h> | 21 | #include <linux/skbuff.h> |
22 | #include <linux/rcupdate.h> | 22 | #include <linux/rcupdate.h> |
23 | #include <linux/seq_file.h> | 23 | #include <linux/seq_file.h> |
24 | #include <linux/bitmap.h> | ||
24 | 25 | ||
25 | #include <linux/err.h> | 26 | #include <linux/err.h> |
26 | #include <linux/sysctl.h> | 27 | #include <linux/sysctl.h> |
@@ -81,16 +82,28 @@ struct neigh_parms { | |||
81 | 82 | ||
82 | int reachable_time; | 83 | int reachable_time; |
83 | int data[NEIGH_VAR_DATA_MAX]; | 84 | int data[NEIGH_VAR_DATA_MAX]; |
85 | DECLARE_BITMAP(data_state, NEIGH_VAR_DATA_MAX); | ||
84 | }; | 86 | }; |
85 | 87 | ||
86 | static inline void neigh_var_set(struct neigh_parms *p, int index, int val) | 88 | static inline void neigh_var_set(struct neigh_parms *p, int index, int val) |
87 | { | 89 | { |
90 | set_bit(index, p->data_state); | ||
88 | p->data[index] = val; | 91 | p->data[index] = val; |
89 | } | 92 | } |
90 | 93 | ||
91 | #define NEIGH_VAR(p, attr) ((p)->data[NEIGH_VAR_ ## attr]) | 94 | #define NEIGH_VAR(p, attr) ((p)->data[NEIGH_VAR_ ## attr]) |
92 | #define NEIGH_VAR_SET(p, attr, val) neigh_var_set(p, NEIGH_VAR_ ## attr, val) | 95 | #define NEIGH_VAR_SET(p, attr, val) neigh_var_set(p, NEIGH_VAR_ ## attr, val) |
93 | 96 | ||
97 | static inline void neigh_parms_data_state_setall(struct neigh_parms *p) | ||
98 | { | ||
99 | bitmap_fill(p->data_state, NEIGH_VAR_DATA_MAX); | ||
100 | } | ||
101 | |||
102 | static inline void neigh_parms_data_state_cleanall(struct neigh_parms *p) | ||
103 | { | ||
104 | bitmap_zero(p->data_state, NEIGH_VAR_DATA_MAX); | ||
105 | } | ||
106 | |||
94 | struct neigh_statistics { | 107 | struct neigh_statistics { |
95 | unsigned long allocs; /* number of allocated neighs */ | 108 | unsigned long allocs; /* number of allocated neighs */ |
96 | unsigned long destroys; /* number of destroyed neighs */ | 109 | unsigned long destroys; /* number of destroyed neighs */ |