Remove deprecated driver_ops handlers
[mech_eap.git] / src / drivers / driver_nl80211.c
index fd1256d..129bf09 100644 (file)
@@ -24,9 +24,6 @@
 #include <netlink/genl/family.h>
 #include <netlink/genl/ctrl.h>
 #include "nl80211_copy.h"
-#ifndef NO_WEXT
-#include "wireless_copy.h"
-#endif /* NO_WEXT */
 
 #include "common.h"
 #include "driver.h"
@@ -39,7 +36,6 @@
 #include "radiotap.h"
 #include "radiotap_iter.h"
 
-#include "../../hostapd/hostapd_defs.h"
 #include "../../hostapd/sta_flags.h"
 #endif /* CONFIG_AP || HOSTAPD */
 
@@ -103,13 +99,10 @@ struct wpa_driver_nl80211_data {
        int nlmode;
        int ap_scan_as_station;
 
-       int beacon_int;
        int monitor_sock;
        int monitor_ifidx;
 
-#ifdef CONFIG_AP
        unsigned int beacon_set:1;
-#endif /* CONFIG_AP */
 
 #ifdef HOSTAPD
        int eapol_sock; /* socket for EAPOL frames */
@@ -326,8 +319,6 @@ static int set_ifhwaddr(struct wpa_driver_nl80211_data *drv,
 #endif /* HOSTAPD */
 
 
-#ifndef HOSTAPD
-
 static int wpa_driver_nl80211_send_oper_ifla(
        struct wpa_driver_nl80211_data *drv,
        int linkmode, int operstate)
@@ -356,8 +347,9 @@ static int wpa_driver_nl80211_send_oper_ifla(
        req.ifinfo.ifi_change = 0;
 
        if (linkmode != -1) {
-               rta = (struct rtattr *)
-                       ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len));
+               rta = aliasing_hide_typecast(
+                       ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len)),
+                       struct rtattr);
                rta->rta_type = IFLA_LINKMODE;
                rta->rta_len = RTA_LENGTH(sizeof(char));
                *((char *) RTA_DATA(rta)) = linkmode;
@@ -365,8 +357,9 @@ static int wpa_driver_nl80211_send_oper_ifla(
                        RTA_LENGTH(sizeof(char));
        }
        if (operstate != -1) {
-               rta = (struct rtattr *)
-                       ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len));
+               rta = aliasing_hide_typecast(
+                       ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len)),
+                       struct rtattr);
                rta->rta_type = IFLA_OPERSTATE;
                rta->rta_len = RTA_LENGTH(sizeof(char));
                *((char *) RTA_DATA(rta)) = operstate;
@@ -388,32 +381,6 @@ static int wpa_driver_nl80211_send_oper_ifla(
 }
 
 
-#ifndef NO_WEXT
-static int wpa_driver_nl80211_set_auth_param(
-       struct wpa_driver_nl80211_data *drv, int idx, u32 value)
-{
-       struct iwreq iwr;
-       int ret = 0;
-
-       os_memset(&iwr, 0, sizeof(iwr));
-       os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
-       iwr.u.param.flags = idx & IW_AUTH_INDEX;
-       iwr.u.param.value = value;
-
-       if (ioctl(drv->ioctl_sock, SIOCSIWAUTH, &iwr) < 0) {
-               if (errno != EOPNOTSUPP) {
-                       wpa_printf(MSG_DEBUG, "WEXT: SIOCSIWAUTH(param %d "
-                                  "value 0x%x) failed: %s)",
-                                  idx, value, strerror(errno));
-               }
-               ret = errno == EOPNOTSUPP ? -2 : -1;
-       }
-
-       return ret;
-}
-#endif /* NO_WEXT */
-
-
 static int wpa_driver_nl80211_get_bssid(void *priv, u8 *bssid)
 {
        struct wpa_driver_nl80211_data *drv = priv;
@@ -434,6 +401,8 @@ static int wpa_driver_nl80211_get_ssid(void *priv, u8 *ssid)
 }
 
 
