net: wifi: shell: enhance twt parse parameters code
Enhance the parse parameters code for twt. Signed-off-by: Rex Chen <rex.chen_1@nxp.com>
This commit is contained in:
parent
5d7df3aa3e
commit
f9a96f3503
1 changed files with 137 additions and 65 deletions
|
@ -1572,74 +1572,139 @@ static int cmd_wifi_twt_setup_quick(const struct shell *sh, size_t argc,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int twt_args_to_params(const struct shell *sh, size_t argc, char *argv[],
|
||||
struct wifi_twt_params *params)
|
||||
{
|
||||
int opt;
|
||||
int opt_index = 0;
|
||||
struct getopt_state *state;
|
||||
long value;
|
||||
static const struct option long_options[] = {
|
||||
{"negotiation-type", required_argument, 0, 'n'},
|
||||
{"setup-cmd", required_argument, 0, 'c'},
|
||||
{"dialog-token", required_argument, 0, 't'},
|
||||
{"flow-id", required_argument, 0, 'f'},
|
||||
{"responder", required_argument, 0, 'r'},
|
||||
{"trigger", required_argument, 0, 'T'},
|
||||
{"implicit", required_argument, 0, 'I'},
|
||||
{"announce", required_argument, 0, 'a'},
|
||||
{"wake-interval", required_argument, 0, 'w'},
|
||||
{"interval", required_argument, 0, 'i'},
|
||||
{"wake-ahead-duration", required_argument, 0, 'D'},
|
||||
{"help", no_argument, 0, 'h'},
|
||||
{0, 0, 0, 0}};
|
||||
|
||||
params->operation = WIFI_TWT_SETUP;
|
||||
|
||||
while ((opt = getopt_long(argc, argv, "n:c:t:f:r:T:I:a:t:w:i:D:d:e:h",
|
||||
long_options, &opt_index)) != -1) {
|
||||
state = getopt_state_get();
|
||||
switch (opt) {
|
||||
case 'n':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL,
|
||||
WIFI_TWT_INDIVIDUAL,
|
||||
WIFI_TWT_WAKE_TBTT)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->negotiation_type = (enum wifi_twt_negotiation_type)value;
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL,
|
||||
WIFI_TWT_SETUP_CMD_REQUEST,
|
||||
WIFI_TWT_SETUP_CMD_DEMAND)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->setup_cmd = (enum wifi_twt_setup_cmd)value;
|
||||
break;
|
||||
|
||||
case 't':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL, 1, 255)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->dialog_token = (uint8_t)value;
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL, 0,
|
||||
(WIFI_MAX_TWT_FLOWS - 1))) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->flow_id = (uint8_t)value;
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL, 0, 1)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->setup.responder = (bool)value;
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL, 0, 1)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->setup.trigger = (bool)value;
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL, 0, 1)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->setup.implicit = (bool)value;
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL, 0, 1)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->setup.announce = (bool)value;
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL, 1,
|
||||
WIFI_MAX_TWT_WAKE_INTERVAL_US)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->setup.twt_wake_interval = (uint32_t)value;
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL, 1,
|
||||
WIFI_MAX_TWT_INTERVAL_US)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->setup.twt_interval = (uint64_t)value;
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
if (!parse_number(sh, &value, state->optarg, NULL, 0,
|
||||
WIFI_MAX_TWT_WAKE_AHEAD_DURATION_US)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params->setup.twt_wake_ahead_duration = (uint32_t)value;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
return -ENOEXEC;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cmd_wifi_twt_setup(const struct shell *sh, size_t argc,
|
||||
char *argv[])
|
||||
{
|
||||
struct net_if *iface = net_if_get_wifi_sta();
|
||||
struct wifi_twt_params params = { 0 };
|
||||
int idx = 1;
|
||||
long value;
|
||||
|
||||
context.sh = sh;
|
||||
|
||||
params.operation = WIFI_TWT_SETUP;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, WIFI_TWT_INDIVIDUAL,
|
||||
WIFI_TWT_WAKE_TBTT)) {
|
||||
return -EINVAL;
|
||||
if (twt_args_to_params(sh, argc, argv, ¶ms)) {
|
||||
shell_help(sh);
|
||||
return -ENOEXEC;
|
||||
}
|
||||
params.negotiation_type = (enum wifi_twt_negotiation_type)value;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, WIFI_TWT_SETUP_CMD_REQUEST,
|
||||
WIFI_TWT_SETUP_CMD_DEMAND)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params.setup_cmd = (enum wifi_twt_setup_cmd)value;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, 1, 255)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params.dialog_token = (uint8_t)value;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, 0, (WIFI_MAX_TWT_FLOWS - 1))) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params.flow_id = (uint8_t)value;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, 0, 1)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params.setup.responder = (bool)value;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, 0, 1)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params.setup.trigger = (bool)value;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, 0, 1)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params.setup.implicit = (bool)value;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, 0, 1)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params.setup.announce = (bool)value;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, 1, WIFI_MAX_TWT_WAKE_INTERVAL_US)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params.setup.twt_wake_interval = (uint32_t)value;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, 1, WIFI_MAX_TWT_INTERVAL_US)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params.setup.twt_interval = (uint64_t)value;
|
||||
|
||||
if (!parse_number(sh, &value, argv[idx++], NULL, 0, WIFI_MAX_TWT_WAKE_AHEAD_DURATION_US)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
params.setup.twt_wake_ahead_duration = (uint32_t)value;
|
||||
|
||||
if (net_mgmt(NET_REQUEST_WIFI_TWT, iface, ¶ms, sizeof(params))) {
|
||||
PR_WARNING("%s with %s failed. reason : %s\n",
|
||||
|
@ -3265,13 +3330,20 @@ SHELL_STATIC_SUBCMD_SET_CREATE(wifi_twt_ops,
|
|||
cmd_wifi_twt_setup_quick,
|
||||
3, 0),
|
||||
SHELL_CMD_ARG(setup, NULL, " Start a TWT flow:\n"
|
||||
"<negotiation_type, 0: Individual, 1: Broadcast, 2: Wake TBTT>\n"
|
||||
"<setup_cmd: 0: Request, 1: Suggest, 2: Demand>\n"
|
||||
"<dialog_token: 1-255> <flow_id: 0-7> <responder: 0/1> <trigger: 0/1> <implicit:0/1> "
|
||||
"<announce: 0/1> <twt_wake_interval: 1-262144us> <twt_interval: 1us-2^31us>.\n"
|
||||
"<twt_wake_ahead_duration>: 0us-2^31us>\n",
|
||||
"<-n --negotiation-type>: 0: Individual, 1: Broadcast, 2: Wake TBTT\n"
|
||||
"<-c --setup-cmd>: 0: Request, 1: Suggest, 2: Demand\n"
|
||||
"<-t --dialog-token>: 1-255\n"
|
||||
"<-f --flow-id>: 0-7\n"
|
||||
"<-r --responder>: 0/1\n"
|
||||
"<-T --trigger>: 0/1\n"
|
||||
"<-I --implicit>:0/1\n"
|
||||
"<-a --announce>: 0/1\n"
|
||||
"<-w --wake-interval>: 1-262144us\n"
|
||||
"<-i --interval>: 1us-2^31us\n"
|
||||
"<-D --wake-ahead-duration>: 0us-2^31us\n"
|
||||
"[-h, --help]: Print out command usage.\n",
|
||||
cmd_wifi_twt_setup,
|
||||
12, 0),
|
||||
23, 1),
|
||||
SHELL_CMD_ARG(teardown, NULL, " Teardown a TWT flow:\n"
|
||||
"<negotiation_type, 0: Individual, 1: Broadcast, 2: Wake TBTT>\n"
|
||||
"<setup_cmd: 0: Request, 1: Suggest, 2: Demand>\n"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue