mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	net: Add tests for bonding and team address list management
Test that the bonding and team drivers clean up an underlying device's address lists (dev->uc, dev->mc) when the aggregated device is deleted. Test addition and removal of the LACPDU multicast address on underlying devices by the bonding driver. v2: * add lag_lib.sh to TEST_FILES v3: * extend bond_listen_lacpdu_multicast test to init_state up and down cases * remove some superfluous shell syntax and 'set dev ... up' commands Signed-off-by: Benjamin Poirier <bpoirier@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									bd60234222
								
							
						
					
					
						commit
						bbb774d921
					
				
					 9 changed files with 237 additions and 1 deletions
				
			
		| 
						 | 
					@ -19948,6 +19948,7 @@ S:	Supported
 | 
				
			||||||
F:	drivers/net/team/
 | 
					F:	drivers/net/team/
 | 
				
			||||||
F:	include/linux/if_team.h
 | 
					F:	include/linux/if_team.h
 | 
				
			||||||
F:	include/uapi/linux/if_team.h
 | 
					F:	include/uapi/linux/if_team.h
 | 
				
			||||||
 | 
					F:	tools/testing/selftests/net/team/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TECHNOLOGIC SYSTEMS TS-5500 PLATFORM SUPPORT
 | 
					TECHNOLOGIC SYSTEMS TS-5500 PLATFORM SUPPORT
 | 
				
			||||||
M:	"Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
 | 
					M:	"Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,7 @@ TARGETS += damon
 | 
				
			||||||
TARGETS += drivers/dma-buf
 | 
					TARGETS += drivers/dma-buf
 | 
				
			||||||
TARGETS += drivers/s390x/uvdevice
 | 
					TARGETS += drivers/s390x/uvdevice
 | 
				
			||||||
TARGETS += drivers/net/bonding
 | 
					TARGETS += drivers/net/bonding
 | 
				
			||||||
 | 
					TARGETS += drivers/net/team
 | 
				
			||||||
TARGETS += efivarfs
 | 
					TARGETS += efivarfs
 | 
				
			||||||
TARGETS += exec
 | 
					TARGETS += exec
 | 
				
			||||||
TARGETS += filesystems
 | 
					TARGETS += filesystems
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
# SPDX-License-Identifier: GPL-2.0
 | 
					# SPDX-License-Identifier: GPL-2.0
 | 
				
			||||||
# Makefile for net selftests
 | 
					# Makefile for net selftests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST_PROGS := bond-break-lacpdu-tx.sh
 | 
					TEST_PROGS := bond-break-lacpdu-tx.sh \
 | 
				
			||||||
 | 
						      dev_addr_lists.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST_FILES := lag_lib.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include ../../../lib.mk
 | 
					include ../../../lib.mk
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1,2 @@
 | 
				
			||||||
