xref: /aosp_15_r20/external/ethtool/test-features.c (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1*1b481fc3SMaciej Żenczykowski /****************************************************************************
2*1b481fc3SMaciej Żenczykowski  * Test cases for ethtool features
3*1b481fc3SMaciej Żenczykowski  * Copyright 2012 Solarflare Communications Inc.
4*1b481fc3SMaciej Żenczykowski  *
5*1b481fc3SMaciej Żenczykowski  * This program is free software; you can redistribute it and/or modify it
6*1b481fc3SMaciej Żenczykowski  * under the terms of the GNU General Public License version 2 as published
7*1b481fc3SMaciej Żenczykowski  * by the Free Software Foundation, incorporated herein by reference.
8*1b481fc3SMaciej Żenczykowski  */
9*1b481fc3SMaciej Żenczykowski 
10*1b481fc3SMaciej Żenczykowski #include <errno.h>
11*1b481fc3SMaciej Żenczykowski #include <stdio.h>
12*1b481fc3SMaciej Żenczykowski #include <stdlib.h>
13*1b481fc3SMaciej Żenczykowski #include <string.h>
14*1b481fc3SMaciej Żenczykowski #define TEST_NO_WRAPPERS
15*1b481fc3SMaciej Żenczykowski #include "internal.h"
16*1b481fc3SMaciej Żenczykowski 
17*1b481fc3SMaciej Żenczykowski static const struct {
18*1b481fc3SMaciej Żenczykowski 	struct ethtool_sset_info cmd;
19*1b481fc3SMaciej Żenczykowski 	u32 data[1];
20*1b481fc3SMaciej Żenczykowski }
21*1b481fc3SMaciej Żenczykowski cmd_gssetinfo = { { ETHTOOL_GSSET_INFO, 0, 1ULL << ETH_SS_FEATURES }, { 34 } };
22*1b481fc3SMaciej Żenczykowski 
23*1b481fc3SMaciej Żenczykowski static const struct ethtool_value
24*1b481fc3SMaciej Żenczykowski cmd_grxcsum_off = { ETHTOOL_GRXCSUM, 0 },
25*1b481fc3SMaciej Żenczykowski cmd_grxcsum_on = { ETHTOOL_GRXCSUM, 1 },
26*1b481fc3SMaciej Żenczykowski cmd_srxcsum_off = { ETHTOOL_SRXCSUM, 0 },
27*1b481fc3SMaciej Żenczykowski cmd_srxcsum_on = { ETHTOOL_SRXCSUM, 1 },
28*1b481fc3SMaciej Żenczykowski cmd_gtxcsum_off = { ETHTOOL_GTXCSUM, 0 },
29*1b481fc3SMaciej Żenczykowski cmd_gtxcsum_on = { ETHTOOL_GTXCSUM, 1 },
30*1b481fc3SMaciej Żenczykowski cmd_stxcsum_off = { ETHTOOL_STXCSUM, 0 },
31*1b481fc3SMaciej Żenczykowski cmd_stxcsum_on = { ETHTOOL_STXCSUM, 1 },
32*1b481fc3SMaciej Żenczykowski cmd_gsg_off = { ETHTOOL_GSG, 0 },
33*1b481fc3SMaciej Żenczykowski cmd_gsg_on = { ETHTOOL_GSG, 1 },
34*1b481fc3SMaciej Żenczykowski cmd_ssg_off = { ETHTOOL_SSG, 0 },
35*1b481fc3SMaciej Żenczykowski cmd_ssg_on = { ETHTOOL_SSG, 1 },
36*1b481fc3SMaciej Żenczykowski cmd_gtso_off = { ETHTOOL_GTSO, 0 },
37*1b481fc3SMaciej Żenczykowski cmd_gtso_on = { ETHTOOL_GTSO, 1 },
38*1b481fc3SMaciej Żenczykowski cmd_stso_off = { ETHTOOL_STSO, 0 },
39*1b481fc3SMaciej Żenczykowski cmd_stso_on = { ETHTOOL_STSO, 1 },
40*1b481fc3SMaciej Żenczykowski cmd_gufo_off = { ETHTOOL_GUFO, 0 },
41*1b481fc3SMaciej Żenczykowski cmd_gufo_on = { ETHTOOL_GUFO, 1 },
42*1b481fc3SMaciej Żenczykowski cmd_sufo_off = { ETHTOOL_SUFO, 0 },
43*1b481fc3SMaciej Żenczykowski cmd_sufo_on = { ETHTOOL_SUFO, 1 },
44*1b481fc3SMaciej Żenczykowski cmd_ggso_off = { ETHTOOL_GGSO, 0 },
45*1b481fc3SMaciej Żenczykowski cmd_ggso_on = { ETHTOOL_GGSO, 1 },
46*1b481fc3SMaciej Żenczykowski cmd_sgso_off = { ETHTOOL_SGSO, 0 },
47*1b481fc3SMaciej Żenczykowski cmd_sgso_on = { ETHTOOL_SGSO, 1 },
48*1b481fc3SMaciej Żenczykowski cmd_ggro_off = { ETHTOOL_GGRO, 0 },
49*1b481fc3SMaciej Żenczykowski cmd_ggro_on = { ETHTOOL_GGRO, 1 },
50*1b481fc3SMaciej Żenczykowski cmd_sgro_off = { ETHTOOL_SGRO, 0 },
51*1b481fc3SMaciej Żenczykowski cmd_sgro_on = { ETHTOOL_SGRO, 1 },
52*1b481fc3SMaciej Żenczykowski cmd_gflags_off = { ETHTOOL_GFLAGS, 0 },
53*1b481fc3SMaciej Żenczykowski cmd_gflags_on = { ETHTOOL_GFLAGS,
54*1b481fc3SMaciej Żenczykowski 		  ETH_FLAG_LRO | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN |
55*1b481fc3SMaciej Żenczykowski 		  ETH_FLAG_NTUPLE | ETH_FLAG_RXHASH },
56*1b481fc3SMaciej Żenczykowski cmd_sflags_off = { ETHTOOL_SFLAGS, 0 },
57*1b481fc3SMaciej Żenczykowski cmd_sflags_ntuple = { ETHTOOL_GFLAGS, ETH_FLAG_NTUPLE },
58*1b481fc3SMaciej Żenczykowski cmd_sflags_on = { ETHTOOL_SFLAGS,
59*1b481fc3SMaciej Żenczykowski 		  ETH_FLAG_LRO | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN |
60*1b481fc3SMaciej Żenczykowski 		  ETH_FLAG_NTUPLE | ETH_FLAG_RXHASH },
61*1b481fc3SMaciej Żenczykowski cmd_sflags_not_rxhash = { ETHTOOL_SFLAGS,
62*1b481fc3SMaciej Żenczykowski 			  ETH_FLAG_LRO | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN |
63*1b481fc3SMaciej Żenczykowski 			  ETH_FLAG_NTUPLE };
64*1b481fc3SMaciej Żenczykowski 
65*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_get_strings_old[] = {
66*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd), -EINVAL },
67*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
68*1b481fc3SMaciej Żenczykowski };
69*1b481fc3SMaciej Żenczykowski 
70*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_get_features_off_old[] = {
71*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd), -EINVAL },
72*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
73*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
74*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
75*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
76*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
77*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
78*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
79*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
80*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
81*1b481fc3SMaciej Żenczykowski };
82*1b481fc3SMaciej Żenczykowski 
83*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_get_features_off_old_some_unsup[] = {
84*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd), -EINVAL },
85*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
86*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
87*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
88*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
89*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, -EOPNOTSUPP },
90*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
91*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4, -EOPNOTSUPP },
92*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
93*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
94*1b481fc3SMaciej Żenczykowski };
95*1b481fc3SMaciej Żenczykowski 
96*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_get_features_off_old_some_priv[] = {
97*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd), -EPERM },
98*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
99*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
100*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
101*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
102*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
103*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
104*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4, -EPERM },
105*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
106*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
107*1b481fc3SMaciej Żenczykowski };
108*1b481fc3SMaciej Żenczykowski 
109*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_set_features_off_old[] = {
110*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd), -EINVAL },
111*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_on, 4, 0, &cmd_grxcsum_on, sizeof(cmd_grxcsum_on) },
112*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_on, 4, 0, &cmd_gtxcsum_on, sizeof(cmd_gtxcsum_on) },
113*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_on, 4, 0, &cmd_gsg_on, sizeof(cmd_gsg_on) },
114*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_on, 4, 0, &cmd_gtso_on, sizeof(cmd_gtso_on) },
115*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_on, 4, 0, &cmd_gufo_on, sizeof(cmd_gufo_on) },
116*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_on, 4, 0, &cmd_ggso_on, sizeof(cmd_ggso_on) },
117*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_on, 4,0, &cmd_ggro_on, sizeof(cmd_ggro_on) },
118*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_on, 4, 0, &cmd_gflags_on, sizeof(cmd_sflags_on) },
119*1b481fc3SMaciej Żenczykowski 	{ &cmd_srxcsum_off, sizeof(cmd_srxcsum_off), 0, 0, 0 },
120*1b481fc3SMaciej Żenczykowski 	{ &cmd_stxcsum_off, sizeof(cmd_stxcsum_off), 0, 0, 0 },
121*1b481fc3SMaciej Żenczykowski 	{ &cmd_ssg_off, sizeof(cmd_ssg_off), 0, 0, 0 },
122*1b481fc3SMaciej Żenczykowski 	{ &cmd_stso_off, sizeof(cmd_stso_off), 0, 0, 0 },
123*1b481fc3SMaciej Żenczykowski 	{ &cmd_sufo_off, sizeof(cmd_sufo_off), 0, 0, 0 },
124*1b481fc3SMaciej Żenczykowski 	{ &cmd_sgso_off, sizeof(cmd_sgso_off), 0, 0, 0 },
125*1b481fc3SMaciej Żenczykowski 	{ &cmd_sgro_off, sizeof(cmd_sgro_off), 0, 0, 0 },
126*1b481fc3SMaciej Żenczykowski 	{ &cmd_sflags_off, sizeof(cmd_sflags_off), 0, 0, 0 },
127*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
128*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
129*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
130*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
131*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
132*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
133*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
134*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_sflags_off) },
135*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
136*1b481fc3SMaciej Żenczykowski };
137*1b481fc3SMaciej Żenczykowski 
138*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_set_features_on_old[] = {
139*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd), -EINVAL },
140*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
141*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
142*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
143*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
144*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
145*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
146*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
147*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
148*1b481fc3SMaciej Żenczykowski 	{ &cmd_srxcsum_on, sizeof(cmd_srxcsum_on), 0, 0, 0 },
149*1b481fc3SMaciej Żenczykowski 	{ &cmd_stxcsum_on, sizeof(cmd_stxcsum_on), 0, 0, 0 },
150*1b481fc3SMaciej Żenczykowski 	{ &cmd_ssg_on, sizeof(cmd_ssg_on), 0, 0, 0 },
151*1b481fc3SMaciej Żenczykowski 	{ &cmd_stso_on, sizeof(cmd_stso_on), 0, 0, 0 },
152*1b481fc3SMaciej Żenczykowski 	{ &cmd_sufo_on, sizeof(cmd_sufo_on), 0, 0, 0 },
153*1b481fc3SMaciej Żenczykowski 	{ &cmd_sgso_on, sizeof(cmd_sgso_on), 0, 0, 0 },
154*1b481fc3SMaciej Żenczykowski 	{ &cmd_sgro_on, sizeof(cmd_sgro_on), 0, 0, 0 },
155*1b481fc3SMaciej Żenczykowski 	{ &cmd_sflags_on, sizeof(cmd_sflags_on), 0, 0, 0 },
156*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_on, 4, 0, &cmd_grxcsum_on, sizeof(cmd_grxcsum_on) },
157*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_on, 4, 0, &cmd_gtxcsum_on, sizeof(cmd_gtxcsum_on) },
158*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_on, 4, 0, &cmd_gsg_on, sizeof(cmd_gsg_on) },
159*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_on, 4, 0, &cmd_gtso_on, sizeof(cmd_gtso_on) },
160*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_on, 4, 0, &cmd_gufo_on, sizeof(cmd_gufo_on) },
161*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_on, 4, 0, &cmd_ggso_on, sizeof(cmd_ggso_on) },
162*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_on, 4,0, &cmd_ggro_on, sizeof(cmd_ggro_on) },
163*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_on, 4, 0, &cmd_gflags_on, sizeof(cmd_sflags_on) },
164*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
165*1b481fc3SMaciej Żenczykowski };
166*1b481fc3SMaciej Żenczykowski 
167*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_set_features_unsup_on_old[] = {
168*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd), -EINVAL },
169*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
170*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
171*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
172*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
173*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
174*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
175*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
176*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
177*1b481fc3SMaciej Żenczykowski 	{ &cmd_stxcsum_on, sizeof(cmd_stxcsum_on), -EOPNOTSUPP },
178*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
179*1b481fc3SMaciej Żenczykowski };
180*1b481fc3SMaciej Żenczykowski 
181*1b481fc3SMaciej Żenczykowski static const struct {
182*1b481fc3SMaciej Żenczykowski 	struct ethtool_gstrings cmd;
183*1b481fc3SMaciej Żenczykowski 	u8 data[34][ETH_GSTRING_LEN];
184*1b481fc3SMaciej Żenczykowski }
185*1b481fc3SMaciej Żenczykowski cmd_gstrings = {
186*1b481fc3SMaciej Żenczykowski 	{ ETHTOOL_GSTRINGS, ETH_SS_FEATURES, 34 },
187*1b481fc3SMaciej Żenczykowski 	{
188*1b481fc3SMaciej Żenczykowski 		"tx-scatter-gather",
189*1b481fc3SMaciej Żenczykowski 		"tx-checksum-ipv4",
190*1b481fc3SMaciej Żenczykowski 		"",
191*1b481fc3SMaciej Żenczykowski 		"tx-checksum-ip-generic",
192*1b481fc3SMaciej Żenczykowski 		"tx-checksum-ipv6",
193*1b481fc3SMaciej Żenczykowski 		"highdma",
194*1b481fc3SMaciej Żenczykowski 		"tx-scatter-gather-fraglist",
195*1b481fc3SMaciej Żenczykowski 		"tx-vlan-hw-insert",
196*1b481fc3SMaciej Żenczykowski 		"rx-vlan-hw-parse",
197*1b481fc3SMaciej Żenczykowski 		"rx-vlan-filter",
198*1b481fc3SMaciej Żenczykowski 		"vlan-challenged",
199*1b481fc3SMaciej Żenczykowski 		"tx-generic-segmentation",
200*1b481fc3SMaciej Żenczykowski 		"tx-lockless",
201*1b481fc3SMaciej Żenczykowski 		"netns-local",
202*1b481fc3SMaciej Żenczykowski 		"rx-gro",
203*1b481fc3SMaciej Żenczykowski 		"rx-lro",
204*1b481fc3SMaciej Żenczykowski 		"tx-tcp-segmentation",
205*1b481fc3SMaciej Żenczykowski 		"tx-udp-fragmentation",
206*1b481fc3SMaciej Żenczykowski 		"tx-gso-robust",
207*1b481fc3SMaciej Żenczykowski 		"tx-tcp-ecn-segmentation",
208*1b481fc3SMaciej Żenczykowski 		"tx-tcp6-segmentation",
209*1b481fc3SMaciej Żenczykowski 		"tx-fcoe-segmentation",
210*1b481fc3SMaciej Żenczykowski 		"",
211*1b481fc3SMaciej Żenczykowski 		"",
212*1b481fc3SMaciej Żenczykowski 		"tx-checksum-fcoe-crc",
213*1b481fc3SMaciej Żenczykowski 		"tx-checksum-sctp",
214*1b481fc3SMaciej Żenczykowski 		"fcoe-mtu",
215*1b481fc3SMaciej Żenczykowski 		"rx-ntuple-filter",
216*1b481fc3SMaciej Żenczykowski 		"rx-hashing",
217*1b481fc3SMaciej Żenczykowski 		"rx-checksum",
218*1b481fc3SMaciej Żenczykowski 		"tx-nocache-copy",
219*1b481fc3SMaciej Żenczykowski 		"loopback",
220*1b481fc3SMaciej Żenczykowski 		"rx-fcs",
221*1b481fc3SMaciej Żenczykowski 		"rx-all",
222*1b481fc3SMaciej Żenczykowski 	}
223*1b481fc3SMaciej Żenczykowski };
224*1b481fc3SMaciej Żenczykowski 
225*1b481fc3SMaciej Żenczykowski static const struct {
226*1b481fc3SMaciej Żenczykowski 	struct ethtool_gfeatures cmd;
227*1b481fc3SMaciej Żenczykowski 	struct ethtool_get_features_block data[2];
228*1b481fc3SMaciej Żenczykowski }
229*1b481fc3SMaciej Żenczykowski 			    /* available   requested   active   never_changed */
230*1b481fc3SMaciej Żenczykowski /* minimal: only GRO and GSO are available (and GSO won't work) */
231*1b481fc3SMaciej Żenczykowski cmd_gfeatures_min_off =   { { ETHTOOL_GFEATURES, 2 },
232*1b481fc3SMaciej Żenczykowski 			    {{ 0x00004800, 0x00000000, 0x00000000, 0x00003400},
233*1b481fc3SMaciej Żenczykowski 			     { 0x00000000, 0x00000000, 0x00000000, 0x00000000}}
234*1b481fc3SMaciej Żenczykowski },
235*1b481fc3SMaciej Żenczykowski cmd_gfeatures_min_on =    { { ETHTOOL_GFEATURES, 2 },
236*1b481fc3SMaciej Żenczykowski 			    {{ 0x00004800, 0x00004800, 0x00004000, 0x00003400},
237*1b481fc3SMaciej Żenczykowski 			     { 0x00000000, 0x00000000, 0x00000000, 0x00000000}}
238*1b481fc3SMaciej Żenczykowski },
239*1b481fc3SMaciej Żenczykowski /* maximal: everything that isn't never-changed is available */
240*1b481fc3SMaciej Żenczykowski cmd_gfeatures_max_off =   { { ETHTOOL_GFEATURES, 2 },
241*1b481fc3SMaciej Żenczykowski 			    {{ 0xffffcbff, 0x00000000, 0x00000000, 0x00003400 },
242*1b481fc3SMaciej Żenczykowski 			     { 0x00000003, 0x00000000, 0x00000000, 0x00000000 }}
243*1b481fc3SMaciej Żenczykowski },
244*1b481fc3SMaciej Żenczykowski cmd_gfeatures_max_on =    { { ETHTOOL_GFEATURES, 2 },
245*1b481fc3SMaciej Żenczykowski 			    {{ 0xffffcbff, 0xffffcbff, 0xffffcbff, 0x00003400 },
246*1b481fc3SMaciej Żenczykowski 			     { 0x00000003, 0x00000003, 0x00000003, 0x00000000 }}
247*1b481fc3SMaciej Żenczykowski },
248*1b481fc3SMaciej Żenczykowski /* IPv4: GRO, GSO, SG and some IPv4-specific offloads are available */
249*1b481fc3SMaciej Żenczykowski cmd_gfeatures_ipv4_off =  { { ETHTOOL_GFEATURES, 2 },
250*1b481fc3SMaciej Żenczykowski 			    {{ 0x00014803, 0x00000000, 0x00000000, 0x00003400 },
251*1b481fc3SMaciej Żenczykowski 			     { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }}
252*1b481fc3SMaciej Żenczykowski },
253*1b481fc3SMaciej Żenczykowski cmd_gfeatures_ipv4_on =   { { ETHTOOL_GFEATURES, 2 },
254*1b481fc3SMaciej Żenczykowski 			    {{ 0x00014803, 0x00014803, 0x00014803, 0x00003400 },
255*1b481fc3SMaciej Żenczykowski 			     { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }}
256*1b481fc3SMaciej Żenczykowski };
257*1b481fc3SMaciej Żenczykowski 
258*1b481fc3SMaciej Żenczykowski static const struct {
259*1b481fc3SMaciej Żenczykowski 	struct ethtool_sfeatures cmd;
260*1b481fc3SMaciej Żenczykowski 	struct ethtool_set_features_block data[2];
261*1b481fc3SMaciej Żenczykowski }
262*1b481fc3SMaciej Żenczykowski 			    /* valid       requested */
263*1b481fc3SMaciej Żenczykowski cmd_sfeatures_min_on =   { { ETHTOOL_SFEATURES, 2 },
264*1b481fc3SMaciej Żenczykowski 			    {{ 0x00004800, 0x00004800 },
265*1b481fc3SMaciej Żenczykowski 			     { 0x00000000, 0x00000000 }} },
266*1b481fc3SMaciej Żenczykowski cmd_sfeatures_min_off =  { { ETHTOOL_SFEATURES, 2 },
267*1b481fc3SMaciej Żenczykowski 			    {{ 0x00004800, 0x00000000 },
268*1b481fc3SMaciej Żenczykowski 			     { 0x00000000, 0x00000000 }} },
269*1b481fc3SMaciej Żenczykowski cmd_sfeatures_noop =     { { ETHTOOL_SFEATURES, 2 },
270*1b481fc3SMaciej Żenczykowski 			    {{ 0x00000000, 0x00000000 },
271*1b481fc3SMaciej Żenczykowski 			     { 0x00000000, 0x00000000 }} },
272*1b481fc3SMaciej Żenczykowski cmd_sfeatures_ipv4_on =  { { ETHTOOL_SFEATURES, 2 },
273*1b481fc3SMaciej Żenczykowski 			    {{ 0x00014803, 0x00014803 },
274*1b481fc3SMaciej Żenczykowski 			     { 0x00000000, 0x00000000 }} };
275*1b481fc3SMaciej Żenczykowski 
276*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_get_strings[] = {
277*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd),
278*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gssetinfo, sizeof(cmd_gssetinfo) },
279*1b481fc3SMaciej Żenczykowski 	{ &cmd_gstrings, sizeof(cmd_gstrings.cmd),
280*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gstrings, sizeof(cmd_gstrings) },
281*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
282*1b481fc3SMaciej Żenczykowski };
283*1b481fc3SMaciej Żenczykowski 
284*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_get_features_min_off[] = {
285*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd),
286*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gssetinfo, sizeof(cmd_gssetinfo) },
287*1b481fc3SMaciej Żenczykowski 	{ &cmd_gstrings, sizeof(cmd_gstrings.cmd),
288*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gstrings, sizeof(cmd_gstrings) },
289*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
290*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
291*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
292*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
293*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
294*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
295*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
296*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
297*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off.cmd),
298*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off) },
299*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
300*1b481fc3SMaciej Żenczykowski };
301*1b481fc3SMaciej Żenczykowski 
302*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_get_features_max_on[] = {
303*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd),
304*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gssetinfo, sizeof(cmd_gssetinfo) },
305*1b481fc3SMaciej Żenczykowski 	{ &cmd_gstrings, sizeof(cmd_gstrings.cmd),
306*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gstrings, sizeof(cmd_gstrings) },
307*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_on, 4, 0, &cmd_grxcsum_on, sizeof(cmd_grxcsum_on) },
308*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_on, 4, 0, &cmd_gtxcsum_on, sizeof(cmd_gtxcsum_on) },
309*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_on, 4, 0, &cmd_gsg_on, sizeof(cmd_gsg_on) },
310*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_on, 4, 0, &cmd_gtso_on, sizeof(cmd_gtso_on) },
311*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_on, 4, 0, &cmd_gufo_on, sizeof(cmd_gufo_on) },
312*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_on, 4, 0, &cmd_ggso_on, sizeof(cmd_ggso_on) },
313*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_on, 4,0, &cmd_ggro_on, sizeof(cmd_ggro_on) },
314*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_on, 4, 0, &cmd_gflags_on, sizeof(cmd_sflags_on) },
315*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_max_on, sizeof(cmd_gfeatures_max_on.cmd),
316*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_max_on, sizeof(cmd_gfeatures_max_on) },
317*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
318*1b481fc3SMaciej Żenczykowski };
319*1b481fc3SMaciej Żenczykowski 
320*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_set_features_min_off_min_on[] = {
321*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd),
322*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gssetinfo, sizeof(cmd_gssetinfo) },
323*1b481fc3SMaciej Żenczykowski 	{ &cmd_gstrings, sizeof(cmd_gstrings.cmd),
324*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gstrings, sizeof(cmd_gstrings) },
325*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
326*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
327*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
328*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
329*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
330*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
331*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
332*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
333*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off.cmd),
334*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off) },
335*1b481fc3SMaciej Żenczykowski 	{ &cmd_sfeatures_min_on, sizeof(cmd_sfeatures_min_on),
336*1b481fc3SMaciej Żenczykowski 	  ETHTOOL_F_WISH, 0, 0 },
337*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
338*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
339*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
340*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
341*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
342*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
343*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_on, 4,0, &cmd_ggro_on, sizeof(cmd_ggro_on) },
344*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
345*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_min_on, sizeof(cmd_gfeatures_min_on.cmd),
346*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_min_on, sizeof(cmd_gfeatures_min_on) },
347*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
348*1b481fc3SMaciej Żenczykowski };
349*1b481fc3SMaciej Żenczykowski 
350*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_set_features_min_off_min_off[] = {
351*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd),
352*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gssetinfo, sizeof(cmd_gssetinfo) },
353*1b481fc3SMaciej Żenczykowski 	{ &cmd_gstrings, sizeof(cmd_gstrings.cmd),
354*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gstrings, sizeof(cmd_gstrings) },
355*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
356*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
357*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
358*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
359*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
360*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
361*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
362*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
363*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off.cmd),
364*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off) },
365*1b481fc3SMaciej Żenczykowski 	{ &cmd_sfeatures_min_off, sizeof(cmd_sfeatures_min_off), 0, 0, 0 },
366*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
367*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
368*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
369*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
370*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
371*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
372*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
373*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
374*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off.cmd),
375*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off) },
376*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
377*1b481fc3SMaciej Żenczykowski };
378*1b481fc3SMaciej Żenczykowski 
379*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_set_features_min_on_min_off[] = {
380*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd),
381*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gssetinfo, sizeof(cmd_gssetinfo) },
382*1b481fc3SMaciej Żenczykowski 	{ &cmd_gstrings, sizeof(cmd_gstrings.cmd),
383*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gstrings, sizeof(cmd_gstrings) },
384*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
385*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
386*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
387*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
388*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
389*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
390*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_on, 4,0, &cmd_ggro_on, sizeof(cmd_ggro_on) },
391*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
392*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_min_on, sizeof(cmd_gfeatures_min_on.cmd),
393*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_min_on, sizeof(cmd_gfeatures_min_on) },
394*1b481fc3SMaciej Żenczykowski 	{ &cmd_sfeatures_min_off, sizeof(cmd_sfeatures_min_off), 0, 0, 0 },
395*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
396*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
397*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
398*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
399*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
400*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
401*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
402*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
403*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off.cmd),
404*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off) },
405*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
406*1b481fc3SMaciej Żenczykowski };
407*1b481fc3SMaciej Żenczykowski 
408*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_set_features_min_off_unsup_on[] = {
409*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd),
410*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gssetinfo, sizeof(cmd_gssetinfo) },
411*1b481fc3SMaciej Żenczykowski 	{ &cmd_gstrings, sizeof(cmd_gstrings.cmd),
412*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gstrings, sizeof(cmd_gstrings) },
413*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
414*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
415*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
416*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
417*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
418*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
419*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
420*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
421*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off.cmd),
422*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off) },
423*1b481fc3SMaciej Żenczykowski 	{ &cmd_sfeatures_noop, sizeof(cmd_sfeatures_noop), 0, 0, 0 },
424*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
425*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
426*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
427*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
428*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
429*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
430*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
431*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
432*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off.cmd),
433*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_min_off, sizeof(cmd_gfeatures_min_off) },
434*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
435*1b481fc3SMaciej Żenczykowski };
436*1b481fc3SMaciej Żenczykowski 
437*1b481fc3SMaciej Żenczykowski static const struct cmd_expect cmd_expect_set_features_ipv4_off_many_on[] = {
438*1b481fc3SMaciej Żenczykowski 	{ &cmd_gssetinfo, sizeof(cmd_gssetinfo.cmd),
439*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gssetinfo, sizeof(cmd_gssetinfo) },
440*1b481fc3SMaciej Żenczykowski 	{ &cmd_gstrings, sizeof(cmd_gstrings.cmd),
441*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gstrings, sizeof(cmd_gstrings) },
442*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_off, 4, 0, &cmd_grxcsum_off, sizeof(cmd_grxcsum_off) },
443*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_off, 4, 0, &cmd_gtxcsum_off, sizeof(cmd_gtxcsum_off) },
444*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_off, 4, 0, &cmd_gsg_off, sizeof(cmd_gsg_off) },
445*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_off, 4, 0, &cmd_gtso_off, sizeof(cmd_gtso_off) },
446*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
447*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_off, 4, 0, &cmd_ggso_off, sizeof(cmd_ggso_off) },
448*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_off, 4,0, &cmd_ggro_off, sizeof(cmd_ggro_off) },
449*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
450*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_ipv4_off, sizeof(cmd_gfeatures_ipv4_off.cmd),
451*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_ipv4_off, sizeof(cmd_gfeatures_ipv4_off) },
452*1b481fc3SMaciej Żenczykowski 	{ &cmd_sfeatures_ipv4_on, sizeof(cmd_sfeatures_ipv4_on), 0, 0, 0 },
453*1b481fc3SMaciej Żenczykowski 	{ &cmd_grxcsum_on, 4, 0, &cmd_grxcsum_on, sizeof(cmd_grxcsum_on) },
454*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtxcsum_on, 4, 0, &cmd_gtxcsum_on, sizeof(cmd_gtxcsum_on) },
455*1b481fc3SMaciej Żenczykowski 	{ &cmd_gsg_on, 4, 0, &cmd_gsg_on, sizeof(cmd_gsg_on) },
456*1b481fc3SMaciej Żenczykowski 	{ &cmd_gtso_on, 4, 0, &cmd_gtso_on, sizeof(cmd_gtso_on) },
457*1b481fc3SMaciej Żenczykowski 	{ &cmd_gufo_off, 4, 0, &cmd_gufo_off, sizeof(cmd_gufo_off) },
458*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggso_on, 4, 0, &cmd_ggso_on, sizeof(cmd_ggso_on) },
459*1b481fc3SMaciej Żenczykowski 	{ &cmd_ggro_on, 4,0, &cmd_ggro_on, sizeof(cmd_ggro_on) },
460*1b481fc3SMaciej Żenczykowski 	{ &cmd_gflags_off, 4, 0, &cmd_gflags_off, sizeof(cmd_gflags_off) },
461*1b481fc3SMaciej Żenczykowski 	{ &cmd_gfeatures_ipv4_on, sizeof(cmd_gfeatures_ipv4_on.cmd),
462*1b481fc3SMaciej Żenczykowski 	  0, &cmd_gfeatures_ipv4_on, sizeof(cmd_gfeatures_ipv4_on) },
463*1b481fc3SMaciej Żenczykowski 	{ 0, 0, 0, 0, 0 }
464*1b481fc3SMaciej Żenczykowski };
465*1b481fc3SMaciej Żenczykowski 
466*1b481fc3SMaciej Żenczykowski static struct test_case {
467*1b481fc3SMaciej Żenczykowski 	int rc;
468*1b481fc3SMaciej Żenczykowski 	const char *args;
469*1b481fc3SMaciej Żenczykowski 	const struct cmd_expect *expect;
470*1b481fc3SMaciej Żenczykowski } const test_cases[] = {
471*1b481fc3SMaciej Żenczykowski 	{ 0, "-k devname", cmd_expect_get_features_off_old },
472*1b481fc3SMaciej Żenczykowski 	{ 0, "-k dev_unsup", cmd_expect_get_features_off_old_some_unsup },
473*1b481fc3SMaciej Żenczykowski 	{ 0, "-k dev_priv", cmd_expect_get_features_off_old_some_priv },
474*1b481fc3SMaciej Żenczykowski 	{ 0, "-K devname rx off tx off sg off tso off ufo off gso off lro off rxvlan off txvlan off ntuple off rxhash off gro off",
475*1b481fc3SMaciej Żenczykowski 	  cmd_expect_set_features_off_old },
476*1b481fc3SMaciej Żenczykowski 	{ 0, "-K devname rx on tx on sg on tso on ufo on gso on lro on rxvlan on txvlan on ntuple on rxhash on gro on",
477*1b481fc3SMaciej Żenczykowski 	  cmd_expect_set_features_on_old },
478*1b481fc3SMaciej Żenczykowski 	{ 1, "-K devname tx on sg on", cmd_expect_set_features_unsup_on_old },
479*1b481fc3SMaciej Żenczykowski 	{ 0, "--show-offload devname", cmd_expect_get_features_min_off },
480*1b481fc3SMaciej Żenczykowski 	{ 0, "--show-features devname", cmd_expect_get_features_max_on },
481*1b481fc3SMaciej Żenczykowski 	{ 0, "-K devname rx on tx on sg on tso on ufo on gso on gro on",
482*1b481fc3SMaciej Żenczykowski 	  cmd_expect_set_features_min_off_min_on },
483*1b481fc3SMaciej Żenczykowski 	{ 0, "-K devname rx off tx off sg off tso off ufo off gso off gro off",
484*1b481fc3SMaciej Żenczykowski 	  cmd_expect_set_features_min_off_min_off },
485*1b481fc3SMaciej Żenczykowski 	{ 0, "-K devname rx off tx off sg off tso off ufo off gso off gro off",
486*1b481fc3SMaciej Żenczykowski 	  cmd_expect_set_features_min_on_min_off },
487*1b481fc3SMaciej Żenczykowski 	{ 1, "-K devname tx on sg on",
488*1b481fc3SMaciej Żenczykowski 	  cmd_expect_set_features_min_off_unsup_on },
489*1b481fc3SMaciej Żenczykowski 	{ 0, "--features devname rx on tx on sg on tso on gso on gro on",
490*1b481fc3SMaciej Żenczykowski 	  cmd_expect_set_features_ipv4_off_many_on },
491*1b481fc3SMaciej Żenczykowski 	{ 1, "-K devname rx foo", cmd_expect_get_strings_old },
492*1b481fc3SMaciej Żenczykowski 	{ 1, "-K devname rx foo", cmd_expect_get_strings },
493*1b481fc3SMaciej Żenczykowski 	{ 1, "--offload devname rx", cmd_expect_get_strings_old },
494*1b481fc3SMaciej Żenczykowski 	{ 1, "--features devname rx", cmd_expect_get_strings },
495*1b481fc3SMaciej Żenczykowski 	{ 1, "--features devname foo on", cmd_expect_get_strings_old },
496*1b481fc3SMaciej Żenczykowski 	{ 1, "--offload devname foo on", cmd_expect_get_strings },
497*1b481fc3SMaciej Żenczykowski };
498*1b481fc3SMaciej Żenczykowski 
499*1b481fc3SMaciej Żenczykowski static int expect_matched;
500*1b481fc3SMaciej Żenczykowski static const struct cmd_expect *expect_next;
501*1b481fc3SMaciej Żenczykowski 
send_ioctl(struct cmd_context * ctx,void * cmd)502*1b481fc3SMaciej Żenczykowski int send_ioctl(struct cmd_context *ctx, void *cmd)
503*1b481fc3SMaciej Żenczykowski {
504*1b481fc3SMaciej Żenczykowski 	int rc = test_ioctl(expect_next, cmd);
505*1b481fc3SMaciej Żenczykowski 
506*1b481fc3SMaciej Żenczykowski 	if (rc == TEST_IOCTL_MISMATCH) {
507*1b481fc3SMaciej Żenczykowski 		expect_matched = 0;
508*1b481fc3SMaciej Żenczykowski 		test_exit(0);
509*1b481fc3SMaciej Żenczykowski 	}
510*1b481fc3SMaciej Żenczykowski 	expect_next++;
511*1b481fc3SMaciej Żenczykowski 	return rc;
512*1b481fc3SMaciej Żenczykowski }
513*1b481fc3SMaciej Żenczykowski 
514*1b481fc3SMaciej Żenczykowski #ifdef ETHTOOL_ENABLE_NETLINK
515*1b481fc3SMaciej Żenczykowski struct nl_socket;
516*1b481fc3SMaciej Żenczykowski struct nl_msg_buff;
517*1b481fc3SMaciej Żenczykowski 
nlsock_sendmsg(struct nl_socket * nlsk,struct nl_msg_buff * altbuff)518*1b481fc3SMaciej Żenczykowski ssize_t nlsock_sendmsg(struct nl_socket *nlsk, struct nl_msg_buff *altbuff)
519*1b481fc3SMaciej Żenczykowski {
520*1b481fc3SMaciej Żenczykowski 	/* Should not be called with test-features */
521*1b481fc3SMaciej Żenczykowski 	exit(1);
522*1b481fc3SMaciej Żenczykowski }
523*1b481fc3SMaciej Żenczykowski #endif
524*1b481fc3SMaciej Żenczykowski 
main(void)525*1b481fc3SMaciej Żenczykowski int main(void)
526*1b481fc3SMaciej Żenczykowski {
527*1b481fc3SMaciej Żenczykowski 	const struct test_case *tc;
528*1b481fc3SMaciej Żenczykowski 	int test_rc;
529*1b481fc3SMaciej Żenczykowski 	int rc = 0;
530*1b481fc3SMaciej Żenczykowski 
531*1b481fc3SMaciej Żenczykowski 	for (tc = test_cases; tc < test_cases + ARRAY_SIZE(test_cases); tc++) {
532*1b481fc3SMaciej Żenczykowski 		if (getenv("ETHTOOL_TEST_VERBOSE"))
533*1b481fc3SMaciej Żenczykowski 			printf("I: Test command line: ethtool %s\n", tc->args);
534*1b481fc3SMaciej Żenczykowski 		expect_matched = 1;
535*1b481fc3SMaciej Żenczykowski 		expect_next = tc->expect;
536*1b481fc3SMaciej Żenczykowski 		test_rc = test_cmdline(tc->args);
537*1b481fc3SMaciej Żenczykowski 
538*1b481fc3SMaciej Żenczykowski 		/* If we found a mismatch, or there is still another
539*1b481fc3SMaciej Żenczykowski 		 * expected ioctl to match, the test failed.
540*1b481fc3SMaciej Żenczykowski 		 */
541*1b481fc3SMaciej Żenczykowski 		if (!expect_matched || expect_next->cmd) {
542*1b481fc3SMaciej Żenczykowski 			fprintf(stderr,
543*1b481fc3SMaciej Żenczykowski 				"E: ethtool %s deviated from the expected "
544*1b481fc3SMaciej Żenczykowski 				"ioctl sequence after %zu calls\n",
545*1b481fc3SMaciej Żenczykowski 				tc->args, expect_next - tc->expect);
546*1b481fc3SMaciej Żenczykowski 			rc = 1;
547*1b481fc3SMaciej Żenczykowski 		} else if (test_rc != tc->rc) {
548*1b481fc3SMaciej Żenczykowski 			fprintf(stderr, "E: ethtool %s returns %d\n",
549*1b481fc3SMaciej Żenczykowski 				tc->args, test_rc);
550*1b481fc3SMaciej Żenczykowski 			rc = 1;
551*1b481fc3SMaciej Żenczykowski 		}
552*1b481fc3SMaciej Żenczykowski 	}
553*1b481fc3SMaciej Żenczykowski 
554*1b481fc3SMaciej Żenczykowski 	return rc;
555*1b481fc3SMaciej Żenczykowski }
556