#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # # Test bond device ether type changing # ALL_TESTS=" bond_test_unsuccessful_enslave_type_change bond_test_successful_enslave_type_change " REQUIRE_MZ=no NUM_NETIFS=0 lib_dir=$(dirname "$0") source "$lib_dir"/../../../net/forwarding/lib.sh bond_check_flags() { local bonddev=$1 ip -d l sh dev "$bonddev" | grep -q "MASTER" check_err $? "MASTER flag is missing from the bond device" ip -d l sh dev "$bonddev" | grep -q "SLAVE" check_err $? "SLAVE flag is missing from the bond device" } # test enslaved bond dev type change from ARPHRD_ETHER and back # this allows us to test both MASTER and SLAVE flags at once bond_test_enslave_type_change() { local test_success=$1 local devbond0="test-bond0" local devbond1="test-bond1" local devbond2="test-bond2" local nonethdev="test-noneth0" # create a non-ARPHRD_ETHER device for testing (e.g. nlmon type) ip link add name "$nonethdev" type nlmon check_err $? "could not create a non-ARPHRD_ETHER device (nlmon)" ip link add name "$devbond0" type bond if [ $test_success -eq 1 ]; then # we need devbond0 in active-backup mode to successfully enslave nonethdev ip link set dev "$devbond0" type bond mode active-backup check_err $? "could not change bond mode to active-backup" fi ip link add name "$devbond1" type bond ip link add name "$devbond2" type bond ip link set dev "$devbond0" master "$devbond1" check_err $? "could not enslave $devbond0 to $devbond1" # change bond type to non-ARPHRD_ETHER ip link set dev "$nonethdev" master "$devbond0" 1>/dev/null 2>/dev/null ip link set dev "$nonethdev" nomaster 1>/dev/null 2>/dev/null # restore ARPHRD_ETHER type by enslaving such device ip link set dev "$devbond2" master "$devbond0" check_err $? "could not enslave $devbond2 to $devbond0" bond_check_flags "$devbond0" # clean up ip link del dev "$devbond0" ip link del dev "$devbond1" ip link del dev "$devbond2" ip link del dev "$nonethdev" } bond_test_unsuccessful_enslave_type_change() { RET=0 bond_test_enslave_type_change 0 log_test "Change ether type of an enslaved bond device with unsuccessful enslave" } bond_test_successful_enslave_type_change() { RET=0 bond_test_enslave_type_change 1 log_test "Change ether type of an enslaved bond device with successful enslave" } tests_run exit "$EXIT_STATUS"