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 + sizeof(*radiotap_header);
119 iterator->_reset_on_ext = 0;
120 iterator->_next_bitmap = &radiotap_header->it_present;
121 iterator->_next_bitmap++;
122 iterator->_vns = vns;
123 iterator->current_namespace = &radiotap_ns;
124 iterator->is_radiotap_ns = 1;
128 if (iterator->_bitmap_shifter & (1<<IEEE80211_RADIOTAP_EXT)) {
129 if ((unsigned long)iterator->_arg -
130 (unsigned long)iterator->_rtheader + sizeof(uint32_t) >
131 (unsigned long)iterator->_max_length)
133 while (get_unaligned_le32(iterator->_arg) &
135 iterator->_arg += sizeof(uint32_t);
143 if ((unsigned long)iterator->_arg -
144 (unsigned long)iterator->_rtheader +
146 (unsigned long)iterator->_max_length)
150 iterator->_arg += sizeof(uint32_t);
159 iterator->this_arg = iterator->_arg;
167 static void find_ns(struct ieee80211_radiotap_iterator *iterator,
172 iterator->current_namespace = NULL;
174 if (!iterator->_vns)
177 for (i = 0; i < iterator->_vns->n_ns; i++) {
178 if (iterator->_vns->ns[i].oui != oui)
180 if (iterator->_vns->ns[i].subns != subns)
183 iterator->current_namespace = &iterator->_vns->ns[i];
191 * ieee80211_radiotap_iterator_next - return next radiotap parser iterator arg
192 * @iterator: radiotap_iterator to move to next arg (if any)
207 * You must take care when dereferencing iterator.this_arg
209 * get_unaligned((type *)iterator.this_arg) to dereference
210 * iterator.this_arg for type "type" safely on all arches.
214 struct ieee80211_radiotap_iterator *iterator)
222 if ((iterator->_arg_index % 32) == IEEE80211_RADIOTAP_EXT &&
223 !(iterator->_bitmap_shifter & 1))
226 if (!(iterator->_bitmap_shifter & 1))
230 switch (iterator->_arg_index % 32) {
241 if (!iterator->current_namespace ||
242 iterator->_arg_index >= iterator->current_namespace->n_bits) {
243 if (iterator->current_namespace == &radiotap_ns)
247 align = iterator->current_namespace->align_size[iterator->_arg_index].align;
248 size = iterator->current_namespace->align_size[iterator->_arg_index].size;
252 iterator->_arg = iterator->_next_ns_data;
254 iterator->current_namespace = NULL;
272 pad = ((unsigned long)iterator->_arg -
273 (unsigned long)iterator->_rtheader) & (align - 1);
276 iterator->_arg += align - pad;
278 if (iterator->_arg_index % 32 == IEEE80211_RADIOTAP_VENDOR_NAMESPACE) {
281 if ((unsigned long)iterator->_arg + size -
282 (unsigned long)iterator->_rtheader >
283 (unsigned long)iterator->_max_length)
286 oui = (*iterator->_arg << 16) |
287 (*(iterator->_arg + 1) << 8) |
288 *(iterator->_arg + 2);
289 subns = *(iterator->_arg + 3);
291 find_ns(iterator, oui, subns);
293 vnslen = get_unaligned_le16(iterator->_arg + 4);
294 iterator->_next_ns_data = iterator->_arg + size + vnslen;
295 if (!iterator->current_namespace)
303 iterator->this_arg_index = iterator->_arg_index;
304 iterator->this_arg = iterator->_arg;
305 iterator->this_arg_size = size;
308 iterator->_arg += size;
317 if ((unsigned long)iterator->_arg -
318 (unsigned long)iterator->_rtheader >
319 (unsigned long)iterator->_max_length)
323 switch (iterator->_arg_index % 32) {
325 iterator->_reset_on_ext = 1;
327 iterator->is_radiotap_ns = 0;
334 iterator->this_arg_index =
336 if (!iterator->current_namespace)
340 iterator->_reset_on_ext = 1;
341 iterator->current_namespace = &radiotap_ns;
342 iterator->is_radiotap_ns = 1;
349 iterator->_bitmap_shifter =
350 get_unaligned_le32(iterator->_next_bitmap);
351 iterator->_next_bitmap++;
352 if (iterator->_reset_on_ext)
353 iterator->_arg_index = 0;
355 iterator->_arg_index++;
356 iterator->_reset_on_ext = 0;
362 iterator->_bitmap_shifter >>= 1;
363 iterator->_arg_index++;