Commit b251610c authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'fix-macvlan-over-alb-bond-support'

Hangbin Liu says:

====================
fix macvlan over alb bond support

Currently, the macvlan over alb bond is broken after commit
14af9963 ("bonding: Support macvlans on top of tlb/rlb mode bonds").
Fix this and add relate tests.
====================

Link: https://lore.kernel.org/r/20230823071907.3027782-1-liuhangbin@gmail.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 30188bd7 246af950
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -660,10 +660,10 @@ static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond)
		return NULL;
	arp = (struct arp_pkt *)skb_network_header(skb);

	/* Don't modify or load balance ARPs that do not originate locally
	 * (e.g.,arrive via a bridge).
	/* Don't modify or load balance ARPs that do not originate
	 * from the bond itself or a VLAN directly above the bond.
	 */
	if (!bond_slave_has_mac_rx(bond, arp->mac_src))
	if (!bond_slave_has_mac_rcu(bond, arp->mac_src))
		return NULL;

	dev = ip_dev_find(dev_net(bond->dev), arp->ip_src);
+1 −10
Original line number Diff line number Diff line
@@ -722,23 +722,14 @@ static inline struct slave *bond_slave_has_mac(struct bonding *bond,
}

/* Caller must hold rcu_read_lock() for read */
static inline bool bond_slave_has_mac_rx(struct bonding *bond, const u8 *mac)
static inline bool bond_slave_has_mac_rcu(struct bonding *bond, const u8 *mac)
{
	struct list_head *iter;
	struct slave *tmp;
	struct netdev_hw_addr *ha;

	bond_for_each_slave_rcu(bond, tmp, iter)
		if (ether_addr_equal_64bits(mac, tmp->dev->dev_addr))
			return true;

	if (netdev_uc_empty(bond->dev))
		return false;

	netdev_for_each_uc_addr(ha, bond->dev)
		if (ether_addr_equal_64bits(mac, ha->addr))
			return true;

	return false;
}

+3 −1
Original line number Diff line number Diff line
@@ -9,10 +9,12 @@ TEST_PROGS := \
	mode-1-recovery-updelay.sh \
	mode-2-recovery-updelay.sh \
	bond_options.sh \
	bond-eth-type-change.sh
	bond-eth-type-change.sh \
	bond_macvlan.sh

TEST_FILES := \
	lag_lib.sh \
	bond_topo_2d1c.sh \
	bond_topo_3d1c.sh \
	net_forwarding_lib.sh

+99 −0
Original line number Diff line number Diff line
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test macvlan over balance-alb

lib_dir=$(dirname "$0")
source ${lib_dir}/bond_topo_2d1c.sh

m1_ns="m1-$(mktemp -u XXXXXX)"
m2_ns="m1-$(mktemp -u XXXXXX)"
m1_ip4="192.0.2.11"
m1_ip6="2001:db8::11"
m2_ip4="192.0.2.12"
m2_ip6="2001:db8::12"

cleanup()
{
	ip -n ${m1_ns} link del macv0
	ip netns del ${m1_ns}
	ip -n ${m2_ns} link del macv0
	ip netns del ${m2_ns}

	client_destroy
	server_destroy
	gateway_destroy
}

check_connection()
{
	local ns=${1}
	local target=${2}
	local message=${3:-"macvlan_over_bond"}
	RET=0


	ip netns exec ${ns} ping ${target} -c 4 -i 0.1 &>/dev/null
	check_err $? "ping failed"
	log_test "$mode: $message"
}

macvlan_over_bond()
{
	local param="$1"
	RET=0

	# setup new bond mode
	bond_reset "${param}"

	ip -n ${s_ns} link add link bond0 name macv0 type macvlan mode bridge
	ip -n ${s_ns} link set macv0 netns ${m1_ns}
	ip -n ${m1_ns} link set dev macv0 up
	ip -n ${m1_ns} addr add ${m1_ip4}/24 dev macv0
	ip -n ${m1_ns} addr add ${m1_ip6}/24 dev macv0

	ip -n ${s_ns} link add link bond0 name macv0 type macvlan mode bridge
	ip -n ${s_ns} link set macv0 netns ${m2_ns}
	ip -n ${m2_ns} link set dev macv0 up
	ip -n ${m2_ns} addr add ${m2_ip4}/24 dev macv0
	ip -n ${m2_ns} addr add ${m2_ip6}/24 dev macv0

	sleep 2

	check_connection "${c_ns}" "${s_ip4}" "IPv4: client->server"
	check_connection "${c_ns}" "${s_ip6}" "IPv6: client->server"
	check_connection "${c_ns}" "${m1_ip4}" "IPv4: client->macvlan_1"
	check_connection "${c_ns}" "${m1_ip6}" "IPv6: client->macvlan_1"
	check_connection "${c_ns}" "${m2_ip4}" "IPv4: client->macvlan_2"
	check_connection "${c_ns}" "${m2_ip6}" "IPv6: client->macvlan_2"
	check_connection "${m1_ns}" "${m2_ip4}" "IPv4: macvlan_1->macvlan_2"
	check_connection "${m1_ns}" "${m2_ip6}" "IPv6: macvlan_1->macvlan_2"


	sleep 5

	check_connection "${s_ns}" "${c_ip4}" "IPv4: server->client"
	check_connection "${s_ns}" "${c_ip6}" "IPv6: server->client"
	check_connection "${m1_ns}" "${c_ip4}" "IPv4: macvlan_1->client"
	check_connection "${m1_ns}" "${c_ip6}" "IPv6: macvlan_1->client"
	check_connection "${m2_ns}" "${c_ip4}" "IPv4: macvlan_2->client"
	check_connection "${m2_ns}" "${c_ip6}" "IPv6: macvlan_2->client"
	check_connection "${m2_ns}" "${m1_ip4}" "IPv4: macvlan_2->macvlan_2"
	check_connection "${m2_ns}" "${m1_ip6}" "IPv6: macvlan_2->macvlan_2"

	ip -n ${c_ns} neigh flush dev eth0
}

trap cleanup EXIT

setup_prepare
ip netns add ${m1_ns}
ip netns add ${m2_ns}

modes="active-backup balance-tlb balance-alb"

for mode in $modes; do
	macvlan_over_bond "mode $mode"
done

exit $EXIT_STATUS
+0 −3
Original line number Diff line number Diff line
@@ -9,10 +9,7 @@ ALL_TESTS="
	num_grat_arp
"

REQUIRE_MZ=no
NUM_NETIFS=0
lib_dir=$(dirname "$0")
source ${lib_dir}/net_forwarding_lib.sh
source ${lib_dir}/bond_topo_3d1c.sh

skip_prio()
Loading