summaryrefslogtreecommitdiff
path: root/gr-digital/lib/crc32_bb_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/lib/crc32_bb_impl.cc')
-rw-r--r--gr-digital/lib/crc32_bb_impl.cc29
1 files changed, 23 insertions, 6 deletions
diff --git a/gr-digital/lib/crc32_bb_impl.cc b/gr-digital/lib/crc32_bb_impl.cc
index afb5e32716..fc88e7f215 100644
--- a/gr-digital/lib/crc32_bb_impl.cc
+++ b/gr-digital/lib/crc32_bb_impl.cc
@@ -65,6 +65,26 @@ namespace gr {
}
}
+ unsigned int
+ crc32_bb_impl::calculate_crc32(const unsigned char* in, size_t packet_length){
+ unsigned int crc = 0;
+ d_crc_impl.reset();
+ if (!d_packed){
+ const size_t n_packed_length = 1 + ((packet_length - 1) / 8);
+ unsigned char packed_buffer[n_packed_length];
+ memset(packed_buffer, 0, n_packed_length);
+ for (size_t bit = 0; bit < packet_length; bit++){
+ packed_buffer[bit/8] |= (in[bit] << (bit % 8));
+ }
+ d_crc_impl.process_bytes(packed_buffer, n_packed_length);
+ crc = d_crc_impl();
+ } else{
+ d_crc_impl.process_bytes(in, packet_length);
+ crc = d_crc_impl();
+ }
+ return crc;
+ }
+
int
crc32_bb_impl::work(int noutput_items,
gr_vector_int &ninput_items,
@@ -72,14 +92,13 @@ namespace gr {
gr_vector_void_star &output_items) {
const unsigned char *in = (const unsigned char *) input_items[0];
unsigned char *out = (unsigned char *) output_items[0];
- long packet_length = ninput_items[0];
+ size_t packet_length = ninput_items[0];
int packet_size_diff = d_check ? -d_crc_length : d_crc_length;
unsigned int crc;
if (d_check) {
- d_crc_impl.reset();
d_crc_impl.process_bytes(in, packet_length - d_crc_length);
- crc = d_crc_impl();
+ crc = calculate_crc32(in, packet_length - d_crc_length);
if (d_packed) {
if (crc != *(unsigned int *) (in + packet_length - d_crc_length)) { // Drop package
d_nfail++;
@@ -97,9 +116,7 @@ namespace gr {
d_npass++;
memcpy((void *) out, (const void *) in, packet_length - d_crc_length);
} else {
- d_crc_impl.reset();
- d_crc_impl.process_bytes(in, packet_length);
- crc = d_crc_impl();
+ crc = calculate_crc32(in, packet_length);
memcpy((void *) out, (const void *) in, packet_length);
if (d_packed) {
memcpy((void *) (out + packet_length), &crc, d_crc_length); // FIXME big-endian/little-endian, this might be wrong