diff options
| author | Marc <foxtrot@malloc.me> | 2022-01-13 01:07:23 +0000 |
|---|---|---|
| committer | Marc <foxtrot@malloc.me> | 2022-01-13 01:07:23 +0000 |
| commit | 275825dde0c4120135d1a563fd861d8bf141729a (patch) | |
| tree | 7f9f8d8b48e1e9540c48f4e3dab884c3ebd9cf57 /src/libwifi | |
| parent | 2057ed8028b4a5c951ed5b6005c5088890c1e689 (diff) | |
| download | libwifi-275825dde0c4120135d1a563fd861d8bf141729a.tar.gz libwifi-275825dde0c4120135d1a563fd861d8bf141729a.tar.bz2 libwifi-275825dde0c4120135d1a563fd861d8bf141729a.zip | |
core: Fix `libwifi_frame_verify()` and clarify usage.
Diffstat (limited to 'src/libwifi')
| -rw-r--r-- | src/libwifi/core/frame/crc.c | 6 | ||||
| -rw-r--r-- | src/libwifi/core/frame/crc.h | 9 |
2 files changed, 12 insertions, 3 deletions
| diff --git a/src/libwifi/core/frame/crc.c b/src/libwifi/core/frame/crc.c index 33dae06..8e45c85 100644 --- a/src/libwifi/core/frame/crc.c +++ b/src/libwifi/core/frame/crc.c | |||
| @@ -49,15 +49,17 @@ uint32_t libwifi_calculate_fcs(const unsigned char *frame, size_t frame_len) { | |||
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | /* | 51 | /* |
| 52 | * Verify a frame containing a FCS at the end to the FCS calculated | 52 | * Verify a raw frame containing a FCS at the end to the FCS calculated |
| 53 | * by libwifi. | 53 | * by libwifi. |
| 54 | */ | 54 | */ |
| 55 | int libwifi_frame_verify(void *frame, size_t frame_len) { | 55 | int libwifi_frame_verify(void *frame, size_t frame_len) { |
| 56 | uint32_t oCRC = *((uint32_t *) ((char *) frame + frame_len)); | 56 | // A frame with a CRC will have the CRC placed at the end, and is 4 bytes long. |
| 57 | uint32_t oCRC = *((uint32_t *) ((char *) frame + (frame_len - 4))); | ||
| 57 | uint32_t rCRC = libwifi_calculate_fcs(frame, frame_len); | 58 | uint32_t rCRC = libwifi_calculate_fcs(frame, frame_len); |
| 58 | 59 | ||
| 59 | if (rCRC == oCRC) { | 60 | if (rCRC == oCRC) { |
| 60 | return 1; | 61 | return 1; |
| 61 | } | 62 | } |
| 63 | |||
| 62 | return 0; | 64 | return 0; |
| 63 | } | 65 | } |
| diff --git a/src/libwifi/core/frame/crc.h b/src/libwifi/core/frame/crc.h index aab1c4e..0f89383 100644 --- a/src/libwifi/core/frame/crc.h +++ b/src/libwifi/core/frame/crc.h | |||
| @@ -38,7 +38,14 @@ uint32_t libwifi_crc32(const unsigned char *message, int message_len); | |||
| 38 | uint32_t libwifi_calculate_fcs(const unsigned char *frame, size_t frame_len); | 38 | uint32_t libwifi_calculate_fcs(const unsigned char *frame, size_t frame_len); |
| 39 | 39 | ||
| 40 | /** | 40 | /** |
| 41 | * Check if the given 802.11 frame has a valid FCS. | 41 | * Check if the given raw 802.11 frame has a valid FCS. |
| 42 | * | ||
| 43 | * This function relies on an assumption that the last 4 bytes of the supplied | ||
| 44 | * frame is the CRC, as stated in the Radiotap specification. | ||
| 45 | * | ||
| 46 | * You can check if the frame data has this field by using libwifi_get_wifi_frame() | ||
| 47 | * and then checking if the libwifi_frame's flags has the LIBWIFI_FLAGS_FCS_PRESENT | ||
| 48 | * bit set. | ||
| 42 | * | 49 | * |
| 43 | * @param frame An 802.11 frame with an FCS | 50 | * @param frame An 802.11 frame with an FCS |
| 44 | * @param frame_len Length of the frame | 51 | * @param frame_len Length of the frame |
