]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Implement noack policy for send_mlme
authorHelmut Schaa <helmut.schaa@googlemail.com>
Sat, 19 Nov 2011 17:22:13 +0000 (19:22 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 19 Nov 2011 17:22:13 +0000 (19:22 +0200)
Signed-hostap: Helmut Schaa <helmut.schaa@googlemail.com>

src/drivers/driver_nl80211.c
src/utils/radiotap.h

index 4884d62d901a2ba6dbff8446c5ee126674b3ef2f..1c71948cc19e225e937065f4758a7e905b3926cd 100644 (file)
@@ -4158,7 +4158,7 @@ wpa_driver_nl80211_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
 
 static int wpa_driver_nl80211_send_frame(struct wpa_driver_nl80211_data *drv,
                                         const void *data, size_t len,
-                                        int encrypt)
+                                        int encrypt, int noack)
 {
        __u8 rtap_hdr[] = {
                0x00, 0x00, /* radiotap version */
@@ -4189,6 +4189,7 @@ static int wpa_driver_nl80211_send_frame(struct wpa_driver_nl80211_data *drv,
                .msg_flags = 0,
        };
        int res;
+       u16 txflags = 0;
 
        if (encrypt)
                rtap_hdr[8] |= IEEE80211_RADIOTAP_F_WEP;
@@ -4199,6 +4200,10 @@ static int wpa_driver_nl80211_send_frame(struct wpa_driver_nl80211_data *drv,
                return -1;
        }
 
+       if (noack)
+               txflags |= IEEE80211_RADIOTAP_F_TX_NOACK;
+       *(le16 *) &rtap_hdr[12] = host_to_le16(txflags);
+
        res = sendmsg(drv->monitor_sock, &msg, 0);
        if (res < 0) {
                wpa_printf(MSG_INFO, "nl80211: sendmsg: %s", strerror(errno));
@@ -4251,7 +4256,8 @@ static int wpa_driver_nl80211_send_mlme(void *priv, const u8 *data,
                        encrypt = 0;
        }
 
-       return wpa_driver_nl80211_send_frame(drv, data, data_len, encrypt);
+       return wpa_driver_nl80211_send_frame(drv, data, data_len, encrypt,
+                                            noack);
 }
 
 
@@ -5211,7 +5217,7 @@ static int wpa_driver_nl80211_hapd_send_eapol(
        pos += 2;
        memcpy(pos, data, data_len);
 
-       res = wpa_driver_nl80211_send_frame(drv, (u8 *) hdr, len, encrypt);
+       res = wpa_driver_nl80211_send_frame(drv, (u8 *) hdr, len, encrypt, 0);
        if (res < 0) {
                wpa_printf(MSG_ERROR, "i802_send_eapol - packet len: %lu - "
                           "failed: %d (%s)",
@@ -7300,7 +7306,7 @@ static int nl80211_send_frame(void *priv, const u8 *data, size_t data_len,
 {
        struct i802_bss *bss = priv;
        struct wpa_driver_nl80211_data *drv = bss->drv;
-       return wpa_driver_nl80211_send_frame(drv, data, data_len, encrypt);
+       return wpa_driver_nl80211_send_frame(drv, data, data_len, encrypt, 0);
 }
 
 
index 508264c4cf333d734ce28df470c7767e007791aa..137288f9a1e010872a572a72b89d389ba89d065b 100644 (file)
@@ -238,5 +238,6 @@ enum ieee80211_radiotap_type {
                                                 * retries */
 #define IEEE80211_RADIOTAP_F_TX_CTS    0x0002  /* used cts 'protection' */
 #define IEEE80211_RADIOTAP_F_TX_RTS    0x0004  /* used rts/cts handshake */
+#define IEEE80211_RADIOTAP_F_TX_NOACK  0x0008  /* don't expect an ACK */
 
 #endif                         /* IEEE80211_RADIOTAP_H */