1 #!/bin/bash 2 # SPDX-License-Identifier: GPL-2.0 3 4 ALL_TESTS=" 5 manual_with_verification_h1_to_h2 6 manual_with_verification_h2_to_h1 7 manual_without_verification_h1_to_h2 8 manual_without_verification_h2_to_h1 9 manual_failed_verification_h1_to_h2 10 manual_failed_verification_h2_to_h1 11 lldp 12 " 13 14 NUM_NETIFS=2 15 REQUIRE_MZ=no 16 PREEMPTIBLE_PRIO=0 17 lib_dir=$(dirname "$0") 18 source "$lib_dir"/../../../net/forwarding/lib.sh 19 20 traffic_test() 21 { 22 local if=$1; shift 23 local src=$1; shift 24 local num_pkts=10000 25 local before= 26 local after= 27 local delta= 28 29 if [ ${has_pmac_stats[$if]} = false ]; then 30 src="aggregate" 31 fi 32 33 before=$(ethtool_std_stats_get $if "eth-mac" "FramesTransmittedOK" $src) 34 35 $MZ $if -q -c $num_pkts -p 64 -b bcast -t ip -R $PREEMPTIBLE_PRIO 36 37 after=$(ethtool_std_stats_get $if "eth-mac" "FramesTransmittedOK" $src) 38 39 delta=$((after - before)) 40 41 # Allow an extra 1% tolerance for random packets sent by the stack 42 [ $delta -ge $num_pkts ] && [ $delta -le $((num_pkts + 100)) ] 43 } 44 45 manual_with_verification() 46 { 47 local tx=$1; shift 48 local rx=$1; shift 49 50 RET=0 51 52 # It isn't completely clear from IEEE 802.3-2018 Figure 99-5: Transmit 53 # Processing state diagram whether the "send_r" variable (send response 54 # to verification frame) should be taken into consideration while the 55 # MAC Merge TX direction is disabled. That being said, at least the 56 # NXP ENETC does not, and requires tx-enabled on in order to respond to 57 # the link partner's verification frames. 58 ethtool --set-mm $rx tx-enabled on 59 ethtool --set-mm $tx verify-enabled on tx-enabled on 60 61 # Wait for verification to finish 62 sleep 1 63 64 ethtool --json --show-mm $tx | jq -r '.[]."verify-status"' | \ 65 grep -q 'SUCCEEDED' 66 check_err "$?" "Verification did not succeed" 67 68 ethtool --json --show-mm $tx | jq -r '.[]."tx-active"' | grep -q 'true' 69 check_err "$?" "pMAC TX is not active" 70 71 traffic_test $tx "pmac" 72 check_err "$?" "Traffic did not get sent through $tx's pMAC" 73 74 ethtool --set-mm $tx verify-enabled off tx-enabled off 75 ethtool --set-mm $rx tx-enabled off 76 77 log_test "Manual configuration with verification: $tx to $rx" 78 } 79 80 manual_with_verification_h1_to_h2() 81 { 82 manual_with_verification $h1 $h2 83 } 84 85 manual_with_verification_h2_to_h1() 86 { 87 manual_with_verification $h2 $h1 88 } 89 90 manual_without_verification() 91 { 92 local tx=$1; shift 93 local rx=$1; shift 94 95 RET=0 96 97 ethtool --set-mm $tx verify-enabled off tx-enabled on 98 99 ethtool --json --show-mm $tx | jq -r '.[]."verify-status"' | \ 100 grep -q 'DISABLED' 101 check_err "$?" "Verification is not disabled" 102 103 ethtool --json --show-mm $tx | jq -r '.[]."tx-active"' | grep -q 'true' 104 check_err "$?" "pMAC TX is not active" 105 106 traffic_test $tx "pmac" 107 check_err "$?" "Traffic did not get sent through $tx's pMAC" 108 109 ethtool --set-mm $tx verify-enabled off tx-enabled off 110 111 log_test "Manual configuration without verification: $tx to $rx" 112 } 113 114 manual_without_verification_h1_to_h2() 115 { 116 manual_without_verification $h1 $h2 117 } 118 119 manual_without_verification_h2_to_h1() 120 { 121 manual_without_verification $h2 $h1 122 } 123 124 manual_failed_verification() 125 { 126 local tx=$1; shift 127 local rx=$1; shift 128 129 RET=0 130 131 ethtool --set-mm $rx pmac-enabled off 132 ethtool --set-mm $tx verify-enabled on tx-enabled on 133 134 # Wait for verification to time out 135 sleep 1 136 137 ethtool --json --show-mm $tx | jq -r '.[]."verify-status"' | \ 138 grep -q 'SUCCEEDED' 139 check_fail "$?" "Verification succeeded when it shouldn't have" 140 141 ethtool --json --show-mm $tx | jq -r '.[]."tx-active"' | grep -q 'true' 142 check_fail "$?" "pMAC TX is active when it shouldn't have" 143 144 traffic_test $tx "emac" 145 check_err "$?" "Traffic did not get sent through $tx's eMAC" 146 147 ethtool --set-mm $tx verify-enabled off tx-enabled off 148 ethtool --set-mm $rx pmac-enabled on 149 150 log_test "Manual configuration with failed verification: $tx to $rx" 151 } 152 153 manual_failed_verification_h1_to_h2() 154 { 155 manual_failed_verification $h1 $h2 156 } 157 158 manual_failed_verification_h2_to_h1() 159 { 160 manual_failed_verification $h2 $h1 161 } 162 163 smallest_supported_add_frag_size() 164 { 165 local iface=$1 166 local rx_min_frag_size= 167 168 rx_min_frag_size=$(ethtool --json --show-mm $iface | \ 169 jq '.[]."rx-min-frag-size"') 170 171 if [ $rx_min_frag_size -le 60 ]; then 172 echo 0 173 elif [ $rx_min_frag_size -le 124 ]; then 174 echo 1 175 elif [ $rx_min_frag_size -le 188 ]; then 176 echo 2 177 elif [ $rx_min_frag_size -le 252 ]; then 178 echo 3 179 else 180 echo "$iface: RX min frag size $rx_min_frag_size cannot be advertised over LLDP" 181 exit 1 182 fi 183 } 184 185 expected_add_frag_size() 186 { 187 local iface=$1 188 local requested=$2 189 local min=$(smallest_supported_add_frag_size $iface) 190 191 [ $requested -le $min ] && echo $min || echo $requested 192 } 193 194 lldp_change_add_frag_size() 195 { 196 local add_frag_size=$1 197 local pattern= 198 199 lldptool -T -i $h1 -V addEthCaps addFragSize=$add_frag_size >/dev/null 200 # Wait for TLVs to be received 201 sleep 2 202 pattern=$(printf "Additional fragment size: %d" \ 203 $(expected_add_frag_size $h1 $add_frag_size)) 204 lldptool -i $h2 -t -n -V addEthCaps | grep -q "$pattern" 205 } 206 207 lldp() 208 { 209 RET=0 210 211 systemctl start lldpad 212 213 # Configure the interfaces to receive and transmit LLDPDUs 214 lldptool -L -i $h1 adminStatus=rxtx >/dev/null 215 lldptool -L -i $h2 adminStatus=rxtx >/dev/null 216 217 # Enable the transmission of Additional Ethernet Capabilities TLV 218 lldptool -T -i $h1 -V addEthCaps enableTx=yes >/dev/null 219 lldptool -T -i $h2 -V addEthCaps enableTx=yes >/dev/null 220 221 # Wait for TLVs to be received 222 sleep 2 223 224 lldptool -i $h1 -t -n -V addEthCaps | \ 225 grep -q "Preemption capability active" 226 check_err "$?" "$h1 pMAC TX is not active" 227 228 lldptool -i $h2 -t -n -V addEthCaps | \ 229 grep -q "Preemption capability active" 230 check_err "$?" "$h2 pMAC TX is not active" 231 232 lldp_change_add_frag_size 3 233 check_err "$?" "addFragSize 3" 234 235 lldp_change_add_frag_size 2 236 check_err "$?" "addFragSize 2" 237 238 lldp_change_add_frag_size 1 239 check_err "$?" "addFragSize 1" 240 241 lldp_change_add_frag_size 0 242 check_err "$?" "addFragSize 0" 243 244 traffic_test $h1 "pmac" 245 check_err "$?" "Traffic did not get sent through $h1's pMAC" 246 247 traffic_test $h2 "pmac" 248 check_err "$?" "Traffic did not get sent through $h2's pMAC" 249 250 systemctl stop lldpad 251 252 log_test "LLDP" 253 } 254 255 h1_create() 256 { 257 ip link set dev $h1 up 258 259 tc qdisc add dev $h1 root mqprio num_tc 4 map 0 1 2 3 \ 260 queues 1@0 1@1 1@2 1@3 \ 261 fp P E E E \ 262 hw 1 263 264 ethtool --set-mm $h1 pmac-enabled on tx-enabled off verify-enabled off 265 } 266 267 h2_create() 268 { 269 ip link set dev $h2 up 270 271 ethtool --set-mm $h2 pmac-enabled on tx-enabled off verify-enabled off 272 273 tc qdisc add dev $h2 root mqprio num_tc 4 map 0 1 2 3 \ 274 queues 1@0 1@1 1@2 1@3 \ 275 fp P E E E \ 276 hw 1 277 } 278 279 h1_destroy() 280 { 281 ethtool --set-mm $h1 pmac-enabled off tx-enabled off verify-enabled off 282 283 tc qdisc del dev $h1 root 284 285 ip link set dev $h1 down 286 } 287 288 h2_destroy() 289 { 290 tc qdisc del dev $h2 root 291 292 ethtool --set-mm $h2 pmac-enabled off tx-enabled off verify-enabled off 293 294 ip link set dev $h2 down 295 } 296 297 setup_prepare() 298 { 299 h1=${NETIFS[p1]} 300 h2=${NETIFS[p2]} 301 302 h1_create 303 h2_create 304 } 305 306 cleanup() 307 { 308 pre_cleanup 309 310 h2_destroy 311 h1_destroy 312 } 313 314 check_ethtool_mm_support 315 check_tc_fp_support 316 require_command lldptool 317 bail_on_lldpad "autoconfigure the MAC Merge layer" "configure it manually" 318 319 for netif in ${NETIFS[@]}; do 320 ethtool --show-mm $netif 2>&1 &> /dev/null 321 if [[ $? -ne 0 ]]; then 322 echo "SKIP: $netif does not support MAC Merge" 323 exit $ksft_skip 324 fi 325 326 if check_ethtool_pmac_std_stats_support $netif eth-mac; then 327 has_pmac_stats[$netif]=true 328 else 329 has_pmac_stats[$netif]=false 330 echo "$netif does not report pMAC statistics, falling back to aggregate" 331 fi 332 done 333 334 trap cleanup EXIT 335 336 setup_prepare 337 setup_wait 338 339 tests_run 340 341 exit $EXIT_STATUS
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.