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:
Rex Chen 2024-11-29 15:41:56 +09:00 committed by Benjamin Cabé
commit f9a96f3503

View file

@ -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, &params)) {
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, &params, 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"