CONFIG_BONDING=y
 | 
					CONFIG_BONDING=y
 | 
				
			||||||
 | 
					CONFIG_MACVLAN=y
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										109
									
								
								tools/testing/selftests/drivers/net/bonding/dev_addr_lists.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										109
									
								
								tools/testing/selftests/drivers/net/bonding/dev_addr_lists.sh
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,109 @@
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-2.0
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Test bond device handling of addr lists (dev->uc, mc)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ALL_TESTS="
 | 
				
			||||||
 | 
						bond_cleanup_mode1
 | 
				
			||||||
 | 
						bond_cleanup_mode4
 | 
				
			||||||
 | 
						bond_listen_lacpdu_multicast_case_down
 | 
				
			||||||
 | 
						bond_listen_lacpdu_multicast_case_up
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					REQUIRE_MZ=no
 | 
				
			||||||
 | 
					NUM_NETIFS=0
 | 
				
			||||||
 | 
					lib_dir=$(dirname "$0")
 | 
				
			||||||
 | 
					source "$lib_dir"/../../../net/forwarding/lib.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source "$lib_dir"/lag_lib.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					destroy()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local ifnames=(dummy1 dummy2 bond1 mv0)
 | 
				
			||||||
 | 
						local ifname
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for ifname in "${ifnames[@]}"; do
 | 
				
			||||||
 | 
							ip link del "$ifname" &>/dev/null
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cleanup()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						pre_cleanup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						destroy
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# bond driver control paths vary between modes that have a primary slave
 | 
				
			||||||
 | 
					# (bond_uses_primary()) and others. Test both kinds of modes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bond_cleanup_mode1()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						RET=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						test_LAG_cleanup "bonding" "active-backup"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bond_cleanup_mode4() {
 | 
				
			||||||
 | 
						RET=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						test_LAG_cleanup "bonding" "802.3ad"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bond_listen_lacpdu_multicast()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						# Initial state of bond device, up | down
 | 
				
			||||||
 | 
						local init_state=$1
 | 
				
			||||||
 | 
						local lacpdu_mc="01:80:c2:00:00:02"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ip link add dummy1 type dummy
 | 
				
			||||||
 | 
						ip link add bond1 "$init_state" type bond mode 802.3ad
 | 
				
			||||||
 | 
						ip link set dev dummy1 master bond1
 | 
				
			||||||
 | 
						if [ "$init_state" = "down" ]; then
 | 
				
			||||||
 | 
							ip link set dev bond1 up
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null
 | 
				
			||||||
 | 
						check_err $? "LACPDU multicast address not present on slave (1)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ip link set dev bond1 down
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						not grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null
 | 
				
			||||||
 | 
						check_err $? "LACPDU multicast address still present on slave"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ip link set dev bond1 up
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null
 | 
				
			||||||
 | 
						check_err $? "LACPDU multicast address not present on slave (2)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cleanup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log_test "bonding LACPDU multicast address to slave (from bond $init_state)"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The LACPDU mc addr is added by different paths depending on the initial state
 | 
				
			||||||
 | 
					# of the bond when enslaving a device. Test both cases.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bond_listen_lacpdu_multicast_case_down()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						RET=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bond_listen_lacpdu_multicast "down"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bond_listen_lacpdu_multicast_case_up()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						RET=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bond_listen_lacpdu_multicast "up"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					trap cleanup EXIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tests_run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exit "$EXIT_STATUS"
 | 
				
			||||||
							
								
								
									
										61
									
								
								tools/testing/selftests/drivers/net/bonding/lag_lib.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								tools/testing/selftests/drivers/net/bonding/lag_lib.sh
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,61 @@
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Test that a link aggregation device (bonding, team) removes the hardware
 | 
				
			||||||
 | 
					# addresses that it adds on its underlying devices.
 | 
				
			||||||
 | 
					test_LAG_cleanup()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local driver=$1
 | 
				
			||||||
 | 
						local mode=$2
 | 
				
			||||||
 | 
						local ucaddr="02:00:00:12:34:56"
 | 
				
			||||||
 | 
						local addr6="fe80::78:9abc/64"
 | 
				
			||||||
 | 
						local mcaddr="33:33:ff:78:9a:bc"
 | 
				
			||||||
 | 
						local name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ip link add dummy1 type dummy
 | 
				
			||||||
 | 
						ip link add dummy2 type dummy
 | 
				
			||||||
 | 
						if [ "$driver" = "bonding" ]; then
 | 
				
			||||||
 | 
							name="bond1"
 | 
				
			||||||
 | 
							ip link add "$name" up type bond mode "$mode"
 | 
				
			||||||
 | 
							ip link set dev dummy1 master "$name"
 | 
				
			||||||
 | 
							ip link set dev dummy2 master "$name"
 | 
				
			||||||
 | 
						elif [ "$driver" = "team" ]; then
 | 
				
			||||||
 | 
							name="team0"
 | 
				
			||||||
 | 
							teamd -d -c '
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									"device": "'"$name"'",
 | 
				
			||||||
 | 
									"runner": {
 | 
				
			||||||
 | 
										"name": "'"$mode"'"
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									"ports": {
 | 
				
			||||||
 | 
										"dummy1":
 | 
				
			||||||
 | 
											{},
 | 
				
			||||||
 | 
										"dummy2":
 | 
				
			||||||
 | 
											{}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							'
 | 
				
			||||||
 | 
							ip link set dev "$name" up
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							check_err 1
 | 
				
			||||||
 | 
							log_test test_LAG_cleanup ": unknown driver \"$driver\""
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Used to test dev->uc handling
 | 
				
			||||||
 | 
						ip link add mv0 link "$name" up address "$ucaddr" type macvlan
 | 
				
			||||||
 | 
						# Used to test dev->mc handling
 | 
				
			||||||
 | 
						ip address add "$addr6" dev "$name"
 | 
				
			||||||
 | 
						ip link set dev "$name" down
 | 
				
			||||||
 | 
						ip link del "$name"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						not grep_bridge_fdb "$ucaddr" bridge fdb show >/dev/null
 | 
				
			||||||
 | 
						check_err $? "macvlan unicast address still present on a slave"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						not grep_bridge_fdb "$mcaddr" bridge fdb show >/dev/null
 | 
				
			||||||
 | 
						check_err $? "IPv6 solicited-node multicast mac address still present on a slave"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cleanup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log_test "$driver cleanup mode $mode"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6
									
								
								tools/testing/selftests/drivers/net/team/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tools/testing/selftests/drivers/net/team/Makefile
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-2.0
 | 
				
			||||||
 | 
					# Makefile for net selftests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST_PROGS := dev_addr_lists.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include ../../../lib.mk
 | 
				
			||||||
							
								
								
									
										3
									
								
								tools/testing/selftests/drivers/net/team/config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								tools/testing/selftests/drivers/net/team/config
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					CONFIG_NET_TEAM=y
 | 
				
			||||||
 | 
					CONFIG_NET_TEAM_MODE_LOADBALANCE=y
 | 
				
			||||||
 | 
					CONFIG_MACVLAN=y
 | 
				
			||||||
							
								
								
									
										51
									
								
								tools/testing/selftests/drivers/net/team/dev_addr_lists.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										51
									
								
								tools/testing/selftests/drivers/net/team/dev_addr_lists.sh
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,51 @@
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-2.0
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Test team device handling of addr lists (dev->uc, mc)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ALL_TESTS="
 | 
				
			||||||
 | 
						team_cleanup
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					REQUIRE_MZ=no
 | 
				
			||||||
 | 
					NUM_NETIFS=0
 | 
				
			||||||
 | 
					lib_dir=$(dirname "$0")
 | 
				
			||||||
 | 
					source "$lib_dir"/../../../net/forwarding/lib.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source "$lib_dir"/../bonding/lag_lib.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					destroy()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local ifnames=(dummy0 dummy1 team0 mv0)
 | 
				
			||||||
 | 
						local ifname
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for ifname in "${ifnames[@]}"; do
 | 
				
			||||||
 | 
							ip link del "$ifname" &>/dev/null
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cleanup()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						pre_cleanup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						destroy
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					team_cleanup()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						RET=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						test_LAG_cleanup "team" "lacp"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require_command teamd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					trap cleanup EXIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tests_run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exit "$EXIT_STATUS"
 | 
				
			||||||
		Loading…
	
		Reference in a new issue