#ifndef _XFS_CKSUM_H
#define _XFS_CKSUM_H
#include "CRCTable.h"
#include "xfs_types.h"
#include "system_dependencies.h"
#define XFS_CRC_SEED (~(uint32)0)
static inline uint32
xfs_start_cksum_safe(const char *buffer, size_t length, uint32 cksum_offset)
{
uint32 zero = 0;
uint32 crc;
crc = calculate_crc32c(XFS_CRC_SEED, (uint8*)buffer, cksum_offset);
crc = calculate_crc32c(crc, (uint8*)&zero, sizeof(uint32));
return calculate_crc32c(crc, (uint8*)buffer + cksum_offset + sizeof(uint32),
length - (cksum_offset + sizeof(uint32)));
}
static inline uint32
xfs_start_cksum_update(const char *buffer, size_t length, uint32 cksum_offset)
{
*(uint32 *)(buffer + cksum_offset) = 0;
return calculate_crc32c(XFS_CRC_SEED, (uint8*)buffer, length);
}
static inline void
xfs_update_cksum(const char *buffer, size_t length, uint32 cksum_offset)
{
uint32 crc = xfs_start_cksum_update(buffer, length, cksum_offset);
*(uint32 *)(buffer + cksum_offset) = ~crc;
}
static inline int
xfs_verify_cksum(const char *buffer, size_t length, uint32 cksum_offset)
{
uint32 crc = xfs_start_cksum_safe(buffer, length, cksum_offset);
TRACE("calculated crc: (%" B_PRIu32 ")\n", ~crc);
TRACE("buffer = %s, cksum_offset: (%" B_PRIu32 ")\n", buffer, cksum_offset);
return *(uint32 *)(buffer + cksum_offset) == (~crc);
}