1*bbb774d9SBenjamin Poirier#!/bin/bash 2*bbb774d9SBenjamin Poirier# SPDX-License-Identifier: GPL-2.0 3*bbb774d9SBenjamin Poirier# 4*bbb774d9SBenjamin Poirier# Test bond device handling of addr lists (dev->uc, mc) 5*bbb774d9SBenjamin Poirier# 6*bbb774d9SBenjamin Poirier 7*bbb774d9SBenjamin PoirierALL_TESTS=" 8*bbb774d9SBenjamin Poirier bond_cleanup_mode1 9*bbb774d9SBenjamin Poirier bond_cleanup_mode4 10*bbb774d9SBenjamin Poirier bond_listen_lacpdu_multicast_case_down 11*bbb774d9SBenjamin Poirier bond_listen_lacpdu_multicast_case_up 12*bbb774d9SBenjamin Poirier" 13*bbb774d9SBenjamin Poirier 14*bbb774d9SBenjamin PoirierREQUIRE_MZ=no 15*bbb774d9SBenjamin PoirierNUM_NETIFS=0 16*bbb774d9SBenjamin Poirierlib_dir=$(dirname "$0") 17*bbb774d9SBenjamin Poiriersource "$lib_dir"/../../../net/forwarding/lib.sh 18*bbb774d9SBenjamin Poirier 19*bbb774d9SBenjamin Poiriersource "$lib_dir"/lag_lib.sh 20*bbb774d9SBenjamin Poirier 21*bbb774d9SBenjamin Poirier 22*bbb774d9SBenjamin Poirierdestroy() 23*bbb774d9SBenjamin Poirier{ 24*bbb774d9SBenjamin Poirier local ifnames=(dummy1 dummy2 bond1 mv0) 25*bbb774d9SBenjamin Poirier local ifname 26*bbb774d9SBenjamin Poirier 27*bbb774d9SBenjamin Poirier for ifname in "${ifnames[@]}"; do 28*bbb774d9SBenjamin Poirier ip link del "$ifname" &>/dev/null 29*bbb774d9SBenjamin Poirier done 30*bbb774d9SBenjamin Poirier} 31*bbb774d9SBenjamin Poirier 32*bbb774d9SBenjamin Poiriercleanup() 33*bbb774d9SBenjamin Poirier{ 34*bbb774d9SBenjamin Poirier pre_cleanup 35*bbb774d9SBenjamin Poirier 36*bbb774d9SBenjamin Poirier destroy 37*bbb774d9SBenjamin Poirier} 38*bbb774d9SBenjamin Poirier 39*bbb774d9SBenjamin Poirier 40*bbb774d9SBenjamin Poirier# bond driver control paths vary between modes that have a primary slave 41*bbb774d9SBenjamin Poirier# (bond_uses_primary()) and others. Test both kinds of modes. 42*bbb774d9SBenjamin Poirier 43*bbb774d9SBenjamin Poirierbond_cleanup_mode1() 44*bbb774d9SBenjamin Poirier{ 45*bbb774d9SBenjamin Poirier RET=0 46*bbb774d9SBenjamin Poirier 47*bbb774d9SBenjamin Poirier test_LAG_cleanup "bonding" "active-backup" 48*bbb774d9SBenjamin Poirier} 49*bbb774d9SBenjamin Poirier 50*bbb774d9SBenjamin Poirierbond_cleanup_mode4() { 51*bbb774d9SBenjamin Poirier RET=0 52*bbb774d9SBenjamin Poirier 53*bbb774d9SBenjamin Poirier test_LAG_cleanup "bonding" "802.3ad" 54*bbb774d9SBenjamin Poirier} 55*bbb774d9SBenjamin Poirier 56*bbb774d9SBenjamin Poirierbond_listen_lacpdu_multicast() 57*bbb774d9SBenjamin Poirier{ 58*bbb774d9SBenjamin Poirier # Initial state of bond device, up | down 59*bbb774d9SBenjamin Poirier local init_state=$1 60*bbb774d9SBenjamin Poirier local lacpdu_mc="01:80:c2:00:00:02" 61*bbb774d9SBenjamin Poirier 62*bbb774d9SBenjamin Poirier ip link add dummy1 type dummy 63*bbb774d9SBenjamin Poirier ip link add bond1 "$init_state" type bond mode 802.3ad 64*bbb774d9SBenjamin Poirier ip link set dev dummy1 master bond1 65*bbb774d9SBenjamin Poirier if [ "$init_state" = "down" ]; then 66*bbb774d9SBenjamin Poirier ip link set dev bond1 up 67*bbb774d9SBenjamin Poirier fi 68*bbb774d9SBenjamin Poirier 69*bbb774d9SBenjamin Poirier grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null 70*bbb774d9SBenjamin Poirier check_err $? "LACPDU multicast address not present on slave (1)" 71*bbb774d9SBenjamin Poirier 72*bbb774d9SBenjamin Poirier ip link set dev bond1 down 73*bbb774d9SBenjamin Poirier 74*bbb774d9SBenjamin Poirier not grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null 75*bbb774d9SBenjamin Poirier check_err $? "LACPDU multicast address still present on slave" 76*bbb774d9SBenjamin Poirier 77*bbb774d9SBenjamin Poirier ip link set dev bond1 up 78*bbb774d9SBenjamin Poirier 79*bbb774d9SBenjamin Poirier grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null 80*bbb774d9SBenjamin Poirier check_err $? "LACPDU multicast address not present on slave (2)" 81*bbb774d9SBenjamin Poirier 82*bbb774d9SBenjamin Poirier cleanup 83*bbb774d9SBenjamin Poirier 84*bbb774d9SBenjamin Poirier log_test "bonding LACPDU multicast address to slave (from bond $init_state)" 85*bbb774d9SBenjamin Poirier} 86*bbb774d9SBenjamin Poirier 87*bbb774d9SBenjamin Poirier# The LACPDU mc addr is added by different paths depending on the initial state 88*bbb774d9SBenjamin Poirier# of the bond when enslaving a device. Test both cases. 89*bbb774d9SBenjamin Poirier 90*bbb774d9SBenjamin Poirierbond_listen_lacpdu_multicast_case_down() 91*bbb774d9SBenjamin Poirier{ 92*bbb774d9SBenjamin Poirier RET=0 93*bbb774d9SBenjamin Poirier 94*bbb774d9SBenjamin Poirier bond_listen_lacpdu_multicast "down" 95*bbb774d9SBenjamin Poirier} 96*bbb774d9SBenjamin Poirier 97*bbb774d9SBenjamin Poirierbond_listen_lacpdu_multicast_case_up() 98*bbb774d9SBenjamin Poirier{ 99*bbb774d9SBenjamin Poirier RET=0 100*bbb774d9SBenjamin Poirier 101*bbb774d9SBenjamin Poirier bond_listen_lacpdu_multicast "up" 102*bbb774d9SBenjamin Poirier} 103*bbb774d9SBenjamin Poirier 104*bbb774d9SBenjamin Poirier 105*bbb774d9SBenjamin Poiriertrap cleanup EXIT 106*bbb774d9SBenjamin Poirier 107*bbb774d9SBenjamin Poiriertests_run 108*bbb774d9SBenjamin Poirier 109*bbb774d9SBenjamin Poirierexit "$EXIT_STATUS" 110