Merge branch 'ipvlan-support-bonding-events'

Etienne Champetier says:

====================
ipvlan: Support bonding events
====================

Link: https://patch.msgid.link/20250109032819.326528-1-champetier.etienne@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2025-01-10 18:10:29 -08:00
commit 8d460ac783
5 changed files with 104 additions and 100 deletions

View File

@ -799,6 +799,12 @@ static int ipvlan_device_event(struct notifier_block *unused,
case NETDEV_PRE_TYPE_CHANGE:
/* Forbid underlying device to change its type. */
return NOTIFY_BAD;
case NETDEV_NOTIFY_PEERS:
case NETDEV_BONDING_FAILOVER:
case NETDEV_RESEND_IGMP:
list_for_each_entry(ipvlan, &port->ipvlans, pnode)
call_netdevice_notifiers(event, ipvlan->dev);
}
return NOTIFY_DONE;
}

View File

@ -10,7 +10,7 @@ TEST_PROGS := \
mode-2-recovery-updelay.sh \
bond_options.sh \
bond-eth-type-change.sh \
bond_macvlan.sh
bond_macvlan_ipvlan.sh
TEST_FILES := \
lag_lib.sh \

View File

@ -1,99 +0,0 @@
#!/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

View File

@ -0,0 +1,96 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test macvlan/ipvlan over bond
lib_dir=$(dirname "$0")
source ${lib_dir}/bond_topo_2d1c.sh
xvlan1_ns="xvlan1-$(mktemp -u XXXXXX)"
xvlan2_ns="xvlan2-$(mktemp -u XXXXXX)"
xvlan1_ip4="192.0.2.11"
xvlan1_ip6="2001:db8::11"
xvlan2_ip4="192.0.2.12"
xvlan2_ip6="2001:db8::12"
cleanup()
{
client_destroy
server_destroy
gateway_destroy
ip netns del ${xvlan1_ns}
ip netns del ${xvlan2_ns}
}
check_connection()
{
local ns=${1}
local target=${2}
local message=${3}
RET=0
ip netns exec ${ns} ping ${target} -c 4 -i 0.1 &>/dev/null
check_err $? "ping failed"
log_test "${bond_mode}/${xvlan_type}_${xvlan_mode}: ${message}"
}
xvlan_over_bond()
{
local param="$1"
local xvlan_type="$2"
local xvlan_mode="$3"
RET=0
# setup new bond mode
bond_reset "${param}"
ip -n ${s_ns} link add link bond0 name ${xvlan_type}0 type ${xvlan_type} mode ${xvlan_mode}
ip -n ${s_ns} link set ${xvlan_type}0 netns ${xvlan1_ns}
ip -n ${xvlan1_ns} link set dev ${xvlan_type}0 up
ip -n ${xvlan1_ns} addr add ${xvlan1_ip4}/24 dev ${xvlan_type}0
ip -n ${xvlan1_ns} addr add ${xvlan1_ip6}/24 dev ${xvlan_type}0
ip -n ${s_ns} link add link bond0 name ${xvlan_type}0 type ${xvlan_type} mode ${xvlan_mode}
ip -n ${s_ns} link set ${xvlan_type}0 netns ${xvlan2_ns}
ip -n ${xvlan2_ns} link set dev ${xvlan_type}0 up
ip -n ${xvlan2_ns} addr add ${xvlan2_ip4}/24 dev ${xvlan_type}0
ip -n ${xvlan2_ns} addr add ${xvlan2_ip6}/24 dev ${xvlan_type}0
sleep 2
check_connection "${c_ns}" "${s_ip4}" "IPv4: client->server"
check_connection "${c_ns}" "${s_ip6}" "IPv6: client->server"
check_connection "${c_ns}" "${xvlan1_ip4}" "IPv4: client->${xvlan_type}_1"
check_connection "${c_ns}" "${xvlan1_ip6}" "IPv6: client->${xvlan_type}_1"
check_connection "${c_ns}" "${xvlan2_ip4}" "IPv4: client->${xvlan_type}_2"
check_connection "${c_ns}" "${xvlan2_ip6}" "IPv6: client->${xvlan_type}_2"
check_connection "${xvlan1_ns}" "${xvlan2_ip4}" "IPv4: ${xvlan_type}_1->${xvlan_type}_2"
check_connection "${xvlan1_ns}" "${xvlan2_ip6}" "IPv6: ${xvlan_type}_1->${xvlan_type}_2"
check_connection "${s_ns}" "${c_ip4}" "IPv4: server->client"
check_connection "${s_ns}" "${c_ip6}" "IPv6: server->client"
check_connection "${xvlan1_ns}" "${c_ip4}" "IPv4: ${xvlan_type}_1->client"
check_connection "${xvlan1_ns}" "${c_ip6}" "IPv6: ${xvlan_type}_1->client"
check_connection "${xvlan2_ns}" "${c_ip4}" "IPv4: ${xvlan_type}_2->client"
check_connection "${xvlan2_ns}" "${c_ip6}" "IPv6: ${xvlan_type}_2->client"
check_connection "${xvlan2_ns}" "${xvlan1_ip4}" "IPv4: ${xvlan_type}_2->${xvlan_type}_1"
check_connection "${xvlan2_ns}" "${xvlan1_ip6}" "IPv6: ${xvlan_type}_2->${xvlan_type}_1"
ip -n ${c_ns} neigh flush dev eth0
}
trap cleanup EXIT
setup_prepare
ip netns add ${xvlan1_ns}
ip netns add ${xvlan2_ns}
bond_modes="active-backup balance-tlb balance-alb"
for bond_mode in ${bond_modes}; do
xvlan_over_bond "mode ${bond_mode}" macvlan bridge
xvlan_over_bond "mode ${bond_mode}" ipvlan l2
done
exit $EXIT_STATUS

View File

@ -3,6 +3,7 @@ CONFIG_BRIDGE=y
CONFIG_DUMMY=y
CONFIG_IPV6=y
CONFIG_MACVLAN=y
CONFIG_IPVLAN=y
CONFIG_NET_ACT_GACT=y
CONFIG_NET_CLS_FLOWER=y
CONFIG_NET_SCH_INGRESS=y