xref: /openwifi/user_space/sdrctl_src/cmd.c (revision 75042a307386ea726b3b1d0f9ed065f672de22e5)
12ee67178SXianjun Jiao // Xianjun jiao. [email protected]; [email protected];
22ee67178SXianjun Jiao 
32ee67178SXianjun Jiao #include <stdbool.h>
42ee67178SXianjun Jiao #include <errno.h>
52ee67178SXianjun Jiao #include <net/if.h>
62ee67178SXianjun Jiao #include <strings.h>
72ee67178SXianjun Jiao 
82ee67178SXianjun Jiao #include <netlink/genl/genl.h>
92ee67178SXianjun Jiao #include <netlink/genl/family.h>
102ee67178SXianjun Jiao #include <netlink/genl/ctrl.h>
112ee67178SXianjun Jiao #include <netlink/msg.h>
122ee67178SXianjun Jiao #include <netlink/attr.h>
132ee67178SXianjun Jiao 
142ee67178SXianjun Jiao #include "nl80211.h"
152ee67178SXianjun Jiao #include "sdrctl.h"
162ee67178SXianjun Jiao #include "nl80211_testmode_def.h"
172ee67178SXianjun Jiao 
182ee67178SXianjun Jiao 
192ee67178SXianjun Jiao static int cb_reg_handler(struct nl_msg *msg, void *arg)
202ee67178SXianjun Jiao {
212ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
222ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
232ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
242ee67178SXianjun Jiao 
252ee67178SXianjun Jiao 	//printf("cb_reg_handler\n");
262ee67178SXianjun Jiao 
272ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
282ee67178SXianjun Jiao 
292ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
302ee67178SXianjun Jiao 		return NL_SKIP;
312ee67178SXianjun Jiao 
322ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
332ee67178SXianjun Jiao 
342ee67178SXianjun Jiao 	//printf("reg addr: %08x\n", nla_get_u32(tb[REG_ATTR_ADDR]));
352ee67178SXianjun Jiao 	printf("reg  val: %08x\n", nla_get_u32(tb[REG_ATTR_VAL]));
362ee67178SXianjun Jiao 
372ee67178SXianjun Jiao 	return NL_SKIP;
382ee67178SXianjun Jiao }
392ee67178SXianjun Jiao 
402ee67178SXianjun Jiao static int handle_set_reg(struct nl80211_state *state,
412ee67178SXianjun Jiao 			  struct nl_cb *cb,
422ee67178SXianjun Jiao 			  struct nl_msg *msg,
432ee67178SXianjun Jiao 			  int argc, char **argv,
442ee67178SXianjun Jiao 			  enum id_input id)
452ee67178SXianjun Jiao {
462ee67178SXianjun Jiao 	struct nlattr *tmdata;
472ee67178SXianjun Jiao 	char *end;
482ee67178SXianjun Jiao 	unsigned int reg_cat, reg_addr, reg_val;
492ee67178SXianjun Jiao 
502ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
512ee67178SXianjun Jiao 	if (!tmdata) {
522ee67178SXianjun Jiao 		return 1;
532ee67178SXianjun Jiao 	}
542ee67178SXianjun Jiao 
552ee67178SXianjun Jiao 	if (strcasecmp(argv[0],"rf")==0)
562ee67178SXianjun Jiao 		reg_cat=1;
572ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx_intf")==0)
582ee67178SXianjun Jiao 		reg_cat = 2;
592ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx_intf")==0)
602ee67178SXianjun Jiao 		reg_cat = 3;
612ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx")==0)
622ee67178SXianjun Jiao 		reg_cat = 4;
632ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx")==0)
642ee67178SXianjun Jiao 		reg_cat = 5;
652ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"xpu")==0)
662ee67178SXianjun Jiao 		reg_cat = 6;
672ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_rx")==0)
682ee67178SXianjun Jiao 		reg_cat = 7;
692ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_tx")==0)
702ee67178SXianjun Jiao 		reg_cat = 8;
712ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_xpu")==0)
722ee67178SXianjun Jiao 		reg_cat = 9;
732ee67178SXianjun Jiao 	else {
742ee67178SXianjun Jiao 		printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n");
752ee67178SXianjun Jiao 		return 1;
762ee67178SXianjun Jiao 	}
772ee67178SXianjun Jiao 
782ee67178SXianjun Jiao 	reg_addr = strtoul(argv[1], &end, 10);
792ee67178SXianjun Jiao 	if (*end) {
802ee67178SXianjun Jiao 		return 1;
812ee67178SXianjun Jiao 	}
822ee67178SXianjun Jiao 	reg_addr = reg_addr<<2;//from idx to addr
832ee67178SXianjun Jiao 	reg_addr = ((reg_cat<<16)|reg_addr);
842ee67178SXianjun Jiao 
852ee67178SXianjun Jiao 	reg_val = strtoul(argv[2], &end, 10);
862ee67178SXianjun Jiao 	if (*end) {
872ee67178SXianjun Jiao 		return 1;
882ee67178SXianjun Jiao 	}
892ee67178SXianjun Jiao 
902ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_SET);
912ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr);
922ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_VAL,  reg_val);
932ee67178SXianjun Jiao 
942ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
952ee67178SXianjun Jiao 
962ee67178SXianjun Jiao 	printf("reg  cat: %d\n",   reg_cat);
972ee67178SXianjun Jiao 	printf("reg addr: %08x\n", reg_addr);
982ee67178SXianjun Jiao 	printf("reg  val: %08x\n", reg_val);
992ee67178SXianjun Jiao 
1002ee67178SXianjun Jiao 	return 0;
1012ee67178SXianjun Jiao 
1022ee67178SXianjun Jiao  nla_put_failure:
1032ee67178SXianjun Jiao 	return -ENOBUFS;
1042ee67178SXianjun Jiao }
1052ee67178SXianjun 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");
1062ee67178SXianjun Jiao 
1072ee67178SXianjun Jiao static int handle_get_reg(struct nl80211_state *state,
1082ee67178SXianjun Jiao 			  struct nl_cb *cb,
1092ee67178SXianjun Jiao 			  struct nl_msg *msg,
1102ee67178SXianjun Jiao 			  int argc, char **argv,
1112ee67178SXianjun Jiao 			  enum id_input id)
1122ee67178SXianjun Jiao {
1132ee67178SXianjun Jiao 	char *end;
1142ee67178SXianjun Jiao 	struct nlattr *tmdata;
1152ee67178SXianjun Jiao 	unsigned int reg_cat, reg_addr;
1162ee67178SXianjun Jiao 
1172ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
1182ee67178SXianjun Jiao 	if (!tmdata)
1192ee67178SXianjun Jiao 		return 1;
1202ee67178SXianjun Jiao 
1212ee67178SXianjun Jiao 	if (strcasecmp(argv[0],"rf")==0)
1222ee67178SXianjun Jiao 		reg_cat=1;
1232ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx_intf")==0)
1242ee67178SXianjun Jiao 		reg_cat = 2;
1252ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx_intf")==0)
1262ee67178SXianjun Jiao 		reg_cat = 3;
1272ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx")==0)
1282ee67178SXianjun Jiao 		reg_cat = 4;
1292ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx")==0)
1302ee67178SXianjun Jiao 		reg_cat = 5;
1312ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"xpu")==0)
1322ee67178SXianjun Jiao 		reg_cat = 6;
1332ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_rx")==0)
1342ee67178SXianjun Jiao 		reg_cat = 7;
1352ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_tx")==0)
1362ee67178SXianjun Jiao 		reg_cat = 8;
1372ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_xpu")==0)
1382ee67178SXianjun Jiao 		reg_cat = 9;
1392ee67178SXianjun Jiao 	else {
1402ee67178SXianjun Jiao 		printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n");
1412ee67178SXianjun Jiao 		return 1;
1422ee67178SXianjun Jiao 	}
1432ee67178SXianjun Jiao 
1442ee67178SXianjun Jiao 	reg_addr = strtoul(argv[1], &end, 10);
1452ee67178SXianjun Jiao 	if (*end) {
1462ee67178SXianjun Jiao 		return 1;
1472ee67178SXianjun Jiao 	}
1482ee67178SXianjun Jiao 	reg_addr = reg_addr<<2;//from idx to addr
1492ee67178SXianjun Jiao 	reg_addr = ((reg_cat<<16)|reg_addr);
1502ee67178SXianjun Jiao 	printf("SENDaddr: %08x\n", reg_addr);
1512ee67178SXianjun Jiao 
1522ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_GET);
1532ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr);
1542ee67178SXianjun Jiao 
1552ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
1562ee67178SXianjun Jiao 
1572ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_reg_handler, NULL);
1582ee67178SXianjun Jiao 	return 0;
1592ee67178SXianjun Jiao 
1602ee67178SXianjun Jiao  nla_put_failure:
1612ee67178SXianjun Jiao 	return -ENOBUFS;
1622ee67178SXianjun Jiao }
1632ee67178SXianjun 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");
1642ee67178SXianjun Jiao 
1652ee67178SXianjun Jiao static int cb_openwifi_rssi_th_handler(struct nl_msg *msg, void *arg)
1662ee67178SXianjun Jiao {
1672ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
1682ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
1692ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1702ee67178SXianjun Jiao 
1712ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
1722ee67178SXianjun Jiao 
1732ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
1742ee67178SXianjun Jiao 		return NL_SKIP;
1752ee67178SXianjun Jiao 
1762ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
1772ee67178SXianjun Jiao 
1782ee67178SXianjun Jiao 	printf("openwifi rssi_th: %d\n", nla_get_u32(tb[OPENWIFI_ATTR_RSSI_TH]));
1792ee67178SXianjun Jiao 
1802ee67178SXianjun Jiao 	return NL_SKIP;
1812ee67178SXianjun Jiao }
1822ee67178SXianjun Jiao 
1832ee67178SXianjun Jiao static int handle_set_rssi_th(struct nl80211_state *state,
1842ee67178SXianjun Jiao 			  struct nl_cb *cb,
1852ee67178SXianjun Jiao 			  struct nl_msg *msg,
1862ee67178SXianjun Jiao 			  int argc, char **argv,
1872ee67178SXianjun Jiao 			  enum id_input id)
1882ee67178SXianjun Jiao {
1892ee67178SXianjun Jiao 	struct nlattr *tmdata;
1902ee67178SXianjun Jiao 	char *end;
1912ee67178SXianjun Jiao 	unsigned int tmp;
1922ee67178SXianjun Jiao 
1932ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
1942ee67178SXianjun Jiao 	if (!tmdata) {
1952ee67178SXianjun Jiao 		return 1;
1962ee67178SXianjun Jiao 	}
1972ee67178SXianjun Jiao 
1982ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
1992ee67178SXianjun Jiao 
2002ee67178SXianjun Jiao 	if (*end) {
2012ee67178SXianjun Jiao 		return 1;
2022ee67178SXianjun Jiao 	}
2032ee67178SXianjun Jiao 
2042ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_RSSI_TH);
2052ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_RSSI_TH, tmp);
2062ee67178SXianjun Jiao 
2072ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
2082ee67178SXianjun Jiao 
2092ee67178SXianjun Jiao 	printf("openwifi rssi_th: %d\n", tmp);
2102ee67178SXianjun Jiao 
2112ee67178SXianjun Jiao 	return 0;
2122ee67178SXianjun Jiao 
2132ee67178SXianjun Jiao  nla_put_failure:
2142ee67178SXianjun Jiao 	return -ENOBUFS;
2152ee67178SXianjun Jiao }
2162ee67178SXianjun Jiao COMMAND(set, rssi_th, "<rssi_th in value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_rssi_th, "set rssi_th");
2172ee67178SXianjun Jiao 
218e63d1ec3SXianjun Jiao 
219e63d1ec3SXianjun Jiao static int handle_set_tsf(struct nl80211_state *state,
220e63d1ec3SXianjun Jiao 		  struct nl_cb *cb,
221e63d1ec3SXianjun Jiao 		  struct nl_msg *msg,
222e63d1ec3SXianjun Jiao 		  int argc, char **argv,
223e63d1ec3SXianjun Jiao 		  enum id_input id)
224e63d1ec3SXianjun Jiao {
225e63d1ec3SXianjun Jiao 	struct nlattr *tmdata;
226e63d1ec3SXianjun Jiao 	char *end;
227*75042a30SXianjun Jiao 	unsigned int high_tsf, low_tsf;
228e63d1ec3SXianjun Jiao 
229e63d1ec3SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
230e63d1ec3SXianjun Jiao 	if (!tmdata) {
231e63d1ec3SXianjun Jiao 		return 1;
232e63d1ec3SXianjun Jiao 	}
233e63d1ec3SXianjun Jiao 
234e63d1ec3SXianjun Jiao 	high_tsf = strtoul(argv[0], &end, 10);
235e63d1ec3SXianjun Jiao 	if (*end) {
236e63d1ec3SXianjun Jiao 		return 1;
237e63d1ec3SXianjun Jiao 	}
238e63d1ec3SXianjun Jiao 
239e63d1ec3SXianjun Jiao 	low_tsf = strtoul(argv[1], &end, 10);
240e63d1ec3SXianjun Jiao 	if (*end) {
241e63d1ec3SXianjun Jiao 		return 1;
242e63d1ec3SXianjun Jiao 	}
243e63d1ec3SXianjun Jiao 
244e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_TSF);
245e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_HIGH_TSF, high_tsf);
246e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_LOW_TSF, low_tsf);
247e63d1ec3SXianjun Jiao 
248e63d1ec3SXianjun Jiao 	nla_nest_end(msg, tmdata);
249e63d1ec3SXianjun Jiao 
250e63d1ec3SXianjun Jiao 	printf("high_tsf val: %08x\n", high_tsf);
251e63d1ec3SXianjun Jiao 	printf("low_tsf  val: %08x\n", low_tsf);
252e63d1ec3SXianjun Jiao 
253e63d1ec3SXianjun Jiao 	return 0;
254e63d1ec3SXianjun Jiao 
255e63d1ec3SXianjun Jiao 	/*struct nlattr *tmdata;
256e63d1ec3SXianjun Jiao 	char *end;
257e63d1ec3SXianjun Jiao 	unsigned int tmp;
258e63d1ec3SXianjun Jiao 
259e63d1ec3SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
260e63d1ec3SXianjun Jiao 	if (!tmdata) {
261e63d1ec3SXianjun Jiao 		return 1;
262e63d1ec3SXianjun Jiao 	}
263e63d1ec3SXianjun Jiao 
264e63d1ec3SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
265e63d1ec3SXianjun Jiao 
266e63d1ec3SXianjun Jiao 	if (*end) {
267e63d1ec3SXianjun Jiao 		return 1;
268e63d1ec3SXianjun Jiao 	}
269e63d1ec3SXianjun Jiao 
270e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_TSF);
271e63d1ec3SXianjun Jiao 	NLA_PUT_U64(msg, OPENWIFI_ATTR_TSF, tmp);
272e63d1ec3SXianjun Jiao 
273e63d1ec3SXianjun Jiao 	nla_nest_end(msg, tmdata);
274e63d1ec3SXianjun Jiao 
275e63d1ec3SXianjun Jiao 	printf("openwifi tsf: %d\n", tmp);
276e63d1ec3SXianjun Jiao 
277e63d1ec3SXianjun Jiao 	return 0;*/
278e63d1ec3SXianjun Jiao 
279e63d1ec3SXianjun Jiao  nla_put_failure:
280e63d1ec3SXianjun Jiao 	return -ENOBUFS;
281e63d1ec3SXianjun Jiao }
282e63d1ec3SXianjun Jiao COMMAND(set, tsf, "<high_tsf value low_tsf value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_tsf, "set tsf");
283e63d1ec3SXianjun Jiao 
2842ee67178SXianjun Jiao static int handle_get_rssi_th(struct nl80211_state *state,
2852ee67178SXianjun Jiao 			  struct nl_cb *cb,
2862ee67178SXianjun Jiao 			  struct nl_msg *msg,
2872ee67178SXianjun Jiao 			  int argc, char **argv,
2882ee67178SXianjun Jiao 			  enum id_input id)
2892ee67178SXianjun Jiao {
2902ee67178SXianjun Jiao 	struct nlattr *tmdata;
2912ee67178SXianjun Jiao 
2922ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
2932ee67178SXianjun Jiao 	if (!tmdata)
2942ee67178SXianjun Jiao 		return 1;
2952ee67178SXianjun Jiao 
2962ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_RSSI_TH);
2972ee67178SXianjun Jiao 
2982ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
2992ee67178SXianjun Jiao 
3002ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_rssi_th_handler, NULL);
3012ee67178SXianjun Jiao 	return 0;
3022ee67178SXianjun Jiao 
3032ee67178SXianjun Jiao  nla_put_failure:
3042ee67178SXianjun Jiao 	return -ENOBUFS;
3052ee67178SXianjun Jiao }
3062ee67178SXianjun Jiao COMMAND(get, rssi_th, "<rssi_th in value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_rssi_th, "get rssi_th");
3072ee67178SXianjun Jiao 
3082ee67178SXianjun Jiao static int cb_openwifi_slice_total0_handler(struct nl_msg *msg, void *arg)
3092ee67178SXianjun Jiao {
3102ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
3112ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
3122ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
3132ee67178SXianjun Jiao 
3142ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
3152ee67178SXianjun Jiao 
3162ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
3172ee67178SXianjun Jiao 		return NL_SKIP;
3182ee67178SXianjun Jiao 
3192ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
3202ee67178SXianjun Jiao 
3212ee67178SXianjun Jiao 	printf("openwifi slice_total0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL0]));
3222ee67178SXianjun Jiao 
3232ee67178SXianjun Jiao 	return NL_SKIP;
3242ee67178SXianjun Jiao }
3252ee67178SXianjun Jiao 
3262ee67178SXianjun Jiao static int handle_set_slice_total0(struct nl80211_state *state,
3272ee67178SXianjun Jiao 			  struct nl_cb *cb,
3282ee67178SXianjun Jiao 			  struct nl_msg *msg,
3292ee67178SXianjun Jiao 			  int argc, char **argv,
3302ee67178SXianjun Jiao 			  enum id_input id)
3312ee67178SXianjun Jiao {
3322ee67178SXianjun Jiao 	struct nlattr *tmdata;
3332ee67178SXianjun Jiao 	char *end;
3342ee67178SXianjun Jiao 	unsigned int tmp;
3352ee67178SXianjun Jiao 
3362ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
3372ee67178SXianjun Jiao 	if (!tmdata) {
3382ee67178SXianjun Jiao 		return 1;
3392ee67178SXianjun Jiao 	}
3402ee67178SXianjun Jiao 
3412ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
3422ee67178SXianjun Jiao 
3432ee67178SXianjun Jiao 	if (*end) {
3442ee67178SXianjun Jiao 		return 1;
3452ee67178SXianjun Jiao 	}
3462ee67178SXianjun Jiao 
3472ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL0);
3482ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL0, tmp);
3492ee67178SXianjun Jiao 
3502ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
3512ee67178SXianjun Jiao 
3522ee67178SXianjun Jiao 	printf("openwifi slice_total0 (duration): %dus\n", tmp);
3532ee67178SXianjun Jiao 
3542ee67178SXianjun Jiao 	return 0;
3552ee67178SXianjun Jiao 
3562ee67178SXianjun Jiao  nla_put_failure:
3572ee67178SXianjun Jiao 	return -ENOBUFS;
3582ee67178SXianjun Jiao }
3592ee67178SXianjun Jiao COMMAND(set, slice_total0, "<slice_total0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total0, "set slice_total0");
3602ee67178SXianjun Jiao 
3612ee67178SXianjun Jiao static int handle_get_slice_total0(struct nl80211_state *state,
3622ee67178SXianjun Jiao 			  struct nl_cb *cb,
3632ee67178SXianjun Jiao 			  struct nl_msg *msg,
3642ee67178SXianjun Jiao 			  int argc, char **argv,
3652ee67178SXianjun Jiao 			  enum id_input id)
3662ee67178SXianjun Jiao {
3672ee67178SXianjun Jiao 	struct nlattr *tmdata;
3682ee67178SXianjun Jiao 
3692ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
3702ee67178SXianjun Jiao 	if (!tmdata)
3712ee67178SXianjun Jiao 		return 1;
3722ee67178SXianjun Jiao 
3732ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL0);
3742ee67178SXianjun Jiao 
3752ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
3762ee67178SXianjun Jiao 
3772ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total0_handler, NULL);
3782ee67178SXianjun Jiao 	return 0;
3792ee67178SXianjun Jiao 
3802ee67178SXianjun Jiao  nla_put_failure:
3812ee67178SXianjun Jiao 	return -ENOBUFS;
3822ee67178SXianjun Jiao }
3832ee67178SXianjun Jiao COMMAND(get, slice_total0, "<slice_total0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total0, "get slice_total0");
3842ee67178SXianjun Jiao 
3852ee67178SXianjun Jiao 
3862ee67178SXianjun Jiao static int cb_openwifi_slice_total1_handler(struct nl_msg *msg, void *arg)
3872ee67178SXianjun Jiao {
3882ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
3892ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
3902ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
3912ee67178SXianjun Jiao 
3922ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
3932ee67178SXianjun Jiao 
3942ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
3952ee67178SXianjun Jiao 		return NL_SKIP;
3962ee67178SXianjun Jiao 
3972ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
3982ee67178SXianjun Jiao 
3992ee67178SXianjun Jiao 	printf("openwifi slice_total1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL1]));
4002ee67178SXianjun Jiao 
4012ee67178SXianjun Jiao 	return NL_SKIP;
4022ee67178SXianjun Jiao }
4032ee67178SXianjun Jiao 
4042ee67178SXianjun Jiao static int handle_set_slice_total1(struct nl80211_state *state,
4052ee67178SXianjun Jiao 			  struct nl_cb *cb,
4062ee67178SXianjun Jiao 			  struct nl_msg *msg,
4072ee67178SXianjun Jiao 			  int argc, char **argv,
4082ee67178SXianjun Jiao 			  enum id_input id)
4092ee67178SXianjun Jiao {
4102ee67178SXianjun Jiao 	struct nlattr *tmdata;
4112ee67178SXianjun Jiao 	char *end;
4122ee67178SXianjun Jiao 	unsigned int tmp;
4132ee67178SXianjun Jiao 
4142ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
4152ee67178SXianjun Jiao 	if (!tmdata) {
4162ee67178SXianjun Jiao 		return 1;
4172ee67178SXianjun Jiao 	}
4182ee67178SXianjun Jiao 
4192ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
4202ee67178SXianjun Jiao 
4212ee67178SXianjun Jiao 	if (*end) {
4222ee67178SXianjun Jiao 		return 1;
4232ee67178SXianjun Jiao 	}
4242ee67178SXianjun Jiao 
4252ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL1);
4262ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL1, tmp);
4272ee67178SXianjun Jiao 
4282ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
4292ee67178SXianjun Jiao 
4302ee67178SXianjun Jiao 	printf("openwifi slice_total1 (duration): %dus\n", tmp);
4312ee67178SXianjun Jiao 
4322ee67178SXianjun Jiao 	return 0;
4332ee67178SXianjun Jiao 
4342ee67178SXianjun Jiao  nla_put_failure:
4352ee67178SXianjun Jiao 	return -ENOBUFS;
4362ee67178SXianjun Jiao }
4372ee67178SXianjun Jiao COMMAND(set, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total1, "set slice_total1");
4382ee67178SXianjun Jiao 
4392ee67178SXianjun Jiao static int handle_get_slice_total1(struct nl80211_state *state,
4402ee67178SXianjun Jiao 			  struct nl_cb *cb,
4412ee67178SXianjun Jiao 			  struct nl_msg *msg,
4422ee67178SXianjun Jiao 			  int argc, char **argv,
4432ee67178SXianjun Jiao 			  enum id_input id)
4442ee67178SXianjun Jiao {
4452ee67178SXianjun Jiao 	struct nlattr *tmdata;
4462ee67178SXianjun Jiao 
4472ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
4482ee67178SXianjun Jiao 	if (!tmdata)
4492ee67178SXianjun Jiao 		return 1;
4502ee67178SXianjun Jiao 
4512ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL1);
4522ee67178SXianjun Jiao 
4532ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
4542ee67178SXianjun Jiao 
4552ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total1_handler, NULL);
4562ee67178SXianjun Jiao 	return 0;
4572ee67178SXianjun Jiao 
4582ee67178SXianjun Jiao  nla_put_failure:
4592ee67178SXianjun Jiao 	return -ENOBUFS;
4602ee67178SXianjun Jiao }
4612ee67178SXianjun Jiao COMMAND(get, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total1, "get slice_total1");
4622ee67178SXianjun Jiao 
4632ee67178SXianjun Jiao 
4642ee67178SXianjun Jiao static int cb_openwifi_slice_start0_handler(struct nl_msg *msg, void *arg)
4652ee67178SXianjun Jiao {
4662ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
4672ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
4682ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
4692ee67178SXianjun Jiao 
4702ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
4712ee67178SXianjun Jiao 
4722ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
4732ee67178SXianjun Jiao 		return NL_SKIP;
4742ee67178SXianjun Jiao 
4752ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
4762ee67178SXianjun Jiao 
4772ee67178SXianjun Jiao 	printf("openwifi slice_start0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START0]));
4782ee67178SXianjun Jiao 
4792ee67178SXianjun Jiao 	return NL_SKIP;
4802ee67178SXianjun Jiao }
4812ee67178SXianjun Jiao 
4822ee67178SXianjun Jiao static int handle_set_slice_start0(struct nl80211_state *state,
4832ee67178SXianjun Jiao 			  struct nl_cb *cb,
4842ee67178SXianjun Jiao 			  struct nl_msg *msg,
4852ee67178SXianjun Jiao 			  int argc, char **argv,
4862ee67178SXianjun Jiao 			  enum id_input id)
4872ee67178SXianjun Jiao {
4882ee67178SXianjun Jiao 	struct nlattr *tmdata;
4892ee67178SXianjun Jiao 	char *end;
4902ee67178SXianjun Jiao 	unsigned int tmp;
4912ee67178SXianjun Jiao 
4922ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
4932ee67178SXianjun Jiao 	if (!tmdata) {
4942ee67178SXianjun Jiao 		return 1;
4952ee67178SXianjun Jiao 	}
4962ee67178SXianjun Jiao 
4972ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
4982ee67178SXianjun Jiao 
4992ee67178SXianjun Jiao 	if (*end) {
5002ee67178SXianjun Jiao 		return 1;
5012ee67178SXianjun Jiao 	}
5022ee67178SXianjun Jiao 
5032ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START0);
5042ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START0, tmp);
5052ee67178SXianjun Jiao 
5062ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
5072ee67178SXianjun Jiao 
5082ee67178SXianjun Jiao 	printf("openwifi slice_start0 (duration): %dus\n", tmp);
5092ee67178SXianjun Jiao 
5102ee67178SXianjun Jiao 	return 0;
5112ee67178SXianjun Jiao 
5122ee67178SXianjun Jiao  nla_put_failure:
5132ee67178SXianjun Jiao 	return -ENOBUFS;
5142ee67178SXianjun Jiao }
5152ee67178SXianjun Jiao COMMAND(set, slice_start0, "<slice_start0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start0, "set slice_start0");
5162ee67178SXianjun Jiao 
5172ee67178SXianjun Jiao static int handle_get_slice_start0(struct nl80211_state *state,
5182ee67178SXianjun Jiao 			  struct nl_cb *cb,
5192ee67178SXianjun Jiao 			  struct nl_msg *msg,
5202ee67178SXianjun Jiao 			  int argc, char **argv,
5212ee67178SXianjun Jiao 			  enum id_input id)
5222ee67178SXianjun Jiao {
5232ee67178SXianjun Jiao 	struct nlattr *tmdata;
5242ee67178SXianjun Jiao 
5252ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
5262ee67178SXianjun Jiao 	if (!tmdata)
5272ee67178SXianjun Jiao 		return 1;
5282ee67178SXianjun Jiao 
5292ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START0);
5302ee67178SXianjun Jiao 
5312ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
5322ee67178SXianjun Jiao 
5332ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start0_handler, NULL);
5342ee67178SXianjun Jiao 	return 0;
5352ee67178SXianjun Jiao 
5362ee67178SXianjun Jiao  nla_put_failure:
5372ee67178SXianjun Jiao 	return -ENOBUFS;
5382ee67178SXianjun Jiao }
5392ee67178SXianjun Jiao COMMAND(get, slice_start0, "<slice_start0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start0, "get slice_start0");
5402ee67178SXianjun Jiao 
5412ee67178SXianjun Jiao 
5422ee67178SXianjun Jiao static int cb_openwifi_slice_start1_handler(struct nl_msg *msg, void *arg)
5432ee67178SXianjun Jiao {
5442ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
5452ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
5462ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
5472ee67178SXianjun Jiao 
5482ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
5492ee67178SXianjun Jiao 
5502ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
5512ee67178SXianjun Jiao 		return NL_SKIP;
5522ee67178SXianjun Jiao 
5532ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
5542ee67178SXianjun Jiao 
5552ee67178SXianjun Jiao 	printf("openwifi slice_start1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START1]));
5562ee67178SXianjun Jiao 
5572ee67178SXianjun Jiao 	return NL_SKIP;
5582ee67178SXianjun Jiao }
5592ee67178SXianjun Jiao 
5602ee67178SXianjun Jiao static int handle_set_slice_start1(struct nl80211_state *state,
5612ee67178SXianjun Jiao 			  struct nl_cb *cb,
5622ee67178SXianjun Jiao 			  struct nl_msg *msg,
5632ee67178SXianjun Jiao 			  int argc, char **argv,
5642ee67178SXianjun Jiao 			  enum id_input id)
5652ee67178SXianjun Jiao {
5662ee67178SXianjun Jiao 	struct nlattr *tmdata;
5672ee67178SXianjun Jiao 	char *end;
5682ee67178SXianjun Jiao 	unsigned int tmp;
5692ee67178SXianjun Jiao 
5702ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
5712ee67178SXianjun Jiao 	if (!tmdata) {
5722ee67178SXianjun Jiao 		return 1;
5732ee67178SXianjun Jiao 	}
5742ee67178SXianjun Jiao 
5752ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
5762ee67178SXianjun Jiao 
5772ee67178SXianjun Jiao 	if (*end) {
5782ee67178SXianjun Jiao 		return 1;
5792ee67178SXianjun Jiao 	}
5802ee67178SXianjun Jiao 
5812ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START1);
5822ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START1, tmp);
5832ee67178SXianjun Jiao 
5842ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
5852ee67178SXianjun Jiao 
5862ee67178SXianjun Jiao 	printf("openwifi slice_start1 (duration): %dus\n", tmp);
5872ee67178SXianjun Jiao 
5882ee67178SXianjun Jiao 	return 0;
5892ee67178SXianjun Jiao 
5902ee67178SXianjun Jiao  nla_put_failure:
5912ee67178SXianjun Jiao 	return -ENOBUFS;
5922ee67178SXianjun Jiao }
5932ee67178SXianjun Jiao COMMAND(set, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start1, "set slice_start1");
5942ee67178SXianjun Jiao 
5952ee67178SXianjun Jiao static int handle_get_slice_start1(struct nl80211_state *state,
5962ee67178SXianjun Jiao 			  struct nl_cb *cb,
5972ee67178SXianjun Jiao 			  struct nl_msg *msg,
5982ee67178SXianjun Jiao 			  int argc, char **argv,
5992ee67178SXianjun Jiao 			  enum id_input id)
6002ee67178SXianjun Jiao {
6012ee67178SXianjun Jiao 	struct nlattr *tmdata;
6022ee67178SXianjun Jiao 
6032ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
6042ee67178SXianjun Jiao 	if (!tmdata)
6052ee67178SXianjun Jiao 		return 1;
6062ee67178SXianjun Jiao 
6072ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START1);
6082ee67178SXianjun Jiao 
6092ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
6102ee67178SXianjun Jiao 
6112ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start1_handler, NULL);
6122ee67178SXianjun Jiao 	return 0;
6132ee67178SXianjun Jiao 
6142ee67178SXianjun Jiao  nla_put_failure:
6152ee67178SXianjun Jiao 	return -ENOBUFS;
6162ee67178SXianjun Jiao }
6172ee67178SXianjun Jiao COMMAND(get, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start1, "get slice_start1");
6182ee67178SXianjun Jiao 
6192ee67178SXianjun Jiao 
6202ee67178SXianjun Jiao static int cb_openwifi_slice_end0_handler(struct nl_msg *msg, void *arg)
6212ee67178SXianjun Jiao {
6222ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
6232ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
6242ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
6252ee67178SXianjun Jiao 
6262ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
6272ee67178SXianjun Jiao 
6282ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
6292ee67178SXianjun Jiao 		return NL_SKIP;
6302ee67178SXianjun Jiao 
6312ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
6322ee67178SXianjun Jiao 
6332ee67178SXianjun Jiao 	printf("openwifi slice_end0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END0]));
6342ee67178SXianjun Jiao 
6352ee67178SXianjun Jiao 	return NL_SKIP;
6362ee67178SXianjun Jiao }
6372ee67178SXianjun Jiao 
6382ee67178SXianjun Jiao static int handle_set_slice_end0(struct nl80211_state *state,
6392ee67178SXianjun Jiao 			  struct nl_cb *cb,
6402ee67178SXianjun Jiao 			  struct nl_msg *msg,
6412ee67178SXianjun Jiao 			  int argc, char **argv,
6422ee67178SXianjun Jiao 			  enum id_input id)
6432ee67178SXianjun Jiao {
6442ee67178SXianjun Jiao 	struct nlattr *tmdata;
6452ee67178SXianjun Jiao 	char *end;
6462ee67178SXianjun Jiao 	unsigned int tmp;
6472ee67178SXianjun Jiao 
6482ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
6492ee67178SXianjun Jiao 	if (!tmdata) {
6502ee67178SXianjun Jiao 		return 1;
6512ee67178SXianjun Jiao 	}
6522ee67178SXianjun Jiao 
6532ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
6542ee67178SXianjun Jiao 
6552ee67178SXianjun Jiao 	if (*end) {
6562ee67178SXianjun Jiao 		return 1;
6572ee67178SXianjun Jiao 	}
6582ee67178SXianjun Jiao 
6592ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END0);
6602ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END0, tmp);
6612ee67178SXianjun Jiao 
6622ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
6632ee67178SXianjun Jiao 
6642ee67178SXianjun Jiao 	printf("openwifi slice_end0 (duration): %dus\n", tmp);
6652ee67178SXianjun Jiao 
6662ee67178SXianjun Jiao 	return 0;
6672ee67178SXianjun Jiao 
6682ee67178SXianjun Jiao  nla_put_failure:
6692ee67178SXianjun Jiao 	return -ENOBUFS;
6702ee67178SXianjun Jiao }
6712ee67178SXianjun Jiao COMMAND(set, slice_end0, "<slice_end0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end0, "set slice_end0");
6722ee67178SXianjun Jiao 
6732ee67178SXianjun Jiao static int handle_get_slice_end0(struct nl80211_state *state,
6742ee67178SXianjun Jiao 			  struct nl_cb *cb,
6752ee67178SXianjun Jiao 			  struct nl_msg *msg,
6762ee67178SXianjun Jiao 			  int argc, char **argv,
6772ee67178SXianjun Jiao 			  enum id_input id)
6782ee67178SXianjun Jiao {
6792ee67178SXianjun Jiao 	struct nlattr *tmdata;
6802ee67178SXianjun Jiao 
6812ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
6822ee67178SXianjun Jiao 	if (!tmdata)
6832ee67178SXianjun Jiao 		return 1;
6842ee67178SXianjun Jiao 
6852ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END0);
6862ee67178SXianjun Jiao 
6872ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
6882ee67178SXianjun Jiao 
6892ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end0_handler, NULL);
6902ee67178SXianjun Jiao 	return 0;
6912ee67178SXianjun Jiao 
6922ee67178SXianjun Jiao  nla_put_failure:
6932ee67178SXianjun Jiao 	return -ENOBUFS;
6942ee67178SXianjun Jiao }
6952ee67178SXianjun Jiao COMMAND(get, slice_end0, "<slice_end0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end0, "get slice_end0");
6962ee67178SXianjun Jiao 
6972ee67178SXianjun Jiao 
6982ee67178SXianjun Jiao static int cb_openwifi_slice_end1_handler(struct nl_msg *msg, void *arg)
6992ee67178SXianjun Jiao {
7002ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
7012ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
7022ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
7032ee67178SXianjun Jiao 
7042ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
7052ee67178SXianjun Jiao 
7062ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
7072ee67178SXianjun Jiao 		return NL_SKIP;
7082ee67178SXianjun Jiao 
7092ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
7102ee67178SXianjun Jiao 
7112ee67178SXianjun Jiao 	printf("openwifi slice_end1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END1]));
7122ee67178SXianjun Jiao 
7132ee67178SXianjun Jiao 	return NL_SKIP;
7142ee67178SXianjun Jiao }
7152ee67178SXianjun Jiao 
7162ee67178SXianjun Jiao static int handle_set_slice_end1(struct nl80211_state *state,
7172ee67178SXianjun Jiao 			  struct nl_cb *cb,
7182ee67178SXianjun Jiao 			  struct nl_msg *msg,
7192ee67178SXianjun Jiao 			  int argc, char **argv,
7202ee67178SXianjun Jiao 			  enum id_input id)
7212ee67178SXianjun Jiao {
7222ee67178SXianjun Jiao 	struct nlattr *tmdata;
7232ee67178SXianjun Jiao 	char *end;
7242ee67178SXianjun Jiao 	unsigned int tmp;
7252ee67178SXianjun Jiao 
7262ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
7272ee67178SXianjun Jiao 	if (!tmdata) {
7282ee67178SXianjun Jiao 		return 1;
7292ee67178SXianjun Jiao 	}
7302ee67178SXianjun Jiao 
7312ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
7322ee67178SXianjun Jiao 
7332ee67178SXianjun Jiao 	if (*end) {
7342ee67178SXianjun Jiao 		return 1;
7352ee67178SXianjun Jiao 	}
7362ee67178SXianjun Jiao 
7372ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END1);
7382ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END1, tmp);
7392ee67178SXianjun Jiao 
7402ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
7412ee67178SXianjun Jiao 
7422ee67178SXianjun Jiao 	printf("openwifi slice_end1 (duration): %dus\n", tmp);
7432ee67178SXianjun Jiao 
7442ee67178SXianjun Jiao 	return 0;
7452ee67178SXianjun Jiao 
7462ee67178SXianjun Jiao  nla_put_failure:
7472ee67178SXianjun Jiao 	return -ENOBUFS;
7482ee67178SXianjun Jiao }
7492ee67178SXianjun Jiao COMMAND(set, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end1, "set slice_end1");
7502ee67178SXianjun Jiao 
7512ee67178SXianjun Jiao static int handle_get_slice_end1(struct nl80211_state *state,
7522ee67178SXianjun Jiao 			  struct nl_cb *cb,
7532ee67178SXianjun Jiao 			  struct nl_msg *msg,
7542ee67178SXianjun Jiao 			  int argc, char **argv,
7552ee67178SXianjun Jiao 			  enum id_input id)
7562ee67178SXianjun Jiao {
7572ee67178SXianjun Jiao 	struct nlattr *tmdata;
7582ee67178SXianjun Jiao 
7592ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
7602ee67178SXianjun Jiao 	if (!tmdata)
7612ee67178SXianjun Jiao 		return 1;
7622ee67178SXianjun Jiao 
7632ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END1);
7642ee67178SXianjun Jiao 
7652ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
7662ee67178SXianjun Jiao 
7672ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end1_handler, NULL);
7682ee67178SXianjun Jiao 	return 0;
7692ee67178SXianjun Jiao 
7702ee67178SXianjun Jiao  nla_put_failure:
7712ee67178SXianjun Jiao 	return -ENOBUFS;
7722ee67178SXianjun Jiao }
7732ee67178SXianjun Jiao COMMAND(get, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end1, "get slice_end1");
7742ee67178SXianjun Jiao 
7752ee67178SXianjun Jiao 
7762ee67178SXianjun Jiao static int cb_openwifi_slice0_target_mac_addr_handler(struct nl_msg *msg, void *arg)
7772ee67178SXianjun Jiao {
7782ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
7792ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
7802ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
7812ee67178SXianjun Jiao 
7822ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
7832ee67178SXianjun Jiao 
7842ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
7852ee67178SXianjun Jiao 		return NL_SKIP;
7862ee67178SXianjun Jiao 
7872ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
7882ee67178SXianjun Jiao 
7892ee67178SXianjun Jiao 	printf("openwifi slice0_target_mac_addr(low32) in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_ADDR0]));
7902ee67178SXianjun Jiao 
7912ee67178SXianjun Jiao 	return NL_SKIP;
7922ee67178SXianjun Jiao }
7932ee67178SXianjun Jiao 
7942ee67178SXianjun Jiao static int handle_set_addr0(struct nl80211_state *state,
7952ee67178SXianjun Jiao 			  struct nl_cb *cb,
7962ee67178SXianjun Jiao 			  struct nl_msg *msg,
7972ee67178SXianjun Jiao 			  int argc, char **argv,
7982ee67178SXianjun Jiao 			  enum id_input id)
7992ee67178SXianjun Jiao {
8002ee67178SXianjun Jiao 	struct nlattr *tmdata;
8012ee67178SXianjun Jiao 	char *end;
8022ee67178SXianjun Jiao 	unsigned int slice0_target_mac_addr;
8032ee67178SXianjun Jiao 
8042ee67178SXianjun Jiao 	//printf("handle_set_slice0_target_mac_addr\n");
8052ee67178SXianjun Jiao 
8062ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
8072ee67178SXianjun Jiao 	if (!tmdata) {
8082ee67178SXianjun Jiao 		//printf("handle_set_slice0_target_mac_addr 1\n");
8092ee67178SXianjun Jiao 		return 1;
8102ee67178SXianjun Jiao 	}
8112ee67178SXianjun Jiao 
8122ee67178SXianjun Jiao 	slice0_target_mac_addr = strtoul(argv[0], &end, 16);
8132ee67178SXianjun Jiao 
8142ee67178SXianjun Jiao 	if (*end) {
8152ee67178SXianjun Jiao 		//printf("handle_set_slice0_target_mac_addr 2 %d\n", slice0_target_mac_addr);
8162ee67178SXianjun Jiao 		return 1;
8172ee67178SXianjun Jiao 	}
8182ee67178SXianjun Jiao 
8192ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_ADDR0);
8202ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_ADDR0, slice0_target_mac_addr);
8212ee67178SXianjun Jiao 
8222ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
8232ee67178SXianjun Jiao 
8242ee67178SXianjun Jiao 	printf("openwifi slice0_target_mac_addr(low32) in hex: %08x\n", slice0_target_mac_addr);
8252ee67178SXianjun Jiao 
8262ee67178SXianjun Jiao 	return 0;
8272ee67178SXianjun Jiao 
8282ee67178SXianjun Jiao  nla_put_failure:
8292ee67178SXianjun Jiao 	return -ENOBUFS;
8302ee67178SXianjun Jiao }
8312ee67178SXianjun Jiao COMMAND(set, addr0, "<slice0_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_addr0, "set addr0");
8322ee67178SXianjun Jiao 
8332ee67178SXianjun Jiao static int handle_get_slice0_target_mac_addr(struct nl80211_state *state,
8342ee67178SXianjun Jiao 			  struct nl_cb *cb,
8352ee67178SXianjun Jiao 			  struct nl_msg *msg,
8362ee67178SXianjun Jiao 			  int argc, char **argv,
8372ee67178SXianjun Jiao 			  enum id_input id)
8382ee67178SXianjun Jiao {
8392ee67178SXianjun Jiao 	struct nlattr *tmdata;
8402ee67178SXianjun Jiao 
8412ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
8422ee67178SXianjun Jiao 	if (!tmdata)
8432ee67178SXianjun Jiao 		return 1;
8442ee67178SXianjun Jiao 
8452ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_ADDR0);
8462ee67178SXianjun Jiao 
8472ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
8482ee67178SXianjun Jiao 
8492ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice0_target_mac_addr_handler, NULL);
8502ee67178SXianjun Jiao 	return 0;
8512ee67178SXianjun Jiao 
8522ee67178SXianjun Jiao  nla_put_failure:
8532ee67178SXianjun Jiao 	return -ENOBUFS;
8542ee67178SXianjun Jiao }
8552ee67178SXianjun 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");
8562ee67178SXianjun Jiao 
8572ee67178SXianjun Jiao static int cb_openwifi_slice1_target_mac_addr_handler(struct nl_msg *msg, void *arg)
8582ee67178SXianjun Jiao {
8592ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
8602ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
8612ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
8622ee67178SXianjun Jiao 
8632ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
8642ee67178SXianjun Jiao 
8652ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
8662ee67178SXianjun Jiao 		return NL_SKIP;
8672ee67178SXianjun Jiao 
8682ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
8692ee67178SXianjun Jiao 
8702ee67178SXianjun Jiao 	printf("openwifi slice1_target_mac_addr(low32) in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_ADDR1]));
8712ee67178SXianjun Jiao 
8722ee67178SXianjun Jiao 	return NL_SKIP;
8732ee67178SXianjun Jiao }
8742ee67178SXianjun Jiao 
8752ee67178SXianjun Jiao static int handle_set_slice1_target_mac_addr(struct nl80211_state *state,
8762ee67178SXianjun Jiao 			  struct nl_cb *cb,
8772ee67178SXianjun Jiao 			  struct nl_msg *msg,
8782ee67178SXianjun Jiao 			  int argc, char **argv,
8792ee67178SXianjun Jiao 			  enum id_input id)
8802ee67178SXianjun Jiao {
8812ee67178SXianjun Jiao 	struct nlattr *tmdata;
8822ee67178SXianjun Jiao 	char *end;
8832ee67178SXianjun Jiao 	unsigned int slice1_target_mac_addr;
8842ee67178SXianjun Jiao 
8852ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
8862ee67178SXianjun Jiao 	if (!tmdata)
8872ee67178SXianjun Jiao 		return 1;
8882ee67178SXianjun Jiao 
8892ee67178SXianjun Jiao 	slice1_target_mac_addr = strtoul(argv[0], &end, 16);
8902ee67178SXianjun Jiao 
8912ee67178SXianjun Jiao 	if (*end)
8922ee67178SXianjun Jiao 		return 1;
8932ee67178SXianjun Jiao 
8942ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_ADDR1);
8952ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_ADDR1, slice1_target_mac_addr);
8962ee67178SXianjun Jiao 
8972ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
8982ee67178SXianjun Jiao 
8992ee67178SXianjun Jiao 	printf("openwifi slice1_target_mac_addr(low32) in hex: %08x\n", slice1_target_mac_addr);
9002ee67178SXianjun Jiao 
9012ee67178SXianjun Jiao 	return 0;
9022ee67178SXianjun Jiao 
9032ee67178SXianjun Jiao  nla_put_failure:
9042ee67178SXianjun Jiao 	return -ENOBUFS;
9052ee67178SXianjun Jiao }
9062ee67178SXianjun 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");
9072ee67178SXianjun Jiao 
9082ee67178SXianjun Jiao static int handle_get_slice1_target_mac_addr(struct nl80211_state *state,
9092ee67178SXianjun Jiao 			  struct nl_cb *cb,
9102ee67178SXianjun Jiao 			  struct nl_msg *msg,
9112ee67178SXianjun Jiao 			  int argc, char **argv,
9122ee67178SXianjun Jiao 			  enum id_input id)
9132ee67178SXianjun Jiao {
9142ee67178SXianjun Jiao 	struct nlattr *tmdata;
9152ee67178SXianjun Jiao 
9162ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
9172ee67178SXianjun Jiao 	if (!tmdata)
9182ee67178SXianjun Jiao 		return 1;
9192ee67178SXianjun Jiao 
9202ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_ADDR1);
9212ee67178SXianjun Jiao 
9222ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
9232ee67178SXianjun Jiao 
9242ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice1_target_mac_addr_handler, NULL);
9252ee67178SXianjun Jiao 	return 0;
9262ee67178SXianjun Jiao 
9272ee67178SXianjun Jiao  nla_put_failure:
9282ee67178SXianjun Jiao 	return -ENOBUFS;
9292ee67178SXianjun Jiao }
9302ee67178SXianjun 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");
9312ee67178SXianjun Jiao 
9322ee67178SXianjun Jiao static int cb_openwifi_gap_handler(struct nl_msg *msg, void *arg)
9332ee67178SXianjun Jiao {
9342ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
9352ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
9362ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
9372ee67178SXianjun Jiao 
9382ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
9392ee67178SXianjun Jiao 
9402ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
9412ee67178SXianjun Jiao 		return NL_SKIP;
9422ee67178SXianjun Jiao 
9432ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
9442ee67178SXianjun Jiao 
9452ee67178SXianjun Jiao 	printf("openwifi GAP (usec): %d\n", nla_get_u32(tb[OPENWIFI_ATTR_GAP]));
9462ee67178SXianjun Jiao 
9472ee67178SXianjun Jiao 	return NL_SKIP;
9482ee67178SXianjun Jiao }
9492ee67178SXianjun Jiao 
9502ee67178SXianjun Jiao static int handle_set_gap(struct nl80211_state *state,
9512ee67178SXianjun Jiao 			  struct nl_cb *cb,
9522ee67178SXianjun Jiao 			  struct nl_msg *msg,
9532ee67178SXianjun Jiao 			  int argc, char **argv,
9542ee67178SXianjun Jiao 			  enum id_input id)
9552ee67178SXianjun Jiao {
9562ee67178SXianjun Jiao 	struct nlattr *tmdata;
9572ee67178SXianjun Jiao 	char *end;
9582ee67178SXianjun Jiao 	unsigned int gap_us;
9592ee67178SXianjun Jiao 
9602ee67178SXianjun Jiao 	//printf("handle_set_gap\n");
9612ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
9622ee67178SXianjun Jiao 	if (!tmdata)
9632ee67178SXianjun Jiao 		return 1;
9642ee67178SXianjun Jiao 
9652ee67178SXianjun Jiao 	gap_us = strtoul(argv[0], &end, 10);
9662ee67178SXianjun Jiao 
9672ee67178SXianjun Jiao 	if (*end)
9682ee67178SXianjun Jiao 		return 1;
9692ee67178SXianjun Jiao 
9702ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_GAP);
9712ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_GAP, gap_us);
9722ee67178SXianjun Jiao 
9732ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
9742ee67178SXianjun Jiao 	return 0;
9752ee67178SXianjun Jiao 
9762ee67178SXianjun Jiao  nla_put_failure:
9772ee67178SXianjun Jiao 	return -ENOBUFS;
9782ee67178SXianjun Jiao }
9792ee67178SXianjun Jiao COMMAND(set, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_gap, "set inter frame gap of openwifi radio");
9802ee67178SXianjun Jiao 
9812ee67178SXianjun Jiao static int handle_get_gap(struct nl80211_state *state,
9822ee67178SXianjun Jiao 			  struct nl_cb *cb,
9832ee67178SXianjun Jiao 			  struct nl_msg *msg,
9842ee67178SXianjun Jiao 			  int argc, char **argv,
9852ee67178SXianjun Jiao 			  enum id_input id)
9862ee67178SXianjun Jiao {
9872ee67178SXianjun Jiao 	struct nlattr *tmdata;
9882ee67178SXianjun Jiao 
9892ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
9902ee67178SXianjun Jiao 	if (!tmdata)
9912ee67178SXianjun Jiao 		return 1;
9922ee67178SXianjun Jiao 
9932ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_GAP);
9942ee67178SXianjun Jiao 
9952ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
9962ee67178SXianjun Jiao 
9972ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_gap_handler, NULL);
9982ee67178SXianjun Jiao 	return 0;
9992ee67178SXianjun Jiao 
10002ee67178SXianjun Jiao  nla_put_failure:
10012ee67178SXianjun Jiao 	return -ENOBUFS;
10022ee67178SXianjun Jiao }
10032ee67178SXianjun Jiao COMMAND(get, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_gap, "get inter frame gap of openwifi radio");
1004