Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8979b0fd authored by Ravinder Konka's avatar Ravinder Konka Committed by Gerrit - the friendly Code Review server
Browse files

net: core: Send ARP probe and trigger RTM_NEWNEIGH



Send ARP probe and generate RTM_NEWNEIGH if the neighbor
state is not NUD_REACHABLE. Also featurize changes for
sending neighbor probe.

Change-Id: I633285b8e0cbcd49291d5e52136f11e20f2388bc
Signed-off-by: default avatarRavinder Konka <rkonka@codeaurora.org>
parent 742c663a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ enum {
	NEIGH_VAR_GC_THRESH1,
	NEIGH_VAR_GC_THRESH2,
	NEIGH_VAR_GC_THRESH3,
	NEIGH_VAR_PROBE,
	NEIGH_VAR_MAX
};

+22 −3
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ static void neigh_update_notify(struct neighbour *neigh);
static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev);

static struct neigh_table *neigh_tables;
static unsigned int neigh_probe_enable;
#ifdef CONFIG_PROC_FS
static const struct file_operations neigh_stat_seq_fops;
#endif
@@ -1277,9 +1278,20 @@ 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_update(neigh, lladdr, NUD_STALE,
					     NEIGH_UPDATE_F_OVERRIDE);
				write_lock(&neigh->lock);
				neigh_probe(neigh);
				neigh_update_notify(neigh);
			}
		} else {
			neigh_update(neigh, lladdr, NUD_STALE,
				     NEIGH_UPDATE_F_OVERRIDE);
		}
	}
	return neigh;
}
EXPORT_SYMBOL(neigh_event_ns);
@@ -3046,6 +3058,12 @@ static struct neigh_sysctl_table {
			.extra2		= &int_max,
			.proc_handler	= proc_dointvec_minmax,
		},
		[NEIGH_VAR_PROBE] = {
			.procname	= "neigh_probe",
			.maxlen		= sizeof(int),
			.mode		= 0644,
			.proc_handler	= proc_dointvec,
		},
		{},
	},
};
@@ -3081,6 +3099,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) {