X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/blobdiff_plain/a302d8ec061482b2bd5ad61a9e07ee4feb9aa0fa..f4ce6d023499d19d641f9f24abbb8eecc23ee50a:/latester/latester.c diff --git a/latester/latester.c b/latester/latester.c index e19064a..6f4aefd 100644 --- a/latester/latester.c +++ b/latester/latester.c @@ -202,26 +202,9 @@ uint32_t calc_bitmap_crc(uint32_t *bitmap, unsigned start, unsigned end) crc_t crc = 0; crc = crc_update(crc, bitmap[0] << start, 32 - start); crc = crc_update(crc, bitmap[1], 32); - crc = crc_update(crc, bitmap[2], end - 64 > 32 ? 32 : end - 64); + crc = crc_update(crc, bitmap[2], end - 64 > 32 ? 32 : end - 64); /* FIXME: This seems to be broken for end < 64 */ crc = crc_update(crc, bitmap[3], end > 96 ? end - 96 : 0); - return (uint32_t)htons(crc) << 17; -} - -void write_crc_to_bitmap(uint32_t crc, uint32_t *bitmap, struct can_frame *frame) -{ - unsigned index = frame->can_id & CAN_EFF_FLAG ? 2 : 1; - if (frame->can_dlc < 4) - bitmap[index] |= crc >> (frame->can_dlc*8); - if (frame->can_dlc == 3) - bitmap[index + 1] |= crc << 8; - if (frame->can_dlc >= 4 && frame->can_dlc < 8) - { - bitmap[index + 1] |= crc >> (frame->can_dlc*8); - if (frame->can_dlc == 7) - bitmap[index + 2] = crc << 8; - } - else if (frame->can_dlc == 8) - bitmap[index + 2] = crc; + return crc << 17; } unsigned calc_stuff_bits(struct can_frame *frame) { @@ -251,8 +234,7 @@ unsigned calc_stuff_bits(struct can_frame *frame) { (!!(frame->can_id & CAN_RTR_FLAG)) << 6 | 0 << 4 | frame->can_dlc & 0xf; - bitmap[2] = htonl(((uint32_t*)frame->data)[0]); - bitmap[3] = htonl(((uint32_t*)frame->data)[1]); + memcpy(&bitmap[2], &frame->data, frame->can_dlc); start = 27; end = 64 + 8*frame->can_dlc; } else { @@ -265,14 +247,14 @@ unsigned calc_stuff_bits(struct can_frame *frame) { (!!(frame->can_id & CAN_RTR_FLAG)) << 6 | 0 << 4 | frame->can_dlc & 0xf; - bitmap[1] = htonl(((uint32_t*)frame->data)[0]); - bitmap[2] = htonl(((uint32_t*)frame->data)[1]); + memcpy(&bitmap[1], &frame->data, frame->can_dlc); start = 13; end = 32 + 8*frame->can_dlc; } crc = calc_bitmap_crc(bitmap, start, end); - write_crc_to_bitmap(crc, bitmap, frame); - end += 15; + uint32_t crc_be = htons(crc << 17); + memcpy((char*)bitmap + end/8, &crc_be, 2); /* end is guaranteed to be divisible by 8 */ + end += 15; while (start < end) { mask = basemask >> (start & 0x1f);