mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-13 04:48:21 -04:00
net: add confirm_neigh method to dst_ops
Add confirm_neigh method to dst_ops and use it from IPv4 and IPv6 to lookup and confirm the neighbour. Its usage via the new helper dst_confirm_neigh() should be restricted to MSG_PROBE users for performance reasons. For XFRM prefer the last tunnel address, if present. With help from Steffen Klassert. Signed-off-by: Julian Anastasov <ja@ssi.bg> Acked-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
c3a2e83705
commit
63fca65d08
@@ -35,6 +35,22 @@ static inline struct neighbour *__ipv4_neigh_lookup(struct net_device *dev, u32
|
||||
return n;
|
||||
}
|
||||
|
||||
static inline void __ipv4_confirm_neigh(struct net_device *dev, u32 key)
|
||||
{
|
||||
struct neighbour *n;
|
||||
|
||||
rcu_read_lock_bh();
|
||||
n = __ipv4_neigh_lookup_noref(dev, key);
|
||||
if (n) {
|
||||
unsigned long now = jiffies;
|
||||
|
||||
/* avoid dirtying neighbour */
|
||||
if (n->confirmed != now)
|
||||
n->confirmed = now;
|
||||
}
|
||||
rcu_read_unlock_bh();
|
||||
}
|
||||
|
||||
void arp_init(void);
|
||||
int arp_ioctl(struct net *net, unsigned int cmd, void __user *arg);
|
||||
void arp_send(int type, int ptype, __be32 dest_ip,
|
||||
|
||||
@@ -477,6 +477,13 @@ static inline struct neighbour *dst_neigh_lookup_skb(const struct dst_entry *dst
|
||||
return IS_ERR(n) ? NULL : n;
|
||||
}
|
||||
|
||||
static inline void dst_confirm_neigh(const struct dst_entry *dst,
|
||||
const void *daddr)
|
||||
{
|
||||
if (dst->ops->confirm_neigh)
|
||||
dst->ops->confirm_neigh(dst, daddr);
|
||||
}
|
||||
|
||||
static inline void dst_link_failure(struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
|
||||
@@ -33,6 +33,8 @@ struct dst_ops {
|
||||
struct neighbour * (*neigh_lookup)(const struct dst_entry *dst,
|
||||
struct sk_buff *skb,
|
||||
const void *daddr);
|
||||
void (*confirm_neigh)(const struct dst_entry *dst,
|
||||
const void *daddr);
|
||||
|
||||
struct kmem_cache *kmem_cachep;
|
||||
|
||||
|
||||
@@ -391,6 +391,23 @@ static inline struct neighbour *__ipv6_neigh_lookup(struct net_device *dev, cons
|
||||
return n;
|
||||
}
|
||||
|
||||
static inline void __ipv6_confirm_neigh(struct net_device *dev,
|
||||
const void *pkey)
|
||||
{
|
||||
struct neighbour *n;
|
||||
|
||||
rcu_read_lock_bh();
|
||||
n = __ipv6_neigh_lookup_noref(dev, pkey);
|
||||
if (n) {
|
||||
unsigned long now = jiffies;
|
||||
|
||||
/* avoid dirtying neighbour */
|
||||
if (n->confirmed != now)
|
||||
n->confirmed = now;
|
||||
}
|
||||
rcu_read_unlock_bh();
|
||||
}
|
||||
|
||||
int ndisc_init(void);
|
||||
int ndisc_late_init(void);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user