100 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# This assumes running on a host with two virtio interfaces connected5# back to back. Example script to do such wire-up of tap devices would6# look like this:7#8# =======================================================================================================9# #!/bin/bash10#11# DEV1="$1"12# DEV2="$2"13#14# sudo tc qdisc add dev $DEV1 clsact15# sudo tc qdisc add dev $DEV2 clsact16# sudo tc filter add dev $DEV1 ingress protocol all pref 1 matchall action mirred egress redirect dev $DEV217# sudo tc filter add dev $DEV2 ingress protocol all pref 1 matchall action mirred egress redirect dev $DEV118# sudo ip link set $DEV1 up19# sudo ip link set $DEV2 up20# =======================================================================================================21 22REQUIRE_MZ="no"23NETIF_CREATE="no"24NETIF_FIND_DRIVER="virtio_net"25NUM_NETIFS=226 27H1_IPV4="192.0.2.1"28H2_IPV4="192.0.2.2"29H1_IPV6="2001:db8:1::1"30H2_IPV6="2001:db8:1::2"31 32VIRTIO_NET_F_MAC=533 34virtio_device_get()35{36 local dev=$1; shift37 local device_path="/sys/class/net/$dev/device/"38 39 basename `realpath $device_path`40}41 42virtio_device_rebind()43{44 local dev=$1; shift45 local device=`virtio_device_get $dev`46 47 echo "$device" > /sys/bus/virtio/drivers/virtio_net/unbind48 echo "$device" > /sys/bus/virtio/drivers/virtio_net/bind49}50 51virtio_debugfs_get()52{53 local dev=$1; shift54 local device=`virtio_device_get $dev`55 56 echo /sys/kernel/debug/virtio/$device/57}58 59check_virtio_debugfs()60{61 local dev=$1; shift62 local debugfs=`virtio_debugfs_get $dev`63 64 if [ ! -f "$debugfs/device_features" ] ||65 [ ! -f "$debugfs/filter_feature_add" ] ||66 [ ! -f "$debugfs/filter_feature_del" ] ||67 [ ! -f "$debugfs/filter_features" ] ||68 [ ! -f "$debugfs/filter_features_clear" ]; then69 echo "SKIP: not possible to access debugfs for $dev"70 exit $ksft_skip71 fi72}73 74virtio_feature_present()75{76 local dev=$1; shift77 local feature=$1; shift78 local debugfs=`virtio_debugfs_get $dev`79 80 cat $debugfs/device_features |grep "^$feature$" &> /dev/null81 return $?82}83 84virtio_filter_features_clear()85{86 local dev=$1; shift87 local debugfs=`virtio_debugfs_get $dev`88 89 echo "1" > $debugfs/filter_features_clear90}91 92virtio_filter_feature_add()93{94 local dev=$1; shift95 local feature=$1; shift96 local debugfs=`virtio_debugfs_get $dev`97 98 echo "$feature" > $debugfs/filter_feature_add99}100