| .. | .. |
|---|
| 15 | 15 | PAUSE_ON_CLEANUP=${PAUSE_ON_CLEANUP:=no} |
|---|
| 16 | 16 | NETIF_TYPE=${NETIF_TYPE:=veth} |
|---|
| 17 | 17 | NETIF_CREATE=${NETIF_CREATE:=yes} |
|---|
| 18 | +MCD=${MCD:=smcrouted} |
|---|
| 19 | +MC_CLI=${MC_CLI:=smcroutectl} |
|---|
| 20 | +PING_TIMEOUT=${PING_TIMEOUT:=5} |
|---|
| 21 | +WAIT_TIMEOUT=${WAIT_TIMEOUT:=20} |
|---|
| 22 | +INTERFACE_TIMEOUT=${INTERFACE_TIMEOUT:=600} |
|---|
| 18 | 23 | |
|---|
| 19 | 24 | relative_path="${BASH_SOURCE%/*}" |
|---|
| 20 | 25 | if [[ "$relative_path" == "${BASH_SOURCE}" ]]; then |
|---|
| .. | .. |
|---|
| 52 | 57 | if [[ $? -ne 0 ]]; then |
|---|
| 53 | 58 | echo "SKIP: iproute2 too old; tc is missing chain support" |
|---|
| 54 | 59 | exit 1 |
|---|
| 60 | + fi |
|---|
| 61 | +} |
|---|
| 62 | + |
|---|
| 63 | +check_tc_action_hw_stats_support() |
|---|
| 64 | +{ |
|---|
| 65 | + tc actions help 2>&1 | grep -q hw_stats |
|---|
| 66 | + if [[ $? -ne 0 ]]; then |
|---|
| 67 | + echo "SKIP: iproute2 too old; tc is missing action hw_stats support" |
|---|
| 68 | + exit 1 |
|---|
| 69 | + fi |
|---|
| 70 | +} |
|---|
| 71 | + |
|---|
| 72 | +skip_on_veth() |
|---|
| 73 | +{ |
|---|
| 74 | + local kind=$(ip -j -d link show dev ${NETIFS[p1]} | |
|---|
| 75 | + jq -r '.[].linkinfo.info_kind') |
|---|
| 76 | + |
|---|
| 77 | + if [[ $kind == veth ]]; then |
|---|
| 78 | + echo "SKIP: Test cannot be run with veth pairs" |
|---|
| 79 | + exit $ksft_skip |
|---|
| 55 | 80 | fi |
|---|
| 56 | 81 | } |
|---|
| 57 | 82 | |
|---|
| .. | .. |
|---|
| 104 | 129 | { |
|---|
| 105 | 130 | local i |
|---|
| 106 | 131 | |
|---|
| 107 | | - for i in $(eval echo {1..$NUM_NETIFS}); do |
|---|
| 132 | + for ((i = 1; i <= NUM_NETIFS; ++i)); do |
|---|
| 108 | 133 | local j=$((i+1)) |
|---|
| 134 | + |
|---|
| 135 | + if [ -z ${NETIFS[p$i]} ]; then |
|---|
| 136 | + echo "SKIP: Cannot create interface. Name not specified" |
|---|
| 137 | + exit $ksft_skip |
|---|
| 138 | + fi |
|---|
| 109 | 139 | |
|---|
| 110 | 140 | ip link show dev ${NETIFS[p$i]} &> /dev/null |
|---|
| 111 | 141 | if [[ $? -ne 0 ]]; then |
|---|
| .. | .. |
|---|
| 135 | 165 | create_netif |
|---|
| 136 | 166 | fi |
|---|
| 137 | 167 | |
|---|
| 138 | | -for i in $(eval echo {1..$NUM_NETIFS}); do |
|---|
| 168 | +for ((i = 1; i <= NUM_NETIFS; ++i)); do |
|---|
| 139 | 169 | ip link show dev ${NETIFS[p$i]} &> /dev/null |
|---|
| 140 | 170 | if [[ $? -ne 0 ]]; then |
|---|
| 141 | 171 | echo "SKIP: could not find all required interfaces" |
|---|
| .. | .. |
|---|
| 209 | 239 | return 1 |
|---|
| 210 | 240 | fi |
|---|
| 211 | 241 | |
|---|
| 212 | | - printf "TEST: %-60s [PASS]\n" "$test_name $opt_str" |
|---|
| 242 | + printf "TEST: %-60s [ OK ]\n" "$test_name $opt_str" |
|---|
| 213 | 243 | return 0 |
|---|
| 214 | 244 | } |
|---|
| 215 | 245 | |
|---|
| .. | .. |
|---|
| 220 | 250 | echo "INFO: $msg" |
|---|
| 221 | 251 | } |
|---|
| 222 | 252 | |
|---|
| 253 | +busywait() |
|---|
| 254 | +{ |
|---|
| 255 | + local timeout=$1; shift |
|---|
| 256 | + |
|---|
| 257 | + local start_time="$(date -u +%s%3N)" |
|---|
| 258 | + while true |
|---|
| 259 | + do |
|---|
| 260 | + local out |
|---|
| 261 | + out=$("$@") |
|---|
| 262 | + local ret=$? |
|---|
| 263 | + if ((!ret)); then |
|---|
| 264 | + echo -n "$out" |
|---|
| 265 | + return 0 |
|---|
| 266 | + fi |
|---|
| 267 | + |
|---|
| 268 | + local current_time="$(date -u +%s%3N)" |
|---|
| 269 | + if ((current_time - start_time > timeout)); then |
|---|
| 270 | + echo -n "$out" |
|---|
| 271 | + return 1 |
|---|
| 272 | + fi |
|---|
| 273 | + done |
|---|
| 274 | +} |
|---|
| 275 | + |
|---|
| 276 | +not() |
|---|
| 277 | +{ |
|---|
| 278 | + "$@" |
|---|
| 279 | + [[ $? != 0 ]] |
|---|
| 280 | +} |
|---|
| 281 | + |
|---|
| 282 | +grep_bridge_fdb() |
|---|
| 283 | +{ |
|---|
| 284 | + local addr=$1; shift |
|---|
| 285 | + local word |
|---|
| 286 | + local flag |
|---|
| 287 | + |
|---|
| 288 | + if [ "$1" == "self" ] || [ "$1" == "master" ]; then |
|---|
| 289 | + word=$1; shift |
|---|
| 290 | + if [ "$1" == "-v" ]; then |
|---|
| 291 | + flag=$1; shift |
|---|
| 292 | + fi |
|---|
| 293 | + fi |
|---|
| 294 | + |
|---|
| 295 | + $@ | grep $addr | grep $flag "$word" |
|---|
| 296 | +} |
|---|
| 297 | + |
|---|
| 298 | +wait_for_offload() |
|---|
| 299 | +{ |
|---|
| 300 | + "$@" | grep -q offload |
|---|
| 301 | +} |
|---|
| 302 | + |
|---|
| 303 | +until_counter_is() |
|---|
| 304 | +{ |
|---|
| 305 | + local expr=$1; shift |
|---|
| 306 | + local current=$("$@") |
|---|
| 307 | + |
|---|
| 308 | + echo $((current)) |
|---|
| 309 | + ((current $expr)) |
|---|
| 310 | +} |
|---|
| 311 | + |
|---|
| 312 | +busywait_for_counter() |
|---|
| 313 | +{ |
|---|
| 314 | + local timeout=$1; shift |
|---|
| 315 | + local delta=$1; shift |
|---|
| 316 | + |
|---|
| 317 | + local base=$("$@") |
|---|
| 318 | + busywait "$timeout" until_counter_is ">= $((base + delta))" "$@" |
|---|
| 319 | +} |
|---|
| 320 | + |
|---|
| 223 | 321 | setup_wait_dev() |
|---|
| 224 | 322 | { |
|---|
| 225 | 323 | local dev=$1; shift |
|---|
| 324 | + local wait_time=${1:-$WAIT_TIME}; shift |
|---|
| 226 | 325 | |
|---|
| 227 | | - while true; do |
|---|
| 326 | + setup_wait_dev_with_timeout "$dev" $INTERFACE_TIMEOUT $wait_time |
|---|
| 327 | + |
|---|
| 328 | + if (($?)); then |
|---|
| 329 | + check_err 1 |
|---|
| 330 | + log_test setup_wait_dev ": Interface $dev does not come up." |
|---|
| 331 | + exit 1 |
|---|
| 332 | + fi |
|---|
| 333 | +} |
|---|
| 334 | + |
|---|
| 335 | +setup_wait_dev_with_timeout() |
|---|
| 336 | +{ |
|---|
| 337 | + local dev=$1; shift |
|---|
| 338 | + local max_iterations=${1:-$WAIT_TIMEOUT}; shift |
|---|
| 339 | + local wait_time=${1:-$WAIT_TIME}; shift |
|---|
| 340 | + local i |
|---|
| 341 | + |
|---|
| 342 | + for ((i = 1; i <= $max_iterations; ++i)); do |
|---|
| 228 | 343 | ip link show dev $dev up \ |
|---|
| 229 | 344 | | grep 'state UP' &> /dev/null |
|---|
| 230 | 345 | if [[ $? -ne 0 ]]; then |
|---|
| 231 | 346 | sleep 1 |
|---|
| 232 | 347 | else |
|---|
| 233 | | - break |
|---|
| 348 | + sleep $wait_time |
|---|
| 349 | + return 0 |
|---|
| 234 | 350 | fi |
|---|
| 235 | 351 | done |
|---|
| 352 | + |
|---|
| 353 | + return 1 |
|---|
| 236 | 354 | } |
|---|
| 237 | 355 | |
|---|
| 238 | 356 | setup_wait() |
|---|
| 239 | 357 | { |
|---|
| 240 | 358 | local num_netifs=${1:-$NUM_NETIFS} |
|---|
| 359 | + local i |
|---|
| 241 | 360 | |
|---|
| 242 | 361 | for ((i = 1; i <= num_netifs; ++i)); do |
|---|
| 243 | | - setup_wait_dev ${NETIFS[p$i]} |
|---|
| 362 | + setup_wait_dev ${NETIFS[p$i]} 0 |
|---|
| 244 | 363 | done |
|---|
| 245 | 364 | |
|---|
| 246 | 365 | # Make sure links are ready. |
|---|
| 247 | 366 | sleep $WAIT_TIME |
|---|
| 367 | +} |
|---|
| 368 | + |
|---|
| 369 | +cmd_jq() |
|---|
| 370 | +{ |
|---|
| 371 | + local cmd=$1 |
|---|
| 372 | + local jq_exp=$2 |
|---|
| 373 | + local jq_opts=$3 |
|---|
| 374 | + local ret |
|---|
| 375 | + local output |
|---|
| 376 | + |
|---|
| 377 | + output="$($cmd)" |
|---|
| 378 | + # it the command fails, return error right away |
|---|
| 379 | + ret=$? |
|---|
| 380 | + if [[ $ret -ne 0 ]]; then |
|---|
| 381 | + return $ret |
|---|
| 382 | + fi |
|---|
| 383 | + output=$(echo $output | jq -r $jq_opts "$jq_exp") |
|---|
| 384 | + ret=$? |
|---|
| 385 | + if [[ $ret -ne 0 ]]; then |
|---|
| 386 | + return $ret |
|---|
| 387 | + fi |
|---|
| 388 | + echo $output |
|---|
| 389 | + # return success only in case of non-empty output |
|---|
| 390 | + [ ! -z "$output" ] |
|---|
| 248 | 391 | } |
|---|
| 249 | 392 | |
|---|
| 250 | 393 | lldpad_app_wait_set() |
|---|
| .. | .. |
|---|
| 477 | 620 | ip -j link show dev $if_name | jq -r '.[]["master"]' |
|---|
| 478 | 621 | } |
|---|
| 479 | 622 | |
|---|
| 623 | +link_stats_get() |
|---|
| 624 | +{ |
|---|
| 625 | + local if_name=$1; shift |
|---|
| 626 | + local dir=$1; shift |
|---|
| 627 | + local stat=$1; shift |
|---|
| 628 | + |
|---|
| 629 | + ip -j -s link show dev $if_name \ |
|---|
| 630 | + | jq '.[]["stats64"]["'$dir'"]["'$stat'"]' |
|---|
| 631 | +} |
|---|
| 632 | + |
|---|
| 480 | 633 | link_stats_tx_packets_get() |
|---|
| 481 | 634 | { |
|---|
| 482 | | - local if_name=$1 |
|---|
| 635 | + link_stats_get $1 tx packets |
|---|
| 636 | +} |
|---|
| 483 | 637 | |
|---|
| 484 | | - ip -j -s link show dev $if_name | jq '.[]["stats64"]["tx"]["packets"]' |
|---|
| 638 | +link_stats_rx_errors_get() |
|---|
| 639 | +{ |
|---|
| 640 | + link_stats_get $1 rx errors |
|---|
| 485 | 641 | } |
|---|
| 486 | 642 | |
|---|
| 487 | 643 | tc_rule_stats_get() |
|---|
| .. | .. |
|---|
| 489 | 645 | local dev=$1; shift |
|---|
| 490 | 646 | local pref=$1; shift |
|---|
| 491 | 647 | local dir=$1; shift |
|---|
| 648 | + local selector=${1:-.packets}; shift |
|---|
| 492 | 649 | |
|---|
| 493 | 650 | tc -j -s filter show dev $dev ${dir:-ingress} pref $pref \ |
|---|
| 494 | | - | jq '.[1].options.actions[].stats.packets' |
|---|
| 651 | + | jq ".[1].options.actions[].stats$selector" |
|---|
| 652 | +} |
|---|
| 653 | + |
|---|
| 654 | +tc_rule_handle_stats_get() |
|---|
| 655 | +{ |
|---|
| 656 | + local id=$1; shift |
|---|
| 657 | + local handle=$1; shift |
|---|
| 658 | + local selector=${1:-.packets}; shift |
|---|
| 659 | + |
|---|
| 660 | + tc -j -s filter show $id \ |
|---|
| 661 | + | jq ".[] | select(.options.handle == $handle) | \ |
|---|
| 662 | + .options.actions[0].stats$selector" |
|---|
| 663 | +} |
|---|
| 664 | + |
|---|
| 665 | +ethtool_stats_get() |
|---|
| 666 | +{ |
|---|
| 667 | + local dev=$1; shift |
|---|
| 668 | + local stat=$1; shift |
|---|
| 669 | + |
|---|
| 670 | + ethtool -S $dev | grep "^ *$stat:" | head -n 1 | cut -d: -f2 |
|---|
| 671 | +} |
|---|
| 672 | + |
|---|
| 673 | +qdisc_stats_get() |
|---|
| 674 | +{ |
|---|
| 675 | + local dev=$1; shift |
|---|
| 676 | + local handle=$1; shift |
|---|
| 677 | + local selector=$1; shift |
|---|
| 678 | + |
|---|
| 679 | + tc -j -s qdisc show dev "$dev" \ |
|---|
| 680 | + | jq '.[] | select(.handle == "'"$handle"'") | '"$selector" |
|---|
| 681 | +} |
|---|
| 682 | + |
|---|
| 683 | +qdisc_parent_stats_get() |
|---|
| 684 | +{ |
|---|
| 685 | + local dev=$1; shift |
|---|
| 686 | + local parent=$1; shift |
|---|
| 687 | + local selector=$1; shift |
|---|
| 688 | + |
|---|
| 689 | + tc -j -s qdisc show dev "$dev" invisible \ |
|---|
| 690 | + | jq '.[] | select(.parent == "'"$parent"'") | '"$selector" |
|---|
| 691 | +} |
|---|
| 692 | + |
|---|
| 693 | +ipv6_stats_get() |
|---|
| 694 | +{ |
|---|
| 695 | + local dev=$1; shift |
|---|
| 696 | + local stat=$1; shift |
|---|
| 697 | + |
|---|
| 698 | + cat /proc/net/dev_snmp6/$dev | grep "^$stat" | cut -f2 |
|---|
| 699 | +} |
|---|
| 700 | + |
|---|
| 701 | +humanize() |
|---|
| 702 | +{ |
|---|
| 703 | + local speed=$1; shift |
|---|
| 704 | + |
|---|
| 705 | + for unit in bps Kbps Mbps Gbps; do |
|---|
| 706 | + if (($(echo "$speed < 1024" | bc))); then |
|---|
| 707 | + break |
|---|
| 708 | + fi |
|---|
| 709 | + |
|---|
| 710 | + speed=$(echo "scale=1; $speed / 1024" | bc) |
|---|
| 711 | + done |
|---|
| 712 | + |
|---|
| 713 | + echo "$speed${unit}" |
|---|
| 714 | +} |
|---|
| 715 | + |
|---|
| 716 | +rate() |
|---|
| 717 | +{ |
|---|
| 718 | + local t0=$1; shift |
|---|
| 719 | + local t1=$1; shift |
|---|
| 720 | + local interval=$1; shift |
|---|
| 721 | + |
|---|
| 722 | + echo $((8 * (t1 - t0) / interval)) |
|---|
| 495 | 723 | } |
|---|
| 496 | 724 | |
|---|
| 497 | 725 | mac_get() |
|---|
| .. | .. |
|---|
| 519 | 747 | local value=$1; shift |
|---|
| 520 | 748 | |
|---|
| 521 | 749 | SYSCTL_ORIG[$key]=$(sysctl -n $key) |
|---|
| 522 | | - sysctl -qw $key=$value |
|---|
| 750 | + sysctl -qw $key="$value" |
|---|
| 523 | 751 | } |
|---|
| 524 | 752 | |
|---|
| 525 | 753 | sysctl_restore() |
|---|
| 526 | 754 | { |
|---|
| 527 | 755 | local key=$1; shift |
|---|
| 528 | 756 | |
|---|
| 529 | | - sysctl -qw $key=${SYSCTL_ORIG["$key"]} |
|---|
| 757 | + sysctl -qw $key="${SYSCTL_ORIG[$key]}" |
|---|
| 530 | 758 | } |
|---|
| 531 | 759 | |
|---|
| 532 | 760 | forwarding_enable() |
|---|
| .. | .. |
|---|
| 539 | 767 | { |
|---|
| 540 | 768 | sysctl_restore net.ipv6.conf.all.forwarding |
|---|
| 541 | 769 | sysctl_restore net.ipv4.conf.all.forwarding |
|---|
| 770 | +} |
|---|
| 771 | + |
|---|
| 772 | +declare -A MTU_ORIG |
|---|
| 773 | +mtu_set() |
|---|
| 774 | +{ |
|---|
| 775 | + local dev=$1; shift |
|---|
| 776 | + local mtu=$1; shift |
|---|
| 777 | + |
|---|
| 778 | + MTU_ORIG["$dev"]=$(ip -j link show dev $dev | jq -e '.[].mtu') |
|---|
| 779 | + ip link set dev $dev mtu $mtu |
|---|
| 780 | +} |
|---|
| 781 | + |
|---|
| 782 | +mtu_restore() |
|---|
| 783 | +{ |
|---|
| 784 | + local dev=$1; shift |
|---|
| 785 | + |
|---|
| 786 | + ip link set dev $dev mtu ${MTU_ORIG["$dev"]} |
|---|
| 542 | 787 | } |
|---|
| 543 | 788 | |
|---|
| 544 | 789 | tc_offload_check() |
|---|
| .. | .. |
|---|
| 758 | 1003 | log_info "Expected ratio $weights_ratio Measured ratio $packets_ratio" |
|---|
| 759 | 1004 | } |
|---|
| 760 | 1005 | |
|---|
| 1006 | +in_ns() |
|---|
| 1007 | +{ |
|---|
| 1008 | + local name=$1; shift |
|---|
| 1009 | + |
|---|
| 1010 | + ip netns exec $name bash <<-EOF |
|---|
| 1011 | + NUM_NETIFS=0 |
|---|
| 1012 | + source lib.sh |
|---|
| 1013 | + $(for a in "$@"; do printf "%q${IFS:0:1}" "$a"; done) |
|---|
| 1014 | + EOF |
|---|
| 1015 | +} |
|---|
| 1016 | + |
|---|
| 761 | 1017 | ############################################################################## |
|---|
| 762 | 1018 | # Tests |
|---|
| 763 | 1019 | |
|---|
| .. | .. |
|---|
| 765 | 1021 | { |
|---|
| 766 | 1022 | local if_name=$1 |
|---|
| 767 | 1023 | local dip=$2 |
|---|
| 1024 | + local args=$3 |
|---|
| 768 | 1025 | local vrf_name |
|---|
| 769 | 1026 | |
|---|
| 770 | 1027 | vrf_name=$(master_name_get $if_name) |
|---|
| 771 | | - ip vrf exec $vrf_name $PING $dip -c 10 -i 0.1 -w 2 &> /dev/null |
|---|
| 1028 | + ip vrf exec $vrf_name \ |
|---|
| 1029 | + $PING $args $dip -c 10 -i 0.1 -w $PING_TIMEOUT &> /dev/null |
|---|
| 772 | 1030 | } |
|---|
| 773 | 1031 | |
|---|
| 774 | 1032 | ping_test() |
|---|
| .. | .. |
|---|
| 777 | 1035 | |
|---|
| 778 | 1036 | ping_do $1 $2 |
|---|
| 779 | 1037 | check_err $? |
|---|
| 780 | | - log_test "ping" |
|---|
| 1038 | + log_test "ping$3" |
|---|
| 781 | 1039 | } |
|---|
| 782 | 1040 | |
|---|
| 783 | 1041 | ping6_do() |
|---|
| 784 | 1042 | { |
|---|
| 785 | 1043 | local if_name=$1 |
|---|
| 786 | 1044 | local dip=$2 |
|---|
| 1045 | + local args=$3 |
|---|
| 787 | 1046 | local vrf_name |
|---|
| 788 | 1047 | |
|---|
| 789 | 1048 | vrf_name=$(master_name_get $if_name) |
|---|
| 790 | | - ip vrf exec $vrf_name $PING6 $dip -c 10 -i 0.1 -w 2 &> /dev/null |
|---|
| 1049 | + ip vrf exec $vrf_name \ |
|---|
| 1050 | + $PING6 $args $dip -c 10 -i 0.1 -w $PING_TIMEOUT &> /dev/null |
|---|
| 791 | 1051 | } |
|---|
| 792 | 1052 | |
|---|
| 793 | 1053 | ping6_test() |
|---|
| .. | .. |
|---|
| 796 | 1056 | |
|---|
| 797 | 1057 | ping6_do $1 $2 |
|---|
| 798 | 1058 | check_err $? |
|---|
| 799 | | - log_test "ping6" |
|---|
| 1059 | + log_test "ping6$3" |
|---|
| 800 | 1060 | } |
|---|
| 801 | 1061 | |
|---|
| 802 | 1062 | learning_test() |
|---|
| .. | .. |
|---|
| 819 | 1079 | # FDB entry was installed. |
|---|
| 820 | 1080 | bridge link set dev $br_port1 flood off |
|---|
| 821 | 1081 | |
|---|
| 1082 | + ip link set $host1_if promisc on |
|---|
| 822 | 1083 | tc qdisc add dev $host1_if ingress |
|---|
| 823 | 1084 | tc filter add dev $host1_if ingress protocol ip pref 1 handle 101 \ |
|---|
| 824 | 1085 | flower dst_mac $mac action drop |
|---|
| .. | .. |
|---|
| 829 | 1090 | tc -j -s filter show dev $host1_if ingress \ |
|---|
| 830 | 1091 | | jq -e ".[] | select(.options.handle == 101) \ |
|---|
| 831 | 1092 | | select(.options.actions[0].stats.packets == 1)" &> /dev/null |
|---|
| 832 | | - check_fail $? "Packet reached second host when should not" |
|---|
| 1093 | + check_fail $? "Packet reached first host when should not" |
|---|
| 833 | 1094 | |
|---|
| 834 | 1095 | $MZ $host1_if -c 1 -p 64 -a $mac -t ip -q |
|---|
| 835 | 1096 | sleep 1 |
|---|
| .. | .. |
|---|
| 868 | 1129 | |
|---|
| 869 | 1130 | tc filter del dev $host1_if ingress protocol ip pref 1 handle 101 flower |
|---|
| 870 | 1131 | tc qdisc del dev $host1_if ingress |
|---|
| 1132 | + ip link set $host1_if promisc off |
|---|
| 871 | 1133 | |
|---|
| 872 | 1134 | bridge link set dev $br_port1 flood on |
|---|
| 873 | 1135 | |
|---|
| .. | .. |
|---|
| 885 | 1147 | |
|---|
| 886 | 1148 | # Add an ACL on `host2_if` which will tell us whether the packet |
|---|
| 887 | 1149 | # was flooded to it or not. |
|---|
| 1150 | + ip link set $host2_if promisc on |
|---|
| 888 | 1151 | tc qdisc add dev $host2_if ingress |
|---|
| 889 | 1152 | tc filter add dev $host2_if ingress protocol ip pref 1 handle 101 \ |
|---|
| 890 | 1153 | flower dst_mac $mac action drop |
|---|
| .. | .. |
|---|
| 902 | 1165 | |
|---|
| 903 | 1166 | tc filter del dev $host2_if ingress protocol ip pref 1 handle 101 flower |
|---|
| 904 | 1167 | tc qdisc del dev $host2_if ingress |
|---|
| 1168 | + ip link set $host2_if promisc off |
|---|
| 905 | 1169 | |
|---|
| 906 | 1170 | return $err |
|---|
| 907 | 1171 | } |
|---|
| .. | .. |
|---|
| 962 | 1226 | flood_unicast_test $br_port $host1_if $host2_if |
|---|
| 963 | 1227 | flood_multicast_test $br_port $host1_if $host2_if |
|---|
| 964 | 1228 | } |
|---|
| 1229 | + |
|---|
| 1230 | +__start_traffic() |
|---|
| 1231 | +{ |
|---|
| 1232 | + local proto=$1; shift |
|---|
| 1233 | + local h_in=$1; shift # Where the traffic egresses the host |
|---|
| 1234 | + local sip=$1; shift |
|---|
| 1235 | + local dip=$1; shift |
|---|
| 1236 | + local dmac=$1; shift |
|---|
| 1237 | + |
|---|
| 1238 | + $MZ $h_in -p 8000 -A $sip -B $dip -c 0 \ |
|---|
| 1239 | + -a own -b $dmac -t "$proto" -q "$@" & |
|---|
| 1240 | + sleep 1 |
|---|
| 1241 | +} |
|---|
| 1242 | + |
|---|
| 1243 | +start_traffic() |
|---|
| 1244 | +{ |
|---|
| 1245 | + __start_traffic udp "$@" |
|---|
| 1246 | +} |
|---|
| 1247 | + |
|---|
| 1248 | +start_tcp_traffic() |
|---|
| 1249 | +{ |
|---|
| 1250 | + __start_traffic tcp "$@" |
|---|
| 1251 | +} |
|---|
| 1252 | + |
|---|
| 1253 | +stop_traffic() |
|---|
| 1254 | +{ |
|---|
| 1255 | + # Suppress noise from killing mausezahn. |
|---|
| 1256 | + { kill %% && wait %%; } 2>/dev/null |
|---|
| 1257 | +} |
|---|
| 1258 | + |
|---|
| 1259 | +tcpdump_start() |
|---|
| 1260 | +{ |
|---|
| 1261 | + local if_name=$1; shift |
|---|
| 1262 | + local ns=$1; shift |
|---|
| 1263 | + |
|---|
| 1264 | + capfile=$(mktemp) |
|---|
| 1265 | + capout=$(mktemp) |
|---|
| 1266 | + |
|---|
| 1267 | + if [ -z $ns ]; then |
|---|
| 1268 | + ns_cmd="" |
|---|
| 1269 | + else |
|---|
| 1270 | + ns_cmd="ip netns exec ${ns}" |
|---|
| 1271 | + fi |
|---|
| 1272 | + |
|---|
| 1273 | + if [ -z $SUDO_USER ] ; then |
|---|
| 1274 | + capuser="" |
|---|
| 1275 | + else |
|---|
| 1276 | + capuser="-Z $SUDO_USER" |
|---|
| 1277 | + fi |
|---|
| 1278 | + |
|---|
| 1279 | + $ns_cmd tcpdump -e -n -Q in -i $if_name \ |
|---|
| 1280 | + -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 & |
|---|
| 1281 | + cappid=$! |
|---|
| 1282 | + |
|---|
| 1283 | + sleep 1 |
|---|
| 1284 | +} |
|---|
| 1285 | + |
|---|
| 1286 | +tcpdump_stop() |
|---|
| 1287 | +{ |
|---|
| 1288 | + $ns_cmd kill $cappid |
|---|
| 1289 | + sleep 1 |
|---|
| 1290 | +} |
|---|
| 1291 | + |
|---|
| 1292 | +tcpdump_cleanup() |
|---|
| 1293 | +{ |
|---|
| 1294 | + rm $capfile $capout |
|---|
| 1295 | +} |
|---|
| 1296 | + |
|---|
| 1297 | +tcpdump_show() |
|---|
| 1298 | +{ |
|---|
| 1299 | + tcpdump -e -n -r $capfile 2>&1 |
|---|
| 1300 | +} |
|---|