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