/* * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. * Copyright (c) 2004-2006 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2009 IBM Corporation. All rights reserved. * Copyright (c) 2009 Los Alamos National Security, LLC. All rights * reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */ #ifndef _OPAL_CRC_H_ #define _OPAL_CRC_H_ #include "opal_config.h" #include BEGIN_C_DECLS #define CRC_POLYNOMIAL ((unsigned int) 0x04c11db7) #define CRC_INITIAL_REGISTER ((unsigned int) 0xffffffff) #define OPAL_CSUM(SRC, LEN) opal_uicsum(SRC, LEN) #define OPAL_CSUM_PARTIAL(SRC, LEN, UI1, UI2) opal_uicsum_partial(SRC, LEN, UI1, UI2) #define OPAL_CSUM_BCOPY_PARTIAL(SRC, DST, LEN1, LEN2, UI1, UI2) \ opal_bcopy_uicsum_partial(SRC, DST, LEN1, LEN2, UI1, UI2) #define OPAL_CSUM_ZERO 0 OPAL_DECLSPEC unsigned long opal_bcopy_csum_partial(const void *source, void *destination, size_t copylen, size_t csumlen, unsigned long *lastPartialLong, size_t *lastPartialLength); static inline unsigned long opal_bcopy_csum(const void *source, void *destination, size_t copylen, size_t csumlen) { unsigned long plong = 0; size_t plength = 0; return opal_bcopy_csum_partial(source, destination, copylen, csumlen, &plong, &plength); } OPAL_DECLSPEC unsigned int opal_bcopy_uicsum_partial(const void *source, void *destination, size_t copylen, size_t csumlen, unsigned int *lastPartialInt, size_t *lastPartialLength); static inline unsigned int opal_bcopy_uicsum(const void *source, void *destination, size_t copylen, size_t csumlen) { unsigned int pint = 0; size_t plength = 0; return opal_bcopy_uicsum_partial(source, destination, copylen, csumlen, &pint, &plength); } OPAL_DECLSPEC unsigned long opal_csum_partial(const void *source, size_t csumlen, unsigned long *lastPartialLong, size_t *lastPartialLength); static inline unsigned long opal_csum(const void *source, size_t csumlen) { unsigned long lastPartialLong = 0; size_t lastPartialLength = 0; return opal_csum_partial(source, csumlen, &lastPartialLong, &lastPartialLength); } /* * The buffer passed to this function is assumed to be 16-bit aligned */ static inline uint16_t opal_csum16(const void *source, size_t csumlen) { uint16_t *src = (uint16_t *) source; register uint32_t csum = 0; while (csumlen > 1) { csum += *src++; csumlen -= 2; } /* Add leftover byte, if any */ if (csumlen > 0) csum += *((unsigned char *) src); /* Fold 32-bit checksum to 16 bits */ while (csum >> 16) { csum = (csum & 0xFFFF) + (csum >> 16); } return csum; } OPAL_DECLSPEC unsigned int opal_uicsum_partial(const void *source, size_t csumlen, unsigned int *lastPartialInt, size_t *lastPartialLength); static inline unsigned int opal_uicsum(const void *source, size_t csumlen) { unsigned int lastPartialInt = 0; size_t lastPartialLength = 0; return opal_uicsum_partial(source, csumlen, &lastPartialInt, &lastPartialLength); } /* * CRC Support */ void opal_initialize_crc_table(void); OPAL_DECLSPEC unsigned int opal_bcopy_uicrc_partial(const void *source, void *destination, size_t copylen, size_t crclen, unsigned int partial_crc); static inline unsigned int opal_bcopy_uicrc(const void *source, void *destination, size_t copylen, size_t crclen) { return opal_bcopy_uicrc_partial(source, destination, copylen, crclen, CRC_INITIAL_REGISTER); } OPAL_DECLSPEC unsigned int opal_uicrc_partial(const void *source, size_t crclen, unsigned int partial_crc); static inline unsigned int opal_uicrc(const void *source, size_t crclen) { return opal_uicrc_partial(source, crclen, CRC_INITIAL_REGISTER); } END_C_DECLS #endif