]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Add capability flag for IBSS and add get_capability modes
authorBruno Randolf <br1@einfach.org>
Sat, 16 Mar 2013 10:42:15 +0000 (12:42 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 16 Mar 2013 10:42:15 +0000 (12:42 +0200)
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>

src/drivers/driver.h
src/drivers/driver_nl80211.c
wpa_supplicant/ctrl_iface.c
wpa_supplicant/wpa_cli.c

index 1a53db329a98def9be84cfe21fada0ad6006e011..ab6907d9a1b6447ac7188ca03dd469062faf3671 100644 (file)
@@ -864,6 +864,8 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_SAE                           0x02000000
 /* Driver makes use of OBSS scan mechanism in wpa_supplicant */
 #define WPA_DRIVER_FLAGS_OBSS_SCAN                     0x04000000
+/* Driver supports IBSS (Ad-hoc) mode */
+#define WPA_DRIVER_FLAGS_IBSS                          0x08000000
        unsigned int flags;
 
        int max_scan_ssids;
index 100434db66dc6cc65997aca2a3bb3f1c05b1af30..b2dc813726b5e13a0f97bbf0a107d21c18ea1bfd 100644 (file)
@@ -2591,6 +2591,9 @@ static void wiphy_info_supported_iftypes(struct wiphy_info_data *info,
                case NL80211_IFTYPE_AP:
                        info->capa->flags |= WPA_DRIVER_FLAGS_AP;
                        break;
+               case NL80211_IFTYPE_ADHOC:
+                       info->capa->flags |= WPA_DRIVER_FLAGS_IBSS;
+                       break;
                case NL80211_IFTYPE_P2P_GO:
                        info->p2p_go_supported = 1;
                        break;
index dc44ae41c7c834b36c37054524e13b72d0754d69..5bcf748da5176b119af9f53d02e427a1e4e4efaf 100644 (file)
@@ -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,
                                              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,
                                                          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)
                return ctrl_iface_get_capability_channels(wpa_s, buf, buflen);
 
index 133a0771c621666d9c0e19b104cf40f368d6ee3b..9fb9d0bbb181c33bf08ec792d84eb5b37c648a74 100644 (file)
@@ -2439,7 +2439,7 @@ static struct wpa_cli_cmd wpa_cli_commands[] = {
          "<<idx> | <bssid>> = get detailed scan result info" },
        { "get_capability", wpa_cli_cmd_get_capability, NULL,
          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" },
        { "reconfigure", wpa_cli_cmd_reconfigure, NULL,
          cli_cmd_flag_none,