netdevice.sh 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #!/bin/sh
  2. # SPDX-License-Identifier: GPL-2.0
  3. #
  4. # This test is for checking network interface
  5. # For the moment it tests only ethernet interface (but wifi could be easily added)
  6. #
  7. # We assume that all network driver are loaded
  8. # if not they probably have failed earlier in the boot process and their logged error will be catched by another test
  9. #
  10. # Kselftest framework requirement - SKIP code is 4.
  11. ksft_skip=4
  12. # this function will try to up the interface
  13. # if already up, nothing done
  14. # arg1: network interface name
  15. kci_net_start()
  16. {
  17. netdev=$1
  18. ip link show "$netdev" |grep -q UP
  19. if [ $? -eq 0 ];then
  20. echo "SKIP: $netdev: interface already up"
  21. return $ksft_skip
  22. fi
  23. ip link set "$netdev" up
  24. if [ $? -ne 0 ];then
  25. echo "FAIL: $netdev: Fail to up interface"
  26. return 1
  27. else
  28. echo "PASS: $netdev: set interface up"
  29. NETDEV_STARTED=1
  30. fi
  31. return 0
  32. }
  33. # this function will try to setup an IP and MAC address on a network interface
  34. # Doing nothing if the interface was already up
  35. # arg1: network interface name
  36. kci_net_setup()
  37. {
  38. netdev=$1
  39. # do nothing if the interface was already up
  40. if [ $NETDEV_STARTED -eq 0 ];then
  41. return 0
  42. fi
  43. MACADDR='02:03:04:05:06:07'
  44. ip link set dev $netdev address "$MACADDR"
  45. if [ $? -ne 0 ];then
  46. echo "FAIL: $netdev: Cannot set MAC address"
  47. else
  48. ip link show $netdev |grep -q "$MACADDR"
  49. if [ $? -eq 0 ];then
  50. echo "PASS: $netdev: set MAC address"
  51. else
  52. echo "FAIL: $netdev: Cannot set MAC address"
  53. fi
  54. fi
  55. #check that the interface did not already have an IP
  56. ip address show "$netdev" |grep '^[[:space:]]*inet'
  57. if [ $? -eq 0 ];then
  58. echo "SKIP: $netdev: already have an IP"
  59. return $ksft_skip
  60. fi
  61. # TODO what ipaddr to set ? DHCP ?
  62. echo "SKIP: $netdev: set IP address"
  63. return $ksft_skip
  64. }
  65. # test an ethtool command
  66. # arg1: return code for not supported (see ethtool code source)
  67. # arg2: summary of the command
  68. # arg3: command to execute
  69. kci_netdev_ethtool_test()
  70. {
  71. if [ $# -le 2 ];then
  72. echo "SKIP: $netdev: ethtool: invalid number of arguments"
  73. return 1
  74. fi
  75. $3 >/dev/null
  76. ret=$?
  77. if [ $ret -ne 0 ];then
  78. if [ $ret -eq "$1" ];then
  79. echo "SKIP: $netdev: ethtool $2 not supported"
  80. return $ksft_skip
  81. else
  82. echo "FAIL: $netdev: ethtool $2"
  83. return 1
  84. fi
  85. else
  86. echo "PASS: $netdev: ethtool $2"
  87. fi
  88. return 0
  89. }
  90. # test ethtool commands
  91. # arg1: network interface name
  92. kci_netdev_ethtool()
  93. {
  94. netdev=$1
  95. #check presence of ethtool
  96. ethtool --version 2>/dev/null >/dev/null
  97. if [ $? -ne 0 ];then
  98. echo "SKIP: ethtool not present"
  99. return $ksft_skip
  100. fi
  101. TMP_ETHTOOL_FEATURES="$(mktemp)"
  102. if [ ! -e "$TMP_ETHTOOL_FEATURES" ];then
  103. echo "SKIP: Cannot create a tmp file"
  104. return 1
  105. fi
  106. ethtool -k "$netdev" > "$TMP_ETHTOOL_FEATURES"
  107. if [ $? -ne 0 ];then
  108. echo "FAIL: $netdev: ethtool list features"
  109. rm "$TMP_ETHTOOL_FEATURES"
  110. return 1
  111. fi
  112. echo "PASS: $netdev: ethtool list features"
  113. #TODO for each non fixed features, try to turn them on/off
  114. rm "$TMP_ETHTOOL_FEATURES"
  115. kci_netdev_ethtool_test 74 'dump' "ethtool -d $netdev"
  116. kci_netdev_ethtool_test 94 'stats' "ethtool -S $netdev"
  117. return 0
  118. }
  119. # stop a netdev
  120. # arg1: network interface name
  121. kci_netdev_stop()
  122. {
  123. netdev=$1
  124. if [ $NETDEV_STARTED -eq 0 ];then
  125. echo "SKIP: $netdev: interface kept up"
  126. return 0
  127. fi
  128. ip link set "$netdev" down
  129. if [ $? -ne 0 ];then
  130. echo "FAIL: $netdev: stop interface"
  131. return 1
  132. fi
  133. echo "PASS: $netdev: stop interface"
  134. return 0
  135. }
  136. # run all test on a netdev
  137. # arg1: network interface name
  138. kci_test_netdev()
  139. {
  140. NETDEV_STARTED=0
  141. IFACE_TO_UPDOWN="$1"
  142. IFACE_TO_TEST="$1"
  143. #check for VLAN interface
  144. MASTER_IFACE="$(echo $1 | cut -d@ -f2)"
  145. if [ ! -z "$MASTER_IFACE" ];then
  146. IFACE_TO_UPDOWN="$MASTER_IFACE"
  147. IFACE_TO_TEST="$(echo $1 | cut -d@ -f1)"
  148. fi
  149. NETDEV_STARTED=0
  150. kci_net_start "$IFACE_TO_UPDOWN"
  151. kci_net_setup "$IFACE_TO_TEST"
  152. kci_netdev_ethtool "$IFACE_TO_TEST"
  153. kci_netdev_stop "$IFACE_TO_UPDOWN"
  154. return 0
  155. }
  156. #check for needed privileges
  157. if [ "$(id -u)" -ne 0 ];then
  158. echo "SKIP: Need root privileges"
  159. exit $ksft_skip
  160. fi
  161. ip link show 2>/dev/null >/dev/null
  162. if [ $? -ne 0 ];then
  163. echo "SKIP: Could not run test without the ip tool"
  164. exit $ksft_skip
  165. fi
  166. TMP_LIST_NETDEV="$(mktemp)"
  167. if [ ! -e "$TMP_LIST_NETDEV" ];then
  168. echo "FAIL: Cannot create a tmp file"
  169. exit 1
  170. fi
  171. 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"
  172. while read netdev
  173. do
  174. kci_test_netdev "$netdev"
  175. done < "$TMP_LIST_NETDEV"
  176. rm "$TMP_LIST_NETDEV"
  177. exit 0