summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreb <eb@221aa14e-8319-0410-a670-987f0aec2ac5>2007-03-12 22:08:06 +0000
committereb <eb@221aa14e-8319-0410-a670-987f0aec2ac5>2007-03-12 22:08:06 +0000
commitf38a7682e3eb4a8a2bfc36a1c771cbf3cd1bdd0e (patch)
tree2b8895b16515d5f402f14f369f59c90ddea84148
parent1cdeff14aa038f53336f871f588e6b6a2d67a82d (diff)
New fix for gr_framer_sink_1 hang on zero length payload.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@4739 221aa14e-8319-0410-a670-987f0aec2ac5
-rw-r--r--gnuradio-core/src/lib/general/gr_framer_sink_1.cc30
-rw-r--r--gnuradio-core/src/python/gnuradio/gruimpl/crc.py2
2 files changed, 21 insertions, 11 deletions
diff --git a/gnuradio-core/src/lib/general/gr_framer_sink_1.cc b/gnuradio-core/src/lib/general/gr_framer_sink_1.cc
index be5209a71e..27e47a332a 100644
--- a/gnuradio-core/src/lib/general/gr_framer_sink_1.cc
+++ b/gnuradio-core/src/lib/general/gr_framer_sink_1.cc
@@ -57,11 +57,6 @@ gr_framer_sink_1::enter_have_header(int payload_len, int whitener_offset)
if (VERBOSE)
fprintf(stderr, "@ enter_have_header (payload_len = %d) (offset = %d)\n", payload_len, whitener_offset);
- if (payload_len < 4) { // should be at least the length of the CRC field
- enter_search();
- return;
- }
-
d_state = STATE_HAVE_HEADER;
d_packetlen = payload_len;
d_packet_whitener_offset = whitener_offset;
@@ -132,13 +127,25 @@ gr_framer_sink_1::work (int noutput_items,
// we have a full header, check to see if it has been received properly
if (header_ok()){
int payload_len;
- int payload_offset;
- header_payload(&payload_len, &payload_offset);
- enter_have_header(payload_len, payload_offset);
+ int whitener_offset;
+ header_payload(&payload_len, &whitener_offset);
+ enter_have_header(payload_len, whitener_offset);
+
+ if (d_packetlen == 0){ // check for zero-length payload
+ // build a zero-length message
+ // NOTE: passing header field as arg1 is not scalable
+ gr_message_sptr msg =
+ gr_make_message(0, d_packet_whitener_offset, 0, 0);
+
+ d_target_queue->insert_tail(msg); // send it
+ msg.reset(); // free it up
+
+ enter_search();
+ }
}
else
- enter_search(); // no.
- break; // we're in a new state
+ enter_search(); // bad header
+ break; // we're in a new state
}
}
break;
@@ -157,7 +164,8 @@ gr_framer_sink_1::work (int noutput_items,
// build a message
// NOTE: passing header field as arg1 is not scalable
- gr_message_sptr msg = gr_make_message(0, d_packet_whitener_offset, 0, d_packetlen_cnt);
+ gr_message_sptr msg =
+ gr_make_message(0, d_packet_whitener_offset, 0, d_packetlen_cnt);
memcpy(msg->msg(), d_packet, d_packetlen_cnt);
d_target_queue->insert_tail(msg); // send it
diff --git a/gnuradio-core/src/python/gnuradio/gruimpl/crc.py b/gnuradio-core/src/python/gnuradio/gruimpl/crc.py
index 3decd09a29..096863fb5d 100644
--- a/gnuradio-core/src/python/gnuradio/gruimpl/crc.py
+++ b/gnuradio-core/src/python/gnuradio/gruimpl/crc.py
@@ -28,6 +28,8 @@ def gen_and_append_crc32(s):
return s + struct.pack(">I", hexint(crc))
def check_crc32(s):
+ if len(s) < 4:
+ return (False, '')
msg = s[:-4]
#print "msg = '%s'" % (msg,)
actual = gr.crc32(msg)