forked from Minki/linux
[NEIGH]: Netlink notifications
Currently neighbour event notifications are limited to update notifications and only sent if the ARP daemon is enabled. This patch extends the existing notification code by also reporting neighbours being removed due to gc or administratively and removes the dependency on the ARP daemon. This allows to keep track of neighbour states without periodically fetching the complete neighbour table. Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4f494554f9
commit
d961db358f
@ -55,9 +55,8 @@
|
||||
#define PNEIGH_HASHMASK 0xF
|
||||
|
||||
static void neigh_timer_handler(unsigned long arg);
|
||||
#ifdef CONFIG_ARPD
|
||||
static void neigh_app_notify(struct neighbour *n);
|
||||
#endif
|
||||
static void __neigh_notify(struct neighbour *n, int type, int flags);
|
||||
static void neigh_update_notify(struct neighbour *neigh);
|
||||
static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev);
|
||||
void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev);
|
||||
|
||||
@ -110,6 +109,7 @@ static void neigh_cleanup_and_release(struct neighbour *neigh)
|
||||
if (neigh->parms->neigh_cleanup)
|
||||
neigh->parms->neigh_cleanup(neigh);
|
||||
|
||||
__neigh_notify(neigh, RTM_DELNEIGH, 0);
|
||||
neigh_release(neigh);
|
||||
}
|
||||
|
||||
@ -830,13 +830,10 @@ static void neigh_timer_handler(unsigned long arg)
|
||||
out:
|
||||
write_unlock(&neigh->lock);
|
||||
}
|
||||
if (notify)
|
||||
call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
|
||||
|
||||
#ifdef CONFIG_ARPD
|
||||
if (notify && neigh->parms->app_probes)
|
||||
neigh_app_notify(neigh);
|
||||
#endif
|
||||
if (notify)
|
||||
neigh_update_notify(neigh);
|
||||
|
||||
neigh_release(neigh);
|
||||
}
|
||||
|
||||
@ -1065,11 +1062,8 @@ out:
|
||||
write_unlock_bh(&neigh->lock);
|
||||
|
||||
if (notify)
|
||||
call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
|
||||
#ifdef CONFIG_ARPD
|
||||
if (notify && neigh->parms->app_probes)
|
||||
neigh_app_notify(neigh);
|
||||
#endif
|
||||
neigh_update_notify(neigh);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -2002,6 +1996,11 @@ nla_put_failure:
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
static void neigh_update_notify(struct neighbour *neigh)
|
||||
{
|
||||
call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
|
||||
__neigh_notify(neigh, RTM_NEWNEIGH, 0);
|
||||
}
|
||||
|
||||
static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
|
||||
struct netlink_callback *cb)
|
||||
@ -2421,7 +2420,6 @@ static const struct file_operations neigh_stat_seq_fops = {
|
||||
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
#ifdef CONFIG_ARPD
|
||||
static inline size_t neigh_nlmsg_size(void)
|
||||
{
|
||||
return NLMSG_ALIGN(sizeof(struct ndmsg))
|
||||
@ -2453,16 +2451,11 @@ errout:
|
||||
rtnl_set_sk_err(RTNLGRP_NEIGH, err);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARPD
|
||||
void neigh_app_ns(struct neighbour *n)
|
||||
{
|
||||
__neigh_notify(n, RTM_GETNEIGH, NLM_F_REQUEST);
|
||||
}
|
||||
|
||||
static void neigh_app_notify(struct neighbour *n)
|
||||
{
|
||||
__neigh_notify(n, RTM_NEWNEIGH, 0);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_ARPD */
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
|
Loading…
Reference in New Issue
Block a user