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