fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/*
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * CDDL HEADER START
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * The contents of this file are subject to the terms of the
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * Common Development and Distribution License (the "License").
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * You may not use this file except in compliance with the License.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * or http://www.opensolaris.org/os/licensing.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * See the License for the specific language governing permissions
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * and limitations under the License.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * When distributing Covered Code, include this CDDL HEADER in each
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * If applicable, add the following below this CDDL HEADER, with the
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * fields enclosed by brackets "[]" replaced with your own identifying
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * information: Portions Copyright [yyyy] [name of copyright owner]
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * CDDL HEADER END
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/*
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * Copyright 2000 by Cisco Systems, Inc. All rights reserved.
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * Use is subject to license terms.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * This file contains CRC-32C code use to verify
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * iSCSI HeaderDigests and DataDigests.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#include <sys/types.h> /* standard types */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#include "iscsi.h" /* contains prototypes */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#include <hd_crc.h>
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/*
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * This is the CRC-32C table
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * Generated with:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * width = 32 bits
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * poly = 0x1EDC6F41
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * reflect input bytes = true
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * reflect output bytes = true
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteuint32_t iscsi_crc32c_table[256] =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte};
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * -1 - uninitialized
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * 0 - applicable
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * others - NA
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengstatic int iscsi_crc32_hd = -1;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/*
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * iscsi_crc32c - Steps through buffer one byte at at time, calculates
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * reflected crc using table.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteuint32_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteiscsi_crc32c(void *address, unsigned long length)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint8_t *buffer = address;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t crc = 0xffffffff, result;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef _BIG_ENDIAN
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint8_t byte0, byte1, byte2, byte3;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#endif
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng if (iscsi_crc32_hd == -1) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng if (hd_crc32_avail((uint32_t *)iscsi_crc32c_table) == B_TRUE) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng iscsi_crc32_hd = 0;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng } else {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng iscsi_crc32_hd = 1;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng }
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng }
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng if (iscsi_crc32_hd == 0)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng return (HW_CRC32(buffer, length, crc));
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ASSERT(address != NULL);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte while (length--) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte crc = iscsi_crc32c_table[(crc ^ *buffer++) & 0xFFL] ^
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (crc >> 8);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte result = crc ^ 0xffffffff;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef _BIG_ENDIAN
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte0 = (uint8_t)(result & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte1 = (uint8_t)((result >> 8) & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte2 = (uint8_t)((result >> 16) & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte3 = (uint8_t)((result >> 24) & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte result = ((byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#endif /* _BIG_ENDIAN */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (result);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte}
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/*
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * iscsi_crc32c_continued - Continues stepping through buffer one
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * byte at at time, calculates reflected crc using table.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteuint32_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteiscsi_crc32c_continued(void *address, unsigned long length, uint32_t crc)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint8_t *buffer = address;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t result;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef _BIG_ENDIAN
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint8_t byte0, byte1, byte2, byte3;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#endif
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng if (iscsi_crc32_hd == -1) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng if (hd_crc32_avail((uint32_t *)iscsi_crc32c_table) == B_TRUE) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng iscsi_crc32_hd = 0;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng } else {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng iscsi_crc32_hd = 1;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng }
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng }
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng if (iscsi_crc32_hd == 0)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng return (HW_CRC32_CONT(buffer, length, crc));
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ASSERT(address != NULL);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef _BIG_ENDIAN
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte0 = (uint8_t)((crc >> 24) & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte1 = (uint8_t)((crc >> 16) & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte2 = (uint8_t)((crc >> 8) & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte3 = (uint8_t)(crc & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte crc = ((byte3 << 24) | (byte2 << 16) | (byte1 << 8) | byte0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#endif
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte crc = crc ^ 0xffffffff;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte while (length--) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte crc = iscsi_crc32c_table[(crc ^ *buffer++) & 0xFFL] ^
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (crc >> 8);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte result = crc ^ 0xffffffff;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef _BIG_ENDIAN
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte0 = (uint8_t)(result & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte1 = (uint8_t)((result >> 8) & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte2 = (uint8_t)((result >> 16) & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte byte3 = (uint8_t)((result >> 24) & 0xFF);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte result = ((byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#endif
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (result);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte}