aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/include/uhd/transport/vrt_if_packet.hpp7
-rw-r--r--host/include/uhd/types/metadata.hpp5
-rwxr-xr-xhost/lib/transport/gen_vrt_if_packet.py48
-rw-r--r--host/lib/transport/vrt_packet_handler.hpp25
-rw-r--r--host/lib/types.cpp4
5 files changed, 52 insertions, 37 deletions
diff --git a/host/include/uhd/transport/vrt_if_packet.hpp b/host/include/uhd/transport/vrt_if_packet.hpp
index ccefe14ea..51bd81bb1 100644
--- a/host/include/uhd/transport/vrt_if_packet.hpp
+++ b/host/include/uhd/transport/vrt_if_packet.hpp
@@ -35,6 +35,13 @@ namespace vrt{
* the operation used (ie the pack or unpack function call).
*/
struct UHD_API if_packet_info_t{
+ //packet type (pack only supports data)
+ enum packet_type_t {
+ PACKET_TYPE_DATA = 0x0,
+ PACKET_TYPE_EXTENSION = 0x1,
+ PACKET_TYPE_CONTEXT = 0x2
+ } packet_type;
+
//size fields
size_t num_payload_words32; //required in pack, derived in unpack
size_t num_header_words32; //derived in pack, derived in unpack
diff --git a/host/include/uhd/types/metadata.hpp b/host/include/uhd/types/metadata.hpp
index f4c962ff7..6712e2594 100644
--- a/host/include/uhd/types/metadata.hpp
+++ b/host/include/uhd/types/metadata.hpp
@@ -52,10 +52,9 @@ namespace uhd{
* Burst flags:
* Start of burst will be true for the first packet in the chain.
* End of burst will be true for the last packet in the chain.
- * --Not currently used in any known device implementation.--
*/
- //bool start_of_burst;
- //bool end_of_burst;
+ bool start_of_burst;
+ bool end_of_burst;
/*!
* Error conditions (TODO):
diff --git a/host/lib/transport/gen_vrt_if_packet.py b/host/lib/transport/gen_vrt_if_packet.py
index 9b5bfca02..07ce391ee 100755
--- a/host/lib/transport/gen_vrt_if_packet.py
+++ b/host/lib/transport/gen_vrt_if_packet.py
@@ -61,13 +61,6 @@ using namespace uhd::transport;
#set $tsf_p = 0b01000
#set $tlr_p = 0b10000
-static UHD_INLINE void pack_uint64_$(suffix)(boost::uint64_t num, boost::uint32_t *mem){
- //*(reinterpret_cast<boost::uint64_t *>(mem)) = $(XE_MACRO)(num);
- //second word is lower 32 bits due to fpga implementation
- mem[1] = $(XE_MACRO)(boost::uint32_t(num >> 0));
- mem[0] = $(XE_MACRO)(boost::uint32_t(num >> 32));
-}
-
void vrt::if_hdr_pack_$(suffix)(
boost::uint32_t *packet_buff,
if_packet_info_t &if_packet_info
@@ -94,8 +87,10 @@ void vrt::if_hdr_pack_$(suffix)(
#end if
########## Class ID ##########
#if $pred & $cid_p
- pack_uint64_$(suffix)(if_packet_info.cid, packet_buff+$num_header_words);
- #set $num_header_words += 2
+ packet_buff[$num_header_words] = 0; //not implemented
+ #set $num_header_words += 1
+ packet_buff[$num_header_words] = 0; //not implemented
+ #set $num_header_words += 1
#set $flags |= (0x1 << 27);
#end if
########## Integer Time ##########
@@ -106,8 +101,10 @@ void vrt::if_hdr_pack_$(suffix)(
#end if
########## Fractional Time ##########
#if $pred & $tsf_p
- pack_uint64_$(suffix)(if_packet_info.tsf, packet_buff+$num_header_words);
- #set $num_header_words += 2
+ packet_buff[$num_header_words] = $(XE_MACRO)(boost::uint32_t(if_packet_info.tsf >> 32));
+ #set $num_header_words += 1
+ packet_buff[$num_header_words] = $(XE_MACRO)(boost::uint32_t(if_packet_info.tsf >> 0));
+ #set $num_header_words += 1
#set $flags |= (0x1 << 20);
#end if
########## Trailer ##########
@@ -116,7 +113,6 @@ void vrt::if_hdr_pack_$(suffix)(
#set $flags |= (0x1 << 26);
#set $num_trailer_words = 1;
#else
- //packet_buff[$num_header_words+if_packet_info.num_payload_words32] = 0;
#set $num_trailer_words = 0;
#end if
########## Variables ##########
@@ -139,13 +135,6 @@ void vrt::if_hdr_pack_$(suffix)(
));
}
-static UHD_INLINE void unpack_uint64_$(suffix)(boost::uint64_t &num, const boost::uint32_t *mem){
- //num = $(XE_MACRO)(*reinterpret_cast<const boost::uint64_t *>(mem));
- //second word is lower 32 bits due to fpga implementation
- num = boost::uint64_t($(XE_MACRO)(mem[1])) << 0;
- num |= boost::uint64_t($(XE_MACRO)(mem[0])) << 32;
-}
-
void vrt::if_hdr_unpack_$(suffix)(
const boost::uint32_t *packet_buff,
if_packet_info_t &if_packet_info
@@ -153,13 +142,16 @@ void vrt::if_hdr_unpack_$(suffix)(
//extract vrt header
boost::uint32_t vrt_hdr_word = $(XE_MACRO)(packet_buff[0]);
size_t packet_words32 = vrt_hdr_word & 0xffff;
- if_packet_info.packet_count = (vrt_hdr_word >> 16) & 0xf;
- //failure cases
+ //failure case
if (if_packet_info.num_packet_words32 < packet_words32)
throw std::runtime_error("bad vrt header or packet fragment");
- if (vrt_hdr_word & (0x7 << 29))
- throw std::runtime_error("bad vrt header or unsupported packet type");
+
+ //extract fields from the header
+ if_packet_info.packet_type = if_packet_info_t::packet_type_t(vrt_hdr_word >> 29);
+ if_packet_info.packet_count = (vrt_hdr_word >> 16) & 0xf;
+ if_packet_info.sob = bool(vrt_hdr_word & $hex(0x1 << 25));
+ if_packet_info.eob = bool(vrt_hdr_word & $hex(0x1 << 24));
boost::uint8_t pred = 0;
if(vrt_hdr_word & $hex(0x1 << 28)) pred |= $hex($sid_p);
@@ -184,7 +176,7 @@ void vrt::if_hdr_unpack_$(suffix)(
########## Class ID ##########
#if $pred & $cid_p
if_packet_info.has_cid = true;
- unpack_uint64_$(suffix)(if_packet_info.cid, packet_buff+$num_header_words);
+ if_packet_info.cid = 0; //not implemented
#set $num_header_words += 2
#else
if_packet_info.has_cid = false;
@@ -200,15 +192,17 @@ void vrt::if_hdr_unpack_$(suffix)(
########## Fractional Time ##########
#if $pred & $tsf_p
if_packet_info.has_tsf = true;
- unpack_uint64_$(suffix)(if_packet_info.tsf, packet_buff+$num_header_words);
- #set $num_header_words += 2
+ if_packet_info.tsf = boost::uint64_t($(XE_MACRO)(packet_buff[$num_header_words])) << 32;
+ #set $num_header_words += 1
+ if_packet_info.tsf |= boost::uint64_t($(XE_MACRO)(packet_buff[$num_header_words])) << 0;
+ #set $num_header_words += 1
#else
if_packet_info.has_tsf = false;
#end if
########## Trailer ##########
#if $pred & $tlr_p
if_packet_info.has_tlr = true;
- if_packet_info.tlr = $(XE_MACRO)(packet_buff[$num_header_words+packet_words32]);
+ if_packet_info.tlr = $(XE_MACRO)(packet_buff[packet_words32-1]);
#set $num_trailer_words = 1;
#else
if_packet_info.has_tlr = false;
diff --git a/host/lib/transport/vrt_packet_handler.hpp b/host/lib/transport/vrt_packet_handler.hpp
index 68edeb1e1..f06fe94c0 100644
--- a/host/lib/transport/vrt_packet_handler.hpp
+++ b/host/lib/transport/vrt_packet_handler.hpp
@@ -77,15 +77,18 @@ namespace vrt_packet_handler{
vrt_unpacker_type vrt_unpacker,
size_t vrt_header_offset_words32
){
- size_t num_packet_words32 = state.managed_buffs[0]->size()/sizeof(boost::uint32_t);
- if (num_packet_words32 <= vrt_header_offset_words32){
- state.size_of_copy_buffs = 0;
- return; //must exit here after setting the buffer
- }
-
//vrt unpack each managed buffer
uhd::transport::vrt::if_packet_info_t if_packet_info;
for (size_t i = 0; i < state.width; i++){
+
+ //extract packet words and check thats its enough to move on
+ size_t num_packet_words32 = state.managed_buffs[i]->size()/sizeof(boost::uint32_t);
+ if (num_packet_words32 <= vrt_header_offset_words32){
+ state.size_of_copy_buffs = 0;
+ return; //must exit here after setting the buffer
+ }
+
+ //unpack the vrt header into the info struct
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);
@@ -96,6 +99,13 @@ namespace vrt_packet_handler{
}
state.next_packet_seq[i] = (if_packet_info.packet_count+1)%16;
+ //make sure that its a data packet (TODO handle non-data packets)
+ if (if_packet_info.packet_type != uhd::transport::vrt::if_packet_info_t::PACKET_TYPE_DATA){
+ std::cout << "vrt packet handler _recv1_helper got non data packet" << std::endl;
+ state.size_of_copy_buffs = 0;
+ return; //must exit here after setting the buffer
+ }
+
//setup the buffer to point to the data
state.copy_buffs[i] = reinterpret_cast<const boost::uint8_t *>(vrt_hdr + if_packet_info.num_header_words32);
@@ -111,6 +121,9 @@ namespace vrt_packet_handler{
metadata.time_spec = uhd::time_spec_t(
time_t(if_packet_info.tsi), size_t(if_packet_info.tsf), tick_rate
);
+ metadata.start_of_burst = if_packet_info.sob;
+ static const int tlr_eob_flags = (1 << 20) | (1 << 8); //enable and indicator bits
+ metadata.end_of_burst = if_packet_info.has_tlr and (int(if_packet_info.tlr & tlr_eob_flags) == tlr_eob_flags);
}
/*******************************************************************
diff --git a/host/lib/types.cpp b/host/lib/types.cpp
index 9cf2a2220..1e7917ad7 100644
--- a/host/lib/types.cpp
+++ b/host/lib/types.cpp
@@ -99,7 +99,9 @@ rx_metadata_t::rx_metadata_t(void):
has_time_spec(false),
time_spec(time_spec_t()),
more_fragments(false),
- fragment_offset(0)
+ fragment_offset(0),
+ start_of_burst(false),
+ end_of_burst(false)
{
/* NOP */
}