Remove unused set_retry() driver op
[wpasupplicant] / src / drivers / driver_nl80211.c
index 0fcd4f0..2f87d43 100644 (file)
 #include "radiotap_iter.h"
 
 #include "../../hostapd/hostapd_defs.h"
+#include "../../hostapd/sta_flags.h"
 #endif /* CONFIG_AP || HOSTAPD */
 
 #ifdef HOSTAPD
-#include "../../hostapd/sta_flags.h"
 #include "ieee802_11_common.h"
 
 #ifdef CONFIG_LIBNL20
@@ -1753,6 +1753,7 @@ static int wpa_driver_nl80211_deauthenticate(void *priv, const u8 *addr,
 {
        struct wpa_driver_nl80211_data *drv = priv;
        wpa_printf(MSG_DEBUG, "%s", __func__);
+       drv->associated = 0;
        return wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DEAUTHENTICATE,
                                       reason_code);
 }
@@ -1763,6 +1764,7 @@ static int wpa_driver_nl80211_disassociate(void *priv, const u8 *addr,
 {
        struct wpa_driver_nl80211_data *drv = priv;
        wpa_printf(MSG_DEBUG, "%s", __func__);
+       drv->associated = 0;
        return wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DISASSOCIATE,
                                       reason_code);
 }
@@ -2320,6 +2322,73 @@ nla_put_failure:
        return -1;
 }
 
+
+static int wpa_driver_nl80211_sta_add(const char *ifname, void *priv,
+                                     struct hostapd_sta_add_params *params)
+{
+       struct wpa_driver_nl80211_data *drv = priv;
+       struct nl_msg *msg;
+       int ret = -ENOBUFS;
+
+       msg = nlmsg_alloc();
+       if (!msg)
+               return -ENOMEM;
+
+       genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
+                   0, NL80211_CMD_NEW_STATION, 0);
+
+       NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(ifname));
+       NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->addr);
+       NLA_PUT_U16(msg, NL80211_ATTR_STA_AID, params->aid);
+       NLA_PUT(msg, NL80211_ATTR_STA_SUPPORTED_RATES, params->supp_rates_len,
+               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);
+       }
+#endif /* CONFIG_IEEE80211N */
+
+       ret = send_and_recv_msgs(drv, msg, NULL, NULL);
+       if (ret)
+               wpa_printf(MSG_DEBUG, "nl80211: NL80211_CMD_NEW_STATION "
+                          "result: %d (%s)", ret, strerror(-ret));
+       if (ret == -EEXIST)
+               ret = 0;
+ nla_put_failure:
+       return ret;
+}
+
+
+static int wpa_driver_nl80211_sta_remove(void *priv, const u8 *addr)
+{
+       struct wpa_driver_nl80211_data *drv = priv;
+       struct nl_msg *msg;
+       int ret;
+
+       msg = nlmsg_alloc();
+       if (!msg)
+               return -ENOMEM;
+
+       genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
+                   0, NL80211_CMD_DEL_STATION, 0);
+
+       NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
+                   if_nametoindex(drv->ifname));
+       NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
+
+       ret = send_and_recv_msgs(drv, msg, NULL, NULL);
+       if (ret == -ENOENT)
+               return 0;
+       return ret;
+ nla_put_failure:
+       return -ENOBUFS;
+}
+
 #endif /* CONFIG_AP || HOSTAPD */
 
 
@@ -2816,6 +2885,124 @@ nl80211_create_monitor_interface(struct wpa_driver_nl80211_data *drv)
        return -1;
 }
 
