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