// // Copyright 2010-2013 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; static void pack_and_unpack( vrt::if_packet_info_t &if_packet_info_in ){ if (if_packet_info_in.num_payload_bytes == 0) { if_packet_info_in.num_payload_bytes = if_packet_info_in.num_payload_words32 * sizeof(boost::uint32_t); } boost::uint32_t packet_buff[2048]; //pack metadata into a vrt header vrt::if_hdr_pack_be( packet_buff, if_packet_info_in ); std::cout << std::endl; for (size_t i = 0; i < 5; i++) { std::cout << boost::format("packet_buff[%u] = 0x%.8x") % i % uhd::byteswap(packet_buff[i]) << std::endl; } vrt::if_packet_info_t if_packet_info_out; if_packet_info_out.link_type = if_packet_info_in.link_type; if_packet_info_out.num_packet_words32 = if_packet_info_in.num_packet_words32; //unpack the vrt header back into metadata vrt::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_EQUAL(if_packet_info_in.has_sid, if_packet_info_out.has_sid); if (if_packet_info_in.has_sid and if_packet_info_out.has_sid){ BOOST_CHECK_EQUAL(if_packet_info_in.sid, if_packet_info_out.sid); } BOOST_CHECK_EQUAL(if_packet_info_in.has_cid, if_packet_info_out.has_cid); if (if_packet_info_in.has_cid and if_packet_info_out.has_cid){ BOOST_CHECK_EQUAL(if_packet_info_in.cid, if_packet_info_out.cid); } BOOST_CHECK_EQUAL(if_packet_info_in.has_tsi, if_packet_info_out.has_tsi); if (if_packet_info_in.has_tsi and if_packet_info_out.has_tsi){ BOOST_CHECK_EQUAL(if_packet_info_in.tsi, if_packet_info_out.tsi); } 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_CHECK_EQUAL(if_packet_info_in.has_tlr, if_packet_info_out.has_tlr); if (if_packet_info_in.has_tlr and if_packet_info_out.has_tlr){ BOOST_CHECK_EQUAL(if_packet_info_in.tlr, if_packet_info_out.tlr); } } /*********************************************************************** * Loopback test the vrt packer/unpacker with various packet info combos * The trailer is not tested as it is not convenient to do so. **********************************************************************/ BOOST_AUTO_TEST_CASE(test_with_none){ vrt::if_packet_info_t if_packet_info; if_packet_info.packet_count = 0; if_packet_info.has_sid = false; if_packet_info.has_cid = false; if_packet_info.has_tsi = false; if_packet_info.has_tsf = false; if_packet_info.has_tlr = false; if_packet_info.num_payload_words32 = 0; pack_and_unpack(if_packet_info); } BOOST_AUTO_TEST_CASE(test_with_sid){ vrt::if_packet_info_t if_packet_info; if_packet_info.packet_count = 1; if_packet_info.has_sid = true; if_packet_info.has_cid = false; if_packet_info.has_tsi = false; if_packet_info.has_tsf = false; if_packet_info.has_tlr = false; if_packet_info.sid = std::rand(); if_packet_info.num_payload_words32 = 11; pack_and_unpack(if_packet_info); } static const bool cid_enb = false; BOOST_AUTO_TEST_CASE(test_with_cid){ vrt::if_packet_info_t if_packet_info; if_packet_info.packet_count = 2; if_packet_info.has_sid = false; if_packet_info.has_cid = cid_enb; if_packet_info.has_tsi = false; if_packet_info.has_tsf = false; if_packet_info.has_tlr = false; if_packet_info.cid = std::rand(); if_packet_info.num_payload_words32 = 22; pack_and_unpack(if_packet_info); } BOOST_AUTO_TEST_CASE(test_with_time){ vrt::if_packet_info_t if_packet_info; if_packet_info.packet_count = 3; if_packet_info.has_sid = false; if_packet_info.has_cid = false; if_packet_info.has_tsi = true; if_packet_info.has_tsf = true; if_packet_info.has_tlr = false; if_packet_info.tsi = std::rand(); if_packet_info.tsf = std::rand(); if_packet_info.num_payload_words32 = 33; pack_and_unpack(if_packet_info); } BOOST_AUTO_TEST_CASE(test_with_all){ vrt::if_packet_info_t if_packet_info; if_packet_info.packet_count = 4; if_packet_info.has_sid = true; if_packet_info.has_cid = cid_enb; if_packet_info.has_tsi = true; if_packet_info.has_tsf = true; if_packet_info.has_tlr = false; if_packet_info.sid = std::rand(); if_packet_info.cid = std::rand(); if_packet_info.tsi = std::rand(); if_packet_info.tsf = std::rand(); if_packet_info.num_payload_words32 = 44; pack_and_unpack(if_packet_info); } BOOST_AUTO_TEST_CASE(test_with_vrlp){ vrt::if_packet_info_t if_packet_info; if_packet_info.link_type = vrt::if_packet_info_t::LINK_TYPE_VRLP; if_packet_info.packet_count = 3; if_packet_info.has_sid = true; if_packet_info.has_cid = false; if_packet_info.has_tsi = false; if_packet_info.has_tsf = true; if_packet_info.has_tlr = true; if_packet_info.tsi = std::rand(); if_packet_info.tsf = std::rand(); if_packet_info.num_payload_words32 = 42; pack_and_unpack(if_packet_info); } BOOST_AUTO_TEST_CASE(test_with_chdr){ vrt::if_packet_info_t if_packet_info; if_packet_info.link_type = vrt::if_packet_info_t::LINK_TYPE_CHDR; if_packet_info.packet_count = 7; if_packet_info.has_sid = true; if_packet_info.has_cid = false; if_packet_info.has_tsi = false; if_packet_info.has_tsf = true; if_packet_info.has_tlr = true; if_packet_info.tsi = std::rand(); if_packet_info.tsf = std::rand(); if_packet_info.num_payload_words32 = 24; pack_and_unpack(if_packet_info); }