Add capability flag for IBSS and add get_capability modes
Add a driver capability flag for drivers which support IBSS mode and set it for nl80211 drivers which have set the NL80211_IFTYPE_ADHOC. Add a new option "modes" to "get_capability" which will return "AP" and "IBSS" if the corresponding capability flags are set. The idea is that this can be used for UIs to find out if the driver supports IBSS mode. Signed-hostap: Bruno Randolf <br1@einfach.org>
This commit is contained in:
parent
ba873c1284
commit
65d52fc103
4 changed files with 50 additions and 1 deletions
|
@ -864,6 +864,8 @@ struct wpa_driver_capa {
|
||||||
#define WPA_DRIVER_FLAGS_SAE 0x02000000
|
#define WPA_DRIVER_FLAGS_SAE 0x02000000
|
||||||
/* Driver makes use of OBSS scan mechanism in wpa_supplicant */
|
/* Driver makes use of OBSS scan mechanism in wpa_supplicant */
|
||||||
#define WPA_DRIVER_FLAGS_OBSS_SCAN 0x04000000
|
#define WPA_DRIVER_FLAGS_OBSS_SCAN 0x04000000
|
||||||
|
/* Driver supports IBSS (Ad-hoc) mode */
|
||||||
|
#define WPA_DRIVER_FLAGS_IBSS 0x08000000
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
|
|
||||||
int max_scan_ssids;
|
int max_scan_ssids;
|
||||||
|
|
|
@ -2591,6 +2591,9 @@ static void wiphy_info_supported_iftypes(struct wiphy_info_data *info,
|
||||||
case NL80211_IFTYPE_AP:
|
case NL80211_IFTYPE_AP:
|
||||||
info->capa->flags |= WPA_DRIVER_FLAGS_AP;
|
info->capa->flags |= WPA_DRIVER_FLAGS_AP;
|
||||||
break;
|
break;
|
||||||
|
case NL80211_IFTYPE_ADHOC:
|
||||||
|
info->capa->flags |= WPA_DRIVER_FLAGS_IBSS;
|
||||||
|
break;
|
||||||
case NL80211_IFTYPE_P2P_GO:
|
case NL80211_IFTYPE_P2P_GO:
|
||||||
info->p2p_go_supported = 1;
|
info->p2p_go_supported = 1;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2850,6 +2850,46 @@ static int ctrl_iface_get_capability_auth_alg(int res, char *strict,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ctrl_iface_get_capability_modes(int res, char *strict,
|
||||||
|
struct wpa_driver_capa *capa,
|
||||||
|
char *buf, size_t buflen)
|
||||||
|
{
|
||||||
|
int ret, first = 1;
|
||||||
|
char *pos, *end;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
pos = buf;
|
||||||
|
end = pos + buflen;
|
||||||
|
|
||||||
|
if (res < 0) {
|
||||||
|
if (strict)
|
||||||
|
return 0;
|
||||||
|
len = os_strlcpy(buf, "IBSS AP", buflen);
|
||||||
|
if (len >= buflen)
|
||||||
|
return -1;
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (capa->flags & WPA_DRIVER_FLAGS_IBSS) {
|
||||||
|
ret = os_snprintf(pos, end - pos, "%sIBSS", first ? "" : " ");
|
||||||
|
if (ret < 0 || ret >= end - pos)
|
||||||
|
return pos - buf;
|
||||||
|
pos += ret;
|
||||||
|
first = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (capa->flags & WPA_DRIVER_FLAGS_AP) {
|
||||||
|
ret = os_snprintf(pos, end - pos, "%sAP", first ? "" : " ");
|
||||||
|
if (ret < 0 || ret >= end - pos)
|
||||||
|
return pos - buf;
|
||||||
|
pos += ret;
|
||||||
|
first = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos - buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int ctrl_iface_get_capability_channels(struct wpa_supplicant *wpa_s,
|
static int ctrl_iface_get_capability_channels(struct wpa_supplicant *wpa_s,
|
||||||
char *buf, size_t buflen)
|
char *buf, size_t buflen)
|
||||||
{
|
{
|
||||||
|
@ -2950,6 +2990,10 @@ static int wpa_supplicant_ctrl_iface_get_capability(
|
||||||
return ctrl_iface_get_capability_auth_alg(res, strict, &capa,
|
return ctrl_iface_get_capability_auth_alg(res, strict, &capa,
|
||||||
buf, buflen);
|
buf, buflen);
|
||||||
|
|
||||||
|
if (os_strcmp(field, "modes") == 0)
|
||||||
|
return ctrl_iface_get_capability_modes(res, strict, &capa,
|
||||||
|
buf, buflen);
|
||||||
|
|
||||||
if (os_strcmp(field, "channels") == 0)
|
if (os_strcmp(field, "channels") == 0)
|
||||||
return ctrl_iface_get_capability_channels(wpa_s, buf, buflen);
|
return ctrl_iface_get_capability_channels(wpa_s, buf, buflen);
|
||||||
|
|
||||||
|
|
|
@ -2439,7 +2439,7 @@ static struct wpa_cli_cmd wpa_cli_commands[] = {
|
||||||
"<<idx> | <bssid>> = get detailed scan result info" },
|
"<<idx> | <bssid>> = get detailed scan result info" },
|
||||||
{ "get_capability", wpa_cli_cmd_get_capability, NULL,
|
{ "get_capability", wpa_cli_cmd_get_capability, NULL,
|
||||||
cli_cmd_flag_none,
|
cli_cmd_flag_none,
|
||||||
"<eap/pairwise/group/key_mgmt/proto/auth_alg/channels> "
|
"<eap/pairwise/group/key_mgmt/proto/auth_alg/channels/modes> "
|
||||||
"= get capabilies" },
|
"= get capabilies" },
|
||||||
{ "reconfigure", wpa_cli_cmd_reconfigure, NULL,
|
{ "reconfigure", wpa_cli_cmd_reconfigure, NULL,
|
||||||
cli_cmd_flag_none,
|
cli_cmd_flag_none,
|
||||||
|
|
Loading…
Reference in a new issue