diff options
| -rw-r--r-- | host/include/uhd/types/metadata.hpp | 6 | ||||
| -rw-r--r-- | host/lib/transport/vrt_packet_handler.hpp | 19 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/io_impl.cpp | 5 | 
3 files changed, 19 insertions, 11 deletions
diff --git a/host/include/uhd/types/metadata.hpp b/host/include/uhd/types/metadata.hpp index 43ddf875f..65952941c 100644 --- a/host/include/uhd/types/metadata.hpp +++ b/host/include/uhd/types/metadata.hpp @@ -134,12 +134,16 @@ namespace uhd{           * - underflow: an internal send buffer has emptied           * - sequence error: packet loss between host and device           * - time error: packet had time that was late (or too early) +         * - underflow in packet: underflow occurred inside a packet +         * - sequence error in burst: packet loss within a burst           */          enum event_code_t {              EVENT_CODE_SUCCESS    = 0x1,              EVENT_CODE_UNDERFLOW  = 0x2,              EVENT_CODE_SEQ_ERROR  = 0x4, -            EVENT_CODE_TIME_ERROR = 0x8 +            EVENT_CODE_TIME_ERROR = 0x8, +            EVENT_CODE_UNDERFLOW_IN_PACKET = 0x10, +            EVENT_CODE_SEQ_ERROR_IN_BURST  = 0x20          } event_code;      }; diff --git a/host/lib/transport/vrt_packet_handler.hpp b/host/lib/transport/vrt_packet_handler.hpp index 3eddcec6d..0cc5eef76 100644 --- a/host/lib/transport/vrt_packet_handler.hpp +++ b/host/lib/transport/vrt_packet_handler.hpp @@ -35,6 +35,16 @@  namespace vrt_packet_handler{ +template <typename T> UHD_INLINE T get_context_code( +    const boost::uint32_t *vrt_hdr, +    const uhd::transport::vrt::if_packet_info_t &if_packet_info +){ +    //extract the context word (we dont know the endianness so mirror the bytes) +    boost::uint32_t word0 = vrt_hdr[if_packet_info.num_header_words32] | +              uhd::byteswap(vrt_hdr[if_packet_info.num_header_words32]); +    return T(word0 & 0xff); +} +  /***********************************************************************   * vrt packet handler for recv   **********************************************************************/ @@ -92,22 +102,19 @@ namespace vrt_packet_handler{              const boost::uint32_t *vrt_hdr = state.managed_buffs[i]->cast<const boost::uint32_t *>() + vrt_header_offset_words32;              if_packet_info.num_packet_words32 = num_packet_words32 - vrt_header_offset_words32;              vrt_unpacker(vrt_hdr, if_packet_info); -            const boost::uint32_t *vrt_data = vrt_hdr + if_packet_info.num_header_words32;              //handle the non-data packet case and parse its contents              if (if_packet_info.packet_type != uhd::transport::vrt::if_packet_info_t::PACKET_TYPE_DATA){ -                //extract the context word (we dont know the endianness so mirror the bytes) -                boost::uint32_t word0 = vrt_data[0] | uhd::byteswap(vrt_data[0]); -                if (word0 & uhd::rx_metadata_t::ERROR_CODE_OVERFLOW) handle_overflow(i); -                metadata.error_code = uhd::rx_metadata_t::error_code_t(word0 & 0xf); +                metadata.error_code = get_context_code<uhd::rx_metadata_t::error_code_t>(vrt_hdr, if_packet_info); +                if (metadata.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW) handle_overflow(i);                  //break to exit loop and store metadata below                  state.size_of_copy_buffs = 0; break;              }              //setup the buffer to point to the data -            state.copy_buffs[i] = reinterpret_cast<const boost::uint8_t *>(vrt_data); +            state.copy_buffs[i] = reinterpret_cast<const boost::uint8_t *>(vrt_hdr + if_packet_info.num_header_words32);              //store the minimum payload length into the copy buffer length              size_t num_payload_bytes = if_packet_info.num_payload_words32*sizeof(boost::uint32_t); diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp index 455a30b47..9a7f34531 100644 --- a/host/lib/usrp/usrp2/io_impl.cpp +++ b/host/lib/usrp/usrp2/io_impl.cpp @@ -101,9 +101,6 @@ void usrp2_impl::io_impl::recv_pirate_loop(              //handle a tx async report message              if (if_packet_info.sid == 1 and if_packet_info.packet_type != vrt::if_packet_info_t::PACKET_TYPE_DATA){ -                const boost::uint32_t *vrt_data = vrt_hdr + if_packet_info.num_header_words32; -                //extract the context word (we dont know the endianness so mirror the bytes) -                boost::uint32_t word0 = vrt_data[0] | uhd::byteswap(vrt_data[0]);                  //fill in the async metadata                  async_metadata_t metadata; @@ -112,7 +109,7 @@ void usrp2_impl::io_impl::recv_pirate_loop(                  metadata.time_spec = time_spec_t(                      time_t(if_packet_info.tsi), size_t(if_packet_info.tsf), mboard->get_master_clock_freq()                  ); -                metadata.event_code = uhd::async_metadata_t::event_code_t(word0 & 0xf); +                metadata.event_code = vrt_packet_handler::get_context_code<async_metadata_t::event_code_t>(vrt_hdr, if_packet_info);                  //print the famous U, and push the metadata into the message queue                  if (metadata.event_code == async_metadata_t::EVENT_CODE_UNDERFLOW) std::cerr << "U";  | 
