aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/core/neighbour.c33
1 files changed, 13 insertions, 20 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 4b815db94b6b..ecd43c4a2221 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -55,9 +55,8 @@
55#define PNEIGH_HASHMASK 0xF 55#define PNEIGH_HASHMASK 0xF
56 56
57static void neigh_timer_handler(unsigned long arg); 57static void neigh_timer_handler(unsigned long arg);
58#ifdef CONFIG_ARPD 58static void __neigh_notify(struct neighbour *n, int type, int flags);
59static void neigh_app_notify(struct neighbour *n); 59static void neigh_update_notify(struct neighbour *neigh);
60#endif
61static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev); 60static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev);
62void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev); 61void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev);
63 62
@@ -110,6 +109,7 @@ static void neigh_cleanup_and_release(struct neighbour *neigh)
110 if (neigh->parms->neigh_cleanup) 109 if (neigh->parms->neigh_cleanup)
111 neigh->parms->neigh_cleanup(neigh); 110 neigh->parms->neigh_cleanup(neigh);
112 111
112 __neigh_notify(neigh, RTM_DELNEIGH, 0);
113 neigh_release(neigh); 113 neigh_release(neigh);
114} 114}
115 115
@@ -830,13 +830,10 @@ static void neigh_timer_handler(unsigned long arg)
830out: 830out:
831 write_unlock(&neigh->lock); 831 write_unlock(&neigh->lock);
832 } 832 }
833
833 if (notify) 834 if (notify)
834 call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh); 835 neigh_update_notify(neigh);
835 836
836#ifdef CONFIG_ARPD
837 if (notify && neigh->parms->app_probes)
838 neigh_app_notify(neigh);
839#endif
840 neigh_release(neigh); 837 neigh_release(neigh);
841} 838}
842 839
@@ -1065,11 +1062,8 @@ out:
1065 write_unlock_bh(&neigh->lock); 1062 write_unlock_bh(&neigh->lock);
1066 1063
1067 if (notify) 1064 if (notify)
1068 call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh); 1065 neigh_update_notify(neigh);
1069#ifdef CONFIG_ARPD 1066
1070 if (notify && neigh->parms->app_probes)
1071 neigh_app_notify(neigh);
1072#endif
1073 return err; 1067 return err;
1074} 1068}
1075 1069
@@ -2002,6 +1996,11 @@ nla_put_failure:
2002 return -EMSGSIZE; 1996 return -EMSGSIZE;
2003} 1997}
2004 1998
1999static void neigh_update_notify(struct neighbour *neigh)
2000{
2001 call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
2002 __neigh_notify(neigh, RTM_NEWNEIGH, 0);
2003}
2005 2004
2006static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb, 2005static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
2007 struct netlink_callback *cb) 2006 struct netlink_callback *cb)
@@ -2421,7 +2420,6 @@ static const struct file_operations neigh_stat_seq_fops = {
2421 2420
2422#endif /* CONFIG_PROC_FS */ 2421#endif /* CONFIG_PROC_FS */
2423 2422
2424#ifdef CONFIG_ARPD
2425static inline size_t neigh_nlmsg_size(void) 2423static inline size_t neigh_nlmsg_size(void)
2426{ 2424{
2427 return NLMSG_ALIGN(sizeof(struct ndmsg)) 2425 return NLMSG_ALIGN(sizeof(struct ndmsg))
@@ -2453,16 +2451,11 @@ errout:
2453 rtnl_set_sk_err(RTNLGRP_NEIGH, err); 2451 rtnl_set_sk_err(RTNLGRP_NEIGH, err);
2454} 2452}
2455 2453
2454#ifdef CONFIG_ARPD
2456void neigh_app_ns(struct neighbour *n) 2455void neigh_app_ns(struct neighbour *n)
2457{ 2456{
2458 __neigh_notify(n, RTM_GETNEIGH, NLM_F_REQUEST); 2457 __neigh_notify(n, RTM_GETNEIGH, NLM_F_REQUEST);
2459} 2458}
2460
2461static void neigh_app_notify(struct neighbour *n)
2462{
2463 __neigh_notify(n, RTM_NEWNEIGH, 0);
2464}
2465
2466#endif /* CONFIG_ARPD */ 2459#endif /* CONFIG_ARPD */
2467 2460
2468#ifdef CONFIG_SYSCTL 2461#ifdef CONFIG_SYSCTL