|
@@ -29,6 +29,7 @@
|
|
|
#include <net/neighbour.h>
|
|
|
#include <net/dst.h>
|
|
|
#include <net/sock.h>
|
|
|
+#include <net/netevent.h>
|
|
|
#include <linux/rtnetlink.h>
|
|
|
#include <linux/random.h>
|
|
|
#include <linux/string.h>
|
|
@@ -754,6 +755,7 @@ static void neigh_timer_handler(unsigned long arg)
|
|
|
neigh->nud_state = NUD_STALE;
|
|
|
neigh->updated = jiffies;
|
|
|
neigh_suspect(neigh);
|
|
|
+ notify = 1;
|
|
|
}
|
|
|
} else if (state & NUD_DELAY) {
|
|
|
if (time_before_eq(now,
|
|
@@ -762,6 +764,7 @@ static void neigh_timer_handler(unsigned long arg)
|
|
|
neigh->nud_state = NUD_REACHABLE;
|
|
|
neigh->updated = jiffies;
|
|
|
neigh_connect(neigh);
|
|
|
+ notify = 1;
|
|
|
next = neigh->confirmed + neigh->parms->reachable_time;
|
|
|
} else {
|
|
|
NEIGH_PRINTK2("neigh %p is probed.\n", neigh);
|
|
@@ -819,6 +822,8 @@ 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)
|
|
@@ -926,9 +931,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
|
|
|
{
|
|
|
u8 old;
|
|
|
int err;
|
|
|
-#ifdef CONFIG_ARPD
|
|
|
int notify = 0;
|
|
|
-#endif
|
|
|
struct net_device *dev;
|
|
|
int update_isrouter = 0;
|
|
|
|
|
@@ -948,9 +951,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
|
|
|
neigh_suspect(neigh);
|
|
|
neigh->nud_state = new;
|
|
|
err = 0;
|
|
|
-#ifdef CONFIG_ARPD
|
|
|
notify = old & NUD_VALID;
|
|
|
-#endif
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
@@ -1022,9 +1023,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
|
|
|
if (!(new & NUD_CONNECTED))
|
|
|
neigh->confirmed = jiffies -
|
|
|
(neigh->parms->base_reachable_time << 1);
|
|
|
-#ifdef CONFIG_ARPD
|
|
|
notify = 1;
|
|
|
-#endif
|
|
|
}
|
|
|
if (new == old)
|
|
|
goto out;
|
|
@@ -1056,6 +1055,9 @@ out:
|
|
|
(neigh->flags & ~NTF_ROUTER);
|
|
|
}
|
|
|
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);
|