summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--host/lib/usrp/cores/radio_ctrl_core_3000.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/host/lib/usrp/cores/radio_ctrl_core_3000.cpp b/host/lib/usrp/cores/radio_ctrl_core_3000.cpp
index 0d6e1c665..3e8de2657 100644
--- a/host/lib/usrp/cores/radio_ctrl_core_3000.cpp
+++ b/host/lib/usrp/cores/radio_ctrl_core_3000.cpp
@@ -189,6 +189,7 @@ private:
//parse the packet
vrt::if_packet_info_t packet_info;
resp_buff_type resp_buff;
+ memset(&resp_buff, 0x00, sizeof(resp_buff));
boost::uint32_t const *pkt = NULL;
managed_recv_buffer::sptr buff;
@@ -221,9 +222,9 @@ private:
*/
double accum_timeout = 0.0;
const double short_timeout = 0.005; // == 5ms
- while(not (_resp_queue.pop_with_haste(resp_buff)
- || check_dump_queue(resp_buff)
- || _resp_queue.pop_with_timed_wait(resp_buff, short_timeout)
+ while(not ((_resp_queue.pop_with_haste(resp_buff))
+ || (check_dump_queue(resp_buff))
+ || (_resp_queue.pop_with_timed_wait(resp_buff, short_timeout))
)){
/*
* If a message couldn't be received within a given timeout
@@ -247,7 +248,12 @@ private:
catch(const std::exception &ex)
{
UHD_MSG(error) << "Radio ctrl bad VITA packet: " << ex.what() << std::endl;
- UHD_VAR(buff->size());
+ if (buff){
+ UHD_VAR(buff->size());
+ }
+ else{
+ UHD_MSG(status) << "buff is NULL" << std::endl;
+ }
UHD_MSG(status) << std::hex << pkt[0] << std::dec << std::endl;
UHD_MSG(status) << std::hex << pkt[1] << std::dec << std::endl;
UHD_MSG(status) << std::hex << pkt[2] << std::dec << std::endl;
@@ -288,16 +294,18 @@ private:
* With check_dump_queue we can check if a message we are waiting for got stranded there.
* If a message got stuck we get it here and push it onto our own message_queue.
*/
- bool check_dump_queue(resp_buff_type b) {
+ bool check_dump_queue(resp_buff_type& b) {
+ const size_t min_buff_size = 8; // Same value as in b200_io_impl->handle_async_task
boost::uint32_t recv_sid = (((_sid)<<16)|((_sid)>>16));
uhd::msg_task::msg_payload_t msg;
do{
msg = _async_task->get_msg_from_dump_queue(recv_sid);
}
- while(msg.size() < 8 && msg.size() != 0);
+ while(msg.size() < min_buff_size && msg.size() != 0);
- if(msg.size() >= 8) {
- memcpy(b.data, &msg.front(), 8);
+ if(msg.size() >= min_buff_size) {
+ UHD_ASSERT_THROW(min_buff_size <= sizeof(b.data));
+ memcpy(b.data, &msg.front(), min_buff_size);
return true;
}
return false;