Commit e62a22f4 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'neighbour-fix-update-of-proxy-neighbour'

Sabrina Dubroca says:

====================
neighbour: fix update of proxy neighbour

While re-reading some "old" patches I ran into a small change of
behavior in commit dc2a27e5 ("neighbour: Update pneigh_entry in
pneigh_create().").

The old behavior was not consistent between ->protocol and ->flags,
and didn't offer a way to clear protocol, so maybe it's better to
change that (7-years-old [1]) behavior. But then we should change
non-proxy neighbours as well to keep neigh/pneigh consistent.

[1] df9b0e30 ("neighbor: Add protocol attribute")
====================

Link: https://patch.msgid.link/cover.1772894876.git.sd@queasysnail.net


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents e8f0dc02 68e76fc1
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -820,6 +820,7 @@ int pneigh_create(struct neigh_table *tbl, struct net *net,
update:
	WRITE_ONCE(n->flags, flags);
	n->permanent = permanent;
	if (protocol)
		WRITE_ONCE(n->protocol, protocol);
out:
	mutex_unlock(&tbl->phash_lock);
+55 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ ALL_TESTS="
	kci_test_fdb_get
	kci_test_fdb_del
	kci_test_neigh_get
	kci_test_neigh_update
	kci_test_bridge_parent_id
	kci_test_address_proto
	kci_test_enslave_bonding
@@ -1160,6 +1161,60 @@ kci_test_neigh_get()
	end_test "PASS: neigh get"
}

kci_test_neigh_update()
{
	dstip=10.0.2.4
	dstmac=de:ad:be:ef:13:37
	local ret=0

	for proxy in "" "proxy" ; do
		# add a neighbour entry without any flags
		run_cmd ip neigh add $proxy $dstip dev "$devdummy" lladdr $dstmac nud permanent
		run_cmd_grep $dstip ip neigh show $proxy
		run_cmd_grep_fail "$dstip dev $devdummy .*\(managed\|use\|router\|extern\)" ip neigh show $proxy

		# set the extern_learn flag, but no other
		run_cmd ip neigh change $proxy $dstip dev "$devdummy" extern_learn
		run_cmd_grep "$dstip dev $devdummy .* extern_learn" ip neigh show $proxy
		run_cmd_grep_fail "$dstip dev $devdummy .* \(managed\|use\|router\)" ip neigh show $proxy

		# flags are reset when not provided
		run_cmd ip neigh change $proxy $dstip dev "$devdummy"
		run_cmd_grep $dstip ip neigh show $proxy
		run_cmd_grep_fail "$dstip dev $devdummy .* extern_learn" ip neigh show $proxy

		# add a protocol
		run_cmd ip neigh change $proxy $dstip dev "$devdummy" protocol boot
		run_cmd_grep "$dstip dev $devdummy .* proto boot" ip neigh show $proxy

		# protocol is retained when not provided
		run_cmd ip neigh change $proxy $dstip dev "$devdummy"
		run_cmd_grep "$dstip dev $devdummy .* proto boot" ip neigh show $proxy

		# change protocol
		run_cmd ip neigh change $proxy $dstip dev "$devdummy" protocol static
		run_cmd_grep "$dstip dev $devdummy .* proto static" ip neigh show $proxy

		# also check an extended flag for non-proxy neighs
		if [ "$proxy" = "" ]; then
			run_cmd ip neigh change $proxy $dstip dev "$devdummy" managed
			run_cmd_grep "$dstip dev $devdummy managed" ip neigh show $proxy

			run_cmd ip neigh change $proxy $dstip dev "$devdummy" lladdr $dstmac
			run_cmd_grep_fail "$dstip dev $devdummy managed" ip neigh show $proxy
		fi

		run_cmd ip neigh del $proxy $dstip dev "$devdummy"
	done

	if [ $ret -ne 0 ];then
		end_test "FAIL: neigh update"
		return 1
	fi

	end_test "PASS: neigh update"
}

kci_test_bridge_parent_id()
{
	local ret=0