source: branches/backfire/package/hostapd/patches/570-wpa_ie_cap_workaround.patch @ 28168

Last change on this file since 28168 was 28168, checked in by nbd, 5 years ago

hostapd: add a workaround for driver issues in various android devices with texas instruments wifi (backport of r28167)

File size: 1.4 KB
  • src/common/wpa_common.c

    a b const char * wpa_key_mgmt_txt(int key_mg 
    811811} 
    812812 
    813813 
     814static void wpa_fixup_wpa_ie_rsn(u8 *assoc_ie, const u8 *wpa_msg_ie, 
     815                                 size_t rsn_ie_len) 
     816{ 
     817        int pos, count; 
     818 
     819        pos = sizeof(struct rsn_ie_hdr) + RSN_SELECTOR_LEN; 
     820        if (rsn_ie_len < pos + 2) 
     821                return; 
     822 
     823        count = WPA_GET_LE16(wpa_msg_ie + pos); 
     824        pos += 2 + count * RSN_SELECTOR_LEN; 
     825        if (rsn_ie_len < pos + 2) 
     826                return; 
     827 
     828        count = WPA_GET_LE16(wpa_msg_ie + pos); 
     829        pos += 2 + count * RSN_SELECTOR_LEN; 
     830        if (rsn_ie_len < pos + 2) 
     831                return; 
     832 
     833        if (!assoc_ie[pos] && !assoc_ie[pos + 1] && 
     834            (wpa_msg_ie[pos] || wpa_msg_ie[pos + 1])) 
     835                memcpy(&assoc_ie[pos], &wpa_msg_ie[pos], 2); 
     836} 
     837 
     838 
    814839int wpa_compare_rsn_ie(int ft_initial_assoc, 
    815840                       const u8 *ie1, size_t ie1len, 
    816841                       const u8 *ie2, size_t ie2len) 
    int wpa_compare_rsn_ie(int ft_initial_as 
    818843        if (ie1 == NULL || ie2 == NULL) 
    819844                return -1; 
    820845 
    821         if (ie1len == ie2len && os_memcmp(ie1, ie2, ie1len) == 0) 
    822                 return 0; /* identical IEs */ 
     846        if (ie1len == ie2len) { 
     847                u8 *ie_tmp; 
     848 
     849                if (os_memcmp(ie1, ie2, ie1len) == 0) 
     850                        return 0; /* identical IEs */ 
     851 
     852                ie_tmp = alloca(ie1len); 
     853                memcpy(ie_tmp, ie1, ie1len); 
     854                wpa_fixup_wpa_ie_rsn(ie_tmp, ie2, ie1len); 
     855 
     856                if (os_memcmp(ie_tmp, ie2, ie1len) == 0) 
     857                        return 0; /* only mismatch in RSN capabilties */ 
     858        } 
    823859 
    824860#ifdef CONFIG_IEEE80211R 
    825861        if (ft_initial_assoc) { 
Note: See TracBrowser for help on using the repository browser.