|
@@ -70,6 +70,7 @@ struct atheros_driver_data {
|
|
|
int ioctl_sock;
|
|
|
struct netlink_data *netlink;
|
|
|
int we_version;
|
|
|
+ int fils_en;
|
|
|
u8 acct_mac[ETH_ALEN];
|
|
|
struct hostap_sta_driver_data acct_data;
|
|
|
|
|
@@ -178,6 +179,25 @@ static const char * athr_get_param_name(int op)
|
|
|
}
|
|
|
|
|
|
|
|
|
+#ifdef CONFIG_FILS
|
|
|
+static int
|
|
|
+get80211param(struct atheros_driver_data *drv, int op, int *data)
|
|
|
+{
|
|
|
+ struct iwreq iwr;
|
|
|
+
|
|
|
+ os_memset(&iwr, 0, sizeof(iwr));
|
|
|
+ os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
|
|
|
+ iwr.u.mode = op;
|
|
|
+
|
|
|
+ if (ioctl(drv->ioctl_sock, IEEE80211_IOCTL_GETPARAM, &iwr) < 0)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ *data = iwr.u.mode;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
static int
|
|
|
set80211priv(struct atheros_driver_data *drv, int op, void *data, int len)
|
|
|
{
|
|
@@ -1603,6 +1623,27 @@ handle_read(void *ctx, const u8 *src_addr, const u8 *buf, size_t len)
|
|
|
len - sizeof(struct l2_ethhdr));
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+static void atheros_read_fils_cap(struct atheros_driver_data *drv)
|
|
|
+{
|
|
|
+ int fils = 0;
|
|
|
+
|
|
|
+#ifdef CONFIG_FILS
|
|
|
+
|
|
|
+ * to automatically check this against the driver header files. */
|
|
|
+ if (get80211param(drv, IEEE80211_PARAM_ENABLE_FILS, &fils) < 0) {
|
|
|
+ wpa_printf(MSG_DEBUG,
|
|
|
+ "%s: Failed to get FILS capability from driver",
|
|
|
+ __func__);
|
|
|
+
|
|
|
+ fils = 0;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ drv->fils_en = fils;
|
|
|
+ wpa_printf(MSG_DEBUG, "atheros: fils_en=%d", drv->fils_en);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static void *
|
|
|
atheros_init(struct hostapd_data *hapd, struct wpa_init_params *params)
|
|
|
{
|
|
@@ -1683,6 +1724,9 @@ atheros_init(struct hostapd_data *hapd, struct wpa_init_params *params)
|
|
|
if (atheros_wireless_event_init(drv))
|
|
|
goto bad;
|
|
|
|
|
|
+
|
|
|
+ atheros_read_fils_cap(drv);
|
|
|
+
|
|
|
return drv;
|
|
|
bad:
|
|
|
atheros_reset_appfilter(drv);
|