+
+static const u8 rfc1042_header[6] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
+
+static int wpa_driver_nl80211_hapd_send_eapol(
+       void *priv, const u8 *addr, const u8 *data,
+       size_t data_len, int encrypt, const u8 *own_addr)
+{
+       struct wpa_driver_nl80211_data *drv = priv;
+       struct ieee80211_hdr *hdr;
+       size_t len;
+       u8 *pos;
+       int res;
+#if 0 /* FIX */
+       int qos = sta->flags & WLAN_STA_WME;
+#else
+       int qos = 0;
+#endif
+
+       len = sizeof(*hdr) + (qos ? 2 : 0) + sizeof(rfc1042_header) + 2 +
+               data_len;
+       hdr = os_zalloc(len);
+       if (hdr == NULL) {
+               printf("malloc() failed for i802_send_data(len=%lu)\n",
+                      (unsigned long) len);
+               return -1;
+       }
+
+       hdr->frame_control =
+               IEEE80211_FC(WLAN_FC_TYPE_DATA, WLAN_FC_STYPE_DATA);
+       hdr->frame_control |= host_to_le16(WLAN_FC_FROMDS);
+       if (encrypt)
+               hdr->frame_control |= host_to_le16(WLAN_FC_ISWEP);
+#if 0 /* To be enabled if qos determination is added above */
+       if (qos) {
+               hdr->frame_control |=
+                       host_to_le16(WLAN_FC_STYPE_QOS_DATA << 4);
+       }
+#endif
+
+       memcpy(hdr->IEEE80211_DA_FROMDS, addr, ETH_ALEN);
+       memcpy(hdr->IEEE80211_BSSID_FROMDS, own_addr, ETH_ALEN);
+       memcpy(hdr->IEEE80211_SA_FROMDS, own_addr, ETH_ALEN);
+       pos = (u8 *) (hdr + 1);
+
+#if 0 /* To be enabled if qos determination is added above */
+       if (qos) {
+               /* add an empty QoS header if needed */
+               pos[0] = 0;
+               pos[1] = 0;
+               pos += 2;
+       }
+#endif
+
+       memcpy(pos, rfc1042_header, sizeof(rfc1042_header));
+       pos += sizeof(rfc1042_header);
+       WPA_PUT_BE16(pos, ETH_P_PAE);
+       pos += 2;
+       memcpy(pos, data, data_len);
+
+       res = wpa_driver_nl80211_send_frame(drv, (u8 *) hdr, len, encrypt);
+       if (res < 0) {
+               wpa_printf(MSG_ERROR, "i802_send_eapol - packet len: %lu - "
+                          "failed: %d (%s)",
+                          (unsigned long) len, errno, strerror(errno));
+       }
+       free(hdr);
+
+       return res;
+}
+
+
+static int wpa_driver_nl80211_sta_set_flags(void *priv, const u8 *addr,
+                                           int total_flags, int flags_or,
+                                           int flags_and)
+{
+       struct wpa_driver_nl80211_data *drv = priv;
+       struct nl_msg *msg, *flags = NULL;
+
+       msg = nlmsg_alloc();
+       if (!msg)
+               return -ENOMEM;
+
+       flags = nlmsg_alloc();
+       if (!flags) {
+               nlmsg_free(msg);
+               return -ENOMEM;
+       }
+
+       genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
+                   0, NL80211_CMD_SET_STATION, 0);
+
+       NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
+                   if_nametoindex(drv->ifname));
+       NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
+
+       if (total_flags & WLAN_STA_AUTHORIZED)
+               NLA_PUT_FLAG(flags, NL80211_STA_FLAG_AUTHORIZED);
+
+       if (total_flags & WLAN_STA_WMM)
+               NLA_PUT_FLAG(flags, NL80211_STA_FLAG_WME);
+
+       if (total_flags & WLAN_STA_SHORT_PREAMBLE)
+               NLA_PUT_FLAG(flags, NL80211_STA_FLAG_SHORT_PREAMBLE);
+
+       if (total_flags & WLAN_STA_MFP)
+               NLA_PUT_FLAG(flags, NL80211_STA_FLAG_MFP);
+
+       if (nla_put_nested(msg, NL80211_ATTR_STA_FLAGS, flags))
+               goto nla_put_failure;
+
+       nlmsg_free(flags);
+
+       return send_and_recv_msgs(drv, msg, NULL, NULL);
+ nla_put_failure:
+       nlmsg_free(flags);
+       return -ENOBUFS;
+}
+
 #endif /* CONFIG_AP || HOSTAPD */
 
 #ifdef CONFIG_AP
@@ -3025,9 +3212,6 @@ static int wpa_driver_nl80211_set_operstate(void *priv, int state)
 
 #ifdef HOSTAPD
 
-static const u8 rfc1042_header[6] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
-
-
 static struct i802_bss * get_bss(struct wpa_driver_nl80211_data *drv,
                                 int ifindex)
 {
@@ -3253,36 +3437,6 @@ static int i802_set_frag(void *priv, int frag)
 }
 
 
-static int i802_set_retry(void *priv, int short_retry, int long_retry)
-{
-#ifdef NO_WEXT
-       return -1;
-#else /* NO_WEXT */
-       struct wpa_driver_nl80211_data *drv = priv;
-       struct iwreq iwr;
-
-       memset(&iwr, 0, sizeof(iwr));
-       os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
-
-       iwr.u.retry.value = short_retry;
-       iwr.u.retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN;
-       if (ioctl(drv->ioctl_sock, SIOCSIWRETRY, &iwr) < 0) {
-               perror("ioctl[SIOCSIWRETRY(short)]");
-               return -1;
-       }
-
-       iwr.u.retry.value = long_retry;
-       iwr.u.retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
-       if (ioctl(drv->ioctl_sock, SIOCSIWRETRY, &iwr) < 0) {
-               perror("ioctl[SIOCSIWRETRY(long)]");
-               return -1;
-       }
-
-       return 0;
-#endif /* NO_WEXT */
-}
-
-
 static int i802_flush(void *priv)
 {
        struct wpa_driver_nl80211_data *drv = priv;
@@ -3381,188 +3535,6 @@ static int i802_read_sta_data(void *priv, struct hostap_sta_driver_data *data,
 }
 
 
-static int i802_send_eapol(void *priv, const u8 *addr, const u8 *data,
-                          size_t data_len, int encrypt, const u8 *own_addr)
-{
-       struct wpa_driver_nl80211_data *drv = priv;
-       struct ieee80211_hdr *hdr;
-       size_t len;
-       u8 *pos;
-       int res;
-#if 0 /* FIX */
-       int qos = sta->flags & WLAN_STA_WME;
-#else
-       int qos = 0;
-#endif
-
-       len = sizeof(*hdr) + (qos ? 2 : 0) + sizeof(rfc1042_header) + 2 +
-               data_len;
-       hdr = os_zalloc(len);
-       if (hdr == NULL) {
-               printf("malloc() failed for i802_send_data(len=%lu)\n",
-                      (unsigned long) len);
-               return -1;
-       }
-
-       hdr->frame_control =
-               IEEE80211_FC(WLAN_FC_TYPE_DATA, WLAN_FC_STYPE_DATA);
-       hdr->frame_control |= host_to_le16(WLAN_FC_FROMDS);
-       if (encrypt)
-               hdr->frame_control |= host_to_le16(WLAN_FC_ISWEP);
-#if 0 /* To be enabled if qos determination is added above */
-       if (qos) {
-               hdr->frame_control |=
-                       host_to_le16(WLAN_FC_STYPE_QOS_DATA << 4);
-       }
-#endif
-
-       memcpy(hdr->IEEE80211_DA_FROMDS, addr, ETH_ALEN);
-       memcpy(hdr->IEEE80211_BSSID_FROMDS, own_addr, ETH_ALEN);
-       memcpy(hdr->IEEE80211_SA_FROMDS, own_addr, ETH_ALEN);
-       pos = (u8 *) (hdr + 1);
-
-#if 0 /* To be enabled if qos determination is added above */
-       if (qos) {
-               /* add an empty QoS header if needed */
-               pos[0] = 0;
-               pos[1] = 0;
-               pos += 2;
-       }
-#endif
-
-       memcpy(pos, rfc1042_header, sizeof(rfc1042_header));
-       pos += sizeof(rfc1042_header);
-       WPA_PUT_BE16(pos, ETH_P_PAE);
-       pos += 2;
-       memcpy(pos, data, data_len);
-
-       res = wpa_driver_nl80211_send_frame(drv, (u8 *) hdr, len, encrypt);
-       if (res < 0) {
-               wpa_printf(MSG_ERROR, "i802_send_eapol - packet len: %lu - "
-                          "failed: %d (%s)",
-                          (unsigned long) len, errno, strerror(errno));
-       }
-       free(hdr);
-
-       return res;
-}
-
-
-static int i802_sta_add(const char *ifname, void *priv,
-                       struct hostapd_sta_add_params *params)
-{
-       struct wpa_driver_nl80211_data *drv = priv;
-       struct nl_msg *msg;
-       int ret = -ENOBUFS;
-
-       msg = nlmsg_alloc();
-       if (!msg)
-               return -ENOMEM;
-
-       genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
-                   0, NL80211_CMD_NEW_STATION, 0);
-
-       NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
-                   if_nametoindex(drv->ifname));
-       NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->addr);
-       NLA_PUT_U16(msg, NL80211_ATTR_STA_AID, params->aid);
-       NLA_PUT(msg, NL80211_ATTR_STA_SUPPORTED_RATES, params->supp_rates_len,
-               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);
-       }
-#endif /* CONFIG_IEEE80211N */
-
-       ret = send_and_recv_msgs(drv, msg, NULL, NULL);
-       if (ret)
-               wpa_printf(MSG_DEBUG, "nl80211: NL80211_CMD_NEW_STATION "
-                          "result: %d (%s)", ret, strerror(-ret));
-       if (ret == -EEXIST)
-               ret = 0;
- nla_put_failure:
-       return ret;
-}
-
-
-static int i802_sta_remove(void *priv, const u8 *addr)
-{
-       struct wpa_driver_nl80211_data *drv = priv;
-       struct nl_msg *msg;
-       int ret;
-
-       msg = nlmsg_alloc();
-       if (!msg)
-               return -ENOMEM;
-
-       genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
-                   0, NL80211_CMD_DEL_STATION, 0);
-
-       NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
-                   if_nametoindex(drv->ifname));
-       NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
-
-       ret = send_and_recv_msgs(drv, msg, NULL, NULL);
-       if (ret == -ENOENT)
-               return 0;
-       return ret;
- nla_put_failure:
-       return -ENOBUFS;
-}
-
-
-static int i802_sta_set_flags(void *priv, const u8 *addr,
-                             int total_flags, int flags_or, int flags_and)
-{
-       struct wpa_driver_nl80211_data *drv = priv;
-       struct nl_msg *msg, *flags = NULL;
-
-       msg = nlmsg_alloc();
-       if (!msg)
-               return -ENOMEM;
-
-       flags = nlmsg_alloc();
-       if (!flags) {
-               nlmsg_free(msg);
-               return -ENOMEM;
-       }
-
-       genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
-                   0, NL80211_CMD_SET_STATION, 0);
-
-       NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
-                   if_nametoindex(drv->ifname));
-       NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
-
-       if (total_flags & WLAN_STA_AUTHORIZED)
-               NLA_PUT_FLAG(flags, NL80211_STA_FLAG_AUTHORIZED);
-
-       if (total_flags & WLAN_STA_WMM)
-               NLA_PUT_FLAG(flags, NL80211_STA_FLAG_WME);
-
-       if (total_flags & WLAN_STA_SHORT_PREAMBLE)
-               NLA_PUT_FLAG(flags, NL80211_STA_FLAG_SHORT_PREAMBLE);
-
-       if (total_flags & WLAN_STA_MFP)
-               NLA_PUT_FLAG(flags, NL80211_STA_FLAG_MFP);
-
-       if (nla_put_nested(msg, NL80211_ATTR_STA_FLAGS, flags))
-               goto nla_put_failure;
-
-       nlmsg_free(flags);
-
-       return send_and_recv_msgs(drv, msg, NULL, NULL);
- nla_put_failure:
-       nlmsg_free(flags);
-       return -ENOBUFS;
-}
-
-
 static int i802_set_tx_queue_params(void *priv, int queue, int aifs,
                                    int cw_min, int cw_max, int burst_time)
 {
@@ -3966,6 +3938,10 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
        .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,
+       .hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol,
+       .sta_set_flags = wpa_driver_nl80211_sta_set_flags,
 #endif /* CONFIG_AP || HOSTAPD */
 #ifdef HOSTAPD
        .hapd_init = i802_init,
@@ -3974,18 +3950,13 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
        .get_seqnum = i802_get_seqnum,
        .flush = i802_flush,
        .read_sta_data = i802_read_sta_data,
-       .hapd_send_eapol = i802_send_eapol,
-       .sta_set_flags = i802_sta_set_flags,
        .sta_deauth = i802_sta_deauth,
        .sta_disassoc = i802_sta_disassoc,
-       .sta_remove = i802_sta_remove,
-       .sta_add = i802_sta_add,
        .get_inact_sec = i802_get_inact_sec,
        .sta_clear_stats = i802_sta_clear_stats,
        .set_freq = i802_set_freq,
        .set_rts = i802_set_rts,
        .set_frag = i802_set_frag,
-       .set_retry = i802_set_retry,
        .set_rate_sets = i802_set_rate_sets,
        .hapd_set_beacon = i802_set_beacon,
        .set_cts_protect = i802_set_cts_protect,