diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2015-03-03 18:10:44 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-04 00:23:23 -0500 |
commit | 60395a20ffd74166ea373ea91418d6f98fa7fdfb (patch) | |
tree | c4ed2b51ec4f179a48018d86660e6f2bb5b8bd81 /net/ipv6 | |
parent | 2f56f6be47dbc6883e28107edfe2f9f98f4d5a24 (diff) |
neigh: Factor out ___neigh_lookup_noref
While looking at the mpls code I found myself writing yet another
version of neigh_lookup_noref. We currently have __ipv4_lookup_noref
and __ipv6_lookup_noref.
So to make my work a little easier and to make it a smidge easier to
verify/maintain the mpls code in the future I stopped and wrote
___neigh_lookup_noref. Then I rewote __ipv4_lookup_noref and
__ipv6_lookup_noref in terms of this new function. I tested my new
version by verifying that the same code is generated in
ip_finish_output2 and ip6_finish_output2 where these functions are
inlined.
To get to ___neigh_lookup_noref I added a new neighbour cache table
function key_eq. So that the static size of the key would be
available.
I also added __neigh_lookup_noref for people who want to to lookup
a neighbour table entry quickly but don't know which neibhgour table
they are going to look up.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/ndisc.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index e363bbc2420d..247ad7c298f7 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -84,6 +84,7 @@ do { \ | |||
84 | static u32 ndisc_hash(const void *pkey, | 84 | static u32 ndisc_hash(const void *pkey, |
85 | const struct net_device *dev, | 85 | const struct net_device *dev, |
86 | __u32 *hash_rnd); | 86 | __u32 *hash_rnd); |
87 | static bool ndisc_key_eq(const struct neighbour *neigh, const void *pkey); | ||
87 | static int ndisc_constructor(struct neighbour *neigh); | 88 | static int ndisc_constructor(struct neighbour *neigh); |
88 | static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb); | 89 | static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb); |
89 | static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb); | 90 | static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb); |
@@ -119,6 +120,7 @@ struct neigh_table nd_tbl = { | |||
119 | .key_len = sizeof(struct in6_addr), | 120 | .key_len = sizeof(struct in6_addr), |
120 | .protocol = cpu_to_be16(ETH_P_IPV6), | 121 | .protocol = cpu_to_be16(ETH_P_IPV6), |
121 | .hash = ndisc_hash, | 122 | .hash = ndisc_hash, |
123 | .key_eq = ndisc_key_eq, | ||
122 | .constructor = ndisc_constructor, | 124 | .constructor = ndisc_constructor, |
123 | .pconstructor = pndisc_constructor, | 125 | .pconstructor = pndisc_constructor, |
124 | .pdestructor = pndisc_destructor, | 126 | .pdestructor = pndisc_destructor, |
@@ -295,6 +297,11 @@ static u32 ndisc_hash(const void *pkey, | |||
295 | return ndisc_hashfn(pkey, dev, hash_rnd); | 297 | return ndisc_hashfn(pkey, dev, hash_rnd); |
296 | } | 298 | } |
297 | 299 | ||
300 | static bool ndisc_key_eq(const struct neighbour *n, const void *pkey) | ||
301 | { | ||
302 | return neigh_key_eq128(n, pkey); | ||
303 | } | ||
304 | |||
298 | static int ndisc_constructor(struct neighbour *neigh) | 305 | static int ndisc_constructor(struct neighbour *neigh) |
299 | { | 306 | { |
300 | struct in6_addr *addr = (struct in6_addr *)&neigh->primary_key; | 307 | struct in6_addr *addr = (struct in6_addr *)&neigh->primary_key; |