Loading include/net/neighbour.h +1 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ enum { NEIGH_VAR_GC_THRESH1, NEIGH_VAR_GC_THRESH2, NEIGH_VAR_GC_THRESH3, NEIGH_VAR_PROBE, NEIGH_VAR_MAX }; Loading net/core/neighbour.c +34 −6 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ static void neigh_update_notify(struct neighbour *neigh, u32 nlmsg_pid); static int pneigh_ifdown_and_unlock(struct neigh_table *tbl, struct net_device *dev); static unsigned int neigh_probe_enable; #ifdef CONFIG_PROC_FS static const struct seq_operations neigh_stat_seq_ops; #endif Loading Loading @@ -1086,12 +1087,20 @@ static void neigh_timer_handler(struct timer_list *t) if (!mod_timer(&neigh->timer, next)) neigh_hold(neigh); } if (neigh_probe_enable) { if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE | NUD_STALE)) neigh_probe(neigh); else write_unlock(&neigh->lock); } else { if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) { neigh_probe(neigh); } else { out: write_unlock(&neigh->lock); } } if (notify) neigh_update_notify(neigh, 0); Loading Loading @@ -1437,9 +1446,21 @@ struct neighbour *neigh_event_ns(struct neigh_table *tbl, { struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev, lladdr || !dev->addr_len); if (neigh) if (neigh) { if (neigh_probe_enable) { if (neigh->nud_state != NUD_REACHABLE && neigh->nud_state != NUD_PERMANENT) { neigh_update(neigh, lladdr, NUD_STALE, NEIGH_UPDATE_F_OVERRIDE, 0); write_lock(&neigh->lock); neigh_probe(neigh); neigh_update_notify(neigh, 0); } } else { neigh_update(neigh, lladdr, NUD_STALE, NEIGH_UPDATE_F_OVERRIDE, 0); } } return neigh; } EXPORT_SYMBOL(neigh_event_ns); Loading Loading @@ -3612,6 +3633,12 @@ static struct neigh_sysctl_table { .extra2 = SYSCTL_INT_MAX, .proc_handler = proc_dointvec_minmax, }, [NEIGH_VAR_PROBE] = { .procname = "neigh_probe", .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec, }, {}, }, }; Loading Loading @@ -3647,6 +3674,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p, t->neigh_vars[NEIGH_VAR_GC_THRESH1].data = &tbl->gc_thresh1; t->neigh_vars[NEIGH_VAR_GC_THRESH2].data = &tbl->gc_thresh2; t->neigh_vars[NEIGH_VAR_GC_THRESH3].data = &tbl->gc_thresh3; t->neigh_vars[NEIGH_VAR_PROBE].data = &neigh_probe_enable; } if (handler) { Loading Loading
include/net/neighbour.h +1 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ enum { NEIGH_VAR_GC_THRESH1, NEIGH_VAR_GC_THRESH2, NEIGH_VAR_GC_THRESH3, NEIGH_VAR_PROBE, NEIGH_VAR_MAX }; Loading
net/core/neighbour.c +34 −6 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ static void neigh_update_notify(struct neighbour *neigh, u32 nlmsg_pid); static int pneigh_ifdown_and_unlock(struct neigh_table *tbl, struct net_device *dev); static unsigned int neigh_probe_enable; #ifdef CONFIG_PROC_FS static const struct seq_operations neigh_stat_seq_ops; #endif Loading Loading @@ -1086,12 +1087,20 @@ static void neigh_timer_handler(struct timer_list *t) if (!mod_timer(&neigh->timer, next)) neigh_hold(neigh); } if (neigh_probe_enable) { if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE | NUD_STALE)) neigh_probe(neigh); else write_unlock(&neigh->lock); } else { if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) { neigh_probe(neigh); } else { out: write_unlock(&neigh->lock); } } if (notify) neigh_update_notify(neigh, 0); Loading Loading @@ -1437,9 +1446,21 @@ struct neighbour *neigh_event_ns(struct neigh_table *tbl, { struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev, lladdr || !dev->addr_len); if (neigh) if (neigh) { if (neigh_probe_enable) { if (neigh->nud_state != NUD_REACHABLE && neigh->nud_state != NUD_PERMANENT) { neigh_update(neigh, lladdr, NUD_STALE, NEIGH_UPDATE_F_OVERRIDE, 0); write_lock(&neigh->lock); neigh_probe(neigh); neigh_update_notify(neigh, 0); } } else { neigh_update(neigh, lladdr, NUD_STALE, NEIGH_UPDATE_F_OVERRIDE, 0); } } return neigh; } EXPORT_SYMBOL(neigh_event_ns); Loading Loading @@ -3612,6 +3633,12 @@ static struct neigh_sysctl_table { .extra2 = SYSCTL_INT_MAX, .proc_handler = proc_dointvec_minmax, }, [NEIGH_VAR_PROBE] = { .procname = "neigh_probe", .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec, }, {}, }, }; Loading Loading @@ -3647,6 +3674,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p, t->neigh_vars[NEIGH_VAR_GC_THRESH1].data = &tbl->gc_thresh1; t->neigh_vars[NEIGH_VAR_GC_THRESH2].data = &tbl->gc_thresh2; t->neigh_vars[NEIGH_VAR_GC_THRESH3].data = &tbl->gc_thresh3; t->neigh_vars[NEIGH_VAR_PROBE].data = &neigh_probe_enable; } if (handler) { Loading