Lines Matching refs:iterator

58  * ieee80211_radiotap_iterator_init - radiotap parser iterator initialization
59 * @iterator: radiotap_iterator to initialize
66 * This function initializes an opaque iterator struct which can then
72 * call __ieee80211_radiotap_iterator_init() to init a semi-opaque iterator
77 * The iterator's @this_arg member points to the start of the argument
79 * found in the iterator's @this_arg_index member. This arg index corresponds
84 * iterator->max_length after executing ieee80211_radiotap_iterator_init()
88 * You must take care when dereferencing iterator.this_arg
90 * get_unaligned((type *)iterator.this_arg) to dereference
91 * iterator.this_arg for type "type" safely on all arches.
98 struct ieee80211_radiotap_iterator *iterator,
114 iterator->_rtheader = radiotap_header;
115 iterator->_max_length = get_unaligned_le16(&radiotap_header->it_len);
116 iterator->_arg_index = 0;
117 iterator->_bitmap_shifter = get_unaligned_le32(&radiotap_header->it_present);
118 iterator->_arg = (uint8_t *)radiotap_header->it_optional;
119 iterator->_reset_on_ext = 0;
120 iterator->_next_bitmap = radiotap_header->it_optional;
121 iterator->_vns = vns;
122 iterator->current_namespace = &radiotap_ns;
123 iterator->is_radiotap_ns = 1;
127 if (iterator->_bitmap_shifter & (BIT(IEEE80211_RADIOTAP_EXT))) {
128 if ((unsigned long)iterator->_arg -
129 (unsigned long)iterator->_rtheader + sizeof(uint32_t) >
130 (unsigned long)iterator->_max_length)
132 while (get_unaligned_le32(iterator->_arg) &
134 iterator->_arg += sizeof(uint32_t);
142 if ((unsigned long)iterator->_arg -
143 (unsigned long)iterator->_rtheader +
145 (unsigned long)iterator->_max_length)
149 iterator->_arg += sizeof(uint32_t);
158 iterator->this_arg = iterator->_arg;
166 static void find_ns(struct ieee80211_radiotap_iterator *iterator,
171 iterator->current_namespace = NULL;
173 if (!iterator->_vns)
176 for (i = 0; i < iterator->_vns->n_ns; i++) {
177 if (iterator->_vns->ns[i].oui != oui)
179 if (iterator->_vns->ns[i].subns != subns)
182 iterator->current_namespace = &iterator->_vns->ns[i];
190 * ieee80211_radiotap_iterator_next - return next radiotap parser iterator arg
191 * @iterator: radiotap_iterator to move to next arg (if any)
206 * You must take care when dereferencing iterator.this_arg
208 * get_unaligned((type *)iterator.this_arg) to dereference
209 * iterator.this_arg for type "type" safely on all arches.
213 struct ieee80211_radiotap_iterator *iterator)
221 if ((iterator->_arg_index % 32) == IEEE80211_RADIOTAP_EXT &&
222 !(iterator->_bitmap_shifter & 1))
225 if (!(iterator->_bitmap_shifter & 1))
229 switch (iterator->_arg_index % 32) {
240 if (!iterator->current_namespace ||
241 iterator->_arg_index >= iterator->current_namespace->n_bits) {
242 if (iterator->current_namespace == &radiotap_ns)
246 align = iterator->current_namespace->align_size[iterator->_arg_index].align;
247 size = iterator->current_namespace->align_size[iterator->_arg_index].size;
251 iterator->_arg = iterator->_next_ns_data;
253 iterator->current_namespace = NULL;
271 pad = ((unsigned long)iterator->_arg -
272 (unsigned long)iterator->_rtheader) & (align - 1);
275 iterator->_arg += align - pad;
277 if (iterator->_arg_index % 32 == IEEE80211_RADIOTAP_VENDOR_NAMESPACE) {
280 if ((unsigned long)iterator->_arg + size -
281 (unsigned long)iterator->_rtheader >
282 (unsigned long)iterator->_max_length)
285 oui = (*iterator->_arg << 16) |
286 (*(iterator->_arg + 1) << 8) |
287 *(iterator->_arg + 2);
288 subns = *(iterator->_arg + 3);
290 find_ns(iterator, oui, subns);
292 vnslen = get_unaligned_le16(iterator->_arg + 4);
293 iterator->_next_ns_data = iterator->_arg + size + vnslen;
294 if (!iterator->current_namespace)
302 iterator->this_arg_index = iterator->_arg_index;
303 iterator->this_arg = iterator->_arg;
304 iterator->this_arg_size = size;
307 iterator->_arg += size;
316 if ((unsigned long)iterator->_arg -
317 (unsigned long)iterator->_rtheader >
318 (unsigned long)iterator->_max_length)
322 switch (iterator->_arg_index % 32) {
324 iterator->_reset_on_ext = 1;
326 iterator->is_radiotap_ns = 0;
333 iterator->this_arg_index =
335 if (!iterator->current_namespace)
339 iterator->_reset_on_ext = 1;
340 iterator->current_namespace = &radiotap_ns;
341 iterator->is_radiotap_ns = 1;
348 iterator->_bitmap_shifter =
349 get_unaligned_le32(iterator->_next_bitmap);
350 iterator->_next_bitmap++;
351 if (iterator->_reset_on_ext)
352 iterator->_arg_index = 0;
354 iterator->_arg_index++;
355 iterator->_reset_on_ext = 0;
361 iterator->_bitmap_shifter >>= 1;
362 iterator->_arg_index++;