radiotap: Fix compiler issues with packed structures

Replace the Radiotap parser platform.h file with use of helper functions
from utils/common.h to avoid compiler issues with the updated design and
getting pointers to members of packet structs.

Silence the warning about _next_bitmap assignment. This pointer is
dereferenced only with operations that are safe for unaligned access, so
the compiler warning is not helpful here.

__packed might not be defined in this context, so use STRUCT_PACKED from
utils/common.h.

Fixes: e6ac269433 ("radiotap: Update radiotap parser")
Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2021-02-21 12:07:38 +02:00
parent fcdf5d93ea
commit 10502ad59f
3 changed files with 12 additions and 15 deletions

View file

@ -1,21 +1,18 @@
/*
* Platform definitions for Radiotap parser
* Copyright (c) 2021, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
*/
#ifndef PLATFORM_H #ifndef PLATFORM_H
#define PLATFORM_H #define PLATFORM_H
#include "includes.h" #include "includes.h"
#include "common.h" #include "common.h"
#define le16_to_cpu le_to_host16 #define get_unaligned_le16(p) WPA_GET_LE16((void *) (p))
#define le32_to_cpu le_to_host32 #define get_unaligned_le32(p) WPA_GET_LE32((void *) (p))
#define get_unaligned(p) \
({ \
struct packed_dummy_struct { \
typeof(*(p)) __val; \
} __attribute__((packed)) *__ptr = (void *) (p); \
\
__ptr->__val; \
})
#define get_unaligned_le16(p) le16_to_cpu(get_unaligned((le16 *)(p)))
#define get_unaligned_le32(p) le32_to_cpu(get_unaligned((le32 *)(p)))
#endif /* PLATFORM_H */ #endif /* PLATFORM_H */

View file

@ -111,7 +111,7 @@ int ieee80211_radiotap_iterator_init(
iterator->_arg = (uint8_t *)radiotap_header + sizeof(*radiotap_header); iterator->_arg = (uint8_t *)radiotap_header + sizeof(*radiotap_header);
iterator->_next_ns_data = NULL; iterator->_next_ns_data = NULL;
iterator->_reset_on_ext = 0; iterator->_reset_on_ext = 0;
iterator->_next_bitmap = &radiotap_header->it_present; iterator->_next_bitmap = (le32 *) (((u8 *) radiotap_header) + offsetof(struct ieee80211_radiotap_header, it_present));
iterator->_next_bitmap++; iterator->_next_bitmap++;
iterator->_vns = vns; iterator->_vns = vns;
iterator->current_namespace = &radiotap_ns; iterator->current_namespace = &radiotap_ns;

View file

@ -39,7 +39,7 @@ struct ieee80211_radiotap_header {
* @it_present: (first) present word * @it_present: (first) present word
*/ */
le32 it_present; le32 it_present;
} __packed; } STRUCT_PACKED;
/* version is always 0 */ /* version is always 0 */
#define PKTHDR_RADIOTAP_VERSION 0 #define PKTHDR_RADIOTAP_VERSION 0