| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 |
|
| 11 | |
| 12 | ksft_skip=4
|
| 13 |
|
| 14 | |
| 15 | |
| 16 | |
| 17 | kci_net_start()
|
| 18 | {
|
| 19 | netdev=$1
|
| 20 |
|
| 21 | ip link show "$netdev" |grep -q UP
|
| 22 | if [ $? -eq 0 ];then
|
| 23 | echo "SKIP: $netdev: interface already up"
|
| 24 | return $ksft_skip
|
| 25 | fi
|
| 26 |
|
| 27 | ip link set "$netdev" up
|
| 28 | if [ $? -ne 0 ];then
|
| 29 | echo "FAIL: $netdev: Fail to up interface"
|
| 30 | return 1
|
| 31 | else
|
| 32 | echo "PASS: $netdev: set interface up"
|
| 33 | NETDEV_STARTED=1
|
| 34 | fi
|
| 35 | return 0
|
| 36 | }
|
| 37 |
|
| 38 | |
| 39 | |
| 40 | |
| 41 | kci_net_setup()
|
| 42 | {
|
| 43 | netdev=$1
|
| 44 |
|
| 45 | |
| 46 | if [ $NETDEV_STARTED -eq 0 ];then
|
| 47 | return 0
|
| 48 | fi
|
| 49 |
|
| 50 | MACADDR='02:03:04:05:06:07'
|
| 51 | ip link set dev $netdev address "$MACADDR"
|
| 52 | if [ $? -ne 0 ];then
|
| 53 | echo "FAIL: $netdev: Cannot set MAC address"
|
| 54 | else
|
| 55 | ip link show $netdev |grep -q "$MACADDR"
|
| 56 | if [ $? -eq 0 ];then
|
| 57 | echo "PASS: $netdev: set MAC address"
|
| 58 | else
|
| 59 | echo "FAIL: $netdev: Cannot set MAC address"
|
| 60 | fi
|
| 61 | fi
|
| 62 |
|
| 63 | |
| 64 | ip address show "$netdev" |grep '^[[:space:]]*inet'
|
| 65 | if [ $? -eq 0 ];then
|
| 66 | echo "SKIP: $netdev: already have an IP"
|
| 67 | return $ksft_skip
|
| 68 | fi
|
| 69 |
|
| 70 | if [ "$veth_created" ]; then
|
| 71 | echo "XFAIL: $netdev: set IP address unsupported for veth*"
|
| 72 | else
|
| 73 | |
| 74 | echo "SKIP: $netdev: set IP address"
|
| 75 | fi
|
| 76 | return $ksft_skip
|
| 77 | }
|
| 78 |
|
| 79 | |
| 80 | |
| 81 | |
| 82 | |
| 83 | kci_netdev_ethtool_test()
|
| 84 | {
|
| 85 | if [ $# -le 2 ];then
|
| 86 | echo "SKIP: $netdev: ethtool: invalid number of arguments"
|
| 87 | return 1
|
| 88 | fi
|
| 89 | $3 >/dev/null
|
| 90 | ret=$?
|
| 91 | if [ $ret -ne 0 ];then
|
| 92 | if [ $ret -eq "$1" ];then
|
| 93 | echo "XFAIL: $netdev: ethtool $2 not supported"
|
| 94 | return $ksft_skip
|
| 95 | else
|
| 96 | echo "FAIL: $netdev: ethtool $2"
|
| 97 | return 1
|
| 98 | fi
|
| 99 | else
|
| 100 | echo "PASS: $netdev: ethtool $2"
|
| 101 | fi
|
| 102 | return 0
|
| 103 | }
|
| 104 |
|
| 105 | |
| 106 | |
| 107 | kci_netdev_ethtool()
|
| 108 | {
|
| 109 | netdev=$1
|
| 110 |
|
| 111 | |
| 112 | ethtool --version 2>/dev/null >/dev/null
|
| 113 | if [ $? -ne 0 ];then
|
| 114 | echo "SKIP: ethtool not present"
|
| 115 | return $ksft_skip
|
| 116 | fi
|
| 117 |
|
| 118 | TMP_ETHTOOL_FEATURES="$(mktemp)"
|
| 119 | if [ ! -e "$TMP_ETHTOOL_FEATURES" ];then
|
| 120 | echo "SKIP: Cannot create a tmp file"
|
| 121 | return 1
|
| 122 | fi
|
| 123 |
|
| 124 | ethtool -k "$netdev" > "$TMP_ETHTOOL_FEATURES"
|
| 125 | if [ $? -ne 0 ];then
|
| 126 | echo "FAIL: $netdev: ethtool list features"
|
| 127 | rm "$TMP_ETHTOOL_FEATURES"
|
| 128 | return 1
|
| 129 | fi
|
| 130 | echo "PASS: $netdev: ethtool list features"
|
| 131 |
|
| 132 | while read -r FEATURE VALUE FIXED; do
|
| 133 | [ "$FEATURE" != "Features" ] || continue |
| 134 | [ "$FIXED" != "[fixed]" ] || continue |
| 135 | feature="${FEATURE%:*}"
|
| 136 |
|
| 137 | ethtool --offload "$netdev" "$feature" off
|
| 138 | if [ $? -eq 0 ]; then
|
| 139 | echo "PASS: $netdev: Turned off feature: $feature"
|
| 140 | else
|
| 141 | echo "FAIL: $netdev: Failed to turn off feature:" \
|
| 142 | "$feature"
|
| 143 | fi
|
| 144 |
|
| 145 | ethtool --offload "$netdev" "$feature" on
|
| 146 | if [ $? -eq 0 ]; then
|
| 147 | echo "PASS: $netdev: Turned on feature: $feature"
|
| 148 | else
|
| 149 | echo "FAIL: $netdev: Failed to turn on feature:" \
|
| 150 | "$feature"
|
| 151 | fi
|
| 152 |
|
| 153 | |
| 154 | ethtool --offload "$netdev" "$feature" "$VALUE"
|
| 155 | if [ $? -eq 0 ]; then
|
| 156 | echo "PASS: $netdev: Restore feature $feature" \
|
| 157 | "to initial state $VALUE"
|
| 158 | else
|
| 159 | echo "FAIL: $netdev: Failed to restore feature" \
|
| 160 | "$feature to initial state $VALUE"
|
| 161 | fi
|
| 162 |
|
| 163 | done < "$TMP_ETHTOOL_FEATURES"
|
| 164 |
|
| 165 | rm "$TMP_ETHTOOL_FEATURES"
|
| 166 |
|
| 167 | kci_netdev_ethtool_test 74 'dump' "ethtool -d $netdev"
|
| 168 | kci_netdev_ethtool_test 94 'stats' "ethtool -S $netdev"
|
| 169 |
|
| 170 | return 0
|
| 171 | }
|
| 172 |
|
| 173 | |
| 174 | |
| 175 | kci_netdev_stop()
|
| 176 | {
|
| 177 | netdev=$1
|
| 178 |
|
| 179 | if [ $NETDEV_STARTED -eq 0 ];then
|
| 180 | echo "SKIP: $netdev: interface kept up"
|
| 181 | return 0
|
| 182 | fi
|
| 183 |
|
| 184 | ip link set "$netdev" down
|
| 185 | if [ $? -ne 0 ];then
|
| 186 | echo "FAIL: $netdev: stop interface"
|
| 187 | return 1
|
| 188 | fi
|
| 189 | echo "PASS: $netdev: stop interface"
|
| 190 | return 0
|
| 191 | }
|
| 192 |
|
| 193 | |
| 194 | |
| 195 | kci_test_netdev()
|
| 196 | {
|
| 197 | NETDEV_STARTED=0
|
| 198 | IFACE_TO_UPDOWN="$1"
|
| 199 | IFACE_TO_TEST="$1"
|
| 200 | |
| 201 | MASTER_IFACE="$(echo $1 | cut -d@ -f2)"
|
| 202 | if [ ! -z "$MASTER_IFACE" ];then
|
| 203 | IFACE_TO_UPDOWN="$MASTER_IFACE"
|
| 204 | IFACE_TO_TEST="$(echo $1 | cut -d@ -f1)"
|
| 205 | fi
|
| 206 |
|
| 207 | NETDEV_STARTED=0
|
| 208 | kci_net_start "$IFACE_TO_UPDOWN"
|
| 209 |
|
| 210 | kci_net_setup "$IFACE_TO_TEST"
|
| 211 |
|
| 212 | kci_netdev_ethtool "$IFACE_TO_TEST"
|
| 213 |
|
| 214 | kci_netdev_stop "$IFACE_TO_UPDOWN"
|
| 215 | return 0
|
| 216 | }
|
| 217 |
|
| 218 | |
| 219 | if [ "$(id -u)" -ne 0 ];then
|
| 220 | echo "SKIP: Need root privileges"
|
| 221 | exit $ksft_skip
|
| 222 | fi
|
| 223 |
|
| 224 | ip link show 2>/dev/null >/dev/null
|
| 225 | if [ $? -ne 0 ];then
|
| 226 | echo "SKIP: Could not run test without the ip tool"
|
| 227 | exit $ksft_skip
|
| 228 | fi
|
| 229 |
|
| 230 | TMP_LIST_NETDEV="$(mktemp)"
|
| 231 | if [ ! -e "$TMP_LIST_NETDEV" ];then
|
| 232 | echo "FAIL: Cannot create a tmp file"
|
| 233 | exit 1
|
| 234 | fi
|
| 235 |
|
| 236 | ip link show |grep '^[0-9]' | grep -oE '[[:space:]].*eth[0-9]*:|[[:space:]].*enp[0-9]s[0-9]:' | cut -d\ -f2 | cut -d: -f1> "$TMP_LIST_NETDEV"
|
| 237 |
|
| 238 | if [ ! -s "$TMP_LIST_NETDEV" ]; then
|
| 239 | echo "No valid network device found, creating veth pair"
|
| 240 | ip link add veth0 type veth peer name veth1
|
| 241 | echo "veth0" > "$TMP_LIST_NETDEV"
|
| 242 | veth_created=1
|
| 243 | fi
|
| 244 |
|
| 245 | while read netdev
|
| 246 | do
|
| 247 | kci_test_netdev "$netdev"
|
| 248 | done < "$TMP_LIST_NETDEV"
|
| 249 |
|
| 250 | |
| 251 | if [ "$veth_created" ]; then
|
| 252 | ip link delete veth0
|
| 253 | echo "Removed veth pair"
|
| 254 | fi
|
| 255 |
|
| 256 | rm "$TMP_LIST_NETDEV"
|
| 257 | exit 0
|