mac80211: Use IWEVASSOCREQIE instead of IWEVCUSTOM
authorJouni Malinen <jouni.malinen@atheros.com>
Tue, 19 Aug 2008 07:54:32 +0000 (10:54 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 27 Aug 2008 00:06:32 +0000 (20:06 -0400)
The previous code was using IWEVCUSTOM to report IEs from AssocReq and
AssocResp frames into user space. This can easily hit the 256 byte
limit (IW_CUSTOM_MAX) with APs that include number of vendor IEs in
AssocResp. This results in the event message not being sent and dmesg
showing "wlan0 (WE) : Wireless Event too big (366)" type of errors.

Convert mac80211 to use IWEVASSOCREQIE/IWEVASSOCRESPIE to avoid the
issue of being unable to send association IEs as wireless events. These
newer event types use binary encoding and larger maximum size
(IW_GENERIC_IE_MAX = 1024), so the likelyhood of not being able to send
the IEs is much smaller than with IWEVCUSTOM. As an extra benefit, the
code is also quite a bit simpler since there is no need to allocate an
extra buffer for hex encoding.

Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/mlme.c

index 1e97fb9fb34bde3f88988e42cd546b43d95a5b6e..09a56e24b799795652c2f1f28a117f6b1e922cf7 100644 (file)
@@ -478,51 +478,21 @@ int ieee80211_ht_addt_info_ie_to_ht_bss_info(
 static void ieee80211_sta_send_associnfo(struct net_device *dev,
                                         struct ieee80211_if_sta *ifsta)
 {
-       char *buf;
-       size_t len;
-       int i;
        union iwreq_data wrqu;
 
-       if (!ifsta->assocreq_ies && !ifsta->assocresp_ies)
-               return;
-
-       buf = kmalloc(50 + 2 * (ifsta->assocreq_ies_len +
-                               ifsta->assocresp_ies_len), GFP_KERNEL);
-       if (!buf)
-               return;
-
-       len = sprintf(buf, "ASSOCINFO(");
        if (ifsta->assocreq_ies) {
-               len += sprintf(buf + len, "ReqIEs=");
-               for (i = 0; i < ifsta->assocreq_ies_len; i++) {
-                       len += sprintf(buf + len, "%02x",
-                                      ifsta->assocreq_ies[i]);
-               }
-       }
-       if (ifsta->assocresp_ies) {
-               if (ifsta->assocreq_ies)
-                       len += sprintf(buf + len, " ");
-               len += sprintf(buf + len, "RespIEs=");
-               for (i = 0; i < ifsta->assocresp_ies_len; i++) {
-                       len += sprintf(buf + len, "%02x",
-                                      ifsta->assocresp_ies[i]);
-               }
+               memset(&wrqu, 0, sizeof(wrqu));
+               wrqu.data.length = ifsta->assocreq_ies_len;
+               wireless_send_event(dev, IWEVASSOCREQIE, &wrqu,
+                                   ifsta->assocreq_ies);
        }
-       len += sprintf(buf + len, ")");
 
-       if (len > IW_CUSTOM_MAX) {
-               len = sprintf(buf, "ASSOCRESPIE=");
-               for (i = 0; i < ifsta->assocresp_ies_len; i++) {
-                       len += sprintf(buf + len, "%02x",
-                                      ifsta->assocresp_ies[i]);
-               }
+       if (ifsta->assocresp_ies) {
+               memset(&wrqu, 0, sizeof(wrqu));
+               wrqu.data.length = ifsta->assocresp_ies_len;
+               wireless_send_event(dev, IWEVASSOCRESPIE, &wrqu,
+                                   ifsta->assocresp_ies);
        }
-
-       memset(&wrqu, 0, sizeof(wrqu));
-       wrqu.data.length = len;
-       wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
-
-       kfree(buf);
 }