xref: /openwifi/user_space/sdrctl_src/cmd.c (revision a6085186d94dfe08b0e09c18c8d4b1b4fe38ea35)
1*a6085186SLina Ceballos // SPDX-FileCopyrightText: 2019 Jiao Xianjun <[email protected]>
2*a6085186SLina Ceballos // SPDX-License-Identifier: AGPL-3.0-or-later
32ee67178SXianjun Jiao 
42ee67178SXianjun Jiao #include <stdbool.h>
52ee67178SXianjun Jiao #include <errno.h>
62ee67178SXianjun Jiao #include <net/if.h>
72ee67178SXianjun Jiao #include <strings.h>
82ee67178SXianjun Jiao 
92ee67178SXianjun Jiao #include <netlink/genl/genl.h>
102ee67178SXianjun Jiao #include <netlink/genl/family.h>
112ee67178SXianjun Jiao #include <netlink/genl/ctrl.h>
122ee67178SXianjun Jiao #include <netlink/msg.h>
132ee67178SXianjun Jiao #include <netlink/attr.h>
142ee67178SXianjun Jiao 
152ee67178SXianjun Jiao #include "nl80211.h"
162ee67178SXianjun Jiao #include "sdrctl.h"
172ee67178SXianjun Jiao #include "nl80211_testmode_def.h"
182ee67178SXianjun Jiao 
192ee67178SXianjun Jiao 
202ee67178SXianjun Jiao static int cb_reg_handler(struct nl_msg *msg, void *arg)
212ee67178SXianjun Jiao {
222ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
232ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
242ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
252ee67178SXianjun Jiao 
262ee67178SXianjun Jiao 	//printf("cb_reg_handler\n");
272ee67178SXianjun Jiao 
282ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
292ee67178SXianjun Jiao 
302ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
312ee67178SXianjun Jiao 		return NL_SKIP;
322ee67178SXianjun Jiao 
332ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
342ee67178SXianjun Jiao 
352ee67178SXianjun Jiao 	//printf("reg addr: %08x\n", nla_get_u32(tb[REG_ATTR_ADDR]));
362ee67178SXianjun Jiao 	printf("reg  val: %08x\n", nla_get_u32(tb[REG_ATTR_VAL]));
372ee67178SXianjun Jiao 
382ee67178SXianjun Jiao 	return NL_SKIP;
392ee67178SXianjun Jiao }
402ee67178SXianjun Jiao 
412ee67178SXianjun Jiao static int handle_set_reg(struct nl80211_state *state,
422ee67178SXianjun Jiao 			  struct nl_cb *cb,
432ee67178SXianjun Jiao 			  struct nl_msg *msg,
442ee67178SXianjun Jiao 			  int argc, char **argv,
452ee67178SXianjun Jiao 			  enum id_input id)
462ee67178SXianjun Jiao {
472ee67178SXianjun Jiao 	struct nlattr *tmdata;
482ee67178SXianjun Jiao 	char *end;
492ee67178SXianjun Jiao 	unsigned int reg_cat, reg_addr, reg_val;
502ee67178SXianjun Jiao 
512ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
522ee67178SXianjun Jiao 	if (!tmdata) {
532ee67178SXianjun Jiao 		return 1;
542ee67178SXianjun Jiao 	}
552ee67178SXianjun Jiao 
562ee67178SXianjun Jiao 	if (strcasecmp(argv[0],"rf")==0)
572ee67178SXianjun Jiao 		reg_cat=1;
582ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx_intf")==0)
592ee67178SXianjun Jiao 		reg_cat = 2;
602ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx_intf")==0)
612ee67178SXianjun Jiao 		reg_cat = 3;
622ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx")==0)
632ee67178SXianjun Jiao 		reg_cat = 4;
642ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx")==0)
652ee67178SXianjun Jiao 		reg_cat = 5;
662ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"xpu")==0)
672ee67178SXianjun Jiao 		reg_cat = 6;
682ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_rx")==0)
692ee67178SXianjun Jiao 		reg_cat = 7;
702ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_tx")==0)
712ee67178SXianjun Jiao 		reg_cat = 8;
722ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_xpu")==0)
732ee67178SXianjun Jiao 		reg_cat = 9;
742ee67178SXianjun Jiao 	else {
752ee67178SXianjun Jiao 		printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n");
762ee67178SXianjun Jiao 		return 1;
772ee67178SXianjun Jiao 	}
782ee67178SXianjun Jiao 
792ee67178SXianjun Jiao 	reg_addr = strtoul(argv[1], &end, 10);
802ee67178SXianjun Jiao 	if (*end) {
812ee67178SXianjun Jiao 		return 1;
822ee67178SXianjun Jiao 	}
832ee67178SXianjun Jiao 	reg_addr = reg_addr<<2;//from idx to addr
842ee67178SXianjun Jiao 	reg_addr = ((reg_cat<<16)|reg_addr);
852ee67178SXianjun Jiao 
862ee67178SXianjun Jiao 	reg_val = strtoul(argv[2], &end, 10);
872ee67178SXianjun Jiao 	if (*end) {
882ee67178SXianjun Jiao 		return 1;
892ee67178SXianjun Jiao 	}
902ee67178SXianjun Jiao 
912ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_SET);
922ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr);
932ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_VAL,  reg_val);
942ee67178SXianjun Jiao 
952ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
962ee67178SXianjun Jiao 
972ee67178SXianjun Jiao 	printf("reg  cat: %d\n",   reg_cat);
982ee67178SXianjun Jiao 	printf("reg addr: %08x\n", reg_addr);
992ee67178SXianjun Jiao 	printf("reg  val: %08x\n", reg_val);
1002ee67178SXianjun Jiao 
1012ee67178SXianjun Jiao 	return 0;
1022ee67178SXianjun Jiao 
1032ee67178SXianjun Jiao  nla_put_failure:
1042ee67178SXianjun Jiao 	return -ENOBUFS;
1052ee67178SXianjun Jiao }
1062ee67178SXianjun 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");
1072ee67178SXianjun Jiao 
1082ee67178SXianjun Jiao static int handle_get_reg(struct nl80211_state *state,
1092ee67178SXianjun Jiao 			  struct nl_cb *cb,
1102ee67178SXianjun Jiao 			  struct nl_msg *msg,
1112ee67178SXianjun Jiao 			  int argc, char **argv,
1122ee67178SXianjun Jiao 			  enum id_input id)
1132ee67178SXianjun Jiao {
1142ee67178SXianjun Jiao 	char *end;
1152ee67178SXianjun Jiao 	struct nlattr *tmdata;
1162ee67178SXianjun Jiao 	unsigned int reg_cat, reg_addr;
1172ee67178SXianjun Jiao 
1182ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
1192ee67178SXianjun Jiao 	if (!tmdata)
1202ee67178SXianjun Jiao 		return 1;
1212ee67178SXianjun Jiao 
1222ee67178SXianjun Jiao 	if (strcasecmp(argv[0],"rf")==0)
1232ee67178SXianjun Jiao 		reg_cat=1;
1242ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx_intf")==0)
1252ee67178SXianjun Jiao 		reg_cat = 2;
1262ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx_intf")==0)
1272ee67178SXianjun Jiao 		reg_cat = 3;
1282ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx")==0)
1292ee67178SXianjun Jiao 		reg_cat = 4;
1302ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx")==0)
1312ee67178SXianjun Jiao 		reg_cat = 5;
1322ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"xpu")==0)
1332ee67178SXianjun Jiao 		reg_cat = 6;
1342ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_rx")==0)
1352ee67178SXianjun Jiao 		reg_cat = 7;
1362ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_tx")==0)
1372ee67178SXianjun Jiao 		reg_cat = 8;
1382ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_xpu")==0)
1392ee67178SXianjun Jiao 		reg_cat = 9;
1402ee67178SXianjun Jiao 	else {
1412ee67178SXianjun Jiao 		printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n");
1422ee67178SXianjun Jiao 		return 1;
1432ee67178SXianjun Jiao 	}
1442ee67178SXianjun Jiao 
1452ee67178SXianjun Jiao 	reg_addr = strtoul(argv[1], &end, 10);
1462ee67178SXianjun Jiao 	if (*end) {
1472ee67178SXianjun Jiao 		return 1;
1482ee67178SXianjun Jiao 	}
1492ee67178SXianjun Jiao 	reg_addr = reg_addr<<2;//from idx to addr
1502ee67178SXianjun Jiao 	reg_addr = ((reg_cat<<16)|reg_addr);
1512ee67178SXianjun Jiao 	printf("SENDaddr: %08x\n", reg_addr);
1522ee67178SXianjun Jiao 
1532ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_GET);
1542ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr);
1552ee67178SXianjun Jiao 
1562ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
1572ee67178SXianjun Jiao 
1582ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_reg_handler, NULL);
1592ee67178SXianjun Jiao 	return 0;
1602ee67178SXianjun Jiao 
1612ee67178SXianjun Jiao  nla_put_failure:
1622ee67178SXianjun Jiao 	return -ENOBUFS;
1632ee67178SXianjun Jiao }
1642ee67178SXianjun 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");
1652ee67178SXianjun Jiao 
1662ee67178SXianjun Jiao static int cb_openwifi_rssi_th_handler(struct nl_msg *msg, void *arg)
1672ee67178SXianjun Jiao {
1682ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
1692ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
1702ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1712ee67178SXianjun Jiao 
1722ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
1732ee67178SXianjun Jiao 
1742ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
1752ee67178SXianjun Jiao 		return NL_SKIP;
1762ee67178SXianjun Jiao 
1772ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
1782ee67178SXianjun Jiao 
1792ee67178SXianjun Jiao 	printf("openwifi rssi_th: %d\n", nla_get_u32(tb[OPENWIFI_ATTR_RSSI_TH]));
1802ee67178SXianjun Jiao 
1812ee67178SXianjun Jiao 	return NL_SKIP;
1822ee67178SXianjun Jiao }
1832ee67178SXianjun Jiao 
1842ee67178SXianjun Jiao static int handle_set_rssi_th(struct nl80211_state *state,
1852ee67178SXianjun Jiao 			  struct nl_cb *cb,
1862ee67178SXianjun Jiao 			  struct nl_msg *msg,
1872ee67178SXianjun Jiao 			  int argc, char **argv,
1882ee67178SXianjun Jiao 			  enum id_input id)
1892ee67178SXianjun Jiao {
1902ee67178SXianjun Jiao 	struct nlattr *tmdata;
1912ee67178SXianjun Jiao 	char *end;
1922ee67178SXianjun Jiao 	unsigned int tmp;
1932ee67178SXianjun Jiao 
1942ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
1952ee67178SXianjun Jiao 	if (!tmdata) {
1962ee67178SXianjun Jiao 		return 1;
1972ee67178SXianjun Jiao 	}
1982ee67178SXianjun Jiao 
1992ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
2002ee67178SXianjun Jiao 
2012ee67178SXianjun Jiao 	if (*end) {
2022ee67178SXianjun Jiao 		return 1;
2032ee67178SXianjun Jiao 	}
2042ee67178SXianjun Jiao 
2052ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_RSSI_TH);
2062ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_RSSI_TH, tmp);
2072ee67178SXianjun Jiao 
2082ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
2092ee67178SXianjun Jiao 
2102ee67178SXianjun Jiao 	printf("openwifi rssi_th: %d\n", tmp);
2112ee67178SXianjun Jiao 
2122ee67178SXianjun Jiao 	return 0;
2132ee67178SXianjun Jiao 
2142ee67178SXianjun Jiao  nla_put_failure:
2152ee67178SXianjun Jiao 	return -ENOBUFS;
2162ee67178SXianjun Jiao }
2172ee67178SXianjun Jiao COMMAND(set, rssi_th, "<rssi_th in value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_rssi_th, "set rssi_th");
2182ee67178SXianjun Jiao 
219e63d1ec3SXianjun Jiao 
220e63d1ec3SXianjun Jiao static int handle_set_tsf(struct nl80211_state *state,
221e63d1ec3SXianjun Jiao 		  struct nl_cb *cb,
222e63d1ec3SXianjun Jiao 		  struct nl_msg *msg,
223e63d1ec3SXianjun Jiao 		  int argc, char **argv,
224e63d1ec3SXianjun Jiao 		  enum id_input id)
225e63d1ec3SXianjun Jiao {
226e63d1ec3SXianjun Jiao 	struct nlattr *tmdata;
227e63d1ec3SXianjun Jiao 	char *end;
22875042a30SXianjun Jiao 	unsigned int high_tsf, low_tsf;
229e63d1ec3SXianjun Jiao 
230e63d1ec3SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
231e63d1ec3SXianjun Jiao 	if (!tmdata) {
232e63d1ec3SXianjun Jiao 		return 1;
233e63d1ec3SXianjun Jiao 	}
234e63d1ec3SXianjun Jiao 
235e63d1ec3SXianjun Jiao 	high_tsf = strtoul(argv[0], &end, 10);
236e63d1ec3SXianjun Jiao 	if (*end) {
237e63d1ec3SXianjun Jiao 		return 1;
238e63d1ec3SXianjun Jiao 	}
239e63d1ec3SXianjun Jiao 
240e63d1ec3SXianjun Jiao 	low_tsf = strtoul(argv[1], &end, 10);
241e63d1ec3SXianjun Jiao 	if (*end) {
242e63d1ec3SXianjun Jiao 		return 1;
243e63d1ec3SXianjun Jiao 	}
244e63d1ec3SXianjun Jiao 
245e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_TSF);
246e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_HIGH_TSF, high_tsf);
247e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_LOW_TSF, low_tsf);
248e63d1ec3SXianjun Jiao 
249e63d1ec3SXianjun Jiao 	nla_nest_end(msg, tmdata);
250e63d1ec3SXianjun Jiao 
251e63d1ec3SXianjun Jiao 	printf("high_tsf val: %08x\n", high_tsf);
252e63d1ec3SXianjun Jiao 	printf("low_tsf  val: %08x\n", low_tsf);
253e63d1ec3SXianjun Jiao 
254e63d1ec3SXianjun Jiao 	return 0;
255e63d1ec3SXianjun Jiao 
256e63d1ec3SXianjun Jiao 	/*struct nlattr *tmdata;
257e63d1ec3SXianjun Jiao 	char *end;
258e63d1ec3SXianjun Jiao 	unsigned int tmp;
259e63d1ec3SXianjun Jiao 
260e63d1ec3SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
261e63d1ec3SXianjun Jiao 	if (!tmdata) {
262e63d1ec3SXianjun Jiao 		return 1;
263e63d1ec3SXianjun Jiao 	}
264e63d1ec3SXianjun Jiao 
265e63d1ec3SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
266e63d1ec3SXianjun Jiao 
267e63d1ec3SXianjun Jiao 	if (*end) {
268e63d1ec3SXianjun Jiao 		return 1;
269e63d1ec3SXianjun Jiao 	}
270e63d1ec3SXianjun Jiao 
271e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_TSF);
272e63d1ec3SXianjun Jiao 	NLA_PUT_U64(msg, OPENWIFI_ATTR_TSF, tmp);
273e63d1ec3SXianjun Jiao 
274e63d1ec3SXianjun Jiao 	nla_nest_end(msg, tmdata);
275e63d1ec3SXianjun Jiao 
276e63d1ec3SXianjun Jiao 	printf("openwifi tsf: %d\n", tmp);
277e63d1ec3SXianjun Jiao 
278e63d1ec3SXianjun Jiao 	return 0;*/
279e63d1ec3SXianjun Jiao 
280e63d1ec3SXianjun Jiao  nla_put_failure:
281e63d1ec3SXianjun Jiao 	return -ENOBUFS;
282e63d1ec3SXianjun Jiao }
283e63d1ec3SXianjun Jiao COMMAND(set, tsf, "<high_tsf value low_tsf value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_tsf, "set tsf");
284e63d1ec3SXianjun Jiao 
2852ee67178SXianjun Jiao static int handle_get_rssi_th(struct nl80211_state *state,
2862ee67178SXianjun Jiao 			  struct nl_cb *cb,
2872ee67178SXianjun Jiao 			  struct nl_msg *msg,
2882ee67178SXianjun Jiao 			  int argc, char **argv,
2892ee67178SXianjun Jiao 			  enum id_input id)
2902ee67178SXianjun Jiao {
2912ee67178SXianjun Jiao 	struct nlattr *tmdata;
2922ee67178SXianjun Jiao 
2932ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
2942ee67178SXianjun Jiao 	if (!tmdata)
2952ee67178SXianjun Jiao 		return 1;
2962ee67178SXianjun Jiao 
2972ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_RSSI_TH);
2982ee67178SXianjun Jiao 
2992ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
3002ee67178SXianjun Jiao 
3012ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_rssi_th_handler, NULL);
3022ee67178SXianjun Jiao 	return 0;
3032ee67178SXianjun Jiao 
3042ee67178SXianjun Jiao  nla_put_failure:
3052ee67178SXianjun Jiao 	return -ENOBUFS;
3062ee67178SXianjun Jiao }
3072ee67178SXianjun Jiao COMMAND(get, rssi_th, "<rssi_th in value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_rssi_th, "get rssi_th");
3082ee67178SXianjun Jiao 
3094ecf49bbSJiao Xianjun static int cb_openwifi_slice_total_handler(struct nl_msg *msg, void *arg)
3102ee67178SXianjun Jiao {
3112ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
3122ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
3132ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
3144ecf49bbSJiao Xianjun 	unsigned int tmp;
3152ee67178SXianjun Jiao 
3162ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
3172ee67178SXianjun Jiao 
3182ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
3192ee67178SXianjun Jiao 		return NL_SKIP;
3202ee67178SXianjun Jiao 
3212ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
3222ee67178SXianjun Jiao 
3234ecf49bbSJiao Xianjun 	tmp = nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL]);
3244ecf49bbSJiao Xianjun 	printf("openwifi slice_total (duration) %dus of slice %d\n", tmp&0xFFFFF, tmp>>20);
3252ee67178SXianjun Jiao 
3262ee67178SXianjun Jiao 	return NL_SKIP;
3272ee67178SXianjun Jiao }
3282ee67178SXianjun Jiao 
3294ecf49bbSJiao Xianjun static int handle_set_slice_total(struct nl80211_state *state,
3302ee67178SXianjun Jiao 			  struct nl_cb *cb,
3312ee67178SXianjun Jiao 			  struct nl_msg *msg,
3322ee67178SXianjun Jiao 			  int argc, char **argv,
3332ee67178SXianjun Jiao 			  enum id_input id)
3342ee67178SXianjun Jiao {
3352ee67178SXianjun Jiao 	struct nlattr *tmdata;
3362ee67178SXianjun Jiao 	char *end;
3372ee67178SXianjun Jiao 	unsigned int tmp;
3382ee67178SXianjun Jiao 
3392ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
3402ee67178SXianjun Jiao 	if (!tmdata) {
3412ee67178SXianjun Jiao 		return 1;
3422ee67178SXianjun Jiao 	}
3432ee67178SXianjun Jiao 
3442ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
3452ee67178SXianjun Jiao 
3462ee67178SXianjun Jiao 	if (*end) {
3472ee67178SXianjun Jiao 		return 1;
3482ee67178SXianjun Jiao 	}
3492ee67178SXianjun Jiao 
3504ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL);
3514ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL, tmp);
3522ee67178SXianjun Jiao 
3532ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
3542ee67178SXianjun Jiao 
3554ecf49bbSJiao Xianjun 	printf("openwifi slice_total (duration): %dus\n", tmp);
3562ee67178SXianjun Jiao 
3572ee67178SXianjun Jiao 	return 0;
3582ee67178SXianjun Jiao 
3592ee67178SXianjun Jiao  nla_put_failure:
3602ee67178SXianjun Jiao 	return -ENOBUFS;
3612ee67178SXianjun Jiao }
3624ecf49bbSJiao Xianjun COMMAND(set, slice_total, "<slice_total(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total, "set slice_total");
3632ee67178SXianjun Jiao 
3644ecf49bbSJiao Xianjun static int handle_get_slice_total(struct nl80211_state *state,
3652ee67178SXianjun Jiao 			  struct nl_cb *cb,
3662ee67178SXianjun Jiao 			  struct nl_msg *msg,
3672ee67178SXianjun Jiao 			  int argc, char **argv,
3682ee67178SXianjun Jiao 			  enum id_input id)
3692ee67178SXianjun Jiao {
3702ee67178SXianjun Jiao 	struct nlattr *tmdata;
3712ee67178SXianjun Jiao 
3722ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
3732ee67178SXianjun Jiao 	if (!tmdata)
3742ee67178SXianjun Jiao 		return 1;
3752ee67178SXianjun Jiao 
3764ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL);
3772ee67178SXianjun Jiao 
3782ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
3792ee67178SXianjun Jiao 
3804ecf49bbSJiao Xianjun 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total_handler, NULL);
3812ee67178SXianjun Jiao 	return 0;
3822ee67178SXianjun Jiao 
3832ee67178SXianjun Jiao  nla_put_failure:
3842ee67178SXianjun Jiao 	return -ENOBUFS;
3852ee67178SXianjun Jiao }
3864ecf49bbSJiao Xianjun COMMAND(get, slice_total, "<slice_total(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total, "get slice_total");
3872ee67178SXianjun Jiao 
3882ee67178SXianjun Jiao 
3894ecf49bbSJiao Xianjun // static int cb_openwifi_slice_total1_handler(struct nl_msg *msg, void *arg)
3904ecf49bbSJiao Xianjun // {
3914ecf49bbSJiao Xianjun // 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
3924ecf49bbSJiao Xianjun // 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
3934ecf49bbSJiao Xianjun // 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
3944ecf49bbSJiao Xianjun 
3954ecf49bbSJiao Xianjun // 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
3964ecf49bbSJiao Xianjun 
3974ecf49bbSJiao Xianjun // 	if (!attrs[NL80211_ATTR_TESTDATA])
3984ecf49bbSJiao Xianjun // 		return NL_SKIP;
3994ecf49bbSJiao Xianjun 
4004ecf49bbSJiao Xianjun // 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
4014ecf49bbSJiao Xianjun 
4024ecf49bbSJiao Xianjun // 	printf("openwifi slice_total1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL1]));
4034ecf49bbSJiao Xianjun 
4044ecf49bbSJiao Xianjun // 	return NL_SKIP;
4054ecf49bbSJiao Xianjun // }
4064ecf49bbSJiao Xianjun 
4074ecf49bbSJiao Xianjun // static int handle_set_slice_total1(struct nl80211_state *state,
4084ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
4094ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
4104ecf49bbSJiao Xianjun // 			  int argc, char **argv,
4114ecf49bbSJiao Xianjun // 			  enum id_input id)
4124ecf49bbSJiao Xianjun // {
4134ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
4144ecf49bbSJiao Xianjun // 	char *end;
4154ecf49bbSJiao Xianjun // 	unsigned int tmp;
4164ecf49bbSJiao Xianjun 
4174ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
4184ecf49bbSJiao Xianjun // 	if (!tmdata) {
4194ecf49bbSJiao Xianjun // 		return 1;
4204ecf49bbSJiao Xianjun // 	}
4214ecf49bbSJiao Xianjun 
4224ecf49bbSJiao Xianjun // 	tmp = strtoul(argv[0], &end, 10);
4234ecf49bbSJiao Xianjun 
4244ecf49bbSJiao Xianjun // 	if (*end) {
4254ecf49bbSJiao Xianjun // 		return 1;
4264ecf49bbSJiao Xianjun // 	}
4274ecf49bbSJiao Xianjun 
4284ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL1);
4294ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL1, tmp);
4304ecf49bbSJiao Xianjun 
4314ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
4324ecf49bbSJiao Xianjun 
4334ecf49bbSJiao Xianjun // 	printf("openwifi slice_total1 (duration): %dus\n", tmp);
4344ecf49bbSJiao Xianjun 
4354ecf49bbSJiao Xianjun // 	return 0;
4364ecf49bbSJiao Xianjun 
4374ecf49bbSJiao Xianjun //  nla_put_failure:
4384ecf49bbSJiao Xianjun // 	return -ENOBUFS;
4394ecf49bbSJiao Xianjun // }
4404ecf49bbSJiao Xianjun // COMMAND(set, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total1, "set slice_total1");
4414ecf49bbSJiao Xianjun 
4424ecf49bbSJiao Xianjun // static int handle_get_slice_total1(struct nl80211_state *state,
4434ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
4444ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
4454ecf49bbSJiao Xianjun // 			  int argc, char **argv,
4464ecf49bbSJiao Xianjun // 			  enum id_input id)
4474ecf49bbSJiao Xianjun // {
4484ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
4494ecf49bbSJiao Xianjun 
4504ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
4514ecf49bbSJiao Xianjun // 	if (!tmdata)
4524ecf49bbSJiao Xianjun // 		return 1;
4534ecf49bbSJiao Xianjun 
4544ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL1);
4554ecf49bbSJiao Xianjun 
4564ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
4574ecf49bbSJiao Xianjun 
4584ecf49bbSJiao Xianjun // 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total1_handler, NULL);
4594ecf49bbSJiao Xianjun // 	return 0;
4604ecf49bbSJiao Xianjun 
4614ecf49bbSJiao Xianjun //  nla_put_failure:
4624ecf49bbSJiao Xianjun // 	return -ENOBUFS;
4634ecf49bbSJiao Xianjun // }
4644ecf49bbSJiao Xianjun // COMMAND(get, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total1, "get slice_total1");
4654ecf49bbSJiao Xianjun 
4664ecf49bbSJiao Xianjun static int cb_openwifi_slice_start_handler(struct nl_msg *msg, void *arg)
4672ee67178SXianjun Jiao {
4682ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
4692ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
4702ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
4714ecf49bbSJiao Xianjun 	unsigned int tmp;
4722ee67178SXianjun Jiao 
4732ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
4742ee67178SXianjun Jiao 
4752ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
4762ee67178SXianjun Jiao 		return NL_SKIP;
4772ee67178SXianjun Jiao 
4782ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
4792ee67178SXianjun Jiao 
4804ecf49bbSJiao Xianjun 	tmp = nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START]);
4814ecf49bbSJiao Xianjun 	printf("openwifi slice_start (duration) %dus of slice %d\n", tmp&0xFFFFF, tmp>>20);
4822ee67178SXianjun Jiao 
4832ee67178SXianjun Jiao 	return NL_SKIP;
4842ee67178SXianjun Jiao }
4852ee67178SXianjun Jiao 
4864ecf49bbSJiao Xianjun static int handle_set_slice_start(struct nl80211_state *state,
4872ee67178SXianjun Jiao 			  struct nl_cb *cb,
4882ee67178SXianjun Jiao 			  struct nl_msg *msg,
4892ee67178SXianjun Jiao 			  int argc, char **argv,
4902ee67178SXianjun Jiao 			  enum id_input id)
4912ee67178SXianjun Jiao {
4922ee67178SXianjun Jiao 	struct nlattr *tmdata;
4932ee67178SXianjun Jiao 	char *end;
4942ee67178SXianjun Jiao 	unsigned int tmp;
4952ee67178SXianjun Jiao 
4962ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
4972ee67178SXianjun Jiao 	if (!tmdata) {
4982ee67178SXianjun Jiao 		return 1;
4992ee67178SXianjun Jiao 	}
5002ee67178SXianjun Jiao 
5012ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
5022ee67178SXianjun Jiao 
5032ee67178SXianjun Jiao 	if (*end) {
5042ee67178SXianjun Jiao 		return 1;
5052ee67178SXianjun Jiao 	}
5062ee67178SXianjun Jiao 
5074ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START);
5084ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START, tmp);
5092ee67178SXianjun Jiao 
5102ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
5112ee67178SXianjun Jiao 
5124ecf49bbSJiao Xianjun 	printf("openwifi slice_start (duration): %dus\n", tmp);
5132ee67178SXianjun Jiao 
5142ee67178SXianjun Jiao 	return 0;
5152ee67178SXianjun Jiao 
5162ee67178SXianjun Jiao  nla_put_failure:
5172ee67178SXianjun Jiao 	return -ENOBUFS;
5182ee67178SXianjun Jiao }
5194ecf49bbSJiao Xianjun COMMAND(set, slice_start, "<slice_start(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start, "set slice_start");
5202ee67178SXianjun Jiao 
5214ecf49bbSJiao Xianjun static int handle_get_slice_start(struct nl80211_state *state,
5222ee67178SXianjun Jiao 			  struct nl_cb *cb,
5232ee67178SXianjun Jiao 			  struct nl_msg *msg,
5242ee67178SXianjun Jiao 			  int argc, char **argv,
5252ee67178SXianjun Jiao 			  enum id_input id)
5262ee67178SXianjun Jiao {
5272ee67178SXianjun Jiao 	struct nlattr *tmdata;
5282ee67178SXianjun Jiao 
5292ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
5302ee67178SXianjun Jiao 	if (!tmdata)
5312ee67178SXianjun Jiao 		return 1;
5322ee67178SXianjun Jiao 
5334ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START);
5342ee67178SXianjun Jiao 
5352ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
5362ee67178SXianjun Jiao 
5374ecf49bbSJiao Xianjun 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start_handler, NULL);
5382ee67178SXianjun Jiao 	return 0;
5392ee67178SXianjun Jiao 
5402ee67178SXianjun Jiao  nla_put_failure:
5412ee67178SXianjun Jiao 	return -ENOBUFS;
5422ee67178SXianjun Jiao }
5434ecf49bbSJiao Xianjun COMMAND(get, slice_start, "<slice_start(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start, "get slice_start");
5442ee67178SXianjun Jiao 
5452ee67178SXianjun Jiao 
5464ecf49bbSJiao Xianjun // static int cb_openwifi_slice_start1_handler(struct nl_msg *msg, void *arg)
5474ecf49bbSJiao Xianjun // {
5484ecf49bbSJiao Xianjun // 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
5494ecf49bbSJiao Xianjun // 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
5504ecf49bbSJiao Xianjun // 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
5514ecf49bbSJiao Xianjun 
5524ecf49bbSJiao Xianjun // 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
5534ecf49bbSJiao Xianjun 
5544ecf49bbSJiao Xianjun // 	if (!attrs[NL80211_ATTR_TESTDATA])
5554ecf49bbSJiao Xianjun // 		return NL_SKIP;
5564ecf49bbSJiao Xianjun 
5574ecf49bbSJiao Xianjun // 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
5584ecf49bbSJiao Xianjun 
5594ecf49bbSJiao Xianjun // 	printf("openwifi slice_start1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START1]));
5604ecf49bbSJiao Xianjun 
5614ecf49bbSJiao Xianjun // 	return NL_SKIP;
5624ecf49bbSJiao Xianjun // }
5634ecf49bbSJiao Xianjun 
5644ecf49bbSJiao Xianjun // static int handle_set_slice_start1(struct nl80211_state *state,
5654ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
5664ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
5674ecf49bbSJiao Xianjun // 			  int argc, char **argv,
5684ecf49bbSJiao Xianjun // 			  enum id_input id)
5694ecf49bbSJiao Xianjun // {
5704ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
5714ecf49bbSJiao Xianjun // 	char *end;
5724ecf49bbSJiao Xianjun // 	unsigned int tmp;
5734ecf49bbSJiao Xianjun 
5744ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
5754ecf49bbSJiao Xianjun // 	if (!tmdata) {
5764ecf49bbSJiao Xianjun // 		return 1;
5774ecf49bbSJiao Xianjun // 	}
5784ecf49bbSJiao Xianjun 
5794ecf49bbSJiao Xianjun // 	tmp = strtoul(argv[0], &end, 10);
5804ecf49bbSJiao Xianjun 
5814ecf49bbSJiao Xianjun // 	if (*end) {
5824ecf49bbSJiao Xianjun // 		return 1;
5834ecf49bbSJiao Xianjun // 	}
5844ecf49bbSJiao Xianjun 
5854ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START1);
5864ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START1, tmp);
5874ecf49bbSJiao Xianjun 
5884ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
5894ecf49bbSJiao Xianjun 
5904ecf49bbSJiao Xianjun // 	printf("openwifi slice_start1 (duration): %dus\n", tmp);
5914ecf49bbSJiao Xianjun 
5924ecf49bbSJiao Xianjun // 	return 0;
5934ecf49bbSJiao Xianjun 
5944ecf49bbSJiao Xianjun //  nla_put_failure:
5954ecf49bbSJiao Xianjun // 	return -ENOBUFS;
5964ecf49bbSJiao Xianjun // }
5974ecf49bbSJiao Xianjun // COMMAND(set, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start1, "set slice_start1");
5984ecf49bbSJiao Xianjun 
5994ecf49bbSJiao Xianjun // static int handle_get_slice_start1(struct nl80211_state *state,
6004ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
6014ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
6024ecf49bbSJiao Xianjun // 			  int argc, char **argv,
6034ecf49bbSJiao Xianjun // 			  enum id_input id)
6044ecf49bbSJiao Xianjun // {
6054ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
6064ecf49bbSJiao Xianjun 
6074ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
6084ecf49bbSJiao Xianjun // 	if (!tmdata)
6094ecf49bbSJiao Xianjun // 		return 1;
6104ecf49bbSJiao Xianjun 
6114ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START1);
6124ecf49bbSJiao Xianjun 
6134ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
6144ecf49bbSJiao Xianjun 
6154ecf49bbSJiao Xianjun // 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start1_handler, NULL);
6164ecf49bbSJiao Xianjun // 	return 0;
6174ecf49bbSJiao Xianjun 
6184ecf49bbSJiao Xianjun //  nla_put_failure:
6194ecf49bbSJiao Xianjun // 	return -ENOBUFS;
6204ecf49bbSJiao Xianjun // }
6214ecf49bbSJiao Xianjun // COMMAND(get, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start1, "get slice_start1");
6224ecf49bbSJiao Xianjun 
6234ecf49bbSJiao Xianjun 
6244ecf49bbSJiao Xianjun static int cb_openwifi_slice_end_handler(struct nl_msg *msg, void *arg)
6252ee67178SXianjun Jiao {
6262ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
6272ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
6282ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
6294ecf49bbSJiao Xianjun 	unsigned int tmp;
6302ee67178SXianjun Jiao 
6312ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
6322ee67178SXianjun Jiao 
6332ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
6342ee67178SXianjun Jiao 		return NL_SKIP;
6352ee67178SXianjun Jiao 
6362ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
6372ee67178SXianjun Jiao 
6384ecf49bbSJiao Xianjun 	tmp = nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END]);
6394ecf49bbSJiao Xianjun 	printf("openwifi slice_end (duration) %dus of slice %d\n", tmp&0xFFFFF, tmp>>20);
6402ee67178SXianjun Jiao 
6412ee67178SXianjun Jiao 	return NL_SKIP;
6422ee67178SXianjun Jiao }
6432ee67178SXianjun Jiao 
6444ecf49bbSJiao Xianjun static int handle_set_slice_end(struct nl80211_state *state,
6452ee67178SXianjun Jiao 			  struct nl_cb *cb,
6462ee67178SXianjun Jiao 			  struct nl_msg *msg,
6472ee67178SXianjun Jiao 			  int argc, char **argv,
6482ee67178SXianjun Jiao 			  enum id_input id)
6492ee67178SXianjun Jiao {
6502ee67178SXianjun Jiao 	struct nlattr *tmdata;
6512ee67178SXianjun Jiao 	char *end;
6522ee67178SXianjun Jiao 	unsigned int tmp;
6532ee67178SXianjun Jiao 
6542ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
6552ee67178SXianjun Jiao 	if (!tmdata) {
6562ee67178SXianjun Jiao 		return 1;
6572ee67178SXianjun Jiao 	}
6582ee67178SXianjun Jiao 
6592ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
6602ee67178SXianjun Jiao 
6612ee67178SXianjun Jiao 	if (*end) {
6622ee67178SXianjun Jiao 		return 1;
6632ee67178SXianjun Jiao 	}
6642ee67178SXianjun Jiao 
6654ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END);
6664ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END, tmp);
6672ee67178SXianjun Jiao 
6682ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
6692ee67178SXianjun Jiao 
6704ecf49bbSJiao Xianjun 	printf("openwifi slice_end (duration): %dus\n", tmp);
6712ee67178SXianjun Jiao 
6722ee67178SXianjun Jiao 	return 0;
6732ee67178SXianjun Jiao 
6742ee67178SXianjun Jiao  nla_put_failure:
6752ee67178SXianjun Jiao 	return -ENOBUFS;
6762ee67178SXianjun Jiao }
6774ecf49bbSJiao Xianjun COMMAND(set, slice_end, "<slice_end(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end, "set slice_end");
6782ee67178SXianjun Jiao 
6794ecf49bbSJiao Xianjun static int handle_get_slice_end(struct nl80211_state *state,
6802ee67178SXianjun Jiao 			  struct nl_cb *cb,
6812ee67178SXianjun Jiao 			  struct nl_msg *msg,
6822ee67178SXianjun Jiao 			  int argc, char **argv,
6832ee67178SXianjun Jiao 			  enum id_input id)
6842ee67178SXianjun Jiao {
6852ee67178SXianjun Jiao 	struct nlattr *tmdata;
6862ee67178SXianjun Jiao 
6872ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
6882ee67178SXianjun Jiao 	if (!tmdata)
6892ee67178SXianjun Jiao 		return 1;
6902ee67178SXianjun Jiao 
6914ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END);
6922ee67178SXianjun Jiao 
6932ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
6942ee67178SXianjun Jiao 
6954ecf49bbSJiao Xianjun 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end_handler, NULL);
6962ee67178SXianjun Jiao 	return 0;
6972ee67178SXianjun Jiao 
6982ee67178SXianjun Jiao  nla_put_failure:
6992ee67178SXianjun Jiao 	return -ENOBUFS;
7002ee67178SXianjun Jiao }
7014ecf49bbSJiao Xianjun COMMAND(get, slice_end, "<slice_end(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end, "get slice_end");
7022ee67178SXianjun Jiao 
7032ee67178SXianjun Jiao 
7044ecf49bbSJiao Xianjun // static int cb_openwifi_slice_end1_handler(struct nl_msg *msg, void *arg)
7054ecf49bbSJiao Xianjun // {
7064ecf49bbSJiao Xianjun // 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
7074ecf49bbSJiao Xianjun // 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
7084ecf49bbSJiao Xianjun // 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
7094ecf49bbSJiao Xianjun 
7104ecf49bbSJiao Xianjun // 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
7114ecf49bbSJiao Xianjun 
7124ecf49bbSJiao Xianjun // 	if (!attrs[NL80211_ATTR_TESTDATA])
7134ecf49bbSJiao Xianjun // 		return NL_SKIP;
7144ecf49bbSJiao Xianjun 
7154ecf49bbSJiao Xianjun // 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
7164ecf49bbSJiao Xianjun 
7174ecf49bbSJiao Xianjun // 	printf("openwifi slice_end1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END1]));
7184ecf49bbSJiao Xianjun 
7194ecf49bbSJiao Xianjun // 	return NL_SKIP;
7204ecf49bbSJiao Xianjun // }
7214ecf49bbSJiao Xianjun 
7224ecf49bbSJiao Xianjun // static int handle_set_slice_end1(struct nl80211_state *state,
7234ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
7244ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
7254ecf49bbSJiao Xianjun // 			  int argc, char **argv,
7264ecf49bbSJiao Xianjun // 			  enum id_input id)
7274ecf49bbSJiao Xianjun // {
7284ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
7294ecf49bbSJiao Xianjun // 	char *end;
7304ecf49bbSJiao Xianjun // 	unsigned int tmp;
7314ecf49bbSJiao Xianjun 
7324ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
7334ecf49bbSJiao Xianjun // 	if (!tmdata) {
7344ecf49bbSJiao Xianjun // 		return 1;
7354ecf49bbSJiao Xianjun // 	}
7364ecf49bbSJiao Xianjun 
7374ecf49bbSJiao Xianjun // 	tmp = strtoul(argv[0], &end, 10);
7384ecf49bbSJiao Xianjun 
7394ecf49bbSJiao Xianjun // 	if (*end) {
7404ecf49bbSJiao Xianjun // 		return 1;
7414ecf49bbSJiao Xianjun // 	}
7424ecf49bbSJiao Xianjun 
7434ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END1);
7444ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END1, tmp);
7454ecf49bbSJiao Xianjun 
7464ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
7474ecf49bbSJiao Xianjun 
7484ecf49bbSJiao Xianjun // 	printf("openwifi slice_end1 (duration): %dus\n", tmp);
7494ecf49bbSJiao Xianjun 
7504ecf49bbSJiao Xianjun // 	return 0;
7514ecf49bbSJiao Xianjun 
7524ecf49bbSJiao Xianjun //  nla_put_failure:
7534ecf49bbSJiao Xianjun // 	return -ENOBUFS;
7544ecf49bbSJiao Xianjun // }
7554ecf49bbSJiao Xianjun // COMMAND(set, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end1, "set slice_end1");
7564ecf49bbSJiao Xianjun 
7574ecf49bbSJiao Xianjun // static int handle_get_slice_end1(struct nl80211_state *state,
7584ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
7594ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
7604ecf49bbSJiao Xianjun // 			  int argc, char **argv,
7614ecf49bbSJiao Xianjun // 			  enum id_input id)
7624ecf49bbSJiao Xianjun // {
7634ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
7644ecf49bbSJiao Xianjun 
7654ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
7664ecf49bbSJiao Xianjun // 	if (!tmdata)
7674ecf49bbSJiao Xianjun // 		return 1;
7684ecf49bbSJiao Xianjun 
7694ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END1);
7704ecf49bbSJiao Xianjun 
7714ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
7724ecf49bbSJiao Xianjun 
7734ecf49bbSJiao Xianjun // 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end1_handler, NULL);
7744ecf49bbSJiao Xianjun // 	return 0;
7754ecf49bbSJiao Xianjun 
7764ecf49bbSJiao Xianjun //  nla_put_failure:
7774ecf49bbSJiao Xianjun // 	return -ENOBUFS;
7784ecf49bbSJiao Xianjun // }
7794ecf49bbSJiao Xianjun // COMMAND(get, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end1, "get slice_end1");
7804ecf49bbSJiao Xianjun 
7814ecf49bbSJiao Xianjun 
7824ecf49bbSJiao Xianjun static int cb_openwifi_slice_idx_handler(struct nl_msg *msg, void *arg)
7832ee67178SXianjun Jiao {
7842ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
7852ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
7862ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
7872ee67178SXianjun Jiao 
7882ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
7892ee67178SXianjun Jiao 
7902ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
7912ee67178SXianjun Jiao 		return NL_SKIP;
7922ee67178SXianjun Jiao 
7932ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
7942ee67178SXianjun Jiao 
7954ecf49bbSJiao Xianjun 	printf("openwifi slice_idx in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_IDX]));
7962ee67178SXianjun Jiao 
7972ee67178SXianjun Jiao 	return NL_SKIP;
7982ee67178SXianjun Jiao }
7992ee67178SXianjun Jiao 
8004ecf49bbSJiao Xianjun static int handle_set_slice_idx(struct nl80211_state *state,
8012ee67178SXianjun Jiao 			  struct nl_cb *cb,
8022ee67178SXianjun Jiao 			  struct nl_msg *msg,
8032ee67178SXianjun Jiao 			  int argc, char **argv,
8042ee67178SXianjun Jiao 			  enum id_input id)
8052ee67178SXianjun Jiao {
8062ee67178SXianjun Jiao 	struct nlattr *tmdata;
8072ee67178SXianjun Jiao 	char *end;
8084ecf49bbSJiao Xianjun 	unsigned int slice_idx;
8094ecf49bbSJiao Xianjun 
8104ecf49bbSJiao Xianjun 	//printf("handle_set_slice_idx\n");
8112ee67178SXianjun Jiao 
8122ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
8132ee67178SXianjun Jiao 	if (!tmdata) {
8144ecf49bbSJiao Xianjun 		//printf("handle_set_slice_idx 1\n");
8152ee67178SXianjun Jiao 		return 1;
8162ee67178SXianjun Jiao 	}
8172ee67178SXianjun Jiao 
8184ecf49bbSJiao Xianjun 	slice_idx = strtoul(argv[0], &end, 16);
8192ee67178SXianjun Jiao 
8202ee67178SXianjun Jiao 	if (*end) {
8214ecf49bbSJiao Xianjun 		//printf("handle_set_slice_idx 2 %d\n", slice_idx);
8222ee67178SXianjun Jiao 		return 1;
8232ee67178SXianjun Jiao 	}
8242ee67178SXianjun Jiao 
8254ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_IDX);
8264ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_IDX, slice_idx);
8272ee67178SXianjun Jiao 
8282ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
8292ee67178SXianjun Jiao 
8304ecf49bbSJiao Xianjun 	printf("openwifi slice_idx in hex: %08x\n", slice_idx);
8312ee67178SXianjun Jiao 
8322ee67178SXianjun Jiao 	return 0;
8332ee67178SXianjun Jiao 
8342ee67178SXianjun Jiao  nla_put_failure:
8352ee67178SXianjun Jiao 	return -ENOBUFS;
8362ee67178SXianjun Jiao }
8374ecf49bbSJiao Xianjun COMMAND(set, slice_idx, "<slice_idx in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_idx, "set slice_idx");
8382ee67178SXianjun Jiao 
8394ecf49bbSJiao Xianjun static int handle_get_slice_idx(struct nl80211_state *state,
8402ee67178SXianjun Jiao 			  struct nl_cb *cb,
8412ee67178SXianjun Jiao 			  struct nl_msg *msg,
8422ee67178SXianjun Jiao 			  int argc, char **argv,
8432ee67178SXianjun Jiao 			  enum id_input id)
8442ee67178SXianjun Jiao {
8452ee67178SXianjun Jiao 	struct nlattr *tmdata;
8462ee67178SXianjun Jiao 
8472ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
8482ee67178SXianjun Jiao 	if (!tmdata)
8492ee67178SXianjun Jiao 		return 1;
8502ee67178SXianjun Jiao 
8514ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_IDX);
8522ee67178SXianjun Jiao 
8532ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
8542ee67178SXianjun Jiao 
8554ecf49bbSJiao Xianjun 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_idx_handler, NULL);
8562ee67178SXianjun Jiao 	return 0;
8572ee67178SXianjun Jiao 
8582ee67178SXianjun Jiao  nla_put_failure:
8592ee67178SXianjun Jiao 	return -ENOBUFS;
8602ee67178SXianjun Jiao }
8614ecf49bbSJiao Xianjun COMMAND(get, slice_idx, "<slice_idx in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_idx, "get slice_idx");
8622ee67178SXianjun Jiao 
8634ecf49bbSJiao Xianjun static int cb_openwifi_slice_target_mac_addr_handler(struct nl_msg *msg, void *arg)
8642ee67178SXianjun Jiao {
8652ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
8662ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
8672ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
8682ee67178SXianjun Jiao 
8692ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
8702ee67178SXianjun Jiao 
8712ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
8722ee67178SXianjun Jiao 		return NL_SKIP;
8732ee67178SXianjun Jiao 
8742ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
8752ee67178SXianjun Jiao 
8764ecf49bbSJiao Xianjun 	printf("openwifi slice_target_mac_addr(low32) in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_ADDR]));
8772ee67178SXianjun Jiao 
8782ee67178SXianjun Jiao 	return NL_SKIP;
8792ee67178SXianjun Jiao }
8802ee67178SXianjun Jiao 
8814ecf49bbSJiao Xianjun static int handle_set_slice_target_mac_addr(struct nl80211_state *state,
8822ee67178SXianjun Jiao 			  struct nl_cb *cb,
8832ee67178SXianjun Jiao 			  struct nl_msg *msg,
8842ee67178SXianjun Jiao 			  int argc, char **argv,
8852ee67178SXianjun Jiao 			  enum id_input id)
8862ee67178SXianjun Jiao {
8872ee67178SXianjun Jiao 	struct nlattr *tmdata;
8882ee67178SXianjun Jiao 	char *end;
8894ecf49bbSJiao Xianjun 	unsigned int slice_target_mac_addr;
8902ee67178SXianjun Jiao 
8912ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
8922ee67178SXianjun Jiao 	if (!tmdata)
8932ee67178SXianjun Jiao 		return 1;
8942ee67178SXianjun Jiao 
8954ecf49bbSJiao Xianjun 	slice_target_mac_addr = strtoul(argv[0], &end, 16);
8962ee67178SXianjun Jiao 
8972ee67178SXianjun Jiao 	if (*end)
8982ee67178SXianjun Jiao 		return 1;
8992ee67178SXianjun Jiao 
9004ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_ADDR);
9014ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_ADDR, slice_target_mac_addr);
9022ee67178SXianjun Jiao 
9032ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
9042ee67178SXianjun Jiao 
9054ecf49bbSJiao Xianjun 	printf("openwifi slice_target_mac_addr(low32) in hex: %08x\n", slice_target_mac_addr);
9062ee67178SXianjun Jiao 
9072ee67178SXianjun Jiao 	return 0;
9082ee67178SXianjun Jiao 
9092ee67178SXianjun Jiao  nla_put_failure:
9102ee67178SXianjun Jiao 	return -ENOBUFS;
9112ee67178SXianjun Jiao }
9124ecf49bbSJiao Xianjun COMMAND(set, addr, "<slice_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_target_mac_addr, "set addr");
9132ee67178SXianjun Jiao 
9144ecf49bbSJiao Xianjun static int handle_get_slice_target_mac_addr(struct nl80211_state *state,
9152ee67178SXianjun Jiao 			  struct nl_cb *cb,
9162ee67178SXianjun Jiao 			  struct nl_msg *msg,
9172ee67178SXianjun Jiao 			  int argc, char **argv,
9182ee67178SXianjun Jiao 			  enum id_input id)
9192ee67178SXianjun Jiao {
9202ee67178SXianjun Jiao 	struct nlattr *tmdata;
9212ee67178SXianjun Jiao 
9222ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
9232ee67178SXianjun Jiao 	if (!tmdata)
9242ee67178SXianjun Jiao 		return 1;
9252ee67178SXianjun Jiao 
9264ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_ADDR);
9272ee67178SXianjun Jiao 
9282ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
9292ee67178SXianjun Jiao 
9304ecf49bbSJiao Xianjun 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_target_mac_addr_handler, NULL);
9312ee67178SXianjun Jiao 	return 0;
9322ee67178SXianjun Jiao 
9332ee67178SXianjun Jiao  nla_put_failure:
9342ee67178SXianjun Jiao 	return -ENOBUFS;
9352ee67178SXianjun Jiao }
9364ecf49bbSJiao Xianjun COMMAND(get, addr, "<slice_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_target_mac_addr, "get addr");
9372ee67178SXianjun Jiao 
9382ee67178SXianjun Jiao static int cb_openwifi_gap_handler(struct nl_msg *msg, void *arg)
9392ee67178SXianjun Jiao {
9402ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
9412ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
9422ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
9432ee67178SXianjun Jiao 
9442ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
9452ee67178SXianjun Jiao 
9462ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
9472ee67178SXianjun Jiao 		return NL_SKIP;
9482ee67178SXianjun Jiao 
9492ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
9502ee67178SXianjun Jiao 
9512ee67178SXianjun Jiao 	printf("openwifi GAP (usec): %d\n", nla_get_u32(tb[OPENWIFI_ATTR_GAP]));
9522ee67178SXianjun Jiao 
9532ee67178SXianjun Jiao 	return NL_SKIP;
9542ee67178SXianjun Jiao }
9552ee67178SXianjun Jiao 
9562ee67178SXianjun Jiao static int handle_set_gap(struct nl80211_state *state,
9572ee67178SXianjun Jiao 			  struct nl_cb *cb,
9582ee67178SXianjun Jiao 			  struct nl_msg *msg,
9592ee67178SXianjun Jiao 			  int argc, char **argv,
9602ee67178SXianjun Jiao 			  enum id_input id)
9612ee67178SXianjun Jiao {
9622ee67178SXianjun Jiao 	struct nlattr *tmdata;
9632ee67178SXianjun Jiao 	char *end;
9642ee67178SXianjun Jiao 	unsigned int gap_us;
9652ee67178SXianjun Jiao 
9662ee67178SXianjun Jiao 	//printf("handle_set_gap\n");
9672ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
9682ee67178SXianjun Jiao 	if (!tmdata)
9692ee67178SXianjun Jiao 		return 1;
9702ee67178SXianjun Jiao 
9712ee67178SXianjun Jiao 	gap_us = strtoul(argv[0], &end, 10);
9722ee67178SXianjun Jiao 
9732ee67178SXianjun Jiao 	if (*end)
9742ee67178SXianjun Jiao 		return 1;
9752ee67178SXianjun Jiao 
9762ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_GAP);
9772ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_GAP, gap_us);
9782ee67178SXianjun Jiao 
9792ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
9802ee67178SXianjun Jiao 	return 0;
9812ee67178SXianjun Jiao 
9822ee67178SXianjun Jiao  nla_put_failure:
9832ee67178SXianjun Jiao 	return -ENOBUFS;
9842ee67178SXianjun Jiao }
9852ee67178SXianjun Jiao COMMAND(set, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_gap, "set inter frame gap of openwifi radio");
9862ee67178SXianjun Jiao 
9872ee67178SXianjun Jiao static int handle_get_gap(struct nl80211_state *state,
9882ee67178SXianjun Jiao 			  struct nl_cb *cb,
9892ee67178SXianjun Jiao 			  struct nl_msg *msg,
9902ee67178SXianjun Jiao 			  int argc, char **argv,
9912ee67178SXianjun Jiao 			  enum id_input id)
9922ee67178SXianjun Jiao {
9932ee67178SXianjun Jiao 	struct nlattr *tmdata;
9942ee67178SXianjun Jiao 
9952ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
9962ee67178SXianjun Jiao 	if (!tmdata)
9972ee67178SXianjun Jiao 		return 1;
9982ee67178SXianjun Jiao 
9992ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_GAP);
10002ee67178SXianjun Jiao 
10012ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
10022ee67178SXianjun Jiao 
10032ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_gap_handler, NULL);
10042ee67178SXianjun Jiao 	return 0;
10052ee67178SXianjun Jiao 
10062ee67178SXianjun Jiao  nla_put_failure:
10072ee67178SXianjun Jiao 	return -ENOBUFS;
10082ee67178SXianjun Jiao }
10092ee67178SXianjun Jiao COMMAND(get, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_gap, "get inter frame gap of openwifi radio");
1010