xref: /openwifi/user_space/sdrctl_src/cmd.c (revision 4ecf49bb3edf31ca09d11d9d5e397c3dbc353c0a)
12ee67178SXianjun Jiao // Xianjun jiao. [email protected]; [email protected];
22ee67178SXianjun Jiao 
32ee67178SXianjun Jiao #include <stdbool.h>
42ee67178SXianjun Jiao #include <errno.h>
52ee67178SXianjun Jiao #include <net/if.h>
62ee67178SXianjun Jiao #include <strings.h>
72ee67178SXianjun Jiao 
82ee67178SXianjun Jiao #include <netlink/genl/genl.h>
92ee67178SXianjun Jiao #include <netlink/genl/family.h>
102ee67178SXianjun Jiao #include <netlink/genl/ctrl.h>
112ee67178SXianjun Jiao #include <netlink/msg.h>
122ee67178SXianjun Jiao #include <netlink/attr.h>
132ee67178SXianjun Jiao 
142ee67178SXianjun Jiao #include "nl80211.h"
152ee67178SXianjun Jiao #include "sdrctl.h"
162ee67178SXianjun Jiao #include "nl80211_testmode_def.h"
172ee67178SXianjun Jiao 
182ee67178SXianjun Jiao 
192ee67178SXianjun Jiao static int cb_reg_handler(struct nl_msg *msg, void *arg)
202ee67178SXianjun Jiao {
212ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
222ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
232ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
242ee67178SXianjun Jiao 
252ee67178SXianjun Jiao 	//printf("cb_reg_handler\n");
262ee67178SXianjun Jiao 
272ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
282ee67178SXianjun Jiao 
292ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
302ee67178SXianjun Jiao 		return NL_SKIP;
312ee67178SXianjun Jiao 
322ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
332ee67178SXianjun Jiao 
342ee67178SXianjun Jiao 	//printf("reg addr: %08x\n", nla_get_u32(tb[REG_ATTR_ADDR]));
352ee67178SXianjun Jiao 	printf("reg  val: %08x\n", nla_get_u32(tb[REG_ATTR_VAL]));
362ee67178SXianjun Jiao 
372ee67178SXianjun Jiao 	return NL_SKIP;
382ee67178SXianjun Jiao }
392ee67178SXianjun Jiao 
402ee67178SXianjun Jiao static int handle_set_reg(struct nl80211_state *state,
412ee67178SXianjun Jiao 			  struct nl_cb *cb,
422ee67178SXianjun Jiao 			  struct nl_msg *msg,
432ee67178SXianjun Jiao 			  int argc, char **argv,
442ee67178SXianjun Jiao 			  enum id_input id)
452ee67178SXianjun Jiao {
462ee67178SXianjun Jiao 	struct nlattr *tmdata;
472ee67178SXianjun Jiao 	char *end;
482ee67178SXianjun Jiao 	unsigned int reg_cat, reg_addr, reg_val;
492ee67178SXianjun Jiao 
502ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
512ee67178SXianjun Jiao 	if (!tmdata) {
522ee67178SXianjun Jiao 		return 1;
532ee67178SXianjun Jiao 	}
542ee67178SXianjun Jiao 
552ee67178SXianjun Jiao 	if (strcasecmp(argv[0],"rf")==0)
562ee67178SXianjun Jiao 		reg_cat=1;
572ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx_intf")==0)
582ee67178SXianjun Jiao 		reg_cat = 2;
592ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx_intf")==0)
602ee67178SXianjun Jiao 		reg_cat = 3;
612ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx")==0)
622ee67178SXianjun Jiao 		reg_cat = 4;
632ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx")==0)
642ee67178SXianjun Jiao 		reg_cat = 5;
652ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"xpu")==0)
662ee67178SXianjun Jiao 		reg_cat = 6;
672ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_rx")==0)
682ee67178SXianjun Jiao 		reg_cat = 7;
692ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_tx")==0)
702ee67178SXianjun Jiao 		reg_cat = 8;
712ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_xpu")==0)
722ee67178SXianjun Jiao 		reg_cat = 9;
732ee67178SXianjun Jiao 	else {
742ee67178SXianjun Jiao 		printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n");
752ee67178SXianjun Jiao 		return 1;
762ee67178SXianjun Jiao 	}
772ee67178SXianjun Jiao 
782ee67178SXianjun Jiao 	reg_addr = strtoul(argv[1], &end, 10);
792ee67178SXianjun Jiao 	if (*end) {
802ee67178SXianjun Jiao 		return 1;
812ee67178SXianjun Jiao 	}
822ee67178SXianjun Jiao 	reg_addr = reg_addr<<2;//from idx to addr
832ee67178SXianjun Jiao 	reg_addr = ((reg_cat<<16)|reg_addr);
842ee67178SXianjun Jiao 
852ee67178SXianjun Jiao 	reg_val = strtoul(argv[2], &end, 10);
862ee67178SXianjun Jiao 	if (*end) {
872ee67178SXianjun Jiao 		return 1;
882ee67178SXianjun Jiao 	}
892ee67178SXianjun Jiao 
902ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_SET);
912ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr);
922ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_VAL,  reg_val);
932ee67178SXianjun Jiao 
942ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
952ee67178SXianjun Jiao 
962ee67178SXianjun Jiao 	printf("reg  cat: %d\n",   reg_cat);
972ee67178SXianjun Jiao 	printf("reg addr: %08x\n", reg_addr);
982ee67178SXianjun Jiao 	printf("reg  val: %08x\n", reg_val);
992ee67178SXianjun Jiao 
1002ee67178SXianjun Jiao 	return 0;
1012ee67178SXianjun Jiao 
1022ee67178SXianjun Jiao  nla_put_failure:
1032ee67178SXianjun Jiao 	return -ENOBUFS;
1042ee67178SXianjun Jiao }
1052ee67178SXianjun Jiao COMMAND(set, reg, "<rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu reg_idx value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_reg, "set reg");
1062ee67178SXianjun Jiao 
1072ee67178SXianjun Jiao static int handle_get_reg(struct nl80211_state *state,
1082ee67178SXianjun Jiao 			  struct nl_cb *cb,
1092ee67178SXianjun Jiao 			  struct nl_msg *msg,
1102ee67178SXianjun Jiao 			  int argc, char **argv,
1112ee67178SXianjun Jiao 			  enum id_input id)
1122ee67178SXianjun Jiao {
1132ee67178SXianjun Jiao 	char *end;
1142ee67178SXianjun Jiao 	struct nlattr *tmdata;
1152ee67178SXianjun Jiao 	unsigned int reg_cat, reg_addr;
1162ee67178SXianjun Jiao 
1172ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
1182ee67178SXianjun Jiao 	if (!tmdata)
1192ee67178SXianjun Jiao 		return 1;
1202ee67178SXianjun Jiao 
1212ee67178SXianjun Jiao 	if (strcasecmp(argv[0],"rf")==0)
1222ee67178SXianjun Jiao 		reg_cat=1;
1232ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx_intf")==0)
1242ee67178SXianjun Jiao 		reg_cat = 2;
1252ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx_intf")==0)
1262ee67178SXianjun Jiao 		reg_cat = 3;
1272ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"rx")==0)
1282ee67178SXianjun Jiao 		reg_cat = 4;
1292ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"tx")==0)
1302ee67178SXianjun Jiao 		reg_cat = 5;
1312ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"xpu")==0)
1322ee67178SXianjun Jiao 		reg_cat = 6;
1332ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_rx")==0)
1342ee67178SXianjun Jiao 		reg_cat = 7;
1352ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_tx")==0)
1362ee67178SXianjun Jiao 		reg_cat = 8;
1372ee67178SXianjun Jiao 	else if (strcasecmp(argv[0],"drv_xpu")==0)
1382ee67178SXianjun Jiao 		reg_cat = 9;
1392ee67178SXianjun Jiao 	else {
1402ee67178SXianjun Jiao 		printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n");
1412ee67178SXianjun Jiao 		return 1;
1422ee67178SXianjun Jiao 	}
1432ee67178SXianjun Jiao 
1442ee67178SXianjun Jiao 	reg_addr = strtoul(argv[1], &end, 10);
1452ee67178SXianjun Jiao 	if (*end) {
1462ee67178SXianjun Jiao 		return 1;
1472ee67178SXianjun Jiao 	}
1482ee67178SXianjun Jiao 	reg_addr = reg_addr<<2;//from idx to addr
1492ee67178SXianjun Jiao 	reg_addr = ((reg_cat<<16)|reg_addr);
1502ee67178SXianjun Jiao 	printf("SENDaddr: %08x\n", reg_addr);
1512ee67178SXianjun Jiao 
1522ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_GET);
1532ee67178SXianjun Jiao 	NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr);
1542ee67178SXianjun Jiao 
1552ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
1562ee67178SXianjun Jiao 
1572ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_reg_handler, NULL);
1582ee67178SXianjun Jiao 	return 0;
1592ee67178SXianjun Jiao 
1602ee67178SXianjun Jiao  nla_put_failure:
1612ee67178SXianjun Jiao 	return -ENOBUFS;
1622ee67178SXianjun Jiao }
1632ee67178SXianjun Jiao COMMAND(get, reg, "<rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu reg_idx>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_reg, "get reg");
1642ee67178SXianjun Jiao 
1652ee67178SXianjun Jiao static int cb_openwifi_rssi_th_handler(struct nl_msg *msg, void *arg)
1662ee67178SXianjun Jiao {
1672ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
1682ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
1692ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1702ee67178SXianjun Jiao 
1712ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
1722ee67178SXianjun Jiao 
1732ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
1742ee67178SXianjun Jiao 		return NL_SKIP;
1752ee67178SXianjun Jiao 
1762ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
1772ee67178SXianjun Jiao 
1782ee67178SXianjun Jiao 	printf("openwifi rssi_th: %d\n", nla_get_u32(tb[OPENWIFI_ATTR_RSSI_TH]));
1792ee67178SXianjun Jiao 
1802ee67178SXianjun Jiao 	return NL_SKIP;
1812ee67178SXianjun Jiao }
1822ee67178SXianjun Jiao 
1832ee67178SXianjun Jiao static int handle_set_rssi_th(struct nl80211_state *state,
1842ee67178SXianjun Jiao 			  struct nl_cb *cb,
1852ee67178SXianjun Jiao 			  struct nl_msg *msg,
1862ee67178SXianjun Jiao 			  int argc, char **argv,
1872ee67178SXianjun Jiao 			  enum id_input id)
1882ee67178SXianjun Jiao {
1892ee67178SXianjun Jiao 	struct nlattr *tmdata;
1902ee67178SXianjun Jiao 	char *end;
1912ee67178SXianjun Jiao 	unsigned int tmp;
1922ee67178SXianjun Jiao 
1932ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
1942ee67178SXianjun Jiao 	if (!tmdata) {
1952ee67178SXianjun Jiao 		return 1;
1962ee67178SXianjun Jiao 	}
1972ee67178SXianjun Jiao 
1982ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
1992ee67178SXianjun Jiao 
2002ee67178SXianjun Jiao 	if (*end) {
2012ee67178SXianjun Jiao 		return 1;
2022ee67178SXianjun Jiao 	}
2032ee67178SXianjun Jiao 
2042ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_RSSI_TH);
2052ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_RSSI_TH, tmp);
2062ee67178SXianjun Jiao 
2072ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
2082ee67178SXianjun Jiao 
2092ee67178SXianjun Jiao 	printf("openwifi rssi_th: %d\n", tmp);
2102ee67178SXianjun Jiao 
2112ee67178SXianjun Jiao 	return 0;
2122ee67178SXianjun Jiao 
2132ee67178SXianjun Jiao  nla_put_failure:
2142ee67178SXianjun Jiao 	return -ENOBUFS;
2152ee67178SXianjun Jiao }
2162ee67178SXianjun Jiao COMMAND(set, rssi_th, "<rssi_th in value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_rssi_th, "set rssi_th");
2172ee67178SXianjun Jiao 
218e63d1ec3SXianjun Jiao 
219e63d1ec3SXianjun Jiao static int handle_set_tsf(struct nl80211_state *state,
220e63d1ec3SXianjun Jiao 		  struct nl_cb *cb,
221e63d1ec3SXianjun Jiao 		  struct nl_msg *msg,
222e63d1ec3SXianjun Jiao 		  int argc, char **argv,
223e63d1ec3SXianjun Jiao 		  enum id_input id)
224e63d1ec3SXianjun Jiao {
225e63d1ec3SXianjun Jiao 	struct nlattr *tmdata;
226e63d1ec3SXianjun Jiao 	char *end;
22775042a30SXianjun Jiao 	unsigned int high_tsf, low_tsf;
228e63d1ec3SXianjun Jiao 
229e63d1ec3SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
230e63d1ec3SXianjun Jiao 	if (!tmdata) {
231e63d1ec3SXianjun Jiao 		return 1;
232e63d1ec3SXianjun Jiao 	}
233e63d1ec3SXianjun Jiao 
234e63d1ec3SXianjun Jiao 	high_tsf = strtoul(argv[0], &end, 10);
235e63d1ec3SXianjun Jiao 	if (*end) {
236e63d1ec3SXianjun Jiao 		return 1;
237e63d1ec3SXianjun Jiao 	}
238e63d1ec3SXianjun Jiao 
239e63d1ec3SXianjun Jiao 	low_tsf = strtoul(argv[1], &end, 10);
240e63d1ec3SXianjun Jiao 	if (*end) {
241e63d1ec3SXianjun Jiao 		return 1;
242e63d1ec3SXianjun Jiao 	}
243e63d1ec3SXianjun Jiao 
244e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_TSF);
245e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_HIGH_TSF, high_tsf);
246e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_LOW_TSF, low_tsf);
247e63d1ec3SXianjun Jiao 
248e63d1ec3SXianjun Jiao 	nla_nest_end(msg, tmdata);
249e63d1ec3SXianjun Jiao 
250e63d1ec3SXianjun Jiao 	printf("high_tsf val: %08x\n", high_tsf);
251e63d1ec3SXianjun Jiao 	printf("low_tsf  val: %08x\n", low_tsf);
252e63d1ec3SXianjun Jiao 
253e63d1ec3SXianjun Jiao 	return 0;
254e63d1ec3SXianjun Jiao 
255e63d1ec3SXianjun Jiao 	/*struct nlattr *tmdata;
256e63d1ec3SXianjun Jiao 	char *end;
257e63d1ec3SXianjun Jiao 	unsigned int tmp;
258e63d1ec3SXianjun Jiao 
259e63d1ec3SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
260e63d1ec3SXianjun Jiao 	if (!tmdata) {
261e63d1ec3SXianjun Jiao 		return 1;
262e63d1ec3SXianjun Jiao 	}
263e63d1ec3SXianjun Jiao 
264e63d1ec3SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
265e63d1ec3SXianjun Jiao 
266e63d1ec3SXianjun Jiao 	if (*end) {
267e63d1ec3SXianjun Jiao 		return 1;
268e63d1ec3SXianjun Jiao 	}
269e63d1ec3SXianjun Jiao 
270e63d1ec3SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_TSF);
271e63d1ec3SXianjun Jiao 	NLA_PUT_U64(msg, OPENWIFI_ATTR_TSF, tmp);
272e63d1ec3SXianjun Jiao 
273e63d1ec3SXianjun Jiao 	nla_nest_end(msg, tmdata);
274e63d1ec3SXianjun Jiao 
275e63d1ec3SXianjun Jiao 	printf("openwifi tsf: %d\n", tmp);
276e63d1ec3SXianjun Jiao 
277e63d1ec3SXianjun Jiao 	return 0;*/
278e63d1ec3SXianjun Jiao 
279e63d1ec3SXianjun Jiao  nla_put_failure:
280e63d1ec3SXianjun Jiao 	return -ENOBUFS;
281e63d1ec3SXianjun Jiao }
282e63d1ec3SXianjun Jiao COMMAND(set, tsf, "<high_tsf value low_tsf value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_tsf, "set tsf");
283e63d1ec3SXianjun Jiao 
2842ee67178SXianjun Jiao static int handle_get_rssi_th(struct nl80211_state *state,
2852ee67178SXianjun Jiao 			  struct nl_cb *cb,
2862ee67178SXianjun Jiao 			  struct nl_msg *msg,
2872ee67178SXianjun Jiao 			  int argc, char **argv,
2882ee67178SXianjun Jiao 			  enum id_input id)
2892ee67178SXianjun Jiao {
2902ee67178SXianjun Jiao 	struct nlattr *tmdata;
2912ee67178SXianjun Jiao 
2922ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
2932ee67178SXianjun Jiao 	if (!tmdata)
2942ee67178SXianjun Jiao 		return 1;
2952ee67178SXianjun Jiao 
2962ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_RSSI_TH);
2972ee67178SXianjun Jiao 
2982ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
2992ee67178SXianjun Jiao 
3002ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_rssi_th_handler, NULL);
3012ee67178SXianjun Jiao 	return 0;
3022ee67178SXianjun Jiao 
3032ee67178SXianjun Jiao  nla_put_failure:
3042ee67178SXianjun Jiao 	return -ENOBUFS;
3052ee67178SXianjun Jiao }
3062ee67178SXianjun Jiao COMMAND(get, rssi_th, "<rssi_th in value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_rssi_th, "get rssi_th");
3072ee67178SXianjun Jiao 
308*4ecf49bbSJiao Xianjun static int cb_openwifi_slice_total_handler(struct nl_msg *msg, void *arg)
3092ee67178SXianjun Jiao {
3102ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
3112ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
3122ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
313*4ecf49bbSJiao Xianjun 	unsigned int tmp;
3142ee67178SXianjun Jiao 
3152ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
3162ee67178SXianjun Jiao 
3172ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
3182ee67178SXianjun Jiao 		return NL_SKIP;
3192ee67178SXianjun Jiao 
3202ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
3212ee67178SXianjun Jiao 
322*4ecf49bbSJiao Xianjun 	tmp = nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL]);
323*4ecf49bbSJiao Xianjun 	printf("openwifi slice_total (duration) %dus of slice %d\n", tmp&0xFFFFF, tmp>>20);
3242ee67178SXianjun Jiao 
3252ee67178SXianjun Jiao 	return NL_SKIP;
3262ee67178SXianjun Jiao }
3272ee67178SXianjun Jiao 
328*4ecf49bbSJiao Xianjun static int handle_set_slice_total(struct nl80211_state *state,
3292ee67178SXianjun Jiao 			  struct nl_cb *cb,
3302ee67178SXianjun Jiao 			  struct nl_msg *msg,
3312ee67178SXianjun Jiao 			  int argc, char **argv,
3322ee67178SXianjun Jiao 			  enum id_input id)
3332ee67178SXianjun Jiao {
3342ee67178SXianjun Jiao 	struct nlattr *tmdata;
3352ee67178SXianjun Jiao 	char *end;
3362ee67178SXianjun Jiao 	unsigned int tmp;
3372ee67178SXianjun Jiao 
3382ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
3392ee67178SXianjun Jiao 	if (!tmdata) {
3402ee67178SXianjun Jiao 		return 1;
3412ee67178SXianjun Jiao 	}
3422ee67178SXianjun Jiao 
3432ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
3442ee67178SXianjun Jiao 
3452ee67178SXianjun Jiao 	if (*end) {
3462ee67178SXianjun Jiao 		return 1;
3472ee67178SXianjun Jiao 	}
3482ee67178SXianjun Jiao 
349*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL);
350*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL, tmp);
3512ee67178SXianjun Jiao 
3522ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
3532ee67178SXianjun Jiao 
354*4ecf49bbSJiao Xianjun 	printf("openwifi slice_total (duration): %dus\n", tmp);
3552ee67178SXianjun Jiao 
3562ee67178SXianjun Jiao 	return 0;
3572ee67178SXianjun Jiao 
3582ee67178SXianjun Jiao  nla_put_failure:
3592ee67178SXianjun Jiao 	return -ENOBUFS;
3602ee67178SXianjun Jiao }
361*4ecf49bbSJiao Xianjun COMMAND(set, slice_total, "<slice_total(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total, "set slice_total");
3622ee67178SXianjun Jiao 
363*4ecf49bbSJiao Xianjun static int handle_get_slice_total(struct nl80211_state *state,
3642ee67178SXianjun Jiao 			  struct nl_cb *cb,
3652ee67178SXianjun Jiao 			  struct nl_msg *msg,
3662ee67178SXianjun Jiao 			  int argc, char **argv,
3672ee67178SXianjun Jiao 			  enum id_input id)
3682ee67178SXianjun Jiao {
3692ee67178SXianjun Jiao 	struct nlattr *tmdata;
3702ee67178SXianjun Jiao 
3712ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
3722ee67178SXianjun Jiao 	if (!tmdata)
3732ee67178SXianjun Jiao 		return 1;
3742ee67178SXianjun Jiao 
375*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL);
3762ee67178SXianjun Jiao 
3772ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
3782ee67178SXianjun Jiao 
379*4ecf49bbSJiao Xianjun 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total_handler, NULL);
3802ee67178SXianjun Jiao 	return 0;
3812ee67178SXianjun Jiao 
3822ee67178SXianjun Jiao  nla_put_failure:
3832ee67178SXianjun Jiao 	return -ENOBUFS;
3842ee67178SXianjun Jiao }
385*4ecf49bbSJiao Xianjun COMMAND(get, slice_total, "<slice_total(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total, "get slice_total");
3862ee67178SXianjun Jiao 
3872ee67178SXianjun Jiao 
388*4ecf49bbSJiao Xianjun // static int cb_openwifi_slice_total1_handler(struct nl_msg *msg, void *arg)
389*4ecf49bbSJiao Xianjun // {
390*4ecf49bbSJiao Xianjun // 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
391*4ecf49bbSJiao Xianjun // 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
392*4ecf49bbSJiao Xianjun // 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
393*4ecf49bbSJiao Xianjun 
394*4ecf49bbSJiao Xianjun // 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
395*4ecf49bbSJiao Xianjun 
396*4ecf49bbSJiao Xianjun // 	if (!attrs[NL80211_ATTR_TESTDATA])
397*4ecf49bbSJiao Xianjun // 		return NL_SKIP;
398*4ecf49bbSJiao Xianjun 
399*4ecf49bbSJiao Xianjun // 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
400*4ecf49bbSJiao Xianjun 
401*4ecf49bbSJiao Xianjun // 	printf("openwifi slice_total1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL1]));
402*4ecf49bbSJiao Xianjun 
403*4ecf49bbSJiao Xianjun // 	return NL_SKIP;
404*4ecf49bbSJiao Xianjun // }
405*4ecf49bbSJiao Xianjun 
406*4ecf49bbSJiao Xianjun // static int handle_set_slice_total1(struct nl80211_state *state,
407*4ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
408*4ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
409*4ecf49bbSJiao Xianjun // 			  int argc, char **argv,
410*4ecf49bbSJiao Xianjun // 			  enum id_input id)
411*4ecf49bbSJiao Xianjun // {
412*4ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
413*4ecf49bbSJiao Xianjun // 	char *end;
414*4ecf49bbSJiao Xianjun // 	unsigned int tmp;
415*4ecf49bbSJiao Xianjun 
416*4ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
417*4ecf49bbSJiao Xianjun // 	if (!tmdata) {
418*4ecf49bbSJiao Xianjun // 		return 1;
419*4ecf49bbSJiao Xianjun // 	}
420*4ecf49bbSJiao Xianjun 
421*4ecf49bbSJiao Xianjun // 	tmp = strtoul(argv[0], &end, 10);
422*4ecf49bbSJiao Xianjun 
423*4ecf49bbSJiao Xianjun // 	if (*end) {
424*4ecf49bbSJiao Xianjun // 		return 1;
425*4ecf49bbSJiao Xianjun // 	}
426*4ecf49bbSJiao Xianjun 
427*4ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL1);
428*4ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL1, tmp);
429*4ecf49bbSJiao Xianjun 
430*4ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
431*4ecf49bbSJiao Xianjun 
432*4ecf49bbSJiao Xianjun // 	printf("openwifi slice_total1 (duration): %dus\n", tmp);
433*4ecf49bbSJiao Xianjun 
434*4ecf49bbSJiao Xianjun // 	return 0;
435*4ecf49bbSJiao Xianjun 
436*4ecf49bbSJiao Xianjun //  nla_put_failure:
437*4ecf49bbSJiao Xianjun // 	return -ENOBUFS;
438*4ecf49bbSJiao Xianjun // }
439*4ecf49bbSJiao Xianjun // COMMAND(set, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total1, "set slice_total1");
440*4ecf49bbSJiao Xianjun 
441*4ecf49bbSJiao Xianjun // static int handle_get_slice_total1(struct nl80211_state *state,
442*4ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
443*4ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
444*4ecf49bbSJiao Xianjun // 			  int argc, char **argv,
445*4ecf49bbSJiao Xianjun // 			  enum id_input id)
446*4ecf49bbSJiao Xianjun // {
447*4ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
448*4ecf49bbSJiao Xianjun 
449*4ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
450*4ecf49bbSJiao Xianjun // 	if (!tmdata)
451*4ecf49bbSJiao Xianjun // 		return 1;
452*4ecf49bbSJiao Xianjun 
453*4ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL1);
454*4ecf49bbSJiao Xianjun 
455*4ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
456*4ecf49bbSJiao Xianjun 
457*4ecf49bbSJiao Xianjun // 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total1_handler, NULL);
458*4ecf49bbSJiao Xianjun // 	return 0;
459*4ecf49bbSJiao Xianjun 
460*4ecf49bbSJiao Xianjun //  nla_put_failure:
461*4ecf49bbSJiao Xianjun // 	return -ENOBUFS;
462*4ecf49bbSJiao Xianjun // }
463*4ecf49bbSJiao Xianjun // COMMAND(get, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total1, "get slice_total1");
464*4ecf49bbSJiao Xianjun 
465*4ecf49bbSJiao Xianjun static int cb_openwifi_slice_start_handler(struct nl_msg *msg, void *arg)
4662ee67178SXianjun Jiao {
4672ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
4682ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
4692ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
470*4ecf49bbSJiao Xianjun 	unsigned int tmp;
4712ee67178SXianjun Jiao 
4722ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
4732ee67178SXianjun Jiao 
4742ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
4752ee67178SXianjun Jiao 		return NL_SKIP;
4762ee67178SXianjun Jiao 
4772ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
4782ee67178SXianjun Jiao 
479*4ecf49bbSJiao Xianjun 	tmp = nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START]);
480*4ecf49bbSJiao Xianjun 	printf("openwifi slice_start (duration) %dus of slice %d\n", tmp&0xFFFFF, tmp>>20);
4812ee67178SXianjun Jiao 
4822ee67178SXianjun Jiao 	return NL_SKIP;
4832ee67178SXianjun Jiao }
4842ee67178SXianjun Jiao 
485*4ecf49bbSJiao Xianjun static int handle_set_slice_start(struct nl80211_state *state,
4862ee67178SXianjun Jiao 			  struct nl_cb *cb,
4872ee67178SXianjun Jiao 			  struct nl_msg *msg,
4882ee67178SXianjun Jiao 			  int argc, char **argv,
4892ee67178SXianjun Jiao 			  enum id_input id)
4902ee67178SXianjun Jiao {
4912ee67178SXianjun Jiao 	struct nlattr *tmdata;
4922ee67178SXianjun Jiao 	char *end;
4932ee67178SXianjun Jiao 	unsigned int tmp;
4942ee67178SXianjun Jiao 
4952ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
4962ee67178SXianjun Jiao 	if (!tmdata) {
4972ee67178SXianjun Jiao 		return 1;
4982ee67178SXianjun Jiao 	}
4992ee67178SXianjun Jiao 
5002ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
5012ee67178SXianjun Jiao 
5022ee67178SXianjun Jiao 	if (*end) {
5032ee67178SXianjun Jiao 		return 1;
5042ee67178SXianjun Jiao 	}
5052ee67178SXianjun Jiao 
506*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START);
507*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START, tmp);
5082ee67178SXianjun Jiao 
5092ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
5102ee67178SXianjun Jiao 
511*4ecf49bbSJiao Xianjun 	printf("openwifi slice_start (duration): %dus\n", tmp);
5122ee67178SXianjun Jiao 
5132ee67178SXianjun Jiao 	return 0;
5142ee67178SXianjun Jiao 
5152ee67178SXianjun Jiao  nla_put_failure:
5162ee67178SXianjun Jiao 	return -ENOBUFS;
5172ee67178SXianjun Jiao }
518*4ecf49bbSJiao Xianjun COMMAND(set, slice_start, "<slice_start(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start, "set slice_start");
5192ee67178SXianjun Jiao 
520*4ecf49bbSJiao Xianjun static int handle_get_slice_start(struct nl80211_state *state,
5212ee67178SXianjun Jiao 			  struct nl_cb *cb,
5222ee67178SXianjun Jiao 			  struct nl_msg *msg,
5232ee67178SXianjun Jiao 			  int argc, char **argv,
5242ee67178SXianjun Jiao 			  enum id_input id)
5252ee67178SXianjun Jiao {
5262ee67178SXianjun Jiao 	struct nlattr *tmdata;
5272ee67178SXianjun Jiao 
5282ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
5292ee67178SXianjun Jiao 	if (!tmdata)
5302ee67178SXianjun Jiao 		return 1;
5312ee67178SXianjun Jiao 
532*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START);
5332ee67178SXianjun Jiao 
5342ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
5352ee67178SXianjun Jiao 
536*4ecf49bbSJiao Xianjun 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start_handler, NULL);
5372ee67178SXianjun Jiao 	return 0;
5382ee67178SXianjun Jiao 
5392ee67178SXianjun Jiao  nla_put_failure:
5402ee67178SXianjun Jiao 	return -ENOBUFS;
5412ee67178SXianjun Jiao }
542*4ecf49bbSJiao Xianjun COMMAND(get, slice_start, "<slice_start(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start, "get slice_start");
5432ee67178SXianjun Jiao 
5442ee67178SXianjun Jiao 
545*4ecf49bbSJiao Xianjun // static int cb_openwifi_slice_start1_handler(struct nl_msg *msg, void *arg)
546*4ecf49bbSJiao Xianjun // {
547*4ecf49bbSJiao Xianjun // 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
548*4ecf49bbSJiao Xianjun // 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
549*4ecf49bbSJiao Xianjun // 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
550*4ecf49bbSJiao Xianjun 
551*4ecf49bbSJiao Xianjun // 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
552*4ecf49bbSJiao Xianjun 
553*4ecf49bbSJiao Xianjun // 	if (!attrs[NL80211_ATTR_TESTDATA])
554*4ecf49bbSJiao Xianjun // 		return NL_SKIP;
555*4ecf49bbSJiao Xianjun 
556*4ecf49bbSJiao Xianjun // 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
557*4ecf49bbSJiao Xianjun 
558*4ecf49bbSJiao Xianjun // 	printf("openwifi slice_start1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START1]));
559*4ecf49bbSJiao Xianjun 
560*4ecf49bbSJiao Xianjun // 	return NL_SKIP;
561*4ecf49bbSJiao Xianjun // }
562*4ecf49bbSJiao Xianjun 
563*4ecf49bbSJiao Xianjun // static int handle_set_slice_start1(struct nl80211_state *state,
564*4ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
565*4ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
566*4ecf49bbSJiao Xianjun // 			  int argc, char **argv,
567*4ecf49bbSJiao Xianjun // 			  enum id_input id)
568*4ecf49bbSJiao Xianjun // {
569*4ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
570*4ecf49bbSJiao Xianjun // 	char *end;
571*4ecf49bbSJiao Xianjun // 	unsigned int tmp;
572*4ecf49bbSJiao Xianjun 
573*4ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
574*4ecf49bbSJiao Xianjun // 	if (!tmdata) {
575*4ecf49bbSJiao Xianjun // 		return 1;
576*4ecf49bbSJiao Xianjun // 	}
577*4ecf49bbSJiao Xianjun 
578*4ecf49bbSJiao Xianjun // 	tmp = strtoul(argv[0], &end, 10);
579*4ecf49bbSJiao Xianjun 
580*4ecf49bbSJiao Xianjun // 	if (*end) {
581*4ecf49bbSJiao Xianjun // 		return 1;
582*4ecf49bbSJiao Xianjun // 	}
583*4ecf49bbSJiao Xianjun 
584*4ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START1);
585*4ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START1, tmp);
586*4ecf49bbSJiao Xianjun 
587*4ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
588*4ecf49bbSJiao Xianjun 
589*4ecf49bbSJiao Xianjun // 	printf("openwifi slice_start1 (duration): %dus\n", tmp);
590*4ecf49bbSJiao Xianjun 
591*4ecf49bbSJiao Xianjun // 	return 0;
592*4ecf49bbSJiao Xianjun 
593*4ecf49bbSJiao Xianjun //  nla_put_failure:
594*4ecf49bbSJiao Xianjun // 	return -ENOBUFS;
595*4ecf49bbSJiao Xianjun // }
596*4ecf49bbSJiao Xianjun // COMMAND(set, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start1, "set slice_start1");
597*4ecf49bbSJiao Xianjun 
598*4ecf49bbSJiao Xianjun // static int handle_get_slice_start1(struct nl80211_state *state,
599*4ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
600*4ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
601*4ecf49bbSJiao Xianjun // 			  int argc, char **argv,
602*4ecf49bbSJiao Xianjun // 			  enum id_input id)
603*4ecf49bbSJiao Xianjun // {
604*4ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
605*4ecf49bbSJiao Xianjun 
606*4ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
607*4ecf49bbSJiao Xianjun // 	if (!tmdata)
608*4ecf49bbSJiao Xianjun // 		return 1;
609*4ecf49bbSJiao Xianjun 
610*4ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START1);
611*4ecf49bbSJiao Xianjun 
612*4ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
613*4ecf49bbSJiao Xianjun 
614*4ecf49bbSJiao Xianjun // 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start1_handler, NULL);
615*4ecf49bbSJiao Xianjun // 	return 0;
616*4ecf49bbSJiao Xianjun 
617*4ecf49bbSJiao Xianjun //  nla_put_failure:
618*4ecf49bbSJiao Xianjun // 	return -ENOBUFS;
619*4ecf49bbSJiao Xianjun // }
620*4ecf49bbSJiao Xianjun // COMMAND(get, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start1, "get slice_start1");
621*4ecf49bbSJiao Xianjun 
622*4ecf49bbSJiao Xianjun 
623*4ecf49bbSJiao Xianjun static int cb_openwifi_slice_end_handler(struct nl_msg *msg, void *arg)
6242ee67178SXianjun Jiao {
6252ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
6262ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
6272ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
628*4ecf49bbSJiao Xianjun 	unsigned int tmp;
6292ee67178SXianjun Jiao 
6302ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
6312ee67178SXianjun Jiao 
6322ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
6332ee67178SXianjun Jiao 		return NL_SKIP;
6342ee67178SXianjun Jiao 
6352ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
6362ee67178SXianjun Jiao 
637*4ecf49bbSJiao Xianjun 	tmp = nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END]);
638*4ecf49bbSJiao Xianjun 	printf("openwifi slice_end (duration) %dus of slice %d\n", tmp&0xFFFFF, tmp>>20);
6392ee67178SXianjun Jiao 
6402ee67178SXianjun Jiao 	return NL_SKIP;
6412ee67178SXianjun Jiao }
6422ee67178SXianjun Jiao 
643*4ecf49bbSJiao Xianjun static int handle_set_slice_end(struct nl80211_state *state,
6442ee67178SXianjun Jiao 			  struct nl_cb *cb,
6452ee67178SXianjun Jiao 			  struct nl_msg *msg,
6462ee67178SXianjun Jiao 			  int argc, char **argv,
6472ee67178SXianjun Jiao 			  enum id_input id)
6482ee67178SXianjun Jiao {
6492ee67178SXianjun Jiao 	struct nlattr *tmdata;
6502ee67178SXianjun Jiao 	char *end;
6512ee67178SXianjun Jiao 	unsigned int tmp;
6522ee67178SXianjun Jiao 
6532ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
6542ee67178SXianjun Jiao 	if (!tmdata) {
6552ee67178SXianjun Jiao 		return 1;
6562ee67178SXianjun Jiao 	}
6572ee67178SXianjun Jiao 
6582ee67178SXianjun Jiao 	tmp = strtoul(argv[0], &end, 10);
6592ee67178SXianjun Jiao 
6602ee67178SXianjun Jiao 	if (*end) {
6612ee67178SXianjun Jiao 		return 1;
6622ee67178SXianjun Jiao 	}
6632ee67178SXianjun Jiao 
664*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END);
665*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END, tmp);
6662ee67178SXianjun Jiao 
6672ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
6682ee67178SXianjun Jiao 
669*4ecf49bbSJiao Xianjun 	printf("openwifi slice_end (duration): %dus\n", tmp);
6702ee67178SXianjun Jiao 
6712ee67178SXianjun Jiao 	return 0;
6722ee67178SXianjun Jiao 
6732ee67178SXianjun Jiao  nla_put_failure:
6742ee67178SXianjun Jiao 	return -ENOBUFS;
6752ee67178SXianjun Jiao }
676*4ecf49bbSJiao Xianjun COMMAND(set, slice_end, "<slice_end(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end, "set slice_end");
6772ee67178SXianjun Jiao 
678*4ecf49bbSJiao Xianjun static int handle_get_slice_end(struct nl80211_state *state,
6792ee67178SXianjun Jiao 			  struct nl_cb *cb,
6802ee67178SXianjun Jiao 			  struct nl_msg *msg,
6812ee67178SXianjun Jiao 			  int argc, char **argv,
6822ee67178SXianjun Jiao 			  enum id_input id)
6832ee67178SXianjun Jiao {
6842ee67178SXianjun Jiao 	struct nlattr *tmdata;
6852ee67178SXianjun Jiao 
6862ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
6872ee67178SXianjun Jiao 	if (!tmdata)
6882ee67178SXianjun Jiao 		return 1;
6892ee67178SXianjun Jiao 
690*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END);
6912ee67178SXianjun Jiao 
6922ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
6932ee67178SXianjun Jiao 
694*4ecf49bbSJiao Xianjun 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end_handler, NULL);
6952ee67178SXianjun Jiao 	return 0;
6962ee67178SXianjun Jiao 
6972ee67178SXianjun Jiao  nla_put_failure:
6982ee67178SXianjun Jiao 	return -ENOBUFS;
6992ee67178SXianjun Jiao }
700*4ecf49bbSJiao Xianjun COMMAND(get, slice_end, "<slice_end(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end, "get slice_end");
7012ee67178SXianjun Jiao 
7022ee67178SXianjun Jiao 
703*4ecf49bbSJiao Xianjun // static int cb_openwifi_slice_end1_handler(struct nl_msg *msg, void *arg)
704*4ecf49bbSJiao Xianjun // {
705*4ecf49bbSJiao Xianjun // 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
706*4ecf49bbSJiao Xianjun // 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
707*4ecf49bbSJiao Xianjun // 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
708*4ecf49bbSJiao Xianjun 
709*4ecf49bbSJiao Xianjun // 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
710*4ecf49bbSJiao Xianjun 
711*4ecf49bbSJiao Xianjun // 	if (!attrs[NL80211_ATTR_TESTDATA])
712*4ecf49bbSJiao Xianjun // 		return NL_SKIP;
713*4ecf49bbSJiao Xianjun 
714*4ecf49bbSJiao Xianjun // 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
715*4ecf49bbSJiao Xianjun 
716*4ecf49bbSJiao Xianjun // 	printf("openwifi slice_end1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END1]));
717*4ecf49bbSJiao Xianjun 
718*4ecf49bbSJiao Xianjun // 	return NL_SKIP;
719*4ecf49bbSJiao Xianjun // }
720*4ecf49bbSJiao Xianjun 
721*4ecf49bbSJiao Xianjun // static int handle_set_slice_end1(struct nl80211_state *state,
722*4ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
723*4ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
724*4ecf49bbSJiao Xianjun // 			  int argc, char **argv,
725*4ecf49bbSJiao Xianjun // 			  enum id_input id)
726*4ecf49bbSJiao Xianjun // {
727*4ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
728*4ecf49bbSJiao Xianjun // 	char *end;
729*4ecf49bbSJiao Xianjun // 	unsigned int tmp;
730*4ecf49bbSJiao Xianjun 
731*4ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
732*4ecf49bbSJiao Xianjun // 	if (!tmdata) {
733*4ecf49bbSJiao Xianjun // 		return 1;
734*4ecf49bbSJiao Xianjun // 	}
735*4ecf49bbSJiao Xianjun 
736*4ecf49bbSJiao Xianjun // 	tmp = strtoul(argv[0], &end, 10);
737*4ecf49bbSJiao Xianjun 
738*4ecf49bbSJiao Xianjun // 	if (*end) {
739*4ecf49bbSJiao Xianjun // 		return 1;
740*4ecf49bbSJiao Xianjun // 	}
741*4ecf49bbSJiao Xianjun 
742*4ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END1);
743*4ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END1, tmp);
744*4ecf49bbSJiao Xianjun 
745*4ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
746*4ecf49bbSJiao Xianjun 
747*4ecf49bbSJiao Xianjun // 	printf("openwifi slice_end1 (duration): %dus\n", tmp);
748*4ecf49bbSJiao Xianjun 
749*4ecf49bbSJiao Xianjun // 	return 0;
750*4ecf49bbSJiao Xianjun 
751*4ecf49bbSJiao Xianjun //  nla_put_failure:
752*4ecf49bbSJiao Xianjun // 	return -ENOBUFS;
753*4ecf49bbSJiao Xianjun // }
754*4ecf49bbSJiao Xianjun // COMMAND(set, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end1, "set slice_end1");
755*4ecf49bbSJiao Xianjun 
756*4ecf49bbSJiao Xianjun // static int handle_get_slice_end1(struct nl80211_state *state,
757*4ecf49bbSJiao Xianjun // 			  struct nl_cb *cb,
758*4ecf49bbSJiao Xianjun // 			  struct nl_msg *msg,
759*4ecf49bbSJiao Xianjun // 			  int argc, char **argv,
760*4ecf49bbSJiao Xianjun // 			  enum id_input id)
761*4ecf49bbSJiao Xianjun // {
762*4ecf49bbSJiao Xianjun // 	struct nlattr *tmdata;
763*4ecf49bbSJiao Xianjun 
764*4ecf49bbSJiao Xianjun // 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
765*4ecf49bbSJiao Xianjun // 	if (!tmdata)
766*4ecf49bbSJiao Xianjun // 		return 1;
767*4ecf49bbSJiao Xianjun 
768*4ecf49bbSJiao Xianjun // 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END1);
769*4ecf49bbSJiao Xianjun 
770*4ecf49bbSJiao Xianjun // 	nla_nest_end(msg, tmdata);
771*4ecf49bbSJiao Xianjun 
772*4ecf49bbSJiao Xianjun // 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end1_handler, NULL);
773*4ecf49bbSJiao Xianjun // 	return 0;
774*4ecf49bbSJiao Xianjun 
775*4ecf49bbSJiao Xianjun //  nla_put_failure:
776*4ecf49bbSJiao Xianjun // 	return -ENOBUFS;
777*4ecf49bbSJiao Xianjun // }
778*4ecf49bbSJiao Xianjun // COMMAND(get, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end1, "get slice_end1");
779*4ecf49bbSJiao Xianjun 
780*4ecf49bbSJiao Xianjun 
781*4ecf49bbSJiao Xianjun static int cb_openwifi_slice_idx_handler(struct nl_msg *msg, void *arg)
7822ee67178SXianjun Jiao {
7832ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
7842ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
7852ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
7862ee67178SXianjun Jiao 
7872ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
7882ee67178SXianjun Jiao 
7892ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
7902ee67178SXianjun Jiao 		return NL_SKIP;
7912ee67178SXianjun Jiao 
7922ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
7932ee67178SXianjun Jiao 
794*4ecf49bbSJiao Xianjun 	printf("openwifi slice_idx in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_IDX]));
7952ee67178SXianjun Jiao 
7962ee67178SXianjun Jiao 	return NL_SKIP;
7972ee67178SXianjun Jiao }
7982ee67178SXianjun Jiao 
799*4ecf49bbSJiao Xianjun static int handle_set_slice_idx(struct nl80211_state *state,
8002ee67178SXianjun Jiao 			  struct nl_cb *cb,
8012ee67178SXianjun Jiao 			  struct nl_msg *msg,
8022ee67178SXianjun Jiao 			  int argc, char **argv,
8032ee67178SXianjun Jiao 			  enum id_input id)
8042ee67178SXianjun Jiao {
8052ee67178SXianjun Jiao 	struct nlattr *tmdata;
8062ee67178SXianjun Jiao 	char *end;
807*4ecf49bbSJiao Xianjun 	unsigned int slice_idx;
808*4ecf49bbSJiao Xianjun 
809*4ecf49bbSJiao Xianjun 	//printf("handle_set_slice_idx\n");
8102ee67178SXianjun Jiao 
8112ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
8122ee67178SXianjun Jiao 	if (!tmdata) {
813*4ecf49bbSJiao Xianjun 		//printf("handle_set_slice_idx 1\n");
8142ee67178SXianjun Jiao 		return 1;
8152ee67178SXianjun Jiao 	}
8162ee67178SXianjun Jiao 
817*4ecf49bbSJiao Xianjun 	slice_idx = strtoul(argv[0], &end, 16);
8182ee67178SXianjun Jiao 
8192ee67178SXianjun Jiao 	if (*end) {
820*4ecf49bbSJiao Xianjun 		//printf("handle_set_slice_idx 2 %d\n", slice_idx);
8212ee67178SXianjun Jiao 		return 1;
8222ee67178SXianjun Jiao 	}
8232ee67178SXianjun Jiao 
824*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_IDX);
825*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_IDX, slice_idx);
8262ee67178SXianjun Jiao 
8272ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
8282ee67178SXianjun Jiao 
829*4ecf49bbSJiao Xianjun 	printf("openwifi slice_idx in hex: %08x\n", slice_idx);
8302ee67178SXianjun Jiao 
8312ee67178SXianjun Jiao 	return 0;
8322ee67178SXianjun Jiao 
8332ee67178SXianjun Jiao  nla_put_failure:
8342ee67178SXianjun Jiao 	return -ENOBUFS;
8352ee67178SXianjun Jiao }
836*4ecf49bbSJiao Xianjun COMMAND(set, slice_idx, "<slice_idx in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_idx, "set slice_idx");
8372ee67178SXianjun Jiao 
838*4ecf49bbSJiao Xianjun static int handle_get_slice_idx(struct nl80211_state *state,
8392ee67178SXianjun Jiao 			  struct nl_cb *cb,
8402ee67178SXianjun Jiao 			  struct nl_msg *msg,
8412ee67178SXianjun Jiao 			  int argc, char **argv,
8422ee67178SXianjun Jiao 			  enum id_input id)
8432ee67178SXianjun Jiao {
8442ee67178SXianjun Jiao 	struct nlattr *tmdata;
8452ee67178SXianjun Jiao 
8462ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
8472ee67178SXianjun Jiao 	if (!tmdata)
8482ee67178SXianjun Jiao 		return 1;
8492ee67178SXianjun Jiao 
850*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_IDX);
8512ee67178SXianjun Jiao 
8522ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
8532ee67178SXianjun Jiao 
854*4ecf49bbSJiao Xianjun 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_idx_handler, NULL);
8552ee67178SXianjun Jiao 	return 0;
8562ee67178SXianjun Jiao 
8572ee67178SXianjun Jiao  nla_put_failure:
8582ee67178SXianjun Jiao 	return -ENOBUFS;
8592ee67178SXianjun Jiao }
860*4ecf49bbSJiao Xianjun COMMAND(get, slice_idx, "<slice_idx in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_idx, "get slice_idx");
8612ee67178SXianjun Jiao 
862*4ecf49bbSJiao Xianjun static int cb_openwifi_slice_target_mac_addr_handler(struct nl_msg *msg, void *arg)
8632ee67178SXianjun Jiao {
8642ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
8652ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
8662ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
8672ee67178SXianjun Jiao 
8682ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
8692ee67178SXianjun Jiao 
8702ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
8712ee67178SXianjun Jiao 		return NL_SKIP;
8722ee67178SXianjun Jiao 
8732ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
8742ee67178SXianjun Jiao 
875*4ecf49bbSJiao Xianjun 	printf("openwifi slice_target_mac_addr(low32) in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_ADDR]));
8762ee67178SXianjun Jiao 
8772ee67178SXianjun Jiao 	return NL_SKIP;
8782ee67178SXianjun Jiao }
8792ee67178SXianjun Jiao 
880*4ecf49bbSJiao Xianjun static int handle_set_slice_target_mac_addr(struct nl80211_state *state,
8812ee67178SXianjun Jiao 			  struct nl_cb *cb,
8822ee67178SXianjun Jiao 			  struct nl_msg *msg,
8832ee67178SXianjun Jiao 			  int argc, char **argv,
8842ee67178SXianjun Jiao 			  enum id_input id)
8852ee67178SXianjun Jiao {
8862ee67178SXianjun Jiao 	struct nlattr *tmdata;
8872ee67178SXianjun Jiao 	char *end;
888*4ecf49bbSJiao Xianjun 	unsigned int slice_target_mac_addr;
8892ee67178SXianjun Jiao 
8902ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
8912ee67178SXianjun Jiao 	if (!tmdata)
8922ee67178SXianjun Jiao 		return 1;
8932ee67178SXianjun Jiao 
894*4ecf49bbSJiao Xianjun 	slice_target_mac_addr = strtoul(argv[0], &end, 16);
8952ee67178SXianjun Jiao 
8962ee67178SXianjun Jiao 	if (*end)
8972ee67178SXianjun Jiao 		return 1;
8982ee67178SXianjun Jiao 
899*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_ADDR);
900*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_ADDR, slice_target_mac_addr);
9012ee67178SXianjun Jiao 
9022ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
9032ee67178SXianjun Jiao 
904*4ecf49bbSJiao Xianjun 	printf("openwifi slice_target_mac_addr(low32) in hex: %08x\n", slice_target_mac_addr);
9052ee67178SXianjun Jiao 
9062ee67178SXianjun Jiao 	return 0;
9072ee67178SXianjun Jiao 
9082ee67178SXianjun Jiao  nla_put_failure:
9092ee67178SXianjun Jiao 	return -ENOBUFS;
9102ee67178SXianjun Jiao }
911*4ecf49bbSJiao 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");
9122ee67178SXianjun Jiao 
913*4ecf49bbSJiao Xianjun static int handle_get_slice_target_mac_addr(struct nl80211_state *state,
9142ee67178SXianjun Jiao 			  struct nl_cb *cb,
9152ee67178SXianjun Jiao 			  struct nl_msg *msg,
9162ee67178SXianjun Jiao 			  int argc, char **argv,
9172ee67178SXianjun Jiao 			  enum id_input id)
9182ee67178SXianjun Jiao {
9192ee67178SXianjun Jiao 	struct nlattr *tmdata;
9202ee67178SXianjun Jiao 
9212ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
9222ee67178SXianjun Jiao 	if (!tmdata)
9232ee67178SXianjun Jiao 		return 1;
9242ee67178SXianjun Jiao 
925*4ecf49bbSJiao Xianjun 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_ADDR);
9262ee67178SXianjun Jiao 
9272ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
9282ee67178SXianjun Jiao 
929*4ecf49bbSJiao Xianjun 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_target_mac_addr_handler, NULL);
9302ee67178SXianjun Jiao 	return 0;
9312ee67178SXianjun Jiao 
9322ee67178SXianjun Jiao  nla_put_failure:
9332ee67178SXianjun Jiao 	return -ENOBUFS;
9342ee67178SXianjun Jiao }
935*4ecf49bbSJiao 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");
9362ee67178SXianjun Jiao 
9372ee67178SXianjun Jiao static int cb_openwifi_gap_handler(struct nl_msg *msg, void *arg)
9382ee67178SXianjun Jiao {
9392ee67178SXianjun Jiao 	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
9402ee67178SXianjun Jiao 	struct nlattr *tb[OPENWIFI_ATTR_MAX + 1];
9412ee67178SXianjun Jiao 	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
9422ee67178SXianjun Jiao 
9432ee67178SXianjun Jiao 	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
9442ee67178SXianjun Jiao 
9452ee67178SXianjun Jiao 	if (!attrs[NL80211_ATTR_TESTDATA])
9462ee67178SXianjun Jiao 		return NL_SKIP;
9472ee67178SXianjun Jiao 
9482ee67178SXianjun Jiao 	nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL);
9492ee67178SXianjun Jiao 
9502ee67178SXianjun Jiao 	printf("openwifi GAP (usec): %d\n", nla_get_u32(tb[OPENWIFI_ATTR_GAP]));
9512ee67178SXianjun Jiao 
9522ee67178SXianjun Jiao 	return NL_SKIP;
9532ee67178SXianjun Jiao }
9542ee67178SXianjun Jiao 
9552ee67178SXianjun Jiao static int handle_set_gap(struct nl80211_state *state,
9562ee67178SXianjun Jiao 			  struct nl_cb *cb,
9572ee67178SXianjun Jiao 			  struct nl_msg *msg,
9582ee67178SXianjun Jiao 			  int argc, char **argv,
9592ee67178SXianjun Jiao 			  enum id_input id)
9602ee67178SXianjun Jiao {
9612ee67178SXianjun Jiao 	struct nlattr *tmdata;
9622ee67178SXianjun Jiao 	char *end;
9632ee67178SXianjun Jiao 	unsigned int gap_us;
9642ee67178SXianjun Jiao 
9652ee67178SXianjun Jiao 	//printf("handle_set_gap\n");
9662ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
9672ee67178SXianjun Jiao 	if (!tmdata)
9682ee67178SXianjun Jiao 		return 1;
9692ee67178SXianjun Jiao 
9702ee67178SXianjun Jiao 	gap_us = strtoul(argv[0], &end, 10);
9712ee67178SXianjun Jiao 
9722ee67178SXianjun Jiao 	if (*end)
9732ee67178SXianjun Jiao 		return 1;
9742ee67178SXianjun Jiao 
9752ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_GAP);
9762ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_GAP, gap_us);
9772ee67178SXianjun Jiao 
9782ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
9792ee67178SXianjun Jiao 	return 0;
9802ee67178SXianjun Jiao 
9812ee67178SXianjun Jiao  nla_put_failure:
9822ee67178SXianjun Jiao 	return -ENOBUFS;
9832ee67178SXianjun Jiao }
9842ee67178SXianjun Jiao COMMAND(set, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_gap, "set inter frame gap of openwifi radio");
9852ee67178SXianjun Jiao 
9862ee67178SXianjun Jiao static int handle_get_gap(struct nl80211_state *state,
9872ee67178SXianjun Jiao 			  struct nl_cb *cb,
9882ee67178SXianjun Jiao 			  struct nl_msg *msg,
9892ee67178SXianjun Jiao 			  int argc, char **argv,
9902ee67178SXianjun Jiao 			  enum id_input id)
9912ee67178SXianjun Jiao {
9922ee67178SXianjun Jiao 	struct nlattr *tmdata;
9932ee67178SXianjun Jiao 
9942ee67178SXianjun Jiao 	tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
9952ee67178SXianjun Jiao 	if (!tmdata)
9962ee67178SXianjun Jiao 		return 1;
9972ee67178SXianjun Jiao 
9982ee67178SXianjun Jiao 	NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_GAP);
9992ee67178SXianjun Jiao 
10002ee67178SXianjun Jiao 	nla_nest_end(msg, tmdata);
10012ee67178SXianjun Jiao 
10022ee67178SXianjun Jiao 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_gap_handler, NULL);
10032ee67178SXianjun Jiao 	return 0;
10042ee67178SXianjun Jiao 
10052ee67178SXianjun Jiao  nla_put_failure:
10062ee67178SXianjun Jiao 	return -ENOBUFS;
10072ee67178SXianjun Jiao }
10082ee67178SXianjun Jiao COMMAND(get, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_gap, "get inter frame gap of openwifi radio");
1009