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; 227*75042a30SXianjun 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 3082ee67178SXianjun Jiao static int cb_openwifi_slice_total0_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)); 3132ee67178SXianjun Jiao 3142ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 3152ee67178SXianjun Jiao 3162ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 3172ee67178SXianjun Jiao return NL_SKIP; 3182ee67178SXianjun Jiao 3192ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 3202ee67178SXianjun Jiao 3212ee67178SXianjun Jiao printf("openwifi slice_total0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL0])); 3222ee67178SXianjun Jiao 3232ee67178SXianjun Jiao return NL_SKIP; 3242ee67178SXianjun Jiao } 3252ee67178SXianjun Jiao 3262ee67178SXianjun Jiao static int handle_set_slice_total0(struct nl80211_state *state, 3272ee67178SXianjun Jiao struct nl_cb *cb, 3282ee67178SXianjun Jiao struct nl_msg *msg, 3292ee67178SXianjun Jiao int argc, char **argv, 3302ee67178SXianjun Jiao enum id_input id) 3312ee67178SXianjun Jiao { 3322ee67178SXianjun Jiao struct nlattr *tmdata; 3332ee67178SXianjun Jiao char *end; 3342ee67178SXianjun Jiao unsigned int tmp; 3352ee67178SXianjun Jiao 3362ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 3372ee67178SXianjun Jiao if (!tmdata) { 3382ee67178SXianjun Jiao return 1; 3392ee67178SXianjun Jiao } 3402ee67178SXianjun Jiao 3412ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 3422ee67178SXianjun Jiao 3432ee67178SXianjun Jiao if (*end) { 3442ee67178SXianjun Jiao return 1; 3452ee67178SXianjun Jiao } 3462ee67178SXianjun Jiao 3472ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL0); 3482ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL0, tmp); 3492ee67178SXianjun Jiao 3502ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 3512ee67178SXianjun Jiao 3522ee67178SXianjun Jiao printf("openwifi slice_total0 (duration): %dus\n", tmp); 3532ee67178SXianjun Jiao 3542ee67178SXianjun Jiao return 0; 3552ee67178SXianjun Jiao 3562ee67178SXianjun Jiao nla_put_failure: 3572ee67178SXianjun Jiao return -ENOBUFS; 3582ee67178SXianjun Jiao } 3592ee67178SXianjun Jiao COMMAND(set, slice_total0, "<slice_total0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total0, "set slice_total0"); 3602ee67178SXianjun Jiao 3612ee67178SXianjun Jiao static int handle_get_slice_total0(struct nl80211_state *state, 3622ee67178SXianjun Jiao struct nl_cb *cb, 3632ee67178SXianjun Jiao struct nl_msg *msg, 3642ee67178SXianjun Jiao int argc, char **argv, 3652ee67178SXianjun Jiao enum id_input id) 3662ee67178SXianjun Jiao { 3672ee67178SXianjun Jiao struct nlattr *tmdata; 3682ee67178SXianjun Jiao 3692ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 3702ee67178SXianjun Jiao if (!tmdata) 3712ee67178SXianjun Jiao return 1; 3722ee67178SXianjun Jiao 3732ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL0); 3742ee67178SXianjun Jiao 3752ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 3762ee67178SXianjun Jiao 3772ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total0_handler, NULL); 3782ee67178SXianjun Jiao return 0; 3792ee67178SXianjun Jiao 3802ee67178SXianjun Jiao nla_put_failure: 3812ee67178SXianjun Jiao return -ENOBUFS; 3822ee67178SXianjun Jiao } 3832ee67178SXianjun Jiao COMMAND(get, slice_total0, "<slice_total0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total0, "get slice_total0"); 3842ee67178SXianjun Jiao 3852ee67178SXianjun Jiao 3862ee67178SXianjun Jiao static int cb_openwifi_slice_total1_handler(struct nl_msg *msg, void *arg) 3872ee67178SXianjun Jiao { 3882ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 3892ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 3902ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 3912ee67178SXianjun Jiao 3922ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 3932ee67178SXianjun Jiao 3942ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 3952ee67178SXianjun Jiao return NL_SKIP; 3962ee67178SXianjun Jiao 3972ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 3982ee67178SXianjun Jiao 3992ee67178SXianjun Jiao printf("openwifi slice_total1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL1])); 4002ee67178SXianjun Jiao 4012ee67178SXianjun Jiao return NL_SKIP; 4022ee67178SXianjun Jiao } 4032ee67178SXianjun Jiao 4042ee67178SXianjun Jiao static int handle_set_slice_total1(struct nl80211_state *state, 4052ee67178SXianjun Jiao struct nl_cb *cb, 4062ee67178SXianjun Jiao struct nl_msg *msg, 4072ee67178SXianjun Jiao int argc, char **argv, 4082ee67178SXianjun Jiao enum id_input id) 4092ee67178SXianjun Jiao { 4102ee67178SXianjun Jiao struct nlattr *tmdata; 4112ee67178SXianjun Jiao char *end; 4122ee67178SXianjun Jiao unsigned int tmp; 4132ee67178SXianjun Jiao 4142ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 4152ee67178SXianjun Jiao if (!tmdata) { 4162ee67178SXianjun Jiao return 1; 4172ee67178SXianjun Jiao } 4182ee67178SXianjun Jiao 4192ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 4202ee67178SXianjun Jiao 4212ee67178SXianjun Jiao if (*end) { 4222ee67178SXianjun Jiao return 1; 4232ee67178SXianjun Jiao } 4242ee67178SXianjun Jiao 4252ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL1); 4262ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL1, tmp); 4272ee67178SXianjun Jiao 4282ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 4292ee67178SXianjun Jiao 4302ee67178SXianjun Jiao printf("openwifi slice_total1 (duration): %dus\n", tmp); 4312ee67178SXianjun Jiao 4322ee67178SXianjun Jiao return 0; 4332ee67178SXianjun Jiao 4342ee67178SXianjun Jiao nla_put_failure: 4352ee67178SXianjun Jiao return -ENOBUFS; 4362ee67178SXianjun Jiao } 4372ee67178SXianjun Jiao COMMAND(set, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total1, "set slice_total1"); 4382ee67178SXianjun Jiao 4392ee67178SXianjun Jiao static int handle_get_slice_total1(struct nl80211_state *state, 4402ee67178SXianjun Jiao struct nl_cb *cb, 4412ee67178SXianjun Jiao struct nl_msg *msg, 4422ee67178SXianjun Jiao int argc, char **argv, 4432ee67178SXianjun Jiao enum id_input id) 4442ee67178SXianjun Jiao { 4452ee67178SXianjun Jiao struct nlattr *tmdata; 4462ee67178SXianjun Jiao 4472ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 4482ee67178SXianjun Jiao if (!tmdata) 4492ee67178SXianjun Jiao return 1; 4502ee67178SXianjun Jiao 4512ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL1); 4522ee67178SXianjun Jiao 4532ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 4542ee67178SXianjun Jiao 4552ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total1_handler, NULL); 4562ee67178SXianjun Jiao return 0; 4572ee67178SXianjun Jiao 4582ee67178SXianjun Jiao nla_put_failure: 4592ee67178SXianjun Jiao return -ENOBUFS; 4602ee67178SXianjun Jiao } 4612ee67178SXianjun Jiao COMMAND(get, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total1, "get slice_total1"); 4622ee67178SXianjun Jiao 4632ee67178SXianjun Jiao 4642ee67178SXianjun Jiao static int cb_openwifi_slice_start0_handler(struct nl_msg *msg, void *arg) 4652ee67178SXianjun Jiao { 4662ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 4672ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 4682ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 4692ee67178SXianjun Jiao 4702ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 4712ee67178SXianjun Jiao 4722ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 4732ee67178SXianjun Jiao return NL_SKIP; 4742ee67178SXianjun Jiao 4752ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 4762ee67178SXianjun Jiao 4772ee67178SXianjun Jiao printf("openwifi slice_start0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START0])); 4782ee67178SXianjun Jiao 4792ee67178SXianjun Jiao return NL_SKIP; 4802ee67178SXianjun Jiao } 4812ee67178SXianjun Jiao 4822ee67178SXianjun Jiao static int handle_set_slice_start0(struct nl80211_state *state, 4832ee67178SXianjun Jiao struct nl_cb *cb, 4842ee67178SXianjun Jiao struct nl_msg *msg, 4852ee67178SXianjun Jiao int argc, char **argv, 4862ee67178SXianjun Jiao enum id_input id) 4872ee67178SXianjun Jiao { 4882ee67178SXianjun Jiao struct nlattr *tmdata; 4892ee67178SXianjun Jiao char *end; 4902ee67178SXianjun Jiao unsigned int tmp; 4912ee67178SXianjun Jiao 4922ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 4932ee67178SXianjun Jiao if (!tmdata) { 4942ee67178SXianjun Jiao return 1; 4952ee67178SXianjun Jiao } 4962ee67178SXianjun Jiao 4972ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 4982ee67178SXianjun Jiao 4992ee67178SXianjun Jiao if (*end) { 5002ee67178SXianjun Jiao return 1; 5012ee67178SXianjun Jiao } 5022ee67178SXianjun Jiao 5032ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START0); 5042ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START0, tmp); 5052ee67178SXianjun Jiao 5062ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 5072ee67178SXianjun Jiao 5082ee67178SXianjun Jiao printf("openwifi slice_start0 (duration): %dus\n", tmp); 5092ee67178SXianjun Jiao 5102ee67178SXianjun Jiao return 0; 5112ee67178SXianjun Jiao 5122ee67178SXianjun Jiao nla_put_failure: 5132ee67178SXianjun Jiao return -ENOBUFS; 5142ee67178SXianjun Jiao } 5152ee67178SXianjun Jiao COMMAND(set, slice_start0, "<slice_start0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start0, "set slice_start0"); 5162ee67178SXianjun Jiao 5172ee67178SXianjun Jiao static int handle_get_slice_start0(struct nl80211_state *state, 5182ee67178SXianjun Jiao struct nl_cb *cb, 5192ee67178SXianjun Jiao struct nl_msg *msg, 5202ee67178SXianjun Jiao int argc, char **argv, 5212ee67178SXianjun Jiao enum id_input id) 5222ee67178SXianjun Jiao { 5232ee67178SXianjun Jiao struct nlattr *tmdata; 5242ee67178SXianjun Jiao 5252ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 5262ee67178SXianjun Jiao if (!tmdata) 5272ee67178SXianjun Jiao return 1; 5282ee67178SXianjun Jiao 5292ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START0); 5302ee67178SXianjun Jiao 5312ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 5322ee67178SXianjun Jiao 5332ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start0_handler, NULL); 5342ee67178SXianjun Jiao return 0; 5352ee67178SXianjun Jiao 5362ee67178SXianjun Jiao nla_put_failure: 5372ee67178SXianjun Jiao return -ENOBUFS; 5382ee67178SXianjun Jiao } 5392ee67178SXianjun Jiao COMMAND(get, slice_start0, "<slice_start0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start0, "get slice_start0"); 5402ee67178SXianjun Jiao 5412ee67178SXianjun Jiao 5422ee67178SXianjun Jiao static int cb_openwifi_slice_start1_handler(struct nl_msg *msg, void *arg) 5432ee67178SXianjun Jiao { 5442ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 5452ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 5462ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 5472ee67178SXianjun Jiao 5482ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 5492ee67178SXianjun Jiao 5502ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 5512ee67178SXianjun Jiao return NL_SKIP; 5522ee67178SXianjun Jiao 5532ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 5542ee67178SXianjun Jiao 5552ee67178SXianjun Jiao printf("openwifi slice_start1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START1])); 5562ee67178SXianjun Jiao 5572ee67178SXianjun Jiao return NL_SKIP; 5582ee67178SXianjun Jiao } 5592ee67178SXianjun Jiao 5602ee67178SXianjun Jiao static int handle_set_slice_start1(struct nl80211_state *state, 5612ee67178SXianjun Jiao struct nl_cb *cb, 5622ee67178SXianjun Jiao struct nl_msg *msg, 5632ee67178SXianjun Jiao int argc, char **argv, 5642ee67178SXianjun Jiao enum id_input id) 5652ee67178SXianjun Jiao { 5662ee67178SXianjun Jiao struct nlattr *tmdata; 5672ee67178SXianjun Jiao char *end; 5682ee67178SXianjun Jiao unsigned int tmp; 5692ee67178SXianjun Jiao 5702ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 5712ee67178SXianjun Jiao if (!tmdata) { 5722ee67178SXianjun Jiao return 1; 5732ee67178SXianjun Jiao } 5742ee67178SXianjun Jiao 5752ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 5762ee67178SXianjun Jiao 5772ee67178SXianjun Jiao if (*end) { 5782ee67178SXianjun Jiao return 1; 5792ee67178SXianjun Jiao } 5802ee67178SXianjun Jiao 5812ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START1); 5822ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START1, tmp); 5832ee67178SXianjun Jiao 5842ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 5852ee67178SXianjun Jiao 5862ee67178SXianjun Jiao printf("openwifi slice_start1 (duration): %dus\n", tmp); 5872ee67178SXianjun Jiao 5882ee67178SXianjun Jiao return 0; 5892ee67178SXianjun Jiao 5902ee67178SXianjun Jiao nla_put_failure: 5912ee67178SXianjun Jiao return -ENOBUFS; 5922ee67178SXianjun Jiao } 5932ee67178SXianjun Jiao COMMAND(set, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start1, "set slice_start1"); 5942ee67178SXianjun Jiao 5952ee67178SXianjun Jiao static int handle_get_slice_start1(struct nl80211_state *state, 5962ee67178SXianjun Jiao struct nl_cb *cb, 5972ee67178SXianjun Jiao struct nl_msg *msg, 5982ee67178SXianjun Jiao int argc, char **argv, 5992ee67178SXianjun Jiao enum id_input id) 6002ee67178SXianjun Jiao { 6012ee67178SXianjun Jiao struct nlattr *tmdata; 6022ee67178SXianjun Jiao 6032ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 6042ee67178SXianjun Jiao if (!tmdata) 6052ee67178SXianjun Jiao return 1; 6062ee67178SXianjun Jiao 6072ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START1); 6082ee67178SXianjun Jiao 6092ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 6102ee67178SXianjun Jiao 6112ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start1_handler, NULL); 6122ee67178SXianjun Jiao return 0; 6132ee67178SXianjun Jiao 6142ee67178SXianjun Jiao nla_put_failure: 6152ee67178SXianjun Jiao return -ENOBUFS; 6162ee67178SXianjun Jiao } 6172ee67178SXianjun Jiao COMMAND(get, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start1, "get slice_start1"); 6182ee67178SXianjun Jiao 6192ee67178SXianjun Jiao 6202ee67178SXianjun Jiao static int cb_openwifi_slice_end0_handler(struct nl_msg *msg, void *arg) 6212ee67178SXianjun Jiao { 6222ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 6232ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 6242ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 6252ee67178SXianjun Jiao 6262ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 6272ee67178SXianjun Jiao 6282ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 6292ee67178SXianjun Jiao return NL_SKIP; 6302ee67178SXianjun Jiao 6312ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 6322ee67178SXianjun Jiao 6332ee67178SXianjun Jiao printf("openwifi slice_end0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END0])); 6342ee67178SXianjun Jiao 6352ee67178SXianjun Jiao return NL_SKIP; 6362ee67178SXianjun Jiao } 6372ee67178SXianjun Jiao 6382ee67178SXianjun Jiao static int handle_set_slice_end0(struct nl80211_state *state, 6392ee67178SXianjun Jiao struct nl_cb *cb, 6402ee67178SXianjun Jiao struct nl_msg *msg, 6412ee67178SXianjun Jiao int argc, char **argv, 6422ee67178SXianjun Jiao enum id_input id) 6432ee67178SXianjun Jiao { 6442ee67178SXianjun Jiao struct nlattr *tmdata; 6452ee67178SXianjun Jiao char *end; 6462ee67178SXianjun Jiao unsigned int tmp; 6472ee67178SXianjun Jiao 6482ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 6492ee67178SXianjun Jiao if (!tmdata) { 6502ee67178SXianjun Jiao return 1; 6512ee67178SXianjun Jiao } 6522ee67178SXianjun Jiao 6532ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 6542ee67178SXianjun Jiao 6552ee67178SXianjun Jiao if (*end) { 6562ee67178SXianjun Jiao return 1; 6572ee67178SXianjun Jiao } 6582ee67178SXianjun Jiao 6592ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END0); 6602ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END0, tmp); 6612ee67178SXianjun Jiao 6622ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 6632ee67178SXianjun Jiao 6642ee67178SXianjun Jiao printf("openwifi slice_end0 (duration): %dus\n", tmp); 6652ee67178SXianjun Jiao 6662ee67178SXianjun Jiao return 0; 6672ee67178SXianjun Jiao 6682ee67178SXianjun Jiao nla_put_failure: 6692ee67178SXianjun Jiao return -ENOBUFS; 6702ee67178SXianjun Jiao } 6712ee67178SXianjun Jiao COMMAND(set, slice_end0, "<slice_end0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end0, "set slice_end0"); 6722ee67178SXianjun Jiao 6732ee67178SXianjun Jiao static int handle_get_slice_end0(struct nl80211_state *state, 6742ee67178SXianjun Jiao struct nl_cb *cb, 6752ee67178SXianjun Jiao struct nl_msg *msg, 6762ee67178SXianjun Jiao int argc, char **argv, 6772ee67178SXianjun Jiao enum id_input id) 6782ee67178SXianjun Jiao { 6792ee67178SXianjun Jiao struct nlattr *tmdata; 6802ee67178SXianjun Jiao 6812ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 6822ee67178SXianjun Jiao if (!tmdata) 6832ee67178SXianjun Jiao return 1; 6842ee67178SXianjun Jiao 6852ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END0); 6862ee67178SXianjun Jiao 6872ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 6882ee67178SXianjun Jiao 6892ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end0_handler, NULL); 6902ee67178SXianjun Jiao return 0; 6912ee67178SXianjun Jiao 6922ee67178SXianjun Jiao nla_put_failure: 6932ee67178SXianjun Jiao return -ENOBUFS; 6942ee67178SXianjun Jiao } 6952ee67178SXianjun Jiao COMMAND(get, slice_end0, "<slice_end0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end0, "get slice_end0"); 6962ee67178SXianjun Jiao 6972ee67178SXianjun Jiao 6982ee67178SXianjun Jiao static int cb_openwifi_slice_end1_handler(struct nl_msg *msg, void *arg) 6992ee67178SXianjun Jiao { 7002ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 7012ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 7022ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 7032ee67178SXianjun Jiao 7042ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 7052ee67178SXianjun Jiao 7062ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 7072ee67178SXianjun Jiao return NL_SKIP; 7082ee67178SXianjun Jiao 7092ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 7102ee67178SXianjun Jiao 7112ee67178SXianjun Jiao printf("openwifi slice_end1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END1])); 7122ee67178SXianjun Jiao 7132ee67178SXianjun Jiao return NL_SKIP; 7142ee67178SXianjun Jiao } 7152ee67178SXianjun Jiao 7162ee67178SXianjun Jiao static int handle_set_slice_end1(struct nl80211_state *state, 7172ee67178SXianjun Jiao struct nl_cb *cb, 7182ee67178SXianjun Jiao struct nl_msg *msg, 7192ee67178SXianjun Jiao int argc, char **argv, 7202ee67178SXianjun Jiao enum id_input id) 7212ee67178SXianjun Jiao { 7222ee67178SXianjun Jiao struct nlattr *tmdata; 7232ee67178SXianjun Jiao char *end; 7242ee67178SXianjun Jiao unsigned int tmp; 7252ee67178SXianjun Jiao 7262ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 7272ee67178SXianjun Jiao if (!tmdata) { 7282ee67178SXianjun Jiao return 1; 7292ee67178SXianjun Jiao } 7302ee67178SXianjun Jiao 7312ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 7322ee67178SXianjun Jiao 7332ee67178SXianjun Jiao if (*end) { 7342ee67178SXianjun Jiao return 1; 7352ee67178SXianjun Jiao } 7362ee67178SXianjun Jiao 7372ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END1); 7382ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END1, tmp); 7392ee67178SXianjun Jiao 7402ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 7412ee67178SXianjun Jiao 7422ee67178SXianjun Jiao printf("openwifi slice_end1 (duration): %dus\n", tmp); 7432ee67178SXianjun Jiao 7442ee67178SXianjun Jiao return 0; 7452ee67178SXianjun Jiao 7462ee67178SXianjun Jiao nla_put_failure: 7472ee67178SXianjun Jiao return -ENOBUFS; 7482ee67178SXianjun Jiao } 7492ee67178SXianjun Jiao COMMAND(set, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end1, "set slice_end1"); 7502ee67178SXianjun Jiao 7512ee67178SXianjun Jiao static int handle_get_slice_end1(struct nl80211_state *state, 7522ee67178SXianjun Jiao struct nl_cb *cb, 7532ee67178SXianjun Jiao struct nl_msg *msg, 7542ee67178SXianjun Jiao int argc, char **argv, 7552ee67178SXianjun Jiao enum id_input id) 7562ee67178SXianjun Jiao { 7572ee67178SXianjun Jiao struct nlattr *tmdata; 7582ee67178SXianjun Jiao 7592ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 7602ee67178SXianjun Jiao if (!tmdata) 7612ee67178SXianjun Jiao return 1; 7622ee67178SXianjun Jiao 7632ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END1); 7642ee67178SXianjun Jiao 7652ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 7662ee67178SXianjun Jiao 7672ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end1_handler, NULL); 7682ee67178SXianjun Jiao return 0; 7692ee67178SXianjun Jiao 7702ee67178SXianjun Jiao nla_put_failure: 7712ee67178SXianjun Jiao return -ENOBUFS; 7722ee67178SXianjun Jiao } 7732ee67178SXianjun Jiao COMMAND(get, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end1, "get slice_end1"); 7742ee67178SXianjun Jiao 7752ee67178SXianjun Jiao 7762ee67178SXianjun Jiao static int cb_openwifi_slice0_target_mac_addr_handler(struct nl_msg *msg, void *arg) 7772ee67178SXianjun Jiao { 7782ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 7792ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 7802ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 7812ee67178SXianjun Jiao 7822ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 7832ee67178SXianjun Jiao 7842ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 7852ee67178SXianjun Jiao return NL_SKIP; 7862ee67178SXianjun Jiao 7872ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 7882ee67178SXianjun Jiao 7892ee67178SXianjun Jiao printf("openwifi slice0_target_mac_addr(low32) in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_ADDR0])); 7902ee67178SXianjun Jiao 7912ee67178SXianjun Jiao return NL_SKIP; 7922ee67178SXianjun Jiao } 7932ee67178SXianjun Jiao 7942ee67178SXianjun Jiao static int handle_set_addr0(struct nl80211_state *state, 7952ee67178SXianjun Jiao struct nl_cb *cb, 7962ee67178SXianjun Jiao struct nl_msg *msg, 7972ee67178SXianjun Jiao int argc, char **argv, 7982ee67178SXianjun Jiao enum id_input id) 7992ee67178SXianjun Jiao { 8002ee67178SXianjun Jiao struct nlattr *tmdata; 8012ee67178SXianjun Jiao char *end; 8022ee67178SXianjun Jiao unsigned int slice0_target_mac_addr; 8032ee67178SXianjun Jiao 8042ee67178SXianjun Jiao //printf("handle_set_slice0_target_mac_addr\n"); 8052ee67178SXianjun Jiao 8062ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 8072ee67178SXianjun Jiao if (!tmdata) { 8082ee67178SXianjun Jiao //printf("handle_set_slice0_target_mac_addr 1\n"); 8092ee67178SXianjun Jiao return 1; 8102ee67178SXianjun Jiao } 8112ee67178SXianjun Jiao 8122ee67178SXianjun Jiao slice0_target_mac_addr = strtoul(argv[0], &end, 16); 8132ee67178SXianjun Jiao 8142ee67178SXianjun Jiao if (*end) { 8152ee67178SXianjun Jiao //printf("handle_set_slice0_target_mac_addr 2 %d\n", slice0_target_mac_addr); 8162ee67178SXianjun Jiao return 1; 8172ee67178SXianjun Jiao } 8182ee67178SXianjun Jiao 8192ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_ADDR0); 8202ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_ADDR0, slice0_target_mac_addr); 8212ee67178SXianjun Jiao 8222ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 8232ee67178SXianjun Jiao 8242ee67178SXianjun Jiao printf("openwifi slice0_target_mac_addr(low32) in hex: %08x\n", slice0_target_mac_addr); 8252ee67178SXianjun Jiao 8262ee67178SXianjun Jiao return 0; 8272ee67178SXianjun Jiao 8282ee67178SXianjun Jiao nla_put_failure: 8292ee67178SXianjun Jiao return -ENOBUFS; 8302ee67178SXianjun Jiao } 8312ee67178SXianjun Jiao COMMAND(set, addr0, "<slice0_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_addr0, "set addr0"); 8322ee67178SXianjun Jiao 8332ee67178SXianjun Jiao static int handle_get_slice0_target_mac_addr(struct nl80211_state *state, 8342ee67178SXianjun Jiao struct nl_cb *cb, 8352ee67178SXianjun Jiao struct nl_msg *msg, 8362ee67178SXianjun Jiao int argc, char **argv, 8372ee67178SXianjun Jiao enum id_input id) 8382ee67178SXianjun Jiao { 8392ee67178SXianjun Jiao struct nlattr *tmdata; 8402ee67178SXianjun Jiao 8412ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 8422ee67178SXianjun Jiao if (!tmdata) 8432ee67178SXianjun Jiao return 1; 8442ee67178SXianjun Jiao 8452ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_ADDR0); 8462ee67178SXianjun Jiao 8472ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 8482ee67178SXianjun Jiao 8492ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice0_target_mac_addr_handler, NULL); 8502ee67178SXianjun Jiao return 0; 8512ee67178SXianjun Jiao 8522ee67178SXianjun Jiao nla_put_failure: 8532ee67178SXianjun Jiao return -ENOBUFS; 8542ee67178SXianjun Jiao } 8552ee67178SXianjun Jiao COMMAND(get, addr0, "<slice0_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice0_target_mac_addr, "get addr0"); 8562ee67178SXianjun Jiao 8572ee67178SXianjun Jiao static int cb_openwifi_slice1_target_mac_addr_handler(struct nl_msg *msg, void *arg) 8582ee67178SXianjun Jiao { 8592ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 8602ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 8612ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 8622ee67178SXianjun Jiao 8632ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 8642ee67178SXianjun Jiao 8652ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 8662ee67178SXianjun Jiao return NL_SKIP; 8672ee67178SXianjun Jiao 8682ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 8692ee67178SXianjun Jiao 8702ee67178SXianjun Jiao printf("openwifi slice1_target_mac_addr(low32) in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_ADDR1])); 8712ee67178SXianjun Jiao 8722ee67178SXianjun Jiao return NL_SKIP; 8732ee67178SXianjun Jiao } 8742ee67178SXianjun Jiao 8752ee67178SXianjun Jiao static int handle_set_slice1_target_mac_addr(struct nl80211_state *state, 8762ee67178SXianjun Jiao struct nl_cb *cb, 8772ee67178SXianjun Jiao struct nl_msg *msg, 8782ee67178SXianjun Jiao int argc, char **argv, 8792ee67178SXianjun Jiao enum id_input id) 8802ee67178SXianjun Jiao { 8812ee67178SXianjun Jiao struct nlattr *tmdata; 8822ee67178SXianjun Jiao char *end; 8832ee67178SXianjun Jiao unsigned int slice1_target_mac_addr; 8842ee67178SXianjun Jiao 8852ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 8862ee67178SXianjun Jiao if (!tmdata) 8872ee67178SXianjun Jiao return 1; 8882ee67178SXianjun Jiao 8892ee67178SXianjun Jiao slice1_target_mac_addr = strtoul(argv[0], &end, 16); 8902ee67178SXianjun Jiao 8912ee67178SXianjun Jiao if (*end) 8922ee67178SXianjun Jiao return 1; 8932ee67178SXianjun Jiao 8942ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_ADDR1); 8952ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_ADDR1, slice1_target_mac_addr); 8962ee67178SXianjun Jiao 8972ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 8982ee67178SXianjun Jiao 8992ee67178SXianjun Jiao printf("openwifi slice1_target_mac_addr(low32) in hex: %08x\n", slice1_target_mac_addr); 9002ee67178SXianjun Jiao 9012ee67178SXianjun Jiao return 0; 9022ee67178SXianjun Jiao 9032ee67178SXianjun Jiao nla_put_failure: 9042ee67178SXianjun Jiao return -ENOBUFS; 9052ee67178SXianjun Jiao } 9062ee67178SXianjun Jiao COMMAND(set, addr1, "<slice1_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice1_target_mac_addr, "set addr1"); 9072ee67178SXianjun Jiao 9082ee67178SXianjun Jiao static int handle_get_slice1_target_mac_addr(struct nl80211_state *state, 9092ee67178SXianjun Jiao struct nl_cb *cb, 9102ee67178SXianjun Jiao struct nl_msg *msg, 9112ee67178SXianjun Jiao int argc, char **argv, 9122ee67178SXianjun Jiao enum id_input id) 9132ee67178SXianjun Jiao { 9142ee67178SXianjun Jiao struct nlattr *tmdata; 9152ee67178SXianjun Jiao 9162ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 9172ee67178SXianjun Jiao if (!tmdata) 9182ee67178SXianjun Jiao return 1; 9192ee67178SXianjun Jiao 9202ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_ADDR1); 9212ee67178SXianjun Jiao 9222ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 9232ee67178SXianjun Jiao 9242ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice1_target_mac_addr_handler, NULL); 9252ee67178SXianjun Jiao return 0; 9262ee67178SXianjun Jiao 9272ee67178SXianjun Jiao nla_put_failure: 9282ee67178SXianjun Jiao return -ENOBUFS; 9292ee67178SXianjun Jiao } 9302ee67178SXianjun Jiao COMMAND(get, addr1, "<slice1_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice1_target_mac_addr, "get addr1"); 9312ee67178SXianjun Jiao 9322ee67178SXianjun Jiao static int cb_openwifi_gap_handler(struct nl_msg *msg, void *arg) 9332ee67178SXianjun Jiao { 9342ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 9352ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 9362ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 9372ee67178SXianjun Jiao 9382ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 9392ee67178SXianjun Jiao 9402ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 9412ee67178SXianjun Jiao return NL_SKIP; 9422ee67178SXianjun Jiao 9432ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 9442ee67178SXianjun Jiao 9452ee67178SXianjun Jiao printf("openwifi GAP (usec): %d\n", nla_get_u32(tb[OPENWIFI_ATTR_GAP])); 9462ee67178SXianjun Jiao 9472ee67178SXianjun Jiao return NL_SKIP; 9482ee67178SXianjun Jiao } 9492ee67178SXianjun Jiao 9502ee67178SXianjun Jiao static int handle_set_gap(struct nl80211_state *state, 9512ee67178SXianjun Jiao struct nl_cb *cb, 9522ee67178SXianjun Jiao struct nl_msg *msg, 9532ee67178SXianjun Jiao int argc, char **argv, 9542ee67178SXianjun Jiao enum id_input id) 9552ee67178SXianjun Jiao { 9562ee67178SXianjun Jiao struct nlattr *tmdata; 9572ee67178SXianjun Jiao char *end; 9582ee67178SXianjun Jiao unsigned int gap_us; 9592ee67178SXianjun Jiao 9602ee67178SXianjun Jiao //printf("handle_set_gap\n"); 9612ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 9622ee67178SXianjun Jiao if (!tmdata) 9632ee67178SXianjun Jiao return 1; 9642ee67178SXianjun Jiao 9652ee67178SXianjun Jiao gap_us = strtoul(argv[0], &end, 10); 9662ee67178SXianjun Jiao 9672ee67178SXianjun Jiao if (*end) 9682ee67178SXianjun Jiao return 1; 9692ee67178SXianjun Jiao 9702ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_GAP); 9712ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_GAP, gap_us); 9722ee67178SXianjun Jiao 9732ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 9742ee67178SXianjun Jiao return 0; 9752ee67178SXianjun Jiao 9762ee67178SXianjun Jiao nla_put_failure: 9772ee67178SXianjun Jiao return -ENOBUFS; 9782ee67178SXianjun Jiao } 9792ee67178SXianjun Jiao COMMAND(set, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_gap, "set inter frame gap of openwifi radio"); 9802ee67178SXianjun Jiao 9812ee67178SXianjun Jiao static int handle_get_gap(struct nl80211_state *state, 9822ee67178SXianjun Jiao struct nl_cb *cb, 9832ee67178SXianjun Jiao struct nl_msg *msg, 9842ee67178SXianjun Jiao int argc, char **argv, 9852ee67178SXianjun Jiao enum id_input id) 9862ee67178SXianjun Jiao { 9872ee67178SXianjun Jiao struct nlattr *tmdata; 9882ee67178SXianjun Jiao 9892ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 9902ee67178SXianjun Jiao if (!tmdata) 9912ee67178SXianjun Jiao return 1; 9922ee67178SXianjun Jiao 9932ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_GAP); 9942ee67178SXianjun Jiao 9952ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 9962ee67178SXianjun Jiao 9972ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_gap_handler, NULL); 9982ee67178SXianjun Jiao return 0; 9992ee67178SXianjun Jiao 10002ee67178SXianjun Jiao nla_put_failure: 10012ee67178SXianjun Jiao return -ENOBUFS; 10022ee67178SXianjun Jiao } 10032ee67178SXianjun Jiao COMMAND(get, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_gap, "get inter frame gap of openwifi radio"); 1004