@@ -3555,6 +3555,113 @@ static int cmd_wifi_set_bss_max_idle_period(const struct shell *sh, size_t argc,
35553555 return 0 ;
35563556}
35573557
3558+ #ifdef CONFIG_WIFI_NM_WPA_SUPPLICANT_BGSCAN
3559+ static int wifi_bgscan_args_to_params (const struct shell * sh , size_t argc , char * argv [],
3560+ struct wifi_bgscan_params * params )
3561+ {
3562+ int err ;
3563+ int opt ;
3564+ int opt_index = 0 ;
3565+ struct getopt_state * state ;
3566+ static const struct option long_options [] = {
3567+ {"type" , required_argument , 0 , 't' },
3568+ {"short-interval" , required_argument , 0 , 's' },
3569+ {"rss-threshold" , required_argument , 0 , 'r' },
3570+ {"long-interval" , required_argument , 0 , 'l' },
3571+ {"btm-queries" , required_argument , 0 , 'b' },
3572+ {"iface" , required_argument , 0 , 'i' },
3573+ {0 , 0 , 0 , 0 }};
3574+ unsigned long uval ;
3575+ long val ;
3576+
3577+ while ((opt = getopt_long (argc , argv , "t:s:r:l:b:i:" , long_options , & opt_index )) != -1 ) {
3578+ state = getopt_state_get ();
3579+ switch (opt ) {
3580+ case 't' :
3581+ if (strcmp ("simple" , state -> optarg ) == 0 ) {
3582+ params -> type = WIFI_BGSCAN_SIMPLE ;
3583+ } else if (strcmp ("learn" , state -> optarg ) == 0 ) {
3584+ params -> type = WIFI_BGSCAN_LEARN ;
3585+ } else if (strcmp ("none" , state -> optarg ) == 0 ) {
3586+ params -> type = WIFI_BGSCAN_NONE ;
3587+ } else {
3588+ PR_ERROR ("Invalid type %s\n" , state -> optarg );
3589+ shell_help (sh );
3590+ return SHELL_CMD_HELP_PRINTED ;
3591+ }
3592+ break ;
3593+ case 's' :
3594+ uval = shell_strtoul (state -> optarg , 10 , & err );
3595+ if (err < 0 ) {
3596+ PR_ERROR ("Invalid short interval %s\n" , state -> optarg );
3597+ return err ;
3598+ }
3599+ params -> short_interval = uval ;
3600+ break ;
3601+ case 'l' :
3602+ uval = shell_strtoul (state -> optarg , 10 , & err );
3603+ if (err < 0 ) {
3604+ PR_ERROR ("Invalid long interval %s\n" , state -> optarg );
3605+ return err ;
3606+ }
3607+ params -> long_interval = uval ;
3608+ break ;
3609+ case 'b' :
3610+ uval = shell_strtoul (state -> optarg , 10 , & err );
3611+ if (err < 0 ) {
3612+ PR_ERROR ("Invalid BTM queries %s\n" , state -> optarg );
3613+ return err ;
3614+ }
3615+ params -> btm_queries = uval ;
3616+ break ;
3617+ case 'r' :
3618+ val = shell_strtol (state -> optarg , 10 , & err );
3619+ if (err < 0 ) {
3620+ PR_ERROR ("Invalid RSSI threshold %s\n" , state -> optarg );
3621+ return err ;
3622+ }
3623+ params -> rssi_threshold = val ;
3624+ break ;
3625+ case 'i' :
3626+ /* Unused, but parsing to avoid unknown option error */
3627+ break ;
3628+ default :
3629+ PR_ERROR ("Invalid option %c\n" , state -> optopt );
3630+ shell_help (sh );
3631+ return SHELL_CMD_HELP_PRINTED ;
3632+ }
3633+ }
3634+
3635+ return 0 ;
3636+ }
3637+
3638+ static int cmd_wifi_set_bgscan (const struct shell * sh , size_t argc , char * argv [])
3639+ {
3640+ struct net_if * iface = get_iface (IFACE_TYPE_STA , argc , argv );
3641+ struct wifi_bgscan_params bgscan_params = {
3642+ .type = WIFI_BGSCAN_NONE ,
3643+ .short_interval = 30 ,
3644+ .long_interval = 300 ,
3645+ .rssi_threshold = 0 ,
3646+ .btm_queries = 0 ,
3647+ };
3648+ int ret ;
3649+
3650+ if (wifi_bgscan_args_to_params (sh , argc , argv , & bgscan_params ) != 0 ) {
3651+ return - ENOEXEC ;
3652+ }
3653+
3654+ ret = net_mgmt (NET_REQUEST_WIFI_BGSCAN , iface , & bgscan_params ,
3655+ sizeof (struct wifi_bgscan_params ));
3656+ if (ret != 0 ) {
3657+ PR_WARNING ("Setting background scanning parameters failed: %s\n" , strerror (- ret ));
3658+ return - ENOEXEC ;
3659+ }
3660+
3661+ return 0 ;
3662+ }
3663+ #endif
3664+
35583665static int wifi_config_args_to_params (const struct shell * sh , size_t argc , char * argv [],
35593666 struct wifi_config_params * params )
35603667{
@@ -4098,6 +4205,19 @@ SHELL_SUBCMD_ADD((wifi), bss_max_idle_period, NULL,
40984205 cmd_wifi_set_bss_max_idle_period ,
40994206 2 , 2 );
41004207
4208+ #ifdef CONFIG_WIFI_NM_WPA_SUPPLICANT_BGSCAN
4209+ SHELL_SUBCMD_ADD ((wifi ), bgscan , NULL ,
4210+ "Configure background scanning.\n"
4211+ "<-t, --type simple/learn/none> : The scanning type, use none to disable.\n"
4212+ "[-s, --short-interval <val>] : Short scan interval (default: 30).\n"
4213+ "[-l, --long-interval <val>] : Long scan interval (default: 300).\n"
4214+ "[-r, --rssi-threshold <val>] : Signal strength threshold (default: disabled).\n"
4215+ "[-b, --btm-queries <val>] : BTM queries before scanning (default: disabled).\n"
4216+ "[-i, --iface=<interface index>] : Interface index.\n" ,
4217+ cmd_wifi_set_bgscan ,
4218+ 2 , 6 );
4219+ #endif /* CONFIG_WIFI_NM_WPA_SUPPLICANT_BGSCAN */
4220+
41014221SHELL_SUBCMD_ADD ((wifi ), config , NULL ,
41024222 "Configure STA parameters.\n"
41034223 "-o, --okc=<0/1>: Opportunistic Key Caching. 0: disable, 1: enable\n"
0 commit comments