Philip Frey1 wrote:
we have developed a dissector for the MPA (Marker PDU Aligned Framing)
protocol which is part of the iWARP stack.
Since we also need to do some CRC32C calculations (same as iSCSI),
...and, it appears, SCTP.
The SCTP dissector has the same CRC table; its CRC routine starts with
0xFFFFFFFF - which, when byte-swapped, is unchanged - and then adds in
to the CRC a bunch of bytes and 0's, flips the bits in the result, and
then swaps the bytes. Your CRC32 routine doesn't flip the bits, so the
right way to combine them might be to:
export the CRC32 table from crc32c.c, declaring it in crc32.h;
moving the CRC32C macro from packet-sctp.c to crc32.h;
moving the CRC32C_SWAP macro from crc32c.c to crc32.h (or see whether
GLib 1.2.x and 2.x define something equivalent, and use that);
have calculate_crc32() use the CRC32C macro:
guint32 calculate_crc32(const void *buf, int len, guint32 crc)
{
const guint8 *p = (const guint8 *)buf;
crc = CRC32C_SWAP(crc);
while (len-- > 0) {
CRC32C(crc, *p++);
}
return CRC32C_SWAP(crc);
}
have sctp_crc32c() use CRC32C_PRELOAD instead of ~0L.
There might be some other merging that could be done.