X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FMPEGDVBBundle%2FSNDUPacket.cc;h=96709d08b2d33911e0dbf3c843db382cebf9dd38;hb=165ec46dc3d091c354ef8dbda67dcf7b1a97fc7d;hp=e55812f8a560ab427f4936fcd1d86629f65a1782;hpb=f1fc7057fa65a9509651d08c6c134d136fbb0424;p=senf.git diff --git a/Packets/MPEGDVBBundle/SNDUPacket.cc b/Packets/MPEGDVBBundle/SNDUPacket.cc index e55812f..96709d0 100644 --- a/Packets/MPEGDVBBundle/SNDUPacket.cc +++ b/Packets/MPEGDVBBundle/SNDUPacket.cc @@ -1,9 +1,9 @@ // $Id$ // // Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Thorsten Horstmann // // 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 @@ -28,8 +28,9 @@ // Custom includes #include -#include "Utils/hexdump.hh" -#include "Packets/PacketData.hh" +#include "../../Utils/hexdump.hh" +#include "../../Packets/DefaultBundle/EthernetPacket.hh" + #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// @@ -40,31 +41,60 @@ //} -prefix_ senf::PacketParserBase::size_type senf::Parse_SNDUPacket::bytes() +prefix_ boost::uint32_t senf::SNDUPacketParser::calcCrc() const { - if ( d_bit() ) - return 2 + 2 + 4; // D-Bit + 15 bits length + 16 bits type field + 32 bits crc + return std::for_each( + data().begin(), + boost::prior(data().end(), 4), + ule_crc32() ).checksum(); +} + +//prefix_ senf::SNDUPacketType::key_t senf::SNDUPacketType::nextPacketKey(packet p) +//{ +// return p->type(); +//} + +prefix_ void senf::SNDUPacketType::init(packet p) +{ + p->init(); +} + +prefix_ senf::PacketInterpreterBase::factory_t senf::SNDUPacketType::nextPacketType(packet p) +{ + if (p.data().size() < 8) + return no_factory(); + PkReg_Entry const * e; + if (p->type() < 1536) + e = PacketRegistry::lookup( p->type(), nothrow ); else - return 2 + 2 + 4 + 6; // + 6 Byte NPA destination address + e = PacketRegistry::lookup( p->type(), nothrow ); + return e ? e->factory() : no_factory(); } -prefix_ boost::uint32_t senf::Parse_SNDUPacket::calcCrc() - const +prefix_ senf::PacketInterpreterBase::optional_range +senf::SNDUPacketType::nextPacketRange(packet p) { - ule_crc32 result; - senf::PacketData::iterator i (data().begin()); - senf::PacketData::iterator const i_end(boost::prior(data().end(),4)); - for (; i!=i_end; ++i) - result.process_byte(*i); - return result.checksum(); + if (p.data().size() < 8) + return no_range(); + + size_type sz = 2 + 2; // D-Bit + 15 bits length + 16 bits type field + if (! p->d_bit() ) + sz += 6; // + 6 Byte NPA destination address + return range( + boost::next(p.data().begin(), sz), + boost::prior(p.data().end(), 4)); // - 32 bits crc } prefix_ void senf::SNDUPacketType::dump(packet p, std::ostream & os) { os << "SNDUPacket:\n" + << std::dec << " d_bit: " << p->d_bit() << "\n" << " length: " << unsigned(p->length()) << "\n" + << std::hex + << " type: 0x" << unsigned(p->type()) << "\n" + << std::dec << " crc: " << unsigned(p->crc()) << "\n"; }