diff options
Diffstat (limited to 'lib/edioutput')
-rw-r--r-- | lib/edioutput/TagPacket.cpp | 18 | ||||
-rw-r--r-- | lib/edioutput/TagPacket.h | 7 | ||||
-rw-r--r-- | lib/edioutput/Transport.cpp | 18 | ||||
-rw-r--r-- | lib/edioutput/Transport.h | 4 |
4 files changed, 31 insertions, 16 deletions
diff --git a/lib/edioutput/TagPacket.cpp b/lib/edioutput/TagPacket.cpp index b0bf9a1..ec52ad7 100644 --- a/lib/edioutput/TagPacket.cpp +++ b/lib/edioutput/TagPacket.cpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2014 + Copyright (C) 2020 Matthias P. Braendli, matthias.braendli@mpb.li http://www.opendigitalradio.org @@ -41,17 +41,19 @@ TagPacket::TagPacket(unsigned int alignment) : m_alignment(alignment) std::vector<uint8_t> TagPacket::Assemble() { - std::list<TagItem*>::iterator tag; + if (raw_tagpacket.size() > 0 and tag_items.size() > 0) { + throw std::logic_error("TagPacket: both raw and items used!"); + } - std::vector<uint8_t> packet; + if (raw_tagpacket.size() > 0) { + return raw_tagpacket; + } - //std::cerr << "Assemble TAGPacket" << std::endl; + std::vector<uint8_t> packet; - for (tag = tag_items.begin(); tag != tag_items.end(); ++tag) { - std::vector<uint8_t> tag_data = (*tag)->Assemble(); + for (auto tag : tag_items) { + std::vector<uint8_t> tag_data = tag->Assemble(); packet.insert(packet.end(), tag_data.begin(), tag_data.end()); - - //std::cerr << " Add TAGItem of length " << tag_data.size() << std::endl; } if (m_alignment == 0) { /* no padding */ } diff --git a/lib/edioutput/TagPacket.h b/lib/edioutput/TagPacket.h index 1e40ce7..b53b718 100644 --- a/lib/edioutput/TagPacket.h +++ b/lib/edioutput/TagPacket.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2014 + Copyright (C) 2020 Matthias P. Braendli, matthias.braendli@mpb.li http://www.opendigitalradio.org @@ -39,6 +39,9 @@ namespace edi { // Assemble function that puts the bytestream together and adds // padding such that the total length is a multiple of 8 Bytes. // +// Alternatively, a raw tagpacket can be used instead of the +// items list +// // ETSI TS 102 821, 5.1 Tag Packet class TagPacket { @@ -48,6 +51,8 @@ class TagPacket std::list<TagItem*> tag_items; + std::vector<uint8_t> raw_tagpacket; + private: unsigned int m_alignment; }; diff --git a/lib/edioutput/Transport.cpp b/lib/edioutput/Transport.cpp index 4c91483..d8627fd 100644 --- a/lib/edioutput/Transport.cpp +++ b/lib/edioutput/Transport.cpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2019 + Copyright (C) 2020 Matthias P. Braendli, matthias.braendli@mpb.li http://www.opendigitalradio.org @@ -33,7 +33,7 @@ namespace edi { void configuration_t::print() const { - etiLog.level(info) << "EDI"; + etiLog.level(info) << "EDI Output"; etiLog.level(info) << " verbose " << verbose; for (auto edi_dest : destinations) { if (auto udp_dest = dynamic_pointer_cast<edi::udp_destination_t>(edi_dest)) { @@ -67,7 +67,7 @@ Sender::Sender(const configuration_t& conf) : edi_pft(m_conf) { if (m_conf.verbose) { - etiLog.log(info, "Setup EDI"); + etiLog.log(info, "Setup EDI Output"); } for (const auto& edi_dest : m_conf.destinations) { @@ -104,7 +104,7 @@ Sender::Sender(const configuration_t& conf) : } if (m_conf.verbose) { - etiLog.log(info, "EDI set up"); + etiLog.log(info, "EDI output set up"); } } @@ -118,7 +118,7 @@ void Sender::write(const TagPacket& tagpacket) vector<edi::PFTFragment> edi_fragments = edi_pft.Assemble(af_packet); if (m_conf.verbose) { - fprintf(stderr, "EDI number of PFT fragment before interleaver %zu\n", + fprintf(stderr, "EDI Output: Number of PFT fragment before interleaver %zu\n", edi_fragments.size()); } @@ -127,7 +127,7 @@ void Sender::write(const TagPacket& tagpacket) } if (m_conf.verbose) { - fprintf(stderr, "EDI number of PFT fragments %zu\n", + fprintf(stderr, "EDI Output: Number of PFT fragments %zu\n", edi_fragments.size()); } @@ -169,6 +169,12 @@ void Sender::write(const TagPacket& tagpacket) Socket::InetAddress addr; addr.resolveUdpDestination(udp_dest->dest_addr, m_conf.dest_port); + if (af_packet.size() > 1400 and not m_udp_fragmentation_warning_printed) { + fprintf(stderr, "EDI Output: AF packet larger than 1400," + " consider using PFT to avoid UP fragmentation.\n"); + m_udp_fragmentation_warning_printed = true; + } + udp_sockets.at(udp_dest.get())->send(af_packet, addr); } else if (auto tcp_dest = dynamic_pointer_cast<edi::tcp_server_t>(dest)) { diff --git a/lib/edioutput/Transport.h b/lib/edioutput/Transport.h index 73b2ab6..56ded3b 100644 --- a/lib/edioutput/Transport.h +++ b/lib/edioutput/Transport.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2019 + Copyright (C) 2020 Matthias P. Braendli, matthias.braendli@mpb.li http://www.opendigitalradio.org @@ -50,6 +50,8 @@ class Sender { void write(const TagPacket& tagpacket); private: + bool m_udp_fragmentation_warning_printed = false; + configuration_t m_conf; std::ofstream edi_debug_file; |