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