Remove src/common from default header file path
[mech_eap.git] / src / drivers / driver_nl80211.c
index 13cf5e4..77245eb 100644 (file)
@@ -28,7 +28,7 @@
 #include "common.h"
 #include "driver.h"
 #include "eloop.h"
-#include "ieee802_11_defs.h"
+#include "common/ieee802_11_defs.h"
 
 #if defined(CONFIG_AP) || defined(HOSTAPD)
 #include <netpacket/packet.h>
 #include "radiotap.h"
 #include "radiotap_iter.h"
 
-#include "../../hostapd/hostapd_defs.h"
 #include "../../hostapd/sta_flags.h"
 #endif /* CONFIG_AP || HOSTAPD */
 
-#ifdef HOSTAPD
-#include "ieee802_11_common.h"
-#endif /* HOSTAPD */
-
 #ifdef CONFIG_LIBNL20
 /* libnl 2.0 compatibility code */
 #define nl_handle nl_sock
@@ -1702,7 +1697,7 @@ wpa_driver_nl80211_get_scan_results(void *priv)
 
        res = os_zalloc(sizeof(*res));
        if (res == NULL)
-               return 0;
+               return NULL;
        msg = nlmsg_alloc();
        if (!msg)
                goto nla_put_failure;
@@ -1727,11 +1722,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;
 
@@ -1943,18 +1941,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)
 {
@@ -2033,6 +2019,9 @@ static int wpa_driver_nl80211_authenticate(
 
        drv->associated = 0;
 
+       if (wpa_driver_nl80211_set_mode(drv, IEEE80211_MODE_INFRA) < 0)
+               return -1;
+
 retry:
        msg = nlmsg_alloc();
        if (!msg)
@@ -2047,7 +2036,8 @@ retry:
        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]);
@@ -2192,6 +2182,18 @@ 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_AMPDU_FACTOR]) {
+                       mode->a_mpdu_params |= nla_get_u8(
+                               tb_band[NL80211_BAND_ATTR_HT_AMPDU_FACTOR]) &
+                               0x03;
+               }
+
+               if (tb_band[NL80211_BAND_ATTR_HT_AMPDU_DENSITY]) {
+                       mode->a_mpdu_params |= nla_get_u8(
+                               tb_band[NL80211_BAND_ATTR_HT_AMPDU_DENSITY]) <<
+                               2;
+               }
+
                if (tb_band[NL80211_BAND_ATTR_HT_MCS_SET] &&
                    nla_len(tb_band[NL80211_BAND_ATTR_HT_MCS_SET])) {
                        u8 *mcs;
@@ -2594,14 +2596,11 @@ static int wpa_driver_nl80211_sta_add(const char *ifname, void *priv,
                params->supp_rates);
        NLA_PUT_U16(msg, NL80211_ATTR_STA_LISTEN_INTERVAL,
                    params->listen_interval);
-
-#ifdef CONFIG_IEEE80211N
        if (params->ht_capabilities) {
                NLA_PUT(msg, NL80211_ATTR_HT_CAPABILITY,
-                       params->ht_capabilities->length,
-                       &params->ht_capabilities->data);
+                       sizeof(*params->ht_capabilities),
+                       params->ht_capabilities);
        }
-#endif /* CONFIG_IEEE80211N */
 
        ret = send_and_recv_msgs(drv, msg, NULL, NULL);
        if (ret)
@@ -3461,8 +3460,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);
+       }
 
        drv->associated = 0;
 
@@ -3747,16 +3749,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)
@@ -4325,7 +4317,7 @@ static void *i802_init(struct hostapd_data *hapd,
                        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;
@@ -4392,7 +4384,6 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
        .set_operstate = wpa_driver_nl80211_set_operstate,
        .set_supp_port = wpa_driver_nl80211_set_supp_port,
        .set_country = wpa_driver_nl80211_set_country,
-       .set_mode = wpa_driver_nl80211_set_mode,
        .set_beacon = wpa_driver_nl80211_set_beacon,
 #if defined(CONFIG_AP) || defined(HOSTAPD)
        .send_mlme = wpa_driver_nl80211_send_mlme,
@@ -4405,7 +4396,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,