+#ifndef HOSTAPD
+
 static void wpa_driver_nl80211_event_link(struct wpa_driver_nl80211_data *drv,
                                          void *ctx, char *buf, size_t len,
                                          int del)
@@ -672,6 +641,8 @@ try_again:
        }
 }
 
+#endif /* HOSTAPD */
+
 
 static void mlme_event_auth(struct wpa_driver_nl80211_data *drv,
                            const u8 *frame, size_t len)
@@ -741,6 +712,7 @@ static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv,
        wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
 }
 
+
 static void mlme_event_connect(struct wpa_driver_nl80211_data *drv,
                               enum nl80211_commands cmd, struct nlattr *status,
                               struct nlattr *addr, struct nlattr *req_ie,
@@ -786,6 +758,7 @@ static void mlme_event_connect(struct wpa_driver_nl80211_data *drv,
        wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
 }
 
+
 static void mlme_timeout_event(struct wpa_driver_nl80211_data *drv,
                               enum nl80211_commands cmd, struct nlattr *addr)
 {
@@ -850,8 +823,6 @@ static void mlme_event(struct wpa_driver_nl80211_data *drv,
        }
 }
 
-#endif /* HOSTAPD */
-
 
 static void mlme_event_michael_mic_failure(struct wpa_driver_nl80211_data *drv,
                                           struct nlattr *tb[])
@@ -916,6 +887,9 @@ static int process_event(struct nl_msg *msg, void *arg)
        }
 
        switch (gnlh->cmd) {
+       case NL80211_CMD_TRIGGER_SCAN:
+               wpa_printf(MSG_DEBUG, "nl80211: Scan trigger");
+               break;
        case NL80211_CMD_NEW_SCAN_RESULTS:
                wpa_printf(MSG_DEBUG, "nl80211: New scan results available");
                drv->scan_complete_events = 1;
@@ -933,7 +907,6 @@ static int process_event(struct nl_msg *msg, void *arg)
                                     drv->ctx);
                wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, NULL);
                break;
-#ifndef HOSTAPD
        case NL80211_CMD_AUTHENTICATE:
        case NL80211_CMD_ASSOCIATE:
        case NL80211_CMD_DEAUTHENTICATE:
@@ -962,7 +935,6 @@ static int process_event(struct nl_msg *msg, void *arg)
                drv->associated = 0;
                wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
                break;
-#endif /* HOSTAPD */
        case NL80211_CMD_MICHAEL_MIC_FAILURE:
                mlme_event_michael_mic_failure(drv, tb);
                break;
@@ -1170,6 +1142,8 @@ static int wpa_driver_nl80211_capa(struct wpa_driver_nl80211_data *drv)
                return -1;
        }
 
+       drv->capa.flags |= WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE;
+
        return 0;
 }
 #endif /* HOSTAPD */
@@ -1480,9 +1454,6 @@ static void wpa_driver_nl80211_deinit(void *priv)
 
        wpa_driver_nl80211_free_bss(drv);
 #else /* HOSTAPD */
-#ifndef NO_WEXT
-       wpa_driver_nl80211_set_auth_param(drv, IW_AUTH_DROP_UNENCRYPTED, 0);
-#endif /* NO_WEXT */
 
        wpa_driver_nl80211_send_oper_ifla(priv, 0, IF_OPER_UP);
 
@@ -1649,6 +1620,7 @@ static int bss_info_handler(struct nl_msg *msg, void *arg)
                [NL80211_BSS_INFORMATION_ELEMENTS] = { .type = NLA_UNSPEC },
                [NL80211_BSS_SIGNAL_MBM] = { .type = NLA_U32 },
                [NL80211_BSS_SIGNAL_UNSPEC] = { .type = NLA_U8 },
+               [NL80211_BSS_SEEN_MS_AGO] = { .type = NLA_U32 },
        };
        struct wpa_scan_results *res = arg;
        struct wpa_scan_res **tmp;
@@ -1695,6 +1667,8 @@ static int bss_info_handler(struct nl_msg *msg, void *arg)
                r->flags |= WPA_SCAN_LEVEL_INVALID | WPA_SCAN_QUAL_INVALID;
        if (bss[NL80211_BSS_TSF])
                r->tsf = nla_get_u64(bss[NL80211_BSS_TSF]);
+       if (bss[NL80211_BSS_SEEN_MS_AGO])
+               r->age = nla_get_u32(bss[NL80211_BSS_SEEN_MS_AGO]);
        r->ie_len = ie_len;
        if (ie)
                os_memcpy(r + 1, ie, ie_len);
@@ -1752,11 +1726,14 @@ nla_put_failure:
 }
 
 
-static int nl_set_encr(int ifindex, struct wpa_driver_nl80211_data *drv,
-                      wpa_alg alg, const u8 *addr, int key_idx, int set_tx,
-                      const u8 *seq, size_t seq_len,
-                      const u8 *key, size_t key_len)
+static int wpa_driver_nl80211_set_key(const char *ifname, void *priv,
+                                     wpa_alg alg, const u8 *addr, int key_idx,
+                                     int set_tx,
+                                     const u8 *seq, size_t seq_len,
+                                     const u8 *key, size_t key_len)
 {
+       struct wpa_driver_nl80211_data *drv = priv;
+       int ifindex = if_nametoindex(ifname);
        struct nl_msg *msg;
        int ret;
 
@@ -1860,7 +1837,59 @@ nla_put_failure:
 }
 
 
-#ifndef HOSTAPD
+static int nl_add_key(struct nl_msg *msg, wpa_alg alg,
+                     int key_idx, int defkey,
+                     const u8 *seq, size_t seq_len,
+                     const u8 *key, size_t key_len)
+{
+       struct nlattr *key_attr = nla_nest_start(msg, NL80211_ATTR_KEY);
+       if (!key_attr)
+               return -1;
+
+       if (defkey && alg == WPA_ALG_IGTK)
+               NLA_PUT_FLAG(msg, NL80211_KEY_DEFAULT_MGMT);
+       else if (defkey)
+               NLA_PUT_FLAG(msg, NL80211_KEY_DEFAULT);
+
+       NLA_PUT_U8(msg, NL80211_KEY_IDX, key_idx);
+
+       switch (alg) {
+       case WPA_ALG_WEP:
+               if (key_len == 5)
+                       NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
+                                   WLAN_CIPHER_SUITE_WEP40);
+               else
+                       NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
+                                   WLAN_CIPHER_SUITE_WEP104);
+               break;
+       case WPA_ALG_TKIP:
+               NLA_PUT_U32(msg, NL80211_KEY_CIPHER, WLAN_CIPHER_SUITE_TKIP);
+               break;
+       case WPA_ALG_CCMP:
+               NLA_PUT_U32(msg, NL80211_KEY_CIPHER, WLAN_CIPHER_SUITE_CCMP);
+               break;
+       case WPA_ALG_IGTK:
+               NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
+                           WLAN_CIPHER_SUITE_AES_CMAC);
+               break;
+       default:
+               wpa_printf(MSG_ERROR, "%s: Unsupported encryption "
+                          "algorithm %d", __func__, alg);
+               return -1;
+       }
+
+       if (seq && seq_len)
+               NLA_PUT(msg, NL80211_KEY_SEQ, seq_len, seq);
+
+       NLA_PUT(msg, NL80211_KEY_DATA, key_len, key);
+
+       nla_nest_end(msg, key_attr);
+
+       return 0;
+ nla_put_failure:
+       return -1;
+}
+
 
 static int nl80211_set_conn_keys(struct wpa_driver_associate_params *params,
                                 struct nl_msg *msg)
@@ -1916,18 +1945,6 @@ nla_put_failure:
 }
 
 
-static int wpa_driver_nl80211_set_key(void *priv, wpa_alg alg,
-                                     const u8 *addr, int key_idx,
-                                     int set_tx, const u8 *seq,
-                                     size_t seq_len,
-                                     const u8 *key, size_t key_len)
-{
-       struct wpa_driver_nl80211_data *drv = priv;
-       return nl_set_encr(drv->ifindex, drv, alg, addr, key_idx, set_tx, seq,
-                          seq_len, key, key_len);
-}
-
-
 static int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
                                   const u8 *addr, int cmd, u16 reason_code)
 {
@@ -2002,9 +2019,14 @@ static int wpa_driver_nl80211_authenticate(
        int ret = -1, i;
        struct nl_msg *msg;
        enum nl80211_auth_type type;
+       int count = 0;
 
        drv->associated = 0;
 
+       if (wpa_driver_nl80211_set_mode(drv, IEEE80211_MODE_INFRA) < 0)
+               return -1;
+
+retry:
        msg = nlmsg_alloc();
        if (!msg)
                return -1;
@@ -2012,18 +2034,26 @@ static int wpa_driver_nl80211_authenticate(
        wpa_printf(MSG_DEBUG, "nl80211: Authenticate (ifindex=%d)",
                   drv->ifindex);
 
+       genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
+                   NL80211_CMD_AUTHENTICATE, 0);
+
        for (i = 0; i < 4; i++) {
                if (!params->wep_key[i])
                        continue;
-               wpa_driver_nl80211_set_key(drv, WPA_ALG_WEP, NULL, i,
+               wpa_driver_nl80211_set_key(drv->ifname, drv, WPA_ALG_WEP, NULL,
+                                          i,
                                           i == params->wep_tx_keyidx, NULL, 0,
                                           params->wep_key[i],
                                           params->wep_key_len[i]);
+               if (params->wep_tx_keyidx != i)
+                       continue;
+               if (nl_add_key(msg, WPA_ALG_WEP, i, 1, NULL, 0,
+                              params->wep_key[i], params->wep_key_len[i])) {
+                       nlmsg_free(msg);
+                       return -1;
+               }
        }
 
-       genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
-                   NL80211_CMD_AUTHENTICATE, 0);
-
        NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
        if (params->bssid) {
                wpa_printf(MSG_DEBUG, "  * bssid=" MACSTR,
@@ -2065,6 +2095,21 @@ static int wpa_driver_nl80211_authenticate(
        if (ret) {
                wpa_printf(MSG_DEBUG, "nl80211: MLME command failed: ret=%d "
                           "(%s)", ret, strerror(-ret));
+               count++;
+               if (ret == -EALREADY && count == 1 && params->bssid) {
+                       /*
+                        * mac80211 does not currently accept new
+                        * authentication if we are already authenticated. As a
+                        * workaround, force deauthentication and try again.
+                        */
+                       wpa_printf(MSG_DEBUG, "nl80211: Retry authentication "
+                                  "after forced deauthentication");
+                       wpa_driver_nl80211_deauthenticate(
+                               drv, params->bssid,
+                               WLAN_REASON_PREV_AUTH_NOT_VALID);
+                       nlmsg_free(msg);
+                       goto retry;
+               }
                goto nla_put_failure;
        }
        ret = 0;
@@ -2076,8 +2121,6 @@ nla_put_failure:
        return ret;
 }
 
-#endif /* HOSTAPD */
-
 
 #if defined(CONFIG_AP) || defined(HOSTAPD)
 
@@ -2143,6 +2186,13 @@ static int phy_info_handler(struct nl_msg *msg, void *arg)
                                tb_band[NL80211_BAND_ATTR_HT_CAPA]);
                }
 
+               if (tb_band[NL80211_BAND_ATTR_HT_MCS_SET] &&
+                   nla_len(tb_band[NL80211_BAND_ATTR_HT_MCS_SET])) {
+                       u8 *mcs;
+                       mcs = nla_data(tb_band[NL80211_BAND_ATTR_HT_MCS_SET]);
+                       os_memcpy(mode->mcs_set, mcs, 16);
+               }
+
                nla_for_each_nested(nl_freq, tb_band[NL80211_BAND_ATTR_FREQS], rem_freq) {
                        nla_parse(tb_freq, NL80211_FREQUENCY_ATTR_MAX, nla_data(nl_freq),
                                  nla_len(nl_freq), freq_policy);
@@ -2413,17 +2463,20 @@ static int wpa_driver_nl80211_send_mlme(void *priv, const u8 *data,
        return wpa_driver_nl80211_send_frame(drv, data, data_len, encrypt);
 }
 
+#endif /* CONFIG_AP || HOSTAPD */
+
 
-static int wpa_driver_nl80211_set_beacon_iface(int ifindex, void *priv,
-                                              const u8 *head, size_t head_len,
-                                              const u8 *tail, size_t tail_len,
-                                              int dtim_period)
+static int wpa_driver_nl80211_set_beacon(const char *ifname, void *priv,
+                                        const u8 *head, size_t head_len,
+                                        const u8 *tail, size_t tail_len,
+                                        int dtim_period, int beacon_int)
 {
        struct wpa_driver_nl80211_data *drv = priv;
        struct nl_msg *msg;
        u8 cmd = NL80211_CMD_NEW_BEACON;
        int ret;
        int beacon_set;
+       int ifindex = if_nametoindex(ifname);
 #ifdef HOSTAPD
        struct i802_bss *bss;
 
@@ -2449,9 +2502,7 @@ static int wpa_driver_nl80211_set_beacon_iface(int ifindex, void *priv,
        NLA_PUT(msg, NL80211_ATTR_BEACON_HEAD, head_len, head);
        NLA_PUT(msg, NL80211_ATTR_BEACON_TAIL, tail_len, tail);
        NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
-       if (!drv->beacon_int)
-               drv->beacon_int = 100;
-       NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, drv->beacon_int);
+       NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, beacon_int);
        NLA_PUT_U32(msg, NL80211_ATTR_DTIM_PERIOD, dtim_period);
 
        ret = send_and_recv_msgs(drv, msg, NULL, NULL);
@@ -2471,37 +2522,7 @@ static int wpa_driver_nl80211_set_beacon_iface(int ifindex, void *priv,
 }
 
 
-static int wpa_driver_nl80211_set_beacon_int(void *priv, int value)
-{
-       struct wpa_driver_nl80211_data *drv = priv;
-       struct nl_msg *msg;
-
-       drv->beacon_int = value;
-
-#ifdef HOSTAPD
-       if (!drv->bss.beacon_set)
-               return 0;
-#else /* HOSTAPD */
-       if (!drv->beacon_set)
-               return 0;
-#endif /* HOSTAPD */
-
-       msg = nlmsg_alloc();
-       if (!msg)
-               return -ENOMEM;
-
-       wpa_printf(MSG_DEBUG, "nl80211: Set beacon interval %d", value);
-       genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
-                   0, NL80211_CMD_SET_BEACON, 0);
-       NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
-
-       NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, value);
-
-       return send_and_recv_msgs(drv, msg, NULL, NULL);
- nla_put_failure:
-       return -ENOBUFS;
-}
-
+#if defined(CONFIG_AP) || defined(HOSTAPD)
 
 static int wpa_driver_nl80211_set_freq(struct wpa_driver_nl80211_data *drv,
                                       int freq, int ht_enabled,
@@ -2612,26 +2633,6 @@ static int wpa_driver_nl80211_sta_remove(void *priv, const u8 *addr)
        return -ENOBUFS;
 }
 
-#endif /* CONFIG_AP || HOSTAPD */
-
-
-#ifdef CONFIG_AP
-
-static int wpa_driver_nl80211_set_beacon(void *priv,
-                                        const u8 *head, size_t head_len,
-                                        const u8 *tail, size_t tail_len,
-                                        int dtim_period)
-{
-       struct wpa_driver_nl80211_data *drv = priv;
-       return wpa_driver_nl80211_set_beacon_iface(drv->ifindex, priv,
-                                                  head, head_len,
-                                                  tail, tail_len,
-                                                  dtim_period);
-}
-
-#endif /* CONFIG_AP */
-
-#if defined(CONFIG_AP) || defined(HOSTAPD)
 
 static void nl80211_remove_iface(struct wpa_driver_nl80211_data *drv,
                                 int ifidx)
@@ -3296,7 +3297,6 @@ static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv,
 #endif /* CONFIG_AP */
 
 
-#ifndef HOSTAPD
 static int wpa_driver_nl80211_connect(
        struct wpa_driver_nl80211_data *drv,
        struct wpa_driver_associate_params *params)
@@ -3365,7 +3365,7 @@ static int wpa_driver_nl80211_connect(
        }
 
        if (params->pairwise_suite != CIPHER_NONE) {
-               int cipher = IW_AUTH_CIPHER_NONE;
+               int cipher;
 
                switch (params->pairwise_suite) {
                case CIPHER_WEP40:
@@ -3386,7 +3386,7 @@ static int wpa_driver_nl80211_connect(
        }
 
        if (params->group_suite != CIPHER_NONE) {
-               int cipher = IW_AUTH_CIPHER_NONE;
+               int cipher;
 
                switch (params->group_suite) {
                case CIPHER_WEP40:
@@ -3455,13 +3455,11 @@ static int wpa_driver_nl80211_associate(
                return wpa_driver_nl80211_ap(drv, params);
 #endif /* CONFIG_AP */
 
-       if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME))
+       if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) {
+               if (wpa_driver_nl80211_set_mode(drv, params->mode) < 0)
+                       return -1;
                return wpa_driver_nl80211_connect(drv, params);
-
-#ifndef NO_WEXT
-       wpa_driver_nl80211_set_auth_param(drv, IW_AUTH_DROP_UNENCRYPTED,
-                                         params->drop_unencrypted);
-#endif /* NO_WEXT */
+       }
 
        drv->associated = 0;
 
@@ -3506,6 +3504,13 @@ static int wpa_driver_nl80211_associate(
 
        NLA_PUT_FLAG(msg, NL80211_ATTR_CONTROL_PORT);
 
+       if (params->prev_bssid) {
+               wpa_printf(MSG_DEBUG, "  * prev_bssid=" MACSTR,
+                          MAC2STR(params->prev_bssid));
+               NLA_PUT(msg, NL80211_ATTR_PREV_BSSID, ETH_ALEN,
+                       params->prev_bssid);
+       }
+
        ret = send_and_recv_msgs(drv, msg, NULL, NULL);
        msg = NULL;
        if (ret) {
@@ -3521,7 +3526,6 @@ nla_put_failure:
        nlmsg_free(msg);
        return ret;
 }
-#endif /* HOSTAPD */
 
 
 static int nl80211_set_mode(struct wpa_driver_nl80211_data *drv,
@@ -3611,8 +3615,6 @@ done:
 }
 
 
-#ifndef HOSTAPD
-
 static int wpa_driver_nl80211_get_capa(void *priv,
                                       struct wpa_driver_capa *capa)
 {
@@ -3664,8 +3666,6 @@ static int wpa_driver_nl80211_set_supp_port(void *priv, int authorized)
        return -ENOBUFS;
 }
 
-#endif /* HOSTAPD */
-
 
 #ifdef HOSTAPD
 
@@ -3744,16 +3744,6 @@ static int have_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
 }
 
 
-static int i802_set_key(const char *iface, void *priv, wpa_alg alg,
-                       const u8 *addr, int key_idx, int set_tx, const u8 *seq,
-                       size_t seq_len, const u8 *key, size_t key_len)
-{
-       struct wpa_driver_nl80211_data *drv = priv;
-       return nl_set_encr(if_nametoindex(iface), drv, alg, addr, key_idx,
-                          set_tx, seq, seq_len, key, key_len);
-}
-
-
 static inline int min_int(int a, int b)
 {
        if (a < b)
@@ -4100,17 +4090,6 @@ static int i802_bss_remove(void *priv, const char *ifname)
 }
 
 
-static int i802_set_beacon(const char *iface, void *priv,
-                          const u8 *head, size_t head_len,
-                          const u8 *tail, size_t tail_len, int dtim_period)
-{
-       return wpa_driver_nl80211_set_beacon_iface(if_nametoindex(iface), priv,
-                                                  head, head_len,
-                                                  tail, tail_len,
-                                                  dtim_period);
-}
-
-
 static int i802_set_bss(void *priv, int cts, int preamble, int slot)
 {
        struct wpa_driver_nl80211_data *drv = priv;
@@ -4209,7 +4188,7 @@ static int i802_set_sta_vlan(void *priv, const u8 *addr,
        NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
                    if_nametoindex(drv->ifname));
        NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
-       NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
+       NLA_PUT_U32(msg, NL80211_ATTR_STA_VLAN,
                    if_nametoindex(ifname));
 
        return send_and_recv_msgs(drv, msg, NULL, NULL);
@@ -4325,15 +4304,15 @@ static void *i802_init(struct hostapd_data *hapd,
        /* start listening for EAPOL on the default AP interface */
        add_ifidx(drv, drv->ifindex);
 
-       if (params->bssid) {
-               if (hostapd_set_iface_flags(drv, drv->ifname, 0))
-                       goto failed;
+       if (hostapd_set_iface_flags(drv, drv->ifname, 0))
+               goto failed;
 
+       if (params->bssid) {
                if (set_ifhwaddr(drv, drv->ifname, params->bssid))
                        goto failed;
        }
 
-       if (nl80211_set_mode(drv, drv->ifindex, NL80211_IFTYPE_AP)) {
+       if (wpa_driver_nl80211_set_mode(drv, IEEE80211_MODE_AP)) {
                wpa_printf(MSG_ERROR, "nl80211: Failed to set interface %s "
                           "into AP mode", drv->ifname);
                goto failed;
@@ -4385,14 +4364,11 @@ static void i802_deinit(void *priv)
 const struct wpa_driver_ops wpa_driver_nl80211_ops = {
        .name = "nl80211",
        .desc = "Linux nl80211/cfg80211",
-#ifndef HOSTAPD
        .get_bssid = wpa_driver_nl80211_get_bssid,
        .get_ssid = wpa_driver_nl80211_get_ssid,
        .set_key = wpa_driver_nl80211_set_key,
-#endif /* HOSTAPD */
        .scan2 = wpa_driver_nl80211_scan,
        .get_scan_results2 = wpa_driver_nl80211_get_scan_results,
-#ifndef HOSTAPD
        .deauthenticate = wpa_driver_nl80211_deauthenticate,
        .disassociate = wpa_driver_nl80211_disassociate,
        .authenticate = wpa_driver_nl80211_authenticate,
@@ -4402,15 +4378,10 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
        .get_capa = wpa_driver_nl80211_get_capa,
        .set_operstate = wpa_driver_nl80211_set_operstate,
        .set_supp_port = wpa_driver_nl80211_set_supp_port,
-#endif /* HOSTAPD */
        .set_country = wpa_driver_nl80211_set_country,
-       .set_mode = wpa_driver_nl80211_set_mode,
-#ifdef CONFIG_AP
        .set_beacon = wpa_driver_nl80211_set_beacon,
-#endif /* CONFIG_AP */
 #if defined(CONFIG_AP) || defined(HOSTAPD)
        .send_mlme = wpa_driver_nl80211_send_mlme,
-       .set_beacon_int = wpa_driver_nl80211_set_beacon_int,
        .get_hw_feature_data = wpa_driver_nl80211_get_hw_feature_data,
        .sta_add = wpa_driver_nl80211_sta_add,
        .sta_remove = wpa_driver_nl80211_sta_remove,
@@ -4420,7 +4391,6 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
 #ifdef HOSTAPD
        .hapd_init = i802_init,
        .hapd_deinit = i802_deinit,
-       .hapd_set_key = i802_set_key,
        .get_seqnum = i802_get_seqnum,
        .flush = i802_flush,
        .read_sta_data = i802_read_sta_data,
@@ -4432,7 +4402,6 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
        .set_rts = i802_set_rts,
        .set_frag = i802_set_frag,
        .set_rate_sets = i802_set_rate_sets,
-       .hapd_set_beacon = i802_set_beacon,
        .set_cts_protect = i802_set_cts_protect,
        .set_preamble = i802_set_preamble,
        .set_short_slot_time = i802_set_short_slot_time,