X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FMPEGDVBBundle%2FSNDUPacket.hh;h=7cb9e761e8ca1085c5c76e4648a4a7a4a7c7dee2;hb=ff0f2fabb3dbb76ee9383a98291a1420d2a59a7f;hp=d2a00fa15c934106eef4792cd3e412638b4a71a5;hpb=981204dbf160d3dd77e303b9bd133eb187e0384f;p=senf.git diff --git a/Packets/MPEGDVBBundle/SNDUPacket.hh b/Packets/MPEGDVBBundle/SNDUPacket.hh index d2a00fa..7cb9e76 100644 --- a/Packets/MPEGDVBBundle/SNDUPacket.hh +++ b/Packets/MPEGDVBBundle/SNDUPacket.hh @@ -3,7 +3,7 @@ // Copyright (C) 2007 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) // Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// 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 @@ -29,11 +29,8 @@ // Custom includes #include #include -#include "Packets/PacketType.hh" -#include "Packets/ParseInt.hh" -#include "Packets/PacketRegistry.hh" -#include "Packets/PacketParser.hh" -#include "Packets/DefaultBundle/EthernetPacket.hh" +#include "../../Packets/Packets.hh" +#include "../DefaultBundle/EthernetPacket.hh" //#include "SNDUPacket.mpp" ///////////////////////////////hh.p//////////////////////////////////////// @@ -48,40 +45,33 @@ namespace senf { */ struct Parse_SNDUPacket : public PacketParserBase { -# ifndef DOXYGEN - - SENF_PACKET_PARSER_NO_INIT(Parse_SNDUPacket); +# include SENF_PARSER() -# endif - - typedef Parse_Flag < 0 > Parse_daaf; // Destination Address Absent Field - typedef Parse_UIntField < 1, 16 > Parse_length; - - Parse_daaf d_bit() const { - return parse( 0 ); - } - Parse_length length() const { - return parse( 0 ); - } - Parse_UInt16 type() const { - return parse( 2 ); - } - Parse_MAC destination() const { - BOOST_ASSERT( ! d_bit() ); - return parse( 4 ); - } - Parse_UInt32 crc() const { - return parse( data().size()-4 ); - } + /* We first define the fields as they appear in the field. Some of the fields are declared + private. We provide custom accessors for those fields further down. */ + + SENF_PARSER_PRIVATE_BITFIELD ( d_bit_ , 1 , unsigned ); + SENF_PARSER_BITFIELD ( length , 15 , unsigned ); + SENF_PARSER_FIELD ( type , Parse_UInt16 ); + SENF_PARSER_PRIVATE_VARIANT ( destination_ , d_bit_ , + (Parse_MAC) (VoidPacketParser) ); - void init() const { - defaultInit(); - d_bit() = false; - } + SENF_PARSER_FINALIZE( Parse_SNDUPacket ); - PacketParserBase::size_type bytes() const; + Parse_MAC destination() /// Only defined if d_bit() == \c false + { return destination_().get<0>(); } + + bool d_bit() /// Destination absent bit + { return d_bit_(); } + + void withDestination() /// Clear destination absent bit + { destination_().init<0>(); } - static const size_type init_bytes = 2+2+4; // D-Bit + 15 bits length + 16 bits type field + 32 bits crc + void withoutDestination() /// Set destination absent bit + { destination_().init<1>(); } + + Parse_UInt32 crc() + { return parse( data().size() - 4 ); } boost::uint32_t calcCrc() const; };