]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Use a shared helper function for merging supported rate lists
authorJouni Malinen <j@w1.fi>
Sun, 19 Aug 2012 14:52:41 +0000 (17:52 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 19 Aug 2012 14:52:41 +0000 (17:52 +0300)
Signed-hostap: Jouni Malinen <j@w1.fi>

src/ap/ap_list.c
src/ap/ieee802_11.c
src/utils/common.c
src/utils/common.h

index 933b1585048f9d5984fa8077b092aac0d7427cbf..18090ca18c0b9feedea986cac43d2f389affced2 100644 (file)
@@ -251,23 +251,9 @@ void ap_list_process_beacon(struct hostapd_iface *iface,
                ap->ssid_len = len;
        }
 
-       os_memset(ap->supported_rates, 0, WLAN_SUPP_RATES_MAX);
-       len = 0;
-       if (elems->supp_rates) {
-               len = elems->supp_rates_len;
-               if (len > WLAN_SUPP_RATES_MAX)
-                       len = WLAN_SUPP_RATES_MAX;
-               os_memcpy(ap->supported_rates, elems->supp_rates, len);
-       }
-       if (elems->ext_supp_rates) {
-               int len2;
-               if (len + elems->ext_supp_rates_len > WLAN_SUPP_RATES_MAX)
-                       len2 = WLAN_SUPP_RATES_MAX - len;
-               else
-                       len2 = elems->ext_supp_rates_len;
-               os_memcpy(ap->supported_rates + len, elems->ext_supp_rates,
-                         len2);
-       }
+       merge_byte_arrays(ap->supported_rates, WLAN_SUPP_RATES_MAX,
+                         elems->supp_rates, elems->supp_rates_len,
+                         elems->ext_supp_rates, elems->ext_supp_rates_len);
 
        ap->wpa = elems->wpa_ie != NULL;
 
index 4d8b3e6e2de2d05f7fb985560932dbf1ddc92878..a795539ed9b6ae4fb33b753240096f85a62937d0 100644 (file)
@@ -586,35 +586,20 @@ static u16 copy_supp_rates(struct hostapd_data *hapd, struct sta_info *sta,
                return WLAN_STATUS_UNSPECIFIED_FAILURE;
        }
 
-       if (elems->supp_rates_len > sizeof(sta->supported_rates)) {
+       if (elems->supp_rates_len + elems->ext_supp_rates_len >
+           sizeof(sta->supported_rates)) {
                hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
                               HOSTAPD_LEVEL_DEBUG,
-                              "Invalid supported rates element length %d",
-                              elems->supp_rates_len);
+                              "Invalid supported rates element length %d+%d",
+                              elems->supp_rates_len,
+                              elems->ext_supp_rates_len);
                return WLAN_STATUS_UNSPECIFIED_FAILURE;
        }
 
-       os_memset(sta->supported_rates, 0, sizeof(sta->supported_rates));
-       os_memcpy(sta->supported_rates, elems->supp_rates,
-                 elems->supp_rates_len);
-       sta->supported_rates_len = elems->supp_rates_len;
-
-       if (elems->ext_supp_rates) {
-               if (elems->supp_rates_len + elems->ext_supp_rates_len >
-                   sizeof(sta->supported_rates)) {
-                       hostapd_logger(hapd, sta->addr,
-                                      HOSTAPD_MODULE_IEEE80211,
-                                      HOSTAPD_LEVEL_DEBUG,
-                                      "Invalid supported rates element length"
-                                      " %d+%d", elems->supp_rates_len,
-                                      elems->ext_supp_rates_len);
-                       return WLAN_STATUS_UNSPECIFIED_FAILURE;
-               }
-
-               os_memcpy(sta->supported_rates + elems->supp_rates_len,
-                         elems->ext_supp_rates, elems->ext_supp_rates_len);
-               sta->supported_rates_len += elems->ext_supp_rates_len;
-       }
+       sta->supported_rates_len = merge_byte_arrays(
+               sta->supported_rates, sizeof(sta->supported_rates),
+               elems->supp_rates, elems->supp_rates_len,
+               elems->ext_supp_rates, elems->ext_supp_rates_len);
 
        return WLAN_STATUS_SUCCESS;
 }
index bae73faca9a5ec08f3e4ad47cc057aecd14272c0..e63698491444b651bdf17dc5fb10c81441234c58 100644 (file)
@@ -578,3 +578,35 @@ int is_hex(const u8 *data, size_t len)
        }
        return 0;
 }
+
+
+size_t merge_byte_arrays(u8 *res, size_t res_len,
+                        const u8 *src1, size_t src1_len,
+                        const u8 *src2, size_t src2_len)
+{
+       size_t len = 0;
+
+       os_memset(res, 0, res_len);
+
+       if (src1) {
+               if (src1_len >= res_len) {
+                       os_memcpy(res, src1, res_len);
+                       return res_len;
+               }
+
+               os_memcpy(res, src1, src1_len);
+               len += src1_len;
+       }
+
+       if (src2) {
+               if (len + src2_len >= res_len) {
+                       os_memcpy(res + len, src2, res_len - len);
+                       return res_len;
+               }
+
+               os_memcpy(res + len, src2, src2_len);
+               len += src2_len;
+       }
+
+       return len;
+}
index 18b76bd43a7d5494a412ee2c0e859fbabec360b6..5fc916c0ab9343f1a48bf252bef7cd78fad67c96 100644 (file)
@@ -448,6 +448,9 @@ const char * wpa_ssid_txt(const u8 *ssid, size_t ssid_len);
 
 char * wpa_config_parse_string(const char *value, size_t *len);
 int is_hex(const u8 *data, size_t len);
+size_t merge_byte_arrays(u8 *res, size_t res_len,
+                        const u8 *src1, size_t src1_len,
+                        const u8 *src2, size_t src2_len);
 
 static inline int is_zero_ether_addr(const u8 *a)
 {