X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FMPEGDVBBundle%2FDTCPPacket.hh;h=78f226fc896dbcd2f384b762868ddb1fa28f1b9a;hb=b8ca4a544cce3e6023bb56b712a03d6362f2bb79;hp=461daf2954a4191db85535eb2643789c145c17cb;hpb=f73fa16ed5abdce272ac77f8b8b9ef2b9922c266;p=senf.git diff --git a/Packets/MPEGDVBBundle/DTCPPacket.hh b/Packets/MPEGDVBBundle/DTCPPacket.hh index 461daf2..78f226f 100644 --- a/Packets/MPEGDVBBundle/DTCPPacket.hh +++ b/Packets/MPEGDVBBundle/DTCPPacket.hh @@ -1,8 +1,8 @@ // $Id$ // -// Copyright (C) 2007 -// Fraunhofer Institute for Open Communication Systems (FOKUS) -// Kompetenzzentrum NETwork research (NET) +// Copyright (C) 2007 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY // David Wagner // // This program is free software; you can redistribute it and/or modify @@ -20,114 +20,126 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +/** \file + \brief DTCPPacket public header */ -#ifndef DTCPPACKET_HH_ -#define DTCPPACKET_HH_ +#ifndef HH_SENF_Packets_MPEGDVBBundle_DTCPPacket_ +#define HH_SENF_Packets_MPEGDVBBundle_DTCPPacket_ 1 +// Custom includes #include "../../Packets/Packets.hh" #include "../../Packets/DefaultBundle/IPv4Packet.hh" #include "../../Packets/DefaultBundle/IPv6Packet.hh" +//#include "DTCPPacket.mpp" +///////////////////////////////hh.p//////////////////////////////////////// + namespace senf { - - //first we have to define some helpers - struct DTCPIPv4AddressListParser : public PacketParserBase { + +# define DTCP_V4_MCADDRESS "224.0.0.36" +# define DTCP_V6_MCADDRESS "FF02:0:0:0:0:0:1:4" +# define DTCP_UDP_PORT 652 + + struct DTCPIPv4AddressListParser : public PacketParserBase + { # include SENF_PARSER() - SENF_PARSER_PRIVATE_FIELD ( num_of_fbips, UInt8Parser ); - SENF_PARSER_PRIVATE_FIELD ( reserved , UInt8Parser ); //must be zero - SENF_PARSER_VEC_N ( fbiplist, num_of_fbips, INet4AddressParser ); - SENF_PARSER_FINALIZE(DTCPIPv4AddressListParser); + SENF_PARSER_PRIVATE_FIELD( fbipCount_, UInt8Parser ); //) //4 - * (senf::VoidPacketParser) //5 - * (senf::ListBParser< IPv6Packet, num_of_fbips>) ); //6 - * This can't work for two reasons: - * -SENF_PARSER_PRIVATE_VARIANT only accepts 6 templates in types but you have to start from 0. - * -you NEVER can use templated Parsers in these macros since the macro-preprocessor won't recognize the <> brackets and will - * interpret the "," - * - * The first problem is solved by using (actually inventing) SENF_PARSER_VARIANT_TRANS which has the same limitations - * concerning the number of types but isn't limited to the values used. This is achieved by a translating function - * as you can see. - * The second problem is solved by introducing Helper-Parser which cover both the list and the number field. By that no - * templates have to be used. - */ - - struct ip_version_translator { - static unsigned fromChooser(ip_version_t::value_type in) { - switch (in) { - case 4: return 0; - case 6: return 1; - } - } - static ip_version_t::value_type toChooser(unsigned in) { - switch (in) { - case 0: return 4; - case 1: return 6; - } - } - }; - - SENF_PARSER_VARIANT_TRANS ( fbiplist, ip_version, ip_version_translator, - (senf::DTCPIPv4AddressListParser) //IPv4 - (senf::DTCPIPv6AddressListParser) ); //IPv6 + //>pkgdraw: name=vers + SENF_PARSER_BITFIELD ( versionNumber, 4, unsigned ); // must be 1 + SENF_PARSER_BITFIELD ( command, 4, unsigned ); //pkgdraw: name= + SENF_PARSER_PRIVATE_FIELD ( reserved1_, UInt8Parser ); // must be zero + + // Go back to fbipCount so the variant has access to that field + SENF_PARSER_GOTO( fbipCount ); - SENF_PARSER_FINALIZE(DTCPPacketParser); + SENF_PARSER_VARIANT ( fbipList_, ipVersion, + ( ids(na, has_v4fbipList, init_v4fbipList, + key(4, DTCPIPv4AddressListParser)) ) + ( ids(na, has_v6fbipList, init_v6fbipList, + key(6, DTCPIPv6AddressListParser)) ) ); + + // We define the two variant accessors ourselves so we can directly return the vector and + // not the collection parser which contains the vector ... + + typedef DTCPIPv4AddressListParser::fbips_t v4fbipList_t; + v4fbipList_t v4fbipList() { return fbipList_().get<0>().fbips(); } + + typedef DTCPIPv6AddressListParser::fbips_t v6fbipList_t; + v6fbipList_t v6fbipList() { return fbipList_().get<1>().fbips(); } + + SENF_PARSER_FINALIZE(DTCPHelloPacketParser); }; - /** \brief DTCP packet + /** \brief DTCP HELLO packet \par Packet type (typedef): - \ref DTCPPacket + \ref DTCPHelloPacket \par Fields: - \ref DTCPPacketParser + \ref DTCPHelloPacketParser + + \image html DTCPPacket.png \ingroup protocolbundle_mpegdvb */ - struct DTCPPacketType + struct DTCPHelloPacketType : public PacketTypeBase, - public PacketTypeMixin + public PacketTypeMixin { - typedef PacketTypeMixin mixin; - typedef ConcretePacket packet; - typedef DTCPPacketParser parser; + typedef PacketTypeMixin mixin; + typedef ConcretePacket packet; + typedef DTCPHelloPacketParser parser; using mixin::nextPacketRange; using mixin::init; @@ -137,7 +149,22 @@ namespace senf { }; /** \brief DTCP packet typedef */ - typedef DTCPPacketType::packet DTCPPacket; + typedef DTCPHelloPacketType::packet DTCPHelloPacket; } -#endif /*DTCPPACKET_HH_*/ +///////////////////////////////hh.e//////////////////////////////////////// +//#include "DTCPPacket.cci" +//#include "DTCPPacket.ct" +//#include "DTCPPacket.cti" +#endif + + +// Local Variables: +// mode: c++ +// fill-column: 100 +// comment-column: 40 +// c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// End: