Vendor Unique iSCSI CRC32C
August 2016 Data Integrity Validation 259
crc = calc_crc32c_intel(buf, len, CRC32C_INIT);
#endif
} else {
/* use software crc */
crc = calc_crc32c_sw(buf, len, CRC32C_INIT);
}
/*************************/
/* End Solaris ONLY */
/*************************/
#else
/********************/
/* Linux ONLY */
/********************/
if (hasSSE42()) {
/* use intel crc instruction */
crc = calc_crc32c_intel(buf, len, CRC32C_INIT);
} else {
/* use software crc */
crc = calc_crc32c_sw(buf, len, CRC32C_INIT);
}
/* printf("hasSSE42 %d\n", hasSSE42()); */
/*************************/
/* End Linux ONLY */
/*************************/
#endif
/* add crc to tape block in big endian format */
#if defined(__sparc)
buf[len] = (uchar_t)(crc);
buf[len+1] = (uchar_t)(crc >> 8);
buf[len+2] = (uchar_t)(crc >> 16);
buf[len+3] = (uchar_t)(crc >> 24);
#else
buf[len] = (uchar_t)(crc >> 24);
buf[len+1] = (uchar_t)(crc >> 16);
buf[len+2] = (uchar_t)(crc >> 8);
buf[len+3] = (uchar_t)(crc);
#endif
}
Software Method
/***************************************************************
*
* CRC LOOKUP TABLE
*
***************************************************************/
uint32_t crc32c_table[256] =
{