// // Copyright 2014 Ettus Research LLC // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #include #include #include #include #include #include using namespace uhd::transport::vrt; static void pack_and_unpack( if_packet_info_t &if_packet_info_in ){ // Temp buffer for packed packet boost::uint32_t packet_buff[2048] = {0}; // Check input (must not be lazy) BOOST_REQUIRE( (if_packet_info_in.num_payload_words32 == 0 and if_packet_info_in.num_payload_bytes == 0) or (if_packet_info_in.num_payload_words32 != 0 and if_packet_info_in.num_payload_bytes != 0) ); if (if_packet_info_in.num_payload_words32) { BOOST_REQUIRE(if_packet_info_in.num_payload_bytes <= 4 * if_packet_info_in.num_payload_words32); BOOST_REQUIRE(if_packet_info_in.num_payload_bytes > 4*(if_packet_info_in.num_payload_words32-1)); } //pack metadata into a vrt header chdr::if_hdr_pack_be( packet_buff, if_packet_info_in ); std::cout << std::endl; boost::uint32_t header_bits = (uhd::ntohx(packet_buff[0]) >> 28); std::cout << boost::format("header bits = 0b%d%d%d%d") % bool(header_bits & 8) % bool(header_bits & 4) % bool(header_bits & 2) % bool(header_bits & 1) << std::endl; for (size_t i = 0; i < 5; i++) { std::cout << boost::format("packet_buff[%u] = 0x%08x") % i % uhd::ntohx(packet_buff[i]) << std::endl; } if_packet_info_t if_packet_info_out; // Must be set a-priori as per contract if_packet_info_out.num_packet_words32 = if_packet_info_in.num_packet_words32; //unpack the vrt header back into metadata chdr::if_hdr_unpack_be( packet_buff, if_packet_info_out ); //check the the unpacked metadata is the same BOOST_CHECK_EQUAL(if_packet_info_in.packet_count, if_packet_info_out.packet_count); BOOST_CHECK_EQUAL(if_packet_info_in.num_header_words32, if_packet_info_out.num_header_words32); BOOST_CHECK_EQUAL(if_packet_info_in.num_payload_words32, if_packet_info_out.num_payload_words32); BOOST_CHECK(if_packet_info_out.has_sid); BOOST_CHECK_EQUAL(if_packet_info_in.sid, if_packet_info_out.sid); BOOST_CHECK(if_packet_info_out.has_sid); BOOST_CHECK_EQUAL(if_packet_info_in.has_tsf, if_packet_info_out.has_tsf); if (if_packet_info_in.has_tsf and if_packet_info_out.has_tsf){ BOOST_CHECK_EQUAL(if_packet_info_in.tsf, if_packet_info_out.tsf); } } BOOST_AUTO_TEST_CASE(test_with_chdr){ if_packet_info_t if_packet_info; if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_DATA; if_packet_info.eob = false; if_packet_info.packet_count = 7; if_packet_info.has_tsf = true; if_packet_info.tsf = 0x1234567890ABCDEF; if_packet_info.sid = 0xAABBCCDD; if_packet_info.num_payload_words32 = 24; if_packet_info.num_payload_bytes = 95; pack_and_unpack(if_packet_info); } BOOST_AUTO_TEST_CASE(test_with_chdr_fc){ if_packet_info_t if_packet_info; if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_FC; if_packet_info.eob = false; if_packet_info.packet_count = 19; if_packet_info.has_tsf = false; if_packet_info.tsf = 0x1234567890ABCDEF; if_packet_info.sid = 0xAABBCCDD; if_packet_info.num_payload_words32 = 4; if_packet_info.num_payload_bytes = 16; pack_and_unpack(if_packet_info); } BOOST_AUTO_TEST_CASE(test_with_chdr_cmd){ if_packet_info_t if_packet_info; if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_CMD; if_packet_info.packet_count = 19; if_packet_info.has_tsf = true; if_packet_info.tsf = 0x1234567890ABCDEF; if_packet_info.sid = 0xAABBCCDD; if_packet_info.num_payload_words32 = 4; if_packet_info.num_payload_bytes = 16; pack_and_unpack(if_packet_info); } BOOST_AUTO_TEST_CASE(test_with_chdr_resp){ if_packet_info_t if_packet_info; if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_RESP; if_packet_info.packet_count = 123; if_packet_info.has_tsf = false; if_packet_info.tsf = 0x1234567890ABCDEF; if_packet_info.sid = 0xAABBCCDD; if_packet_info.num_payload_words32 = 4; if_packet_info.num_payload_bytes = 16; pack_and_unpack(if_packet_info); } BOOST_AUTO_TEST_CASE(test_with_chdr_err){ if_packet_info_t if_packet_info; if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_ERROR; if_packet_info.packet_count = 1928; if_packet_info.eob = false; if_packet_info.error = false; // Needs to be set explicitly if_packet_info.has_tsf = false; if_packet_info.tsf = 0x1234567890ABCDEF; if_packet_info.sid = 0xAABBCCDD; if_packet_info.num_payload_words32 = 4; if_packet_info.num_payload_bytes = 16; pack_and_unpack(if_packet_info); }