struct ieee802_11_elems *elems,
                               u64 filter, u32 crc)
 {
-       size_t left = len;
-       const u8 *pos = start;
+       struct element *elem;
        bool calc_crc = filter != 0;
        DECLARE_BITMAP(seen_elems, 256);
        const u8 *ie;
        elems->ie_start = start;
        elems->total_len = len;
 
-       while (left >= 2) {
-               u8 id, elen;
+       for_each_element(elem, start, len) {
                bool elem_parse_failed;
-
-               id = *pos++;
-               elen = *pos++;
-               left -= 2;
-
-               if (elen > left) {
-                       elems->parse_error = true;
-                       break;
-               }
+               u8 id = elem->id;
+               u8 elen = elem->datalen;
+               const u8 *pos = elem->data;
 
                switch (id) {
                case WLAN_EID_SSID:
                 */
                        if (test_bit(id, seen_elems)) {
                                elems->parse_error = true;
-                               left -= elen;
-                               pos += elen;
                                continue;
                        }
                        break;
                        elems->parse_error = true;
                else
                        __set_bit(id, seen_elems);
-
-               left -= elen;
-               pos += elen;
        }
 
-       if (left != 0)
+       if (!for_each_element_completed(elem, start, len))
                elems->parse_error = true;
 
        return crc;