diff options
-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 |