1*2ee67178SXianjun Jiao // Xianjun jiao. [email protected]; [email protected]; 2*2ee67178SXianjun Jiao 3*2ee67178SXianjun Jiao #include <stdbool.h> 4*2ee67178SXianjun Jiao #include <errno.h> 5*2ee67178SXianjun Jiao #include <net/if.h> 6*2ee67178SXianjun Jiao #include <strings.h> 7*2ee67178SXianjun Jiao 8*2ee67178SXianjun Jiao #include <netlink/genl/genl.h> 9*2ee67178SXianjun Jiao #include <netlink/genl/family.h> 10*2ee67178SXianjun Jiao #include <netlink/genl/ctrl.h> 11*2ee67178SXianjun Jiao #include <netlink/msg.h> 12*2ee67178SXianjun Jiao #include <netlink/attr.h> 13*2ee67178SXianjun Jiao 14*2ee67178SXianjun Jiao #include "nl80211.h" 15*2ee67178SXianjun Jiao #include "sdrctl.h" 16*2ee67178SXianjun Jiao #include "nl80211_testmode_def.h" 17*2ee67178SXianjun Jiao 18*2ee67178SXianjun Jiao 19*2ee67178SXianjun Jiao static int cb_reg_handler(struct nl_msg *msg, void *arg) 20*2ee67178SXianjun Jiao { 21*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 22*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 23*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 24*2ee67178SXianjun Jiao 25*2ee67178SXianjun Jiao //printf("cb_reg_handler\n"); 26*2ee67178SXianjun Jiao 27*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 28*2ee67178SXianjun Jiao 29*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 30*2ee67178SXianjun Jiao return NL_SKIP; 31*2ee67178SXianjun Jiao 32*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 33*2ee67178SXianjun Jiao 34*2ee67178SXianjun Jiao //printf("reg addr: %08x\n", nla_get_u32(tb[REG_ATTR_ADDR])); 35*2ee67178SXianjun Jiao printf("reg val: %08x\n", nla_get_u32(tb[REG_ATTR_VAL])); 36*2ee67178SXianjun Jiao 37*2ee67178SXianjun Jiao return NL_SKIP; 38*2ee67178SXianjun Jiao } 39*2ee67178SXianjun Jiao 40*2ee67178SXianjun Jiao static int handle_set_reg(struct nl80211_state *state, 41*2ee67178SXianjun Jiao struct nl_cb *cb, 42*2ee67178SXianjun Jiao struct nl_msg *msg, 43*2ee67178SXianjun Jiao int argc, char **argv, 44*2ee67178SXianjun Jiao enum id_input id) 45*2ee67178SXianjun Jiao { 46*2ee67178SXianjun Jiao struct nlattr *tmdata; 47*2ee67178SXianjun Jiao char *end; 48*2ee67178SXianjun Jiao unsigned int reg_cat, reg_addr, reg_val; 49*2ee67178SXianjun Jiao 50*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 51*2ee67178SXianjun Jiao if (!tmdata) { 52*2ee67178SXianjun Jiao return 1; 53*2ee67178SXianjun Jiao } 54*2ee67178SXianjun Jiao 55*2ee67178SXianjun Jiao if (strcasecmp(argv[0],"rf")==0) 56*2ee67178SXianjun Jiao reg_cat=1; 57*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"rx_intf")==0) 58*2ee67178SXianjun Jiao reg_cat = 2; 59*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"tx_intf")==0) 60*2ee67178SXianjun Jiao reg_cat = 3; 61*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"rx")==0) 62*2ee67178SXianjun Jiao reg_cat = 4; 63*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"tx")==0) 64*2ee67178SXianjun Jiao reg_cat = 5; 65*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"xpu")==0) 66*2ee67178SXianjun Jiao reg_cat = 6; 67*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"drv_rx")==0) 68*2ee67178SXianjun Jiao reg_cat = 7; 69*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"drv_tx")==0) 70*2ee67178SXianjun Jiao reg_cat = 8; 71*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"drv_xpu")==0) 72*2ee67178SXianjun Jiao reg_cat = 9; 73*2ee67178SXianjun Jiao else { 74*2ee67178SXianjun Jiao printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n"); 75*2ee67178SXianjun Jiao return 1; 76*2ee67178SXianjun Jiao } 77*2ee67178SXianjun Jiao 78*2ee67178SXianjun Jiao reg_addr = strtoul(argv[1], &end, 10); 79*2ee67178SXianjun Jiao if (*end) { 80*2ee67178SXianjun Jiao return 1; 81*2ee67178SXianjun Jiao } 82*2ee67178SXianjun Jiao reg_addr = reg_addr<<2;//from idx to addr 83*2ee67178SXianjun Jiao reg_addr = ((reg_cat<<16)|reg_addr); 84*2ee67178SXianjun Jiao 85*2ee67178SXianjun Jiao reg_val = strtoul(argv[2], &end, 10); 86*2ee67178SXianjun Jiao if (*end) { 87*2ee67178SXianjun Jiao return 1; 88*2ee67178SXianjun Jiao } 89*2ee67178SXianjun Jiao 90*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_SET); 91*2ee67178SXianjun Jiao NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr); 92*2ee67178SXianjun Jiao NLA_PUT_U32(msg, REG_ATTR_VAL, reg_val); 93*2ee67178SXianjun Jiao 94*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 95*2ee67178SXianjun Jiao 96*2ee67178SXianjun Jiao printf("reg cat: %d\n", reg_cat); 97*2ee67178SXianjun Jiao printf("reg addr: %08x\n", reg_addr); 98*2ee67178SXianjun Jiao printf("reg val: %08x\n", reg_val); 99*2ee67178SXianjun Jiao 100*2ee67178SXianjun Jiao return 0; 101*2ee67178SXianjun Jiao 102*2ee67178SXianjun Jiao nla_put_failure: 103*2ee67178SXianjun Jiao return -ENOBUFS; 104*2ee67178SXianjun Jiao } 105*2ee67178SXianjun 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"); 106*2ee67178SXianjun Jiao 107*2ee67178SXianjun Jiao static int handle_get_reg(struct nl80211_state *state, 108*2ee67178SXianjun Jiao struct nl_cb *cb, 109*2ee67178SXianjun Jiao struct nl_msg *msg, 110*2ee67178SXianjun Jiao int argc, char **argv, 111*2ee67178SXianjun Jiao enum id_input id) 112*2ee67178SXianjun Jiao { 113*2ee67178SXianjun Jiao char *end; 114*2ee67178SXianjun Jiao struct nlattr *tmdata; 115*2ee67178SXianjun Jiao unsigned int reg_cat, reg_addr; 116*2ee67178SXianjun Jiao 117*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 118*2ee67178SXianjun Jiao if (!tmdata) 119*2ee67178SXianjun Jiao return 1; 120*2ee67178SXianjun Jiao 121*2ee67178SXianjun Jiao if (strcasecmp(argv[0],"rf")==0) 122*2ee67178SXianjun Jiao reg_cat=1; 123*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"rx_intf")==0) 124*2ee67178SXianjun Jiao reg_cat = 2; 125*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"tx_intf")==0) 126*2ee67178SXianjun Jiao reg_cat = 3; 127*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"rx")==0) 128*2ee67178SXianjun Jiao reg_cat = 4; 129*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"tx")==0) 130*2ee67178SXianjun Jiao reg_cat = 5; 131*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"xpu")==0) 132*2ee67178SXianjun Jiao reg_cat = 6; 133*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"drv_rx")==0) 134*2ee67178SXianjun Jiao reg_cat = 7; 135*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"drv_tx")==0) 136*2ee67178SXianjun Jiao reg_cat = 8; 137*2ee67178SXianjun Jiao else if (strcasecmp(argv[0],"drv_xpu")==0) 138*2ee67178SXianjun Jiao reg_cat = 9; 139*2ee67178SXianjun Jiao else { 140*2ee67178SXianjun Jiao printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n"); 141*2ee67178SXianjun Jiao return 1; 142*2ee67178SXianjun Jiao } 143*2ee67178SXianjun Jiao 144*2ee67178SXianjun Jiao reg_addr = strtoul(argv[1], &end, 10); 145*2ee67178SXianjun Jiao if (*end) { 146*2ee67178SXianjun Jiao return 1; 147*2ee67178SXianjun Jiao } 148*2ee67178SXianjun Jiao reg_addr = reg_addr<<2;//from idx to addr 149*2ee67178SXianjun Jiao reg_addr = ((reg_cat<<16)|reg_addr); 150*2ee67178SXianjun Jiao printf("SENDaddr: %08x\n", reg_addr); 151*2ee67178SXianjun Jiao 152*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_GET); 153*2ee67178SXianjun Jiao NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr); 154*2ee67178SXianjun Jiao 155*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 156*2ee67178SXianjun Jiao 157*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_reg_handler, NULL); 158*2ee67178SXianjun Jiao return 0; 159*2ee67178SXianjun Jiao 160*2ee67178SXianjun Jiao nla_put_failure: 161*2ee67178SXianjun Jiao return -ENOBUFS; 162*2ee67178SXianjun Jiao } 163*2ee67178SXianjun 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"); 164*2ee67178SXianjun Jiao 165*2ee67178SXianjun Jiao static int cb_openwifi_rssi_th_handler(struct nl_msg *msg, void *arg) 166*2ee67178SXianjun Jiao { 167*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 168*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 169*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 170*2ee67178SXianjun Jiao 171*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 172*2ee67178SXianjun Jiao 173*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 174*2ee67178SXianjun Jiao return NL_SKIP; 175*2ee67178SXianjun Jiao 176*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 177*2ee67178SXianjun Jiao 178*2ee67178SXianjun Jiao printf("openwifi rssi_th: %d\n", nla_get_u32(tb[OPENWIFI_ATTR_RSSI_TH])); 179*2ee67178SXianjun Jiao 180*2ee67178SXianjun Jiao return NL_SKIP; 181*2ee67178SXianjun Jiao } 182*2ee67178SXianjun Jiao 183*2ee67178SXianjun Jiao static int handle_set_rssi_th(struct nl80211_state *state, 184*2ee67178SXianjun Jiao struct nl_cb *cb, 185*2ee67178SXianjun Jiao struct nl_msg *msg, 186*2ee67178SXianjun Jiao int argc, char **argv, 187*2ee67178SXianjun Jiao enum id_input id) 188*2ee67178SXianjun Jiao { 189*2ee67178SXianjun Jiao struct nlattr *tmdata; 190*2ee67178SXianjun Jiao char *end; 191*2ee67178SXianjun Jiao unsigned int tmp; 192*2ee67178SXianjun Jiao 193*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 194*2ee67178SXianjun Jiao if (!tmdata) { 195*2ee67178SXianjun Jiao return 1; 196*2ee67178SXianjun Jiao } 197*2ee67178SXianjun Jiao 198*2ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 199*2ee67178SXianjun Jiao 200*2ee67178SXianjun Jiao if (*end) { 201*2ee67178SXianjun Jiao return 1; 202*2ee67178SXianjun Jiao } 203*2ee67178SXianjun Jiao 204*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_RSSI_TH); 205*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_RSSI_TH, tmp); 206*2ee67178SXianjun Jiao 207*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 208*2ee67178SXianjun Jiao 209*2ee67178SXianjun Jiao printf("openwifi rssi_th: %d\n", tmp); 210*2ee67178SXianjun Jiao 211*2ee67178SXianjun Jiao return 0; 212*2ee67178SXianjun Jiao 213*2ee67178SXianjun Jiao nla_put_failure: 214*2ee67178SXianjun Jiao return -ENOBUFS; 215*2ee67178SXianjun Jiao } 216*2ee67178SXianjun Jiao COMMAND(set, rssi_th, "<rssi_th in value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_rssi_th, "set rssi_th"); 217*2ee67178SXianjun Jiao 218*2ee67178SXianjun Jiao static int handle_get_rssi_th(struct nl80211_state *state, 219*2ee67178SXianjun Jiao struct nl_cb *cb, 220*2ee67178SXianjun Jiao struct nl_msg *msg, 221*2ee67178SXianjun Jiao int argc, char **argv, 222*2ee67178SXianjun Jiao enum id_input id) 223*2ee67178SXianjun Jiao { 224*2ee67178SXianjun Jiao struct nlattr *tmdata; 225*2ee67178SXianjun Jiao 226*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 227*2ee67178SXianjun Jiao if (!tmdata) 228*2ee67178SXianjun Jiao return 1; 229*2ee67178SXianjun Jiao 230*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_RSSI_TH); 231*2ee67178SXianjun Jiao 232*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 233*2ee67178SXianjun Jiao 234*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_rssi_th_handler, NULL); 235*2ee67178SXianjun Jiao return 0; 236*2ee67178SXianjun Jiao 237*2ee67178SXianjun Jiao nla_put_failure: 238*2ee67178SXianjun Jiao return -ENOBUFS; 239*2ee67178SXianjun Jiao } 240*2ee67178SXianjun Jiao COMMAND(get, rssi_th, "<rssi_th in value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_rssi_th, "get rssi_th"); 241*2ee67178SXianjun Jiao 242*2ee67178SXianjun Jiao static int cb_openwifi_slice_total0_handler(struct nl_msg *msg, void *arg) 243*2ee67178SXianjun Jiao { 244*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 245*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 246*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 247*2ee67178SXianjun Jiao 248*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 249*2ee67178SXianjun Jiao 250*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 251*2ee67178SXianjun Jiao return NL_SKIP; 252*2ee67178SXianjun Jiao 253*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 254*2ee67178SXianjun Jiao 255*2ee67178SXianjun Jiao printf("openwifi slice_total0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL0])); 256*2ee67178SXianjun Jiao 257*2ee67178SXianjun Jiao return NL_SKIP; 258*2ee67178SXianjun Jiao } 259*2ee67178SXianjun Jiao 260*2ee67178SXianjun Jiao static int handle_set_slice_total0(struct nl80211_state *state, 261*2ee67178SXianjun Jiao struct nl_cb *cb, 262*2ee67178SXianjun Jiao struct nl_msg *msg, 263*2ee67178SXianjun Jiao int argc, char **argv, 264*2ee67178SXianjun Jiao enum id_input id) 265*2ee67178SXianjun Jiao { 266*2ee67178SXianjun Jiao struct nlattr *tmdata; 267*2ee67178SXianjun Jiao char *end; 268*2ee67178SXianjun Jiao unsigned int tmp; 269*2ee67178SXianjun Jiao 270*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 271*2ee67178SXianjun Jiao if (!tmdata) { 272*2ee67178SXianjun Jiao return 1; 273*2ee67178SXianjun Jiao } 274*2ee67178SXianjun Jiao 275*2ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 276*2ee67178SXianjun Jiao 277*2ee67178SXianjun Jiao if (*end) { 278*2ee67178SXianjun Jiao return 1; 279*2ee67178SXianjun Jiao } 280*2ee67178SXianjun Jiao 281*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL0); 282*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL0, tmp); 283*2ee67178SXianjun Jiao 284*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 285*2ee67178SXianjun Jiao 286*2ee67178SXianjun Jiao printf("openwifi slice_total0 (duration): %dus\n", tmp); 287*2ee67178SXianjun Jiao 288*2ee67178SXianjun Jiao return 0; 289*2ee67178SXianjun Jiao 290*2ee67178SXianjun Jiao nla_put_failure: 291*2ee67178SXianjun Jiao return -ENOBUFS; 292*2ee67178SXianjun Jiao } 293*2ee67178SXianjun Jiao COMMAND(set, slice_total0, "<slice_total0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total0, "set slice_total0"); 294*2ee67178SXianjun Jiao 295*2ee67178SXianjun Jiao static int handle_get_slice_total0(struct nl80211_state *state, 296*2ee67178SXianjun Jiao struct nl_cb *cb, 297*2ee67178SXianjun Jiao struct nl_msg *msg, 298*2ee67178SXianjun Jiao int argc, char **argv, 299*2ee67178SXianjun Jiao enum id_input id) 300*2ee67178SXianjun Jiao { 301*2ee67178SXianjun Jiao struct nlattr *tmdata; 302*2ee67178SXianjun Jiao 303*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 304*2ee67178SXianjun Jiao if (!tmdata) 305*2ee67178SXianjun Jiao return 1; 306*2ee67178SXianjun Jiao 307*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL0); 308*2ee67178SXianjun Jiao 309*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 310*2ee67178SXianjun Jiao 311*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total0_handler, NULL); 312*2ee67178SXianjun Jiao return 0; 313*2ee67178SXianjun Jiao 314*2ee67178SXianjun Jiao nla_put_failure: 315*2ee67178SXianjun Jiao return -ENOBUFS; 316*2ee67178SXianjun Jiao } 317*2ee67178SXianjun Jiao COMMAND(get, slice_total0, "<slice_total0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total0, "get slice_total0"); 318*2ee67178SXianjun Jiao 319*2ee67178SXianjun Jiao 320*2ee67178SXianjun Jiao static int cb_openwifi_slice_total1_handler(struct nl_msg *msg, void *arg) 321*2ee67178SXianjun Jiao { 322*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 323*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 324*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 325*2ee67178SXianjun Jiao 326*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 327*2ee67178SXianjun Jiao 328*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 329*2ee67178SXianjun Jiao return NL_SKIP; 330*2ee67178SXianjun Jiao 331*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 332*2ee67178SXianjun Jiao 333*2ee67178SXianjun Jiao printf("openwifi slice_total1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_TOTAL1])); 334*2ee67178SXianjun Jiao 335*2ee67178SXianjun Jiao return NL_SKIP; 336*2ee67178SXianjun Jiao } 337*2ee67178SXianjun Jiao 338*2ee67178SXianjun Jiao static int handle_set_slice_total1(struct nl80211_state *state, 339*2ee67178SXianjun Jiao struct nl_cb *cb, 340*2ee67178SXianjun Jiao struct nl_msg *msg, 341*2ee67178SXianjun Jiao int argc, char **argv, 342*2ee67178SXianjun Jiao enum id_input id) 343*2ee67178SXianjun Jiao { 344*2ee67178SXianjun Jiao struct nlattr *tmdata; 345*2ee67178SXianjun Jiao char *end; 346*2ee67178SXianjun Jiao unsigned int tmp; 347*2ee67178SXianjun Jiao 348*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 349*2ee67178SXianjun Jiao if (!tmdata) { 350*2ee67178SXianjun Jiao return 1; 351*2ee67178SXianjun Jiao } 352*2ee67178SXianjun Jiao 353*2ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 354*2ee67178SXianjun Jiao 355*2ee67178SXianjun Jiao if (*end) { 356*2ee67178SXianjun Jiao return 1; 357*2ee67178SXianjun Jiao } 358*2ee67178SXianjun Jiao 359*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_TOTAL1); 360*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_TOTAL1, tmp); 361*2ee67178SXianjun Jiao 362*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 363*2ee67178SXianjun Jiao 364*2ee67178SXianjun Jiao printf("openwifi slice_total1 (duration): %dus\n", tmp); 365*2ee67178SXianjun Jiao 366*2ee67178SXianjun Jiao return 0; 367*2ee67178SXianjun Jiao 368*2ee67178SXianjun Jiao nla_put_failure: 369*2ee67178SXianjun Jiao return -ENOBUFS; 370*2ee67178SXianjun Jiao } 371*2ee67178SXianjun Jiao COMMAND(set, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_total1, "set slice_total1"); 372*2ee67178SXianjun Jiao 373*2ee67178SXianjun Jiao static int handle_get_slice_total1(struct nl80211_state *state, 374*2ee67178SXianjun Jiao struct nl_cb *cb, 375*2ee67178SXianjun Jiao struct nl_msg *msg, 376*2ee67178SXianjun Jiao int argc, char **argv, 377*2ee67178SXianjun Jiao enum id_input id) 378*2ee67178SXianjun Jiao { 379*2ee67178SXianjun Jiao struct nlattr *tmdata; 380*2ee67178SXianjun Jiao 381*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 382*2ee67178SXianjun Jiao if (!tmdata) 383*2ee67178SXianjun Jiao return 1; 384*2ee67178SXianjun Jiao 385*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_TOTAL1); 386*2ee67178SXianjun Jiao 387*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 388*2ee67178SXianjun Jiao 389*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_total1_handler, NULL); 390*2ee67178SXianjun Jiao return 0; 391*2ee67178SXianjun Jiao 392*2ee67178SXianjun Jiao nla_put_failure: 393*2ee67178SXianjun Jiao return -ENOBUFS; 394*2ee67178SXianjun Jiao } 395*2ee67178SXianjun Jiao COMMAND(get, slice_total1, "<slice_total1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_total1, "get slice_total1"); 396*2ee67178SXianjun Jiao 397*2ee67178SXianjun Jiao 398*2ee67178SXianjun Jiao static int cb_openwifi_slice_start0_handler(struct nl_msg *msg, void *arg) 399*2ee67178SXianjun Jiao { 400*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 401*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 402*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 403*2ee67178SXianjun Jiao 404*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 405*2ee67178SXianjun Jiao 406*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 407*2ee67178SXianjun Jiao return NL_SKIP; 408*2ee67178SXianjun Jiao 409*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 410*2ee67178SXianjun Jiao 411*2ee67178SXianjun Jiao printf("openwifi slice_start0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START0])); 412*2ee67178SXianjun Jiao 413*2ee67178SXianjun Jiao return NL_SKIP; 414*2ee67178SXianjun Jiao } 415*2ee67178SXianjun Jiao 416*2ee67178SXianjun Jiao static int handle_set_slice_start0(struct nl80211_state *state, 417*2ee67178SXianjun Jiao struct nl_cb *cb, 418*2ee67178SXianjun Jiao struct nl_msg *msg, 419*2ee67178SXianjun Jiao int argc, char **argv, 420*2ee67178SXianjun Jiao enum id_input id) 421*2ee67178SXianjun Jiao { 422*2ee67178SXianjun Jiao struct nlattr *tmdata; 423*2ee67178SXianjun Jiao char *end; 424*2ee67178SXianjun Jiao unsigned int tmp; 425*2ee67178SXianjun Jiao 426*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 427*2ee67178SXianjun Jiao if (!tmdata) { 428*2ee67178SXianjun Jiao return 1; 429*2ee67178SXianjun Jiao } 430*2ee67178SXianjun Jiao 431*2ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 432*2ee67178SXianjun Jiao 433*2ee67178SXianjun Jiao if (*end) { 434*2ee67178SXianjun Jiao return 1; 435*2ee67178SXianjun Jiao } 436*2ee67178SXianjun Jiao 437*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START0); 438*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START0, tmp); 439*2ee67178SXianjun Jiao 440*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 441*2ee67178SXianjun Jiao 442*2ee67178SXianjun Jiao printf("openwifi slice_start0 (duration): %dus\n", tmp); 443*2ee67178SXianjun Jiao 444*2ee67178SXianjun Jiao return 0; 445*2ee67178SXianjun Jiao 446*2ee67178SXianjun Jiao nla_put_failure: 447*2ee67178SXianjun Jiao return -ENOBUFS; 448*2ee67178SXianjun Jiao } 449*2ee67178SXianjun Jiao COMMAND(set, slice_start0, "<slice_start0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start0, "set slice_start0"); 450*2ee67178SXianjun Jiao 451*2ee67178SXianjun Jiao static int handle_get_slice_start0(struct nl80211_state *state, 452*2ee67178SXianjun Jiao struct nl_cb *cb, 453*2ee67178SXianjun Jiao struct nl_msg *msg, 454*2ee67178SXianjun Jiao int argc, char **argv, 455*2ee67178SXianjun Jiao enum id_input id) 456*2ee67178SXianjun Jiao { 457*2ee67178SXianjun Jiao struct nlattr *tmdata; 458*2ee67178SXianjun Jiao 459*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 460*2ee67178SXianjun Jiao if (!tmdata) 461*2ee67178SXianjun Jiao return 1; 462*2ee67178SXianjun Jiao 463*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START0); 464*2ee67178SXianjun Jiao 465*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 466*2ee67178SXianjun Jiao 467*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start0_handler, NULL); 468*2ee67178SXianjun Jiao return 0; 469*2ee67178SXianjun Jiao 470*2ee67178SXianjun Jiao nla_put_failure: 471*2ee67178SXianjun Jiao return -ENOBUFS; 472*2ee67178SXianjun Jiao } 473*2ee67178SXianjun Jiao COMMAND(get, slice_start0, "<slice_start0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start0, "get slice_start0"); 474*2ee67178SXianjun Jiao 475*2ee67178SXianjun Jiao 476*2ee67178SXianjun Jiao static int cb_openwifi_slice_start1_handler(struct nl_msg *msg, void *arg) 477*2ee67178SXianjun Jiao { 478*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 479*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 480*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 481*2ee67178SXianjun Jiao 482*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 483*2ee67178SXianjun Jiao 484*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 485*2ee67178SXianjun Jiao return NL_SKIP; 486*2ee67178SXianjun Jiao 487*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 488*2ee67178SXianjun Jiao 489*2ee67178SXianjun Jiao printf("openwifi slice_start1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_START1])); 490*2ee67178SXianjun Jiao 491*2ee67178SXianjun Jiao return NL_SKIP; 492*2ee67178SXianjun Jiao } 493*2ee67178SXianjun Jiao 494*2ee67178SXianjun Jiao static int handle_set_slice_start1(struct nl80211_state *state, 495*2ee67178SXianjun Jiao struct nl_cb *cb, 496*2ee67178SXianjun Jiao struct nl_msg *msg, 497*2ee67178SXianjun Jiao int argc, char **argv, 498*2ee67178SXianjun Jiao enum id_input id) 499*2ee67178SXianjun Jiao { 500*2ee67178SXianjun Jiao struct nlattr *tmdata; 501*2ee67178SXianjun Jiao char *end; 502*2ee67178SXianjun Jiao unsigned int tmp; 503*2ee67178SXianjun Jiao 504*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 505*2ee67178SXianjun Jiao if (!tmdata) { 506*2ee67178SXianjun Jiao return 1; 507*2ee67178SXianjun Jiao } 508*2ee67178SXianjun Jiao 509*2ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 510*2ee67178SXianjun Jiao 511*2ee67178SXianjun Jiao if (*end) { 512*2ee67178SXianjun Jiao return 1; 513*2ee67178SXianjun Jiao } 514*2ee67178SXianjun Jiao 515*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_START1); 516*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_START1, tmp); 517*2ee67178SXianjun Jiao 518*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 519*2ee67178SXianjun Jiao 520*2ee67178SXianjun Jiao printf("openwifi slice_start1 (duration): %dus\n", tmp); 521*2ee67178SXianjun Jiao 522*2ee67178SXianjun Jiao return 0; 523*2ee67178SXianjun Jiao 524*2ee67178SXianjun Jiao nla_put_failure: 525*2ee67178SXianjun Jiao return -ENOBUFS; 526*2ee67178SXianjun Jiao } 527*2ee67178SXianjun Jiao COMMAND(set, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_start1, "set slice_start1"); 528*2ee67178SXianjun Jiao 529*2ee67178SXianjun Jiao static int handle_get_slice_start1(struct nl80211_state *state, 530*2ee67178SXianjun Jiao struct nl_cb *cb, 531*2ee67178SXianjun Jiao struct nl_msg *msg, 532*2ee67178SXianjun Jiao int argc, char **argv, 533*2ee67178SXianjun Jiao enum id_input id) 534*2ee67178SXianjun Jiao { 535*2ee67178SXianjun Jiao struct nlattr *tmdata; 536*2ee67178SXianjun Jiao 537*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 538*2ee67178SXianjun Jiao if (!tmdata) 539*2ee67178SXianjun Jiao return 1; 540*2ee67178SXianjun Jiao 541*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_START1); 542*2ee67178SXianjun Jiao 543*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 544*2ee67178SXianjun Jiao 545*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_start1_handler, NULL); 546*2ee67178SXianjun Jiao return 0; 547*2ee67178SXianjun Jiao 548*2ee67178SXianjun Jiao nla_put_failure: 549*2ee67178SXianjun Jiao return -ENOBUFS; 550*2ee67178SXianjun Jiao } 551*2ee67178SXianjun Jiao COMMAND(get, slice_start1, "<slice_start1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_start1, "get slice_start1"); 552*2ee67178SXianjun Jiao 553*2ee67178SXianjun Jiao 554*2ee67178SXianjun Jiao static int cb_openwifi_slice_end0_handler(struct nl_msg *msg, void *arg) 555*2ee67178SXianjun Jiao { 556*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 557*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 558*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 559*2ee67178SXianjun Jiao 560*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 561*2ee67178SXianjun Jiao 562*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 563*2ee67178SXianjun Jiao return NL_SKIP; 564*2ee67178SXianjun Jiao 565*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 566*2ee67178SXianjun Jiao 567*2ee67178SXianjun Jiao printf("openwifi slice_end0 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END0])); 568*2ee67178SXianjun Jiao 569*2ee67178SXianjun Jiao return NL_SKIP; 570*2ee67178SXianjun Jiao } 571*2ee67178SXianjun Jiao 572*2ee67178SXianjun Jiao static int handle_set_slice_end0(struct nl80211_state *state, 573*2ee67178SXianjun Jiao struct nl_cb *cb, 574*2ee67178SXianjun Jiao struct nl_msg *msg, 575*2ee67178SXianjun Jiao int argc, char **argv, 576*2ee67178SXianjun Jiao enum id_input id) 577*2ee67178SXianjun Jiao { 578*2ee67178SXianjun Jiao struct nlattr *tmdata; 579*2ee67178SXianjun Jiao char *end; 580*2ee67178SXianjun Jiao unsigned int tmp; 581*2ee67178SXianjun Jiao 582*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 583*2ee67178SXianjun Jiao if (!tmdata) { 584*2ee67178SXianjun Jiao return 1; 585*2ee67178SXianjun Jiao } 586*2ee67178SXianjun Jiao 587*2ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 588*2ee67178SXianjun Jiao 589*2ee67178SXianjun Jiao if (*end) { 590*2ee67178SXianjun Jiao return 1; 591*2ee67178SXianjun Jiao } 592*2ee67178SXianjun Jiao 593*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END0); 594*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END0, tmp); 595*2ee67178SXianjun Jiao 596*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 597*2ee67178SXianjun Jiao 598*2ee67178SXianjun Jiao printf("openwifi slice_end0 (duration): %dus\n", tmp); 599*2ee67178SXianjun Jiao 600*2ee67178SXianjun Jiao return 0; 601*2ee67178SXianjun Jiao 602*2ee67178SXianjun Jiao nla_put_failure: 603*2ee67178SXianjun Jiao return -ENOBUFS; 604*2ee67178SXianjun Jiao } 605*2ee67178SXianjun Jiao COMMAND(set, slice_end0, "<slice_end0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end0, "set slice_end0"); 606*2ee67178SXianjun Jiao 607*2ee67178SXianjun Jiao static int handle_get_slice_end0(struct nl80211_state *state, 608*2ee67178SXianjun Jiao struct nl_cb *cb, 609*2ee67178SXianjun Jiao struct nl_msg *msg, 610*2ee67178SXianjun Jiao int argc, char **argv, 611*2ee67178SXianjun Jiao enum id_input id) 612*2ee67178SXianjun Jiao { 613*2ee67178SXianjun Jiao struct nlattr *tmdata; 614*2ee67178SXianjun Jiao 615*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 616*2ee67178SXianjun Jiao if (!tmdata) 617*2ee67178SXianjun Jiao return 1; 618*2ee67178SXianjun Jiao 619*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END0); 620*2ee67178SXianjun Jiao 621*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 622*2ee67178SXianjun Jiao 623*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end0_handler, NULL); 624*2ee67178SXianjun Jiao return 0; 625*2ee67178SXianjun Jiao 626*2ee67178SXianjun Jiao nla_put_failure: 627*2ee67178SXianjun Jiao return -ENOBUFS; 628*2ee67178SXianjun Jiao } 629*2ee67178SXianjun Jiao COMMAND(get, slice_end0, "<slice_end0(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end0, "get slice_end0"); 630*2ee67178SXianjun Jiao 631*2ee67178SXianjun Jiao 632*2ee67178SXianjun Jiao static int cb_openwifi_slice_end1_handler(struct nl_msg *msg, void *arg) 633*2ee67178SXianjun Jiao { 634*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 635*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 636*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 637*2ee67178SXianjun Jiao 638*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 639*2ee67178SXianjun Jiao 640*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 641*2ee67178SXianjun Jiao return NL_SKIP; 642*2ee67178SXianjun Jiao 643*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 644*2ee67178SXianjun Jiao 645*2ee67178SXianjun Jiao printf("openwifi slice_end1 (duration): %dus\n", nla_get_u32(tb[OPENWIFI_ATTR_SLICE_END1])); 646*2ee67178SXianjun Jiao 647*2ee67178SXianjun Jiao return NL_SKIP; 648*2ee67178SXianjun Jiao } 649*2ee67178SXianjun Jiao 650*2ee67178SXianjun Jiao static int handle_set_slice_end1(struct nl80211_state *state, 651*2ee67178SXianjun Jiao struct nl_cb *cb, 652*2ee67178SXianjun Jiao struct nl_msg *msg, 653*2ee67178SXianjun Jiao int argc, char **argv, 654*2ee67178SXianjun Jiao enum id_input id) 655*2ee67178SXianjun Jiao { 656*2ee67178SXianjun Jiao struct nlattr *tmdata; 657*2ee67178SXianjun Jiao char *end; 658*2ee67178SXianjun Jiao unsigned int tmp; 659*2ee67178SXianjun Jiao 660*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 661*2ee67178SXianjun Jiao if (!tmdata) { 662*2ee67178SXianjun Jiao return 1; 663*2ee67178SXianjun Jiao } 664*2ee67178SXianjun Jiao 665*2ee67178SXianjun Jiao tmp = strtoul(argv[0], &end, 10); 666*2ee67178SXianjun Jiao 667*2ee67178SXianjun Jiao if (*end) { 668*2ee67178SXianjun Jiao return 1; 669*2ee67178SXianjun Jiao } 670*2ee67178SXianjun Jiao 671*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_SLICE_END1); 672*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_SLICE_END1, tmp); 673*2ee67178SXianjun Jiao 674*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 675*2ee67178SXianjun Jiao 676*2ee67178SXianjun Jiao printf("openwifi slice_end1 (duration): %dus\n", tmp); 677*2ee67178SXianjun Jiao 678*2ee67178SXianjun Jiao return 0; 679*2ee67178SXianjun Jiao 680*2ee67178SXianjun Jiao nla_put_failure: 681*2ee67178SXianjun Jiao return -ENOBUFS; 682*2ee67178SXianjun Jiao } 683*2ee67178SXianjun Jiao COMMAND(set, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_slice_end1, "set slice_end1"); 684*2ee67178SXianjun Jiao 685*2ee67178SXianjun Jiao static int handle_get_slice_end1(struct nl80211_state *state, 686*2ee67178SXianjun Jiao struct nl_cb *cb, 687*2ee67178SXianjun Jiao struct nl_msg *msg, 688*2ee67178SXianjun Jiao int argc, char **argv, 689*2ee67178SXianjun Jiao enum id_input id) 690*2ee67178SXianjun Jiao { 691*2ee67178SXianjun Jiao struct nlattr *tmdata; 692*2ee67178SXianjun Jiao 693*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 694*2ee67178SXianjun Jiao if (!tmdata) 695*2ee67178SXianjun Jiao return 1; 696*2ee67178SXianjun Jiao 697*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_SLICE_END1); 698*2ee67178SXianjun Jiao 699*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 700*2ee67178SXianjun Jiao 701*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice_end1_handler, NULL); 702*2ee67178SXianjun Jiao return 0; 703*2ee67178SXianjun Jiao 704*2ee67178SXianjun Jiao nla_put_failure: 705*2ee67178SXianjun Jiao return -ENOBUFS; 706*2ee67178SXianjun Jiao } 707*2ee67178SXianjun Jiao COMMAND(get, slice_end1, "<slice_end1(duration) in us>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_slice_end1, "get slice_end1"); 708*2ee67178SXianjun Jiao 709*2ee67178SXianjun Jiao 710*2ee67178SXianjun Jiao static int cb_openwifi_slice0_target_mac_addr_handler(struct nl_msg *msg, void *arg) 711*2ee67178SXianjun Jiao { 712*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 713*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 714*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 715*2ee67178SXianjun Jiao 716*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 717*2ee67178SXianjun Jiao 718*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 719*2ee67178SXianjun Jiao return NL_SKIP; 720*2ee67178SXianjun Jiao 721*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 722*2ee67178SXianjun Jiao 723*2ee67178SXianjun Jiao printf("openwifi slice0_target_mac_addr(low32) in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_ADDR0])); 724*2ee67178SXianjun Jiao 725*2ee67178SXianjun Jiao return NL_SKIP; 726*2ee67178SXianjun Jiao } 727*2ee67178SXianjun Jiao 728*2ee67178SXianjun Jiao static int handle_set_addr0(struct nl80211_state *state, 729*2ee67178SXianjun Jiao struct nl_cb *cb, 730*2ee67178SXianjun Jiao struct nl_msg *msg, 731*2ee67178SXianjun Jiao int argc, char **argv, 732*2ee67178SXianjun Jiao enum id_input id) 733*2ee67178SXianjun Jiao { 734*2ee67178SXianjun Jiao struct nlattr *tmdata; 735*2ee67178SXianjun Jiao char *end; 736*2ee67178SXianjun Jiao unsigned int slice0_target_mac_addr; 737*2ee67178SXianjun Jiao 738*2ee67178SXianjun Jiao //printf("handle_set_slice0_target_mac_addr\n"); 739*2ee67178SXianjun Jiao 740*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 741*2ee67178SXianjun Jiao if (!tmdata) { 742*2ee67178SXianjun Jiao //printf("handle_set_slice0_target_mac_addr 1\n"); 743*2ee67178SXianjun Jiao return 1; 744*2ee67178SXianjun Jiao } 745*2ee67178SXianjun Jiao 746*2ee67178SXianjun Jiao slice0_target_mac_addr = strtoul(argv[0], &end, 16); 747*2ee67178SXianjun Jiao 748*2ee67178SXianjun Jiao if (*end) { 749*2ee67178SXianjun Jiao //printf("handle_set_slice0_target_mac_addr 2 %d\n", slice0_target_mac_addr); 750*2ee67178SXianjun Jiao return 1; 751*2ee67178SXianjun Jiao } 752*2ee67178SXianjun Jiao 753*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_ADDR0); 754*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_ADDR0, slice0_target_mac_addr); 755*2ee67178SXianjun Jiao 756*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 757*2ee67178SXianjun Jiao 758*2ee67178SXianjun Jiao printf("openwifi slice0_target_mac_addr(low32) in hex: %08x\n", slice0_target_mac_addr); 759*2ee67178SXianjun Jiao 760*2ee67178SXianjun Jiao return 0; 761*2ee67178SXianjun Jiao 762*2ee67178SXianjun Jiao nla_put_failure: 763*2ee67178SXianjun Jiao return -ENOBUFS; 764*2ee67178SXianjun Jiao } 765*2ee67178SXianjun Jiao COMMAND(set, addr0, "<slice0_target_mac_addr(low32) in hex>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_addr0, "set addr0"); 766*2ee67178SXianjun Jiao 767*2ee67178SXianjun Jiao static int handle_get_slice0_target_mac_addr(struct nl80211_state *state, 768*2ee67178SXianjun Jiao struct nl_cb *cb, 769*2ee67178SXianjun Jiao struct nl_msg *msg, 770*2ee67178SXianjun Jiao int argc, char **argv, 771*2ee67178SXianjun Jiao enum id_input id) 772*2ee67178SXianjun Jiao { 773*2ee67178SXianjun Jiao struct nlattr *tmdata; 774*2ee67178SXianjun Jiao 775*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 776*2ee67178SXianjun Jiao if (!tmdata) 777*2ee67178SXianjun Jiao return 1; 778*2ee67178SXianjun Jiao 779*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_ADDR0); 780*2ee67178SXianjun Jiao 781*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 782*2ee67178SXianjun Jiao 783*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice0_target_mac_addr_handler, NULL); 784*2ee67178SXianjun Jiao return 0; 785*2ee67178SXianjun Jiao 786*2ee67178SXianjun Jiao nla_put_failure: 787*2ee67178SXianjun Jiao return -ENOBUFS; 788*2ee67178SXianjun Jiao } 789*2ee67178SXianjun 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"); 790*2ee67178SXianjun Jiao 791*2ee67178SXianjun Jiao static int cb_openwifi_slice1_target_mac_addr_handler(struct nl_msg *msg, void *arg) 792*2ee67178SXianjun Jiao { 793*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 794*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 795*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 796*2ee67178SXianjun Jiao 797*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 798*2ee67178SXianjun Jiao 799*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 800*2ee67178SXianjun Jiao return NL_SKIP; 801*2ee67178SXianjun Jiao 802*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 803*2ee67178SXianjun Jiao 804*2ee67178SXianjun Jiao printf("openwifi slice1_target_mac_addr(low32) in hex: %08x\n", nla_get_u32(tb[OPENWIFI_ATTR_ADDR1])); 805*2ee67178SXianjun Jiao 806*2ee67178SXianjun Jiao return NL_SKIP; 807*2ee67178SXianjun Jiao } 808*2ee67178SXianjun Jiao 809*2ee67178SXianjun Jiao static int handle_set_slice1_target_mac_addr(struct nl80211_state *state, 810*2ee67178SXianjun Jiao struct nl_cb *cb, 811*2ee67178SXianjun Jiao struct nl_msg *msg, 812*2ee67178SXianjun Jiao int argc, char **argv, 813*2ee67178SXianjun Jiao enum id_input id) 814*2ee67178SXianjun Jiao { 815*2ee67178SXianjun Jiao struct nlattr *tmdata; 816*2ee67178SXianjun Jiao char *end; 817*2ee67178SXianjun Jiao unsigned int slice1_target_mac_addr; 818*2ee67178SXianjun Jiao 819*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 820*2ee67178SXianjun Jiao if (!tmdata) 821*2ee67178SXianjun Jiao return 1; 822*2ee67178SXianjun Jiao 823*2ee67178SXianjun Jiao slice1_target_mac_addr = strtoul(argv[0], &end, 16); 824*2ee67178SXianjun Jiao 825*2ee67178SXianjun Jiao if (*end) 826*2ee67178SXianjun Jiao return 1; 827*2ee67178SXianjun Jiao 828*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_ADDR1); 829*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_ADDR1, slice1_target_mac_addr); 830*2ee67178SXianjun Jiao 831*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 832*2ee67178SXianjun Jiao 833*2ee67178SXianjun Jiao printf("openwifi slice1_target_mac_addr(low32) in hex: %08x\n", slice1_target_mac_addr); 834*2ee67178SXianjun Jiao 835*2ee67178SXianjun Jiao return 0; 836*2ee67178SXianjun Jiao 837*2ee67178SXianjun Jiao nla_put_failure: 838*2ee67178SXianjun Jiao return -ENOBUFS; 839*2ee67178SXianjun Jiao } 840*2ee67178SXianjun 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"); 841*2ee67178SXianjun Jiao 842*2ee67178SXianjun Jiao static int handle_get_slice1_target_mac_addr(struct nl80211_state *state, 843*2ee67178SXianjun Jiao struct nl_cb *cb, 844*2ee67178SXianjun Jiao struct nl_msg *msg, 845*2ee67178SXianjun Jiao int argc, char **argv, 846*2ee67178SXianjun Jiao enum id_input id) 847*2ee67178SXianjun Jiao { 848*2ee67178SXianjun Jiao struct nlattr *tmdata; 849*2ee67178SXianjun Jiao 850*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 851*2ee67178SXianjun Jiao if (!tmdata) 852*2ee67178SXianjun Jiao return 1; 853*2ee67178SXianjun Jiao 854*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_ADDR1); 855*2ee67178SXianjun Jiao 856*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 857*2ee67178SXianjun Jiao 858*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_slice1_target_mac_addr_handler, NULL); 859*2ee67178SXianjun Jiao return 0; 860*2ee67178SXianjun Jiao 861*2ee67178SXianjun Jiao nla_put_failure: 862*2ee67178SXianjun Jiao return -ENOBUFS; 863*2ee67178SXianjun Jiao } 864*2ee67178SXianjun 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"); 865*2ee67178SXianjun Jiao 866*2ee67178SXianjun Jiao static int cb_openwifi_gap_handler(struct nl_msg *msg, void *arg) 867*2ee67178SXianjun Jiao { 868*2ee67178SXianjun Jiao struct nlattr *attrs[NL80211_ATTR_MAX + 1]; 869*2ee67178SXianjun Jiao struct nlattr *tb[OPENWIFI_ATTR_MAX + 1]; 870*2ee67178SXianjun Jiao struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); 871*2ee67178SXianjun Jiao 872*2ee67178SXianjun Jiao nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 873*2ee67178SXianjun Jiao 874*2ee67178SXianjun Jiao if (!attrs[NL80211_ATTR_TESTDATA]) 875*2ee67178SXianjun Jiao return NL_SKIP; 876*2ee67178SXianjun Jiao 877*2ee67178SXianjun Jiao nla_parse(tb, OPENWIFI_ATTR_MAX, nla_data(attrs[NL80211_ATTR_TESTDATA]), nla_len(attrs[NL80211_ATTR_TESTDATA]), NULL); 878*2ee67178SXianjun Jiao 879*2ee67178SXianjun Jiao printf("openwifi GAP (usec): %d\n", nla_get_u32(tb[OPENWIFI_ATTR_GAP])); 880*2ee67178SXianjun Jiao 881*2ee67178SXianjun Jiao return NL_SKIP; 882*2ee67178SXianjun Jiao } 883*2ee67178SXianjun Jiao 884*2ee67178SXianjun Jiao static int handle_set_gap(struct nl80211_state *state, 885*2ee67178SXianjun Jiao struct nl_cb *cb, 886*2ee67178SXianjun Jiao struct nl_msg *msg, 887*2ee67178SXianjun Jiao int argc, char **argv, 888*2ee67178SXianjun Jiao enum id_input id) 889*2ee67178SXianjun Jiao { 890*2ee67178SXianjun Jiao struct nlattr *tmdata; 891*2ee67178SXianjun Jiao char *end; 892*2ee67178SXianjun Jiao unsigned int gap_us; 893*2ee67178SXianjun Jiao 894*2ee67178SXianjun Jiao //printf("handle_set_gap\n"); 895*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 896*2ee67178SXianjun Jiao if (!tmdata) 897*2ee67178SXianjun Jiao return 1; 898*2ee67178SXianjun Jiao 899*2ee67178SXianjun Jiao gap_us = strtoul(argv[0], &end, 10); 900*2ee67178SXianjun Jiao 901*2ee67178SXianjun Jiao if (*end) 902*2ee67178SXianjun Jiao return 1; 903*2ee67178SXianjun Jiao 904*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_SET_GAP); 905*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_GAP, gap_us); 906*2ee67178SXianjun Jiao 907*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 908*2ee67178SXianjun Jiao return 0; 909*2ee67178SXianjun Jiao 910*2ee67178SXianjun Jiao nla_put_failure: 911*2ee67178SXianjun Jiao return -ENOBUFS; 912*2ee67178SXianjun Jiao } 913*2ee67178SXianjun Jiao COMMAND(set, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_gap, "set inter frame gap of openwifi radio"); 914*2ee67178SXianjun Jiao 915*2ee67178SXianjun Jiao static int handle_get_gap(struct nl80211_state *state, 916*2ee67178SXianjun Jiao struct nl_cb *cb, 917*2ee67178SXianjun Jiao struct nl_msg *msg, 918*2ee67178SXianjun Jiao int argc, char **argv, 919*2ee67178SXianjun Jiao enum id_input id) 920*2ee67178SXianjun Jiao { 921*2ee67178SXianjun Jiao struct nlattr *tmdata; 922*2ee67178SXianjun Jiao 923*2ee67178SXianjun Jiao tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 924*2ee67178SXianjun Jiao if (!tmdata) 925*2ee67178SXianjun Jiao return 1; 926*2ee67178SXianjun Jiao 927*2ee67178SXianjun Jiao NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, OPENWIFI_CMD_GET_GAP); 928*2ee67178SXianjun Jiao 929*2ee67178SXianjun Jiao nla_nest_end(msg, tmdata); 930*2ee67178SXianjun Jiao 931*2ee67178SXianjun Jiao nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_openwifi_gap_handler, NULL); 932*2ee67178SXianjun Jiao return 0; 933*2ee67178SXianjun Jiao 934*2ee67178SXianjun Jiao nla_put_failure: 935*2ee67178SXianjun Jiao return -ENOBUFS; 936*2ee67178SXianjun Jiao } 937*2ee67178SXianjun Jiao COMMAND(get, gap, "<gap in usec>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_get_gap, "get inter frame gap of openwifi radio"); 938