xref: /openwifi/user_space/sdrctl_src/cmd.c (revision 2ee67178825ee52f380c2f72b7135d15ddadca60)
1*2ee67178SXianjun Jiao // Xianjun jiao. [email protected]; [email protected];
2*2ee67178SXianjun Jiao 
3*2ee67178SXianjun Jiao #include <stdbool.h>
4*2ee67178SXianjun Jiao #include <errno.h>
5*2ee67178SXianjun Jiao #include <net/if.h>
6*2ee67178SXianjun Jiao #include <strings.h>
7*2ee67178SXianjun Jiao 
8*2ee67178SXianjun Jiao #include <netlink/genl/genl.h>
9*2ee67178SXianjun Jiao #include <netlink/genl/family.h>
10*2ee67178SXianjun Jiao #include <netlink/genl/ctrl.h>
11*2ee67178SXianjun Jiao #include <netlink/msg.h>
12*2ee67178SXianjun Jiao #include <netlink/attr.h>
13*2ee67178SXianjun Jiao 
14*2ee67178SXianjun Jiao #include "nl80211.h"
15*2ee67178SXianjun Jiao #include "sdrctl.h"
16*2ee67178SXianjun Jiao #include "nl80211_testmode_def.h"
17*2ee67178SXianjun Jiao 
18*2ee67178SXianjun Jiao 
19*2ee67178SXianjun Jiao static int cb_reg_handler(struct nl_msg *msg, void *arg)
20*2ee67178SXianjun Jiao {
21*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
22*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
23*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
24*2ee67178SXianjun Jiao 
25*2ee67178SXianjun Jiao 	//printf("cb_reg_handler\n");
26*2ee67178SXianjun Jiao 
27*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
28*2ee67178SXianjun Jiao 
29*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
30*2ee67178SXianjun Jiao 		return NL_SKIP;
31*2ee67178SXianjun Jiao 
32*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
33*2ee67178SXianjun Jiao 
34*2ee67178SXianjun Jiao 	//printf("reg addr: %08x\n", nla_get_u32(tb[REG_ATTR_ADDR]));
35*2ee67178SXianjun Jiao 	printf("reg  val: %08x\n", nla_get_u32(tb[REG_ATTR_VAL]));
36*2ee67178SXianjun Jiao 
37*2ee67178SXianjun Jiao 	return NL_SKIP;
38*2ee67178SXianjun Jiao }
39*2ee67178SXianjun Jiao 
40*2ee67178SXianjun Jiao static int handle_set_reg(struct nl80211_state *state,
41*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
42*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
43*2ee67178SXianjun Jiao 			  int argc, char **argv,
44*2ee67178SXianjun Jiao 			  enum id_input id)
45*2ee67178SXianjun Jiao {
46*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
47*2ee67178SXianjun Jiao 	char *end;
48*2ee67178SXianjun Jiao 	unsigned int reg_cat, reg_addr, reg_val;
49*2ee67178SXianjun Jiao 
50*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
51*2ee67178SXianjun Jiao 	if (!tmdata) {
52*2ee67178SXianjun Jiao 		return 1;
53*2ee67178SXianjun Jiao 	}
54*2ee67178SXianjun Jiao 
55*2ee67178SXianjun Jiao 	if (strcasecmp(argv[0],"rf")==0)
56*2ee67178SXianjun Jiao 		reg_cat=1;
57*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx_intf")==0)
58*2ee67178SXianjun Jiao 		reg_cat = 2;
59*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx_intf")==0)
60*2ee67178SXianjun Jiao 		reg_cat = 3;
61*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx")==0)
62*2ee67178SXianjun Jiao 		reg_cat = 4;
63*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx")==0)
64*2ee67178SXianjun Jiao 		reg_cat = 5;
65*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"xpu")==0)
66*2ee67178SXianjun Jiao 		reg_cat = 6;
67*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_rx")==0)
68*2ee67178SXianjun Jiao 		reg_cat = 7;
69*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_tx")==0)
70*2ee67178SXianjun Jiao 		reg_cat = 8;
71*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_xpu")==0)
72*2ee67178SXianjun Jiao 		reg_cat = 9;
73*2ee67178SXianjun Jiao 	else {
74*2ee67178SXianjun Jiao 		printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n");
75*2ee67178SXianjun Jiao 		return 1;
76*2ee67178SXianjun Jiao 	}
77*2ee67178SXianjun Jiao 
78*2ee67178SXianjun Jiao 	reg_addr = strtoul(argv[1], &end, 10);
79*2ee67178SXianjun Jiao 	if (*end) {
80*2ee67178SXianjun Jiao 		return 1;
81*2ee67178SXianjun Jiao 	}
82*2ee67178SXianjun Jiao 	reg_addr = reg_addr<<2;//from idx to addr
83*2ee67178SXianjun Jiao 	reg_addr = ((reg_cat<<16)|reg_addr);
84*2ee67178SXianjun Jiao 
85*2ee67178SXianjun Jiao 	reg_val = strtoul(argv[2], &end, 10);
86*2ee67178SXianjun Jiao 	if (*end) {
87*2ee67178SXianjun Jiao 		return 1;
88*2ee67178SXianjun Jiao 	}
89*2ee67178SXianjun Jiao 
90*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_SET);
91*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr);
92*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_VAL,  reg_val);
93*2ee67178SXianjun Jiao 
94*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
95*2ee67178SXianjun Jiao 
96*2ee67178SXianjun Jiao 	printf("reg  cat: %d\n",   reg_cat);
97*2ee67178SXianjun Jiao 	printf("reg addr: %08x\n", reg_addr);
98*2ee67178SXianjun Jiao 	printf("reg  val: %08x\n", reg_val);
99*2ee67178SXianjun Jiao 
100*2ee67178SXianjun Jiao 	return 0;
101*2ee67178SXianjun Jiao 
102*2ee67178SXianjun Jiao  nla_put_failure:
103*2ee67178SXianjun Jiao 	return -ENOBUFS;
104*2ee67178SXianjun Jiao }
105*2ee67178SXianjun Jiao COMMAND(set, reg, "<rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu reg_idx value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_reg, "set reg");
106*2ee67178SXianjun Jiao 
107*2ee67178SXianjun Jiao static int handle_get_reg(struct nl80211_state *state,
108*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
109*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
110*2ee67178SXianjun Jiao 			  int argc, char **argv,
111*2ee67178SXianjun Jiao 			  enum id_input id)
112*2ee67178SXianjun Jiao {
113*2ee67178SXianjun Jiao 	char *end;
114*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
115*2ee67178SXianjun Jiao 	unsigned int reg_cat, reg_addr;
116*2ee67178SXianjun Jiao 
117*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
118*2ee67178SXianjun Jiao 	if (!tmdata)
119*2ee67178SXianjun Jiao 		return 1;
120*2ee67178SXianjun Jiao 
121*2ee67178SXianjun Jiao 	if (strcasecmp(argv[0],"rf")==0)
122*2ee67178SXianjun Jiao 		reg_cat=1;
123*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx_intf")==0)
124*2ee67178SXianjun Jiao 		reg_cat = 2;
125*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx_intf")==0)
126*2ee67178SXianjun Jiao 		reg_cat = 3;
127*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx")==0)
128*2ee67178SXianjun Jiao 		reg_cat = 4;
129*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx")==0)
130*2ee67178SXianjun Jiao 		reg_cat = 5;
131*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"xpu")==0)
132*2ee67178SXianjun Jiao 		reg_cat = 6;
133*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_rx")==0)
134*2ee67178SXianjun Jiao 		reg_cat = 7;
135*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_tx")==0)
136*2ee67178SXianjun Jiao 		reg_cat = 8;
137*2ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_xpu")==0)
138*2ee67178SXianjun Jiao 		reg_cat = 9;
139*2ee67178SXianjun Jiao 	else {
140*2ee67178SXianjun Jiao 		printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n");
141*2ee67178SXianjun Jiao 		return 1;
142*2ee67178SXianjun Jiao 	}
143*2ee67178SXianjun Jiao 
144*2ee67178SXianjun Jiao 	reg_addr = strtoul(argv[1], &end, 10);
145*2ee67178SXianjun Jiao 	if (*end) {
146*2ee67178SXianjun Jiao 		return 1;
147*2ee67178SXianjun Jiao 	}
148*2ee67178SXianjun Jiao 	reg_addr = reg_addr<<2;//from idx to addr
149*2ee67178SXianjun Jiao 	reg_addr = ((reg_cat<<16)|reg_addr);
150*2ee67178SXianjun Jiao 	printf("SENDaddr: %08x\n", reg_addr);
151*2ee67178SXianjun Jiao 
152*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_GET);
153*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr);
154*2ee67178SXianjun Jiao 
155*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
156*2ee67178SXianjun Jiao 
157*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_reg_handler, NULL);
158*2ee67178SXianjun Jiao 	return 0;
159*2ee67178SXianjun Jiao 
160*2ee67178SXianjun Jiao  nla_put_failure:
161*2ee67178SXianjun Jiao 	return -ENOBUFS;
162*2ee67178SXianjun Jiao }
163*2ee67178SXianjun Jiao COMMAND(get, reg, "<rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu reg_idx>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_reg, "get reg");
164*2ee67178SXianjun Jiao 
165*2ee67178SXianjun Jiao static int cb_openwifi_rssi_th_handler(struct nl_msg *msg, void *arg)
166*2ee67178SXianjun Jiao {
167*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
168*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
169*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
170*2ee67178SXianjun Jiao 
171*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
172*2ee67178SXianjun Jiao 
173*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
174*2ee67178SXianjun Jiao 		return NL_SKIP;
175*2ee67178SXianjun Jiao 
176*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
177*2ee67178SXianjun Jiao 
178*2ee67178SXianjun Jiao 	printf("openwifi rssi_th: %d\n", nla_get_u32(tb[OPENWIFI_ATTR_RSSI_TH]));
179*2ee67178SXianjun Jiao 
180*2ee67178SXianjun Jiao 	return NL_SKIP;
181*2ee67178SXianjun Jiao }
182*2ee67178SXianjun Jiao 
183*2ee67178SXianjun Jiao static int handle_set_rssi_th(struct nl80211_state *state,
184*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
185*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
186*2ee67178SXianjun Jiao 			  int argc, char **argv,
187*2ee67178SXianjun Jiao 			  enum id_input id)
188*2ee67178SXianjun Jiao {
189*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
190*2ee67178SXianjun Jiao 	char *end;
191*2ee67178SXianjun Jiao 	unsigned int tmp;
192*2ee67178SXianjun Jiao 
193*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
194*2ee67178SXianjun Jiao 	if (!tmdata) {
195*2ee67178SXianjun Jiao 		return 1;
196*2ee67178SXianjun Jiao 	}
197*2ee67178SXianjun Jiao 
198*2ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
199*2ee67178SXianjun Jiao 
200*2ee67178SXianjun Jiao 	if (*end) {
201*2ee67178SXianjun Jiao 		return 1;
202*2ee67178SXianjun Jiao 	}
203*2ee67178SXianjun Jiao 
204*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_RSSI_TH);
205*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_RSSI_TH, tmp);
206*2ee67178SXianjun Jiao 
207*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
208*2ee67178SXianjun Jiao 
209*2ee67178SXianjun Jiao 	printf("openwifi rssi_th: %d\n", tmp);
210*2ee67178SXianjun Jiao 
211*2ee67178SXianjun Jiao 	return 0;
212*2ee67178SXianjun Jiao 
213*2ee67178SXianjun Jiao  nla_put_failure:
214*2ee67178SXianjun Jiao 	return -ENOBUFS;
215*2ee67178SXianjun Jiao }
216*2ee67178SXianjun Jiao COMMAND(set, rssi_th, "<rssi_th in value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_rssi_th, "set rssi_th");
217*2ee67178SXianjun Jiao 
218*2ee67178SXianjun Jiao static int handle_get_rssi_th(struct nl80211_state *state,
219*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
220*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
221*2ee67178SXianjun Jiao 			  int argc, char **argv,
222*2ee67178SXianjun Jiao 			  enum id_input id)
223*2ee67178SXianjun Jiao {
224*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
225*2ee67178SXianjun Jiao 
226*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
227*2ee67178SXianjun Jiao 	if (!tmdata)
228*2ee67178SXianjun Jiao 		return 1;
229*2ee67178SXianjun Jiao 
230*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_RSSI_TH);
231*2ee67178SXianjun Jiao 
232*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
233*2ee67178SXianjun Jiao 
234*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_rssi_th_handler, NULL);
235*2ee67178SXianjun Jiao 	return 0;
236*2ee67178SXianjun Jiao 
237*2ee67178SXianjun Jiao  nla_put_failure:
238*2ee67178SXianjun Jiao 	return -ENOBUFS;
239*2ee67178SXianjun Jiao }
240*2ee67178SXianjun Jiao COMMAND(get, rssi_th, "<rssi_th in value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_rssi_th, "get rssi_th");
241*2ee67178SXianjun Jiao 
242*2ee67178SXianjun Jiao static int cb_openwifi_slice_total0_handler(struct nl_msg *msg, void *arg)
243*2ee67178SXianjun Jiao {
244*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
245*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
246*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
247*2ee67178SXianjun Jiao 
248*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
249*2ee67178SXianjun Jiao 
250*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
251*2ee67178SXianjun Jiao 		return NL_SKIP;
252*2ee67178SXianjun Jiao 
253*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
254*2ee67178SXianjun Jiao 
255*2ee67178SXianjun Jiao 	printf("openwifi slice_total0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL0]));
256*2ee67178SXianjun Jiao 
257*2ee67178SXianjun Jiao 	return NL_SKIP;
258*2ee67178SXianjun Jiao }
259*2ee67178SXianjun Jiao 
260*2ee67178SXianjun Jiao static int handle_set_slice_total0(struct nl80211_state *state,
261*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
262*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
263*2ee67178SXianjun Jiao 			  int argc, char **argv,
264*2ee67178SXianjun Jiao 			  enum id_input id)
265*2ee67178SXianjun Jiao {
266*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
267*2ee67178SXianjun Jiao 	char *end;
268*2ee67178SXianjun Jiao 	unsigned int tmp;
269*2ee67178SXianjun Jiao 
270*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
271*2ee67178SXianjun Jiao 	if (!tmdata) {
272*2ee67178SXianjun Jiao 		return 1;
273*2ee67178SXianjun Jiao 	}
274*2ee67178SXianjun Jiao 
275*2ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
276*2ee67178SXianjun Jiao 
277*2ee67178SXianjun Jiao 	if (*end) {
278*2ee67178SXianjun Jiao 		return 1;
279*2ee67178SXianjun Jiao 	}
280*2ee67178SXianjun Jiao 
281*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL0);
282*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL0, tmp);
283*2ee67178SXianjun Jiao 
284*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
285*2ee67178SXianjun Jiao 
286*2ee67178SXianjun Jiao 	printf("openwifi slice_total0 (duration): %dus\n", tmp);
287*2ee67178SXianjun Jiao 
288*2ee67178SXianjun Jiao 	return 0;
289*2ee67178SXianjun Jiao 
290*2ee67178SXianjun Jiao  nla_put_failure:
291*2ee67178SXianjun Jiao 	return -ENOBUFS;
292*2ee67178SXianjun Jiao }
293*2ee67178SXianjun Jiao COMMAND(set, slice_total0, "<slice_total0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total0, "set slice_total0");
294*2ee67178SXianjun Jiao 
295*2ee67178SXianjun Jiao static int handle_get_slice_total0(struct nl80211_state *state,
296*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
297*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
298*2ee67178SXianjun Jiao 			  int argc, char **argv,
299*2ee67178SXianjun Jiao 			  enum id_input id)
300*2ee67178SXianjun Jiao {
301*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
302*2ee67178SXianjun Jiao 
303*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
304*2ee67178SXianjun Jiao 	if (!tmdata)
305*2ee67178SXianjun Jiao 		return 1;
306*2ee67178SXianjun Jiao 
307*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL0);
308*2ee67178SXianjun Jiao 
309*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
310*2ee67178SXianjun Jiao 
311*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total0_handler, NULL);
312*2ee67178SXianjun Jiao 	return 0;
313*2ee67178SXianjun Jiao 
314*2ee67178SXianjun Jiao  nla_put_failure:
315*2ee67178SXianjun Jiao 	return -ENOBUFS;
316*2ee67178SXianjun Jiao }
317*2ee67178SXianjun Jiao COMMAND(get, slice_total0, "<slice_total0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total0, "get slice_total0");
318*2ee67178SXianjun Jiao 
319*2ee67178SXianjun Jiao 
320*2ee67178SXianjun Jiao static int cb_openwifi_slice_total1_handler(struct nl_msg *msg, void *arg)
321*2ee67178SXianjun Jiao {
322*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
323*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
324*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
325*2ee67178SXianjun Jiao 
326*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
327*2ee67178SXianjun Jiao 
328*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
329*2ee67178SXianjun Jiao 		return NL_SKIP;
330*2ee67178SXianjun Jiao 
331*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
332*2ee67178SXianjun Jiao 
333*2ee67178SXianjun Jiao 	printf("openwifi slice_total1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL1]));
334*2ee67178SXianjun Jiao 
335*2ee67178SXianjun Jiao 	return NL_SKIP;
336*2ee67178SXianjun Jiao }
337*2ee67178SXianjun Jiao 
338*2ee67178SXianjun Jiao static int handle_set_slice_total1(struct nl80211_state *state,
339*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
340*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
341*2ee67178SXianjun Jiao 			  int argc, char **argv,
342*2ee67178SXianjun Jiao 			  enum id_input id)
343*2ee67178SXianjun Jiao {
344*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
345*2ee67178SXianjun Jiao 	char *end;
346*2ee67178SXianjun Jiao 	unsigned int tmp;
347*2ee67178SXianjun Jiao 
348*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
349*2ee67178SXianjun Jiao 	if (!tmdata) {
350*2ee67178SXianjun Jiao 		return 1;
351*2ee67178SXianjun Jiao 	}
352*2ee67178SXianjun Jiao 
353*2ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
354*2ee67178SXianjun Jiao 
355*2ee67178SXianjun Jiao 	if (*end) {
356*2ee67178SXianjun Jiao 		return 1;
357*2ee67178SXianjun Jiao 	}
358*2ee67178SXianjun Jiao 
359*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL1);
360*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL1, tmp);
361*2ee67178SXianjun Jiao 
362*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
363*2ee67178SXianjun Jiao 
364*2ee67178SXianjun Jiao 	printf("openwifi slice_total1 (duration): %dus\n", tmp);
365*2ee67178SXianjun Jiao 
366*2ee67178SXianjun Jiao 	return 0;
367*2ee67178SXianjun Jiao 
368*2ee67178SXianjun Jiao  nla_put_failure:
369*2ee67178SXianjun Jiao 	return -ENOBUFS;
370*2ee67178SXianjun Jiao }
371*2ee67178SXianjun Jiao COMMAND(set, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total1, "set slice_total1");
372*2ee67178SXianjun Jiao 
373*2ee67178SXianjun Jiao static int handle_get_slice_total1(struct nl80211_state *state,
374*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
375*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
376*2ee67178SXianjun Jiao 			  int argc, char **argv,
377*2ee67178SXianjun Jiao 			  enum id_input id)
378*2ee67178SXianjun Jiao {
379*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
380*2ee67178SXianjun Jiao 
381*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
382*2ee67178SXianjun Jiao 	if (!tmdata)
383*2ee67178SXianjun Jiao 		return 1;
384*2ee67178SXianjun Jiao 
385*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL1);
386*2ee67178SXianjun Jiao 
387*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
388*2ee67178SXianjun Jiao 
389*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total1_handler, NULL);
390*2ee67178SXianjun Jiao 	return 0;
391*2ee67178SXianjun Jiao 
392*2ee67178SXianjun Jiao  nla_put_failure:
393*2ee67178SXianjun Jiao 	return -ENOBUFS;
394*2ee67178SXianjun Jiao }
395*2ee67178SXianjun Jiao COMMAND(get, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total1, "get slice_total1");
396*2ee67178SXianjun Jiao 
397*2ee67178SXianjun Jiao 
398*2ee67178SXianjun Jiao static int cb_openwifi_slice_start0_handler(struct nl_msg *msg, void *arg)
399*2ee67178SXianjun Jiao {
400*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
401*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
402*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
403*2ee67178SXianjun Jiao 
404*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
405*2ee67178SXianjun Jiao 
406*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
407*2ee67178SXianjun Jiao 		return NL_SKIP;
408*2ee67178SXianjun Jiao 
409*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
410*2ee67178SXianjun Jiao 
411*2ee67178SXianjun Jiao 	printf("openwifi slice_start0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START0]));
412*2ee67178SXianjun Jiao 
413*2ee67178SXianjun Jiao 	return NL_SKIP;
414*2ee67178SXianjun Jiao }
415*2ee67178SXianjun Jiao 
416*2ee67178SXianjun Jiao static int handle_set_slice_start0(struct nl80211_state *state,
417*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
418*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
419*2ee67178SXianjun Jiao 			  int argc, char **argv,
420*2ee67178SXianjun Jiao 			  enum id_input id)
421*2ee67178SXianjun Jiao {
422*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
423*2ee67178SXianjun Jiao 	char *end;
424*2ee67178SXianjun Jiao 	unsigned int tmp;
425*2ee67178SXianjun Jiao 
426*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
427*2ee67178SXianjun Jiao 	if (!tmdata) {
428*2ee67178SXianjun Jiao 		return 1;
429*2ee67178SXianjun Jiao 	}
430*2ee67178SXianjun Jiao 
431*2ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
432*2ee67178SXianjun Jiao 
433*2ee67178SXianjun Jiao 	if (*end) {
434*2ee67178SXianjun Jiao 		return 1;
435*2ee67178SXianjun Jiao 	}
436*2ee67178SXianjun Jiao 
437*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START0);
438*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START0, tmp);
439*2ee67178SXianjun Jiao 
440*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
441*2ee67178SXianjun Jiao 
442*2ee67178SXianjun Jiao 	printf("openwifi slice_start0 (duration): %dus\n", tmp);
443*2ee67178SXianjun Jiao 
444*2ee67178SXianjun Jiao 	return 0;
445*2ee67178SXianjun Jiao 
446*2ee67178SXianjun Jiao  nla_put_failure:
447*2ee67178SXianjun Jiao 	return -ENOBUFS;
448*2ee67178SXianjun Jiao }
449*2ee67178SXianjun Jiao COMMAND(set, slice_start0, "<slice_start0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start0, "set slice_start0");
450*2ee67178SXianjun Jiao 
451*2ee67178SXianjun Jiao static int handle_get_slice_start0(struct nl80211_state *state,
452*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
453*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
454*2ee67178SXianjun Jiao 			  int argc, char **argv,
455*2ee67178SXianjun Jiao 			  enum id_input id)
456*2ee67178SXianjun Jiao {
457*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
458*2ee67178SXianjun Jiao 
459*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
460*2ee67178SXianjun Jiao 	if (!tmdata)
461*2ee67178SXianjun Jiao 		return 1;
462*2ee67178SXianjun Jiao 
463*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START0);
464*2ee67178SXianjun Jiao 
465*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
466*2ee67178SXianjun Jiao 
467*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start0_handler, NULL);
468*2ee67178SXianjun Jiao 	return 0;
469*2ee67178SXianjun Jiao 
470*2ee67178SXianjun Jiao  nla_put_failure:
471*2ee67178SXianjun Jiao 	return -ENOBUFS;
472*2ee67178SXianjun Jiao }
473*2ee67178SXianjun Jiao COMMAND(get, slice_start0, "<slice_start0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start0, "get slice_start0");
474*2ee67178SXianjun Jiao 
475*2ee67178SXianjun Jiao 
476*2ee67178SXianjun Jiao static int cb_openwifi_slice_start1_handler(struct nl_msg *msg, void *arg)
477*2ee67178SXianjun Jiao {
478*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
479*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
480*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
481*2ee67178SXianjun Jiao 
482*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
483*2ee67178SXianjun Jiao 
484*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
485*2ee67178SXianjun Jiao 		return NL_SKIP;
486*2ee67178SXianjun Jiao 
487*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
488*2ee67178SXianjun Jiao 
489*2ee67178SXianjun Jiao 	printf("openwifi slice_start1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START1]));
490*2ee67178SXianjun Jiao 
491*2ee67178SXianjun Jiao 	return NL_SKIP;
492*2ee67178SXianjun Jiao }
493*2ee67178SXianjun Jiao 
494*2ee67178SXianjun Jiao static int handle_set_slice_start1(struct nl80211_state *state,
495*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
496*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
497*2ee67178SXianjun Jiao 			  int argc, char **argv,
498*2ee67178SXianjun Jiao 			  enum id_input id)
499*2ee67178SXianjun Jiao {
500*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
501*2ee67178SXianjun Jiao 	char *end;
502*2ee67178SXianjun Jiao 	unsigned int tmp;
503*2ee67178SXianjun Jiao 
504*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
505*2ee67178SXianjun Jiao 	if (!tmdata) {
506*2ee67178SXianjun Jiao 		return 1;
507*2ee67178SXianjun Jiao 	}
508*2ee67178SXianjun Jiao 
509*2ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
510*2ee67178SXianjun Jiao 
511*2ee67178SXianjun Jiao 	if (*end) {
512*2ee67178SXianjun Jiao 		return 1;
513*2ee67178SXianjun Jiao 	}
514*2ee67178SXianjun Jiao 
515*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START1);
516*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START1, tmp);
517*2ee67178SXianjun Jiao 
518*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
519*2ee67178SXianjun Jiao 
520*2ee67178SXianjun Jiao 	printf("openwifi slice_start1 (duration): %dus\n", tmp);
521*2ee67178SXianjun Jiao 
522*2ee67178SXianjun Jiao 	return 0;
523*2ee67178SXianjun Jiao 
524*2ee67178SXianjun Jiao  nla_put_failure:
525*2ee67178SXianjun Jiao 	return -ENOBUFS;
526*2ee67178SXianjun Jiao }
527*2ee67178SXianjun Jiao COMMAND(set, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start1, "set slice_start1");
528*2ee67178SXianjun Jiao 
529*2ee67178SXianjun Jiao static int handle_get_slice_start1(struct nl80211_state *state,
530*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
531*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
532*2ee67178SXianjun Jiao 			  int argc, char **argv,
533*2ee67178SXianjun Jiao 			  enum id_input id)
534*2ee67178SXianjun Jiao {
535*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
536*2ee67178SXianjun Jiao 
537*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
538*2ee67178SXianjun Jiao 	if (!tmdata)
539*2ee67178SXianjun Jiao 		return 1;
540*2ee67178SXianjun Jiao 
541*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START1);
542*2ee67178SXianjun Jiao 
543*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
544*2ee67178SXianjun Jiao 
545*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start1_handler, NULL);
546*2ee67178SXianjun Jiao 	return 0;
547*2ee67178SXianjun Jiao 
548*2ee67178SXianjun Jiao  nla_put_failure:
549*2ee67178SXianjun Jiao 	return -ENOBUFS;
550*2ee67178SXianjun Jiao }
551*2ee67178SXianjun Jiao COMMAND(get, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start1, "get slice_start1");
552*2ee67178SXianjun Jiao 
553*2ee67178SXianjun Jiao 
554*2ee67178SXianjun Jiao static int cb_openwifi_slice_end0_handler(struct nl_msg *msg, void *arg)
555*2ee67178SXianjun Jiao {
556*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
557*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
558*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
559*2ee67178SXianjun Jiao 
560*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
561*2ee67178SXianjun Jiao 
562*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
563*2ee67178SXianjun Jiao 		return NL_SKIP;
564*2ee67178SXianjun Jiao 
565*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
566*2ee67178SXianjun Jiao 
567*2ee67178SXianjun Jiao 	printf("openwifi slice_end0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END0]));
568*2ee67178SXianjun Jiao 
569*2ee67178SXianjun Jiao 	return NL_SKIP;
570*2ee67178SXianjun Jiao }
571*2ee67178SXianjun Jiao 
572*2ee67178SXianjun Jiao static int handle_set_slice_end0(struct nl80211_state *state,
573*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
574*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
575*2ee67178SXianjun Jiao 			  int argc, char **argv,
576*2ee67178SXianjun Jiao 			  enum id_input id)
577*2ee67178SXianjun Jiao {
578*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
579*2ee67178SXianjun Jiao 	char *end;
580*2ee67178SXianjun Jiao 	unsigned int tmp;
581*2ee67178SXianjun Jiao 
582*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
583*2ee67178SXianjun Jiao 	if (!tmdata) {
584*2ee67178SXianjun Jiao 		return 1;
585*2ee67178SXianjun Jiao 	}
586*2ee67178SXianjun Jiao 
587*2ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
588*2ee67178SXianjun Jiao 
589*2ee67178SXianjun Jiao 	if (*end) {
590*2ee67178SXianjun Jiao 		return 1;
591*2ee67178SXianjun Jiao 	}
592*2ee67178SXianjun Jiao 
593*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END0);
594*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END0, tmp);
595*2ee67178SXianjun Jiao 
596*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
597*2ee67178SXianjun Jiao 
598*2ee67178SXianjun Jiao 	printf("openwifi slice_end0 (duration): %dus\n", tmp);
599*2ee67178SXianjun Jiao 
600*2ee67178SXianjun Jiao 	return 0;
601*2ee67178SXianjun Jiao 
602*2ee67178SXianjun Jiao  nla_put_failure:
603*2ee67178SXianjun Jiao 	return -ENOBUFS;
604*2ee67178SXianjun Jiao }
605*2ee67178SXianjun Jiao COMMAND(set, slice_end0, "<slice_end0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end0, "set slice_end0");
606*2ee67178SXianjun Jiao 
607*2ee67178SXianjun Jiao static int handle_get_slice_end0(struct nl80211_state *state,
608*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
609*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
610*2ee67178SXianjun Jiao 			  int argc, char **argv,
611*2ee67178SXianjun Jiao 			  enum id_input id)
612*2ee67178SXianjun Jiao {
613*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
614*2ee67178SXianjun Jiao 
615*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
616*2ee67178SXianjun Jiao 	if (!tmdata)
617*2ee67178SXianjun Jiao 		return 1;
618*2ee67178SXianjun Jiao 
619*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END0);
620*2ee67178SXianjun Jiao 
621*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
622*2ee67178SXianjun Jiao 
623*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end0_handler, NULL);
624*2ee67178SXianjun Jiao 	return 0;
625*2ee67178SXianjun Jiao 
626*2ee67178SXianjun Jiao  nla_put_failure:
627*2ee67178SXianjun Jiao 	return -ENOBUFS;
628*2ee67178SXianjun Jiao }
629*2ee67178SXianjun Jiao COMMAND(get, slice_end0, "<slice_end0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end0, "get slice_end0");
630*2ee67178SXianjun Jiao 
631*2ee67178SXianjun Jiao 
632*2ee67178SXianjun Jiao static int cb_openwifi_slice_end1_handler(struct nl_msg *msg, void *arg)
633*2ee67178SXianjun Jiao {
634*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
635*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
636*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
637*2ee67178SXianjun Jiao 
638*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
639*2ee67178SXianjun Jiao 
640*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
641*2ee67178SXianjun Jiao 		return NL_SKIP;
642*2ee67178SXianjun Jiao 
643*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
644*2ee67178SXianjun Jiao 
645*2ee67178SXianjun Jiao 	printf("openwifi slice_end1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END1]));
646*2ee67178SXianjun Jiao 
647*2ee67178SXianjun Jiao 	return NL_SKIP;
648*2ee67178SXianjun Jiao }
649*2ee67178SXianjun Jiao 
650*2ee67178SXianjun Jiao static int handle_set_slice_end1(struct nl80211_state *state,
651*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
652*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
653*2ee67178SXianjun Jiao 			  int argc, char **argv,
654*2ee67178SXianjun Jiao 			  enum id_input id)
655*2ee67178SXianjun Jiao {
656*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
657*2ee67178SXianjun Jiao 	char *end;
658*2ee67178SXianjun Jiao 	unsigned int tmp;
659*2ee67178SXianjun Jiao 
660*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
661*2ee67178SXianjun Jiao 	if (!tmdata) {
662*2ee67178SXianjun Jiao 		return 1;
663*2ee67178SXianjun Jiao 	}
664*2ee67178SXianjun Jiao 
665*2ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
666*2ee67178SXianjun Jiao 
667*2ee67178SXianjun Jiao 	if (*end) {
668*2ee67178SXianjun Jiao 		return 1;
669*2ee67178SXianjun Jiao 	}
670*2ee67178SXianjun Jiao 
671*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END1);
672*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END1, tmp);
673*2ee67178SXianjun Jiao 
674*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
675*2ee67178SXianjun Jiao 
676*2ee67178SXianjun Jiao 	printf("openwifi slice_end1 (duration): %dus\n", tmp);
677*2ee67178SXianjun Jiao 
678*2ee67178SXianjun Jiao 	return 0;
679*2ee67178SXianjun Jiao 
680*2ee67178SXianjun Jiao  nla_put_failure:
681*2ee67178SXianjun Jiao 	return -ENOBUFS;
682*2ee67178SXianjun Jiao }
683*2ee67178SXianjun Jiao COMMAND(set, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end1, "set slice_end1");
684*2ee67178SXianjun Jiao 
685*2ee67178SXianjun Jiao static int handle_get_slice_end1(struct nl80211_state *state,
686*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
687*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
688*2ee67178SXianjun Jiao 			  int argc, char **argv,
689*2ee67178SXianjun Jiao 			  enum id_input id)
690*2ee67178SXianjun Jiao {
691*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
692*2ee67178SXianjun Jiao 
693*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
694*2ee67178SXianjun Jiao 	if (!tmdata)
695*2ee67178SXianjun Jiao 		return 1;
696*2ee67178SXianjun Jiao 
697*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END1);
698*2ee67178SXianjun Jiao 
699*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
700*2ee67178SXianjun Jiao 
701*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end1_handler, NULL);
702*2ee67178SXianjun Jiao 	return 0;
703*2ee67178SXianjun Jiao 
704*2ee67178SXianjun Jiao  nla_put_failure:
705*2ee67178SXianjun Jiao 	return -ENOBUFS;
706*2ee67178SXianjun Jiao }
707*2ee67178SXianjun Jiao COMMAND(get, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end1, "get slice_end1");
708*2ee67178SXianjun Jiao 
709*2ee67178SXianjun Jiao 
710*2ee67178SXianjun Jiao static int cb_openwifi_slice0_target_mac_addr_handler(struct nl_msg *msg, void *arg)
711*2ee67178SXianjun Jiao {
712*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
713*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
714*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
715*2ee67178SXianjun Jiao 
716*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
717*2ee67178SXianjun Jiao 
718*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
719*2ee67178SXianjun Jiao 		return NL_SKIP;
720*2ee67178SXianjun Jiao 
721*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
722*2ee67178SXianjun Jiao 
723*2ee67178SXianjun Jiao 	printf("openwifi slice0_target_mac_addr(low32) in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_ADDR0]));
724*2ee67178SXianjun Jiao 
725*2ee67178SXianjun Jiao 	return NL_SKIP;
726*2ee67178SXianjun Jiao }
727*2ee67178SXianjun Jiao 
728*2ee67178SXianjun Jiao static int handle_set_addr0(struct nl80211_state *state,
729*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
730*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
731*2ee67178SXianjun Jiao 			  int argc, char **argv,
732*2ee67178SXianjun Jiao 			  enum id_input id)
733*2ee67178SXianjun Jiao {
734*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
735*2ee67178SXianjun Jiao 	char *end;
736*2ee67178SXianjun Jiao 	unsigned int slice0_target_mac_addr;
737*2ee67178SXianjun Jiao 
738*2ee67178SXianjun Jiao 	//printf("handle_set_slice0_target_mac_addr\n");
739*2ee67178SXianjun Jiao 
740*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
741*2ee67178SXianjun Jiao 	if (!tmdata) {
742*2ee67178SXianjun Jiao 		//printf("handle_set_slice0_target_mac_addr 1\n");
743*2ee67178SXianjun Jiao 		return 1;
744*2ee67178SXianjun Jiao 	}
745*2ee67178SXianjun Jiao 
746*2ee67178SXianjun Jiao 	slice0_target_mac_addr = strtoul(argv[0], &end, 16);
747*2ee67178SXianjun Jiao 
748*2ee67178SXianjun Jiao 	if (*end) {
749*2ee67178SXianjun Jiao 		//printf("handle_set_slice0_target_mac_addr 2 %d\n", slice0_target_mac_addr);
750*2ee67178SXianjun Jiao 		return 1;
751*2ee67178SXianjun Jiao 	}
752*2ee67178SXianjun Jiao 
753*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_ADDR0);
754*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_ADDR0, slice0_target_mac_addr);
755*2ee67178SXianjun Jiao 
756*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
757*2ee67178SXianjun Jiao 
758*2ee67178SXianjun Jiao 	printf("openwifi slice0_target_mac_addr(low32) in hex: %08x\n", slice0_target_mac_addr);
759*2ee67178SXianjun Jiao 
760*2ee67178SXianjun Jiao 	return 0;
761*2ee67178SXianjun Jiao 
762*2ee67178SXianjun Jiao  nla_put_failure:
763*2ee67178SXianjun Jiao 	return -ENOBUFS;
764*2ee67178SXianjun Jiao }
765*2ee67178SXianjun Jiao COMMAND(set, addr0, "<slice0_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_addr0, "set addr0");
766*2ee67178SXianjun Jiao 
767*2ee67178SXianjun Jiao static int handle_get_slice0_target_mac_addr(struct nl80211_state *state,
768*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
769*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
770*2ee67178SXianjun Jiao 			  int argc, char **argv,
771*2ee67178SXianjun Jiao 			  enum id_input id)
772*2ee67178SXianjun Jiao {
773*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
774*2ee67178SXianjun Jiao 
775*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
776*2ee67178SXianjun Jiao 	if (!tmdata)
777*2ee67178SXianjun Jiao 		return 1;
778*2ee67178SXianjun Jiao 
779*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_ADDR0);
780*2ee67178SXianjun Jiao 
781*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
782*2ee67178SXianjun Jiao 
783*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice0_target_mac_addr_handler, NULL);
784*2ee67178SXianjun Jiao 	return 0;
785*2ee67178SXianjun Jiao 
786*2ee67178SXianjun Jiao  nla_put_failure:
787*2ee67178SXianjun Jiao 	return -ENOBUFS;
788*2ee67178SXianjun Jiao }
789*2ee67178SXianjun Jiao COMMAND(get, addr0, "<slice0_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice0_target_mac_addr, "get addr0");
790*2ee67178SXianjun Jiao 
791*2ee67178SXianjun Jiao static int cb_openwifi_slice1_target_mac_addr_handler(struct nl_msg *msg, void *arg)
792*2ee67178SXianjun Jiao {
793*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
794*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
795*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
796*2ee67178SXianjun Jiao 
797*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
798*2ee67178SXianjun Jiao 
799*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
800*2ee67178SXianjun Jiao 		return NL_SKIP;
801*2ee67178SXianjun Jiao 
802*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
803*2ee67178SXianjun Jiao 
804*2ee67178SXianjun Jiao 	printf("openwifi slice1_target_mac_addr(low32) in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_ADDR1]));
805*2ee67178SXianjun Jiao 
806*2ee67178SXianjun Jiao 	return NL_SKIP;
807*2ee67178SXianjun Jiao }
808*2ee67178SXianjun Jiao 
809*2ee67178SXianjun Jiao static int handle_set_slice1_target_mac_addr(struct nl80211_state *state,
810*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
811*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
812*2ee67178SXianjun Jiao 			  int argc, char **argv,
813*2ee67178SXianjun Jiao 			  enum id_input id)
814*2ee67178SXianjun Jiao {
815*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
816*2ee67178SXianjun Jiao 	char *end;
817*2ee67178SXianjun Jiao 	unsigned int slice1_target_mac_addr;
818*2ee67178SXianjun Jiao 
819*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
820*2ee67178SXianjun Jiao 	if (!tmdata)
821*2ee67178SXianjun Jiao 		return 1;
822*2ee67178SXianjun Jiao 
823*2ee67178SXianjun Jiao 	slice1_target_mac_addr = strtoul(argv[0], &end, 16);
824*2ee67178SXianjun Jiao 
825*2ee67178SXianjun Jiao 	if (*end)
826*2ee67178SXianjun Jiao 		return 1;
827*2ee67178SXianjun Jiao 
828*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_ADDR1);
829*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_ADDR1, slice1_target_mac_addr);
830*2ee67178SXianjun Jiao 
831*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
832*2ee67178SXianjun Jiao 
833*2ee67178SXianjun Jiao 	printf("openwifi slice1_target_mac_addr(low32) in hex: %08x\n", slice1_target_mac_addr);
834*2ee67178SXianjun Jiao 
835*2ee67178SXianjun Jiao 	return 0;
836*2ee67178SXianjun Jiao 
837*2ee67178SXianjun Jiao  nla_put_failure:
838*2ee67178SXianjun Jiao 	return -ENOBUFS;
839*2ee67178SXianjun Jiao }
840*2ee67178SXianjun Jiao COMMAND(set, addr1, "<slice1_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice1_target_mac_addr, "set addr1");
841*2ee67178SXianjun Jiao 
842*2ee67178SXianjun Jiao static int handle_get_slice1_target_mac_addr(struct nl80211_state *state,
843*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
844*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
845*2ee67178SXianjun Jiao 			  int argc, char **argv,
846*2ee67178SXianjun Jiao 			  enum id_input id)
847*2ee67178SXianjun Jiao {
848*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
849*2ee67178SXianjun Jiao 
850*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
851*2ee67178SXianjun Jiao 	if (!tmdata)
852*2ee67178SXianjun Jiao 		return 1;
853*2ee67178SXianjun Jiao 
854*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_ADDR1);
855*2ee67178SXianjun Jiao 
856*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
857*2ee67178SXianjun Jiao 
858*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice1_target_mac_addr_handler, NULL);
859*2ee67178SXianjun Jiao 	return 0;
860*2ee67178SXianjun Jiao 
861*2ee67178SXianjun Jiao  nla_put_failure:
862*2ee67178SXianjun Jiao 	return -ENOBUFS;
863*2ee67178SXianjun Jiao }
864*2ee67178SXianjun Jiao COMMAND(get, addr1, "<slice1_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice1_target_mac_addr, "get addr1");
865*2ee67178SXianjun Jiao 
866*2ee67178SXianjun Jiao static int cb_openwifi_gap_handler(struct nl_msg *msg, void *arg)
867*2ee67178SXianjun Jiao {
868*2ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
869*2ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
870*2ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
871*2ee67178SXianjun Jiao 
872*2ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
873*2ee67178SXianjun Jiao 
874*2ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
875*2ee67178SXianjun Jiao 		return NL_SKIP;
876*2ee67178SXianjun Jiao 
877*2ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
878*2ee67178SXianjun Jiao 
879*2ee67178SXianjun Jiao 	printf("openwifi GAP (usec): %d\n", nla_get_u32(tb[OPENWIFI_ATTR_GAP]));
880*2ee67178SXianjun Jiao 
881*2ee67178SXianjun Jiao 	return NL_SKIP;
882*2ee67178SXianjun Jiao }
883*2ee67178SXianjun Jiao 
884*2ee67178SXianjun Jiao static int handle_set_gap(struct nl80211_state *state,
885*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
886*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
887*2ee67178SXianjun Jiao 			  int argc, char **argv,
888*2ee67178SXianjun Jiao 			  enum id_input id)
889*2ee67178SXianjun Jiao {
890*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
891*2ee67178SXianjun Jiao 	char *end;
892*2ee67178SXianjun Jiao 	unsigned int gap_us;
893*2ee67178SXianjun Jiao 
894*2ee67178SXianjun Jiao 	//printf("handle_set_gap\n");
895*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
896*2ee67178SXianjun Jiao 	if (!tmdata)
897*2ee67178SXianjun Jiao 		return 1;
898*2ee67178SXianjun Jiao 
899*2ee67178SXianjun Jiao 	gap_us = strtoul(argv[0], &end, 10);
900*2ee67178SXianjun Jiao 
901*2ee67178SXianjun Jiao 	if (*end)
902*2ee67178SXianjun Jiao 		return 1;
903*2ee67178SXianjun Jiao 
904*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_GAP);
905*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_GAP, gap_us);
906*2ee67178SXianjun Jiao 
907*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
908*2ee67178SXianjun Jiao 	return 0;
909*2ee67178SXianjun Jiao 
910*2ee67178SXianjun Jiao  nla_put_failure:
911*2ee67178SXianjun Jiao 	return -ENOBUFS;
912*2ee67178SXianjun Jiao }
913*2ee67178SXianjun Jiao COMMAND(set, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_gap, "set inter frame gap of openwifi radio");
914*2ee67178SXianjun Jiao 
915*2ee67178SXianjun Jiao static int handle_get_gap(struct nl80211_state *state,
916*2ee67178SXianjun Jiao 			  struct nl_cb *cb,
917*2ee67178SXianjun Jiao 			  struct nl_msg *msg,
918*2ee67178SXianjun Jiao 			  int argc, char **argv,
919*2ee67178SXianjun Jiao 			  enum id_input id)
920*2ee67178SXianjun Jiao {
921*2ee67178SXianjun Jiao 	struct nlattr *tmdata;
922*2ee67178SXianjun Jiao 
923*2ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
924*2ee67178SXianjun Jiao 	if (!tmdata)
925*2ee67178SXianjun Jiao 		return 1;
926*2ee67178SXianjun Jiao 
927*2ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_GAP);
928*2ee67178SXianjun Jiao 
929*2ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
930*2ee67178SXianjun Jiao 
931*2ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_gap_handler, NULL);
932*2ee67178SXianjun Jiao 	return 0;
933*2ee67178SXianjun Jiao 
934*2ee67178SXianjun Jiao  nla_put_failure:
935*2ee67178SXianjun Jiao 	return -ENOBUFS;
936*2ee67178SXianjun Jiao }
937*2ee67178SXianjun Jiao COMMAND(get, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_gap, "get inter frame gap of openwifi radio");
938