// $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 <dw6@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
// 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 ); //<pkgdraw: hide
+ SENF_PARSER_PRIVATE_FIELD( reserved_, UInt8Parser ); //<pkgdraw: hide
+
+ SENF_PARSER_VECTOR( fbips, fbipCount_, INet4AddressParser );
+
+ // Needed since we do NOT want to init fbipCount_ or reseverd_. And since
+ // INet4AddressParser::init() is a no-op, we can just as well disable init completely
+ SENF_PARSER_INIT() {}
+
+ SENF_PARSER_FINALIZE(DTCPIPv4AddressListParser);
};
- struct DTCPIPv6AddressListParser : public PacketParserBase {
+ struct DTCPIPv6AddressListParser : 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, INet6AddressParser );
- SENF_PARSER_FINALIZE(DTCPIPv6AddressListParser);
+ SENF_PARSER_PRIVATE_FIELD( fbipCount_, UInt8Parser ); //<pkgdraw: hide
+ SENF_PARSER_PRIVATE_FIELD( reserved_, UInt8Parser ); //<pkgdraw: hide
+
+ SENF_PARSER_VECTOR( fbips, fbipCount_, INet6AddressParser );
+
+ // Needed since we do NOT want to init fbipCount_ or reseverd_. And since
+ // INet4AddressParser::init() is a no-op, we can just as well disable init completely
+ SENF_PARSER_INIT() {}
+
+ SENF_PARSER_FINALIZE(DTCPIPv6AddressListParser);
};
- /** \brief Parse a DTCP packet
+ /** \brief Parse a DTCP HELLO packet
Parser implementing the DTCP packet according to RFC 3077
- \see DTCPPacketType
+ \see DTCPHelloPacketType
*/
- struct DTCPPacketParser : public PacketParserBase
+ struct DTCPHelloPacketParser : public PacketParserBase
{
# include SENF_PARSER()
- SENF_PARSER_BITFIELD ( version_number, 4, unsigned ); // =1 according to rfc3077
- SENF_PARSER_BITFIELD ( command, 4, unsigned ); // 1=JOIN 2=LEAVE
- SENF_PARSER_FIELD ( interval, UInt8Parser ); // 5 according to rfc3077
- SENF_PARSER_FIELD ( sequence_number, UInt16Parser );
- SENF_PARSER_PRIVATE_BITFIELD ( reserved, 3, unsigned );
- SENF_PARSER_BITFIELD ( receive_capable_feed, 1, bool ); // 0=send only, 1=receive_capable_feed
- SENF_PARSER_BITFIELD ( ip_version, 4, unsigned ); // 4=IPv4, 6=IPv6
- SENF_PARSER_FIELD ( tunnel_protocol, UInt8Parser );
- /* Please consider the following comments on the implementation given in this class:
- * 1. you could think of simply using SENF_PARSER_PRIVATE_VARIANT and List / Vectorparser like this:
- * SENF_PARSER_PRIVATE_VARIANT ( fbiplist, ip_version,
- * (senf::VoidPacketParser) //ip_version=0
- * (senf::VoidPacketParser) //1
- * (senf::VoidPacketParser) //2
- * (senf::VoidPacketParser) //3
- * (senf::ListBParser< IPv4Packet, num_of_fbips>) //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=cmd
+
+ enum Command { JOIN=1, LEAVE=2 };
+
+ SENF_PARSER_FIELD ( interval, UInt8Parser ); // should be 5
+ SENF_PARSER_FIELD ( sequenceNumber, UInt16Parser );
+
+ SENF_PARSER_PRIVATE_BITFIELD ( reserved0_, 3, unsigned ); //<pkgdraw: name=
+ SENF_PARSER_BITFIELD ( receiveCapableFeed, 1, bool );
+ SENF_PARSER_BITFIELD_RO ( ipVersion, 4, unsigned ); // 4=IPv4, 6=IPv6
+
+ SENF_PARSER_FIELD ( tunnelProtocol, UInt8Parser );
+ SENF_PARSER_FIELD_RO ( fbipCount, UInt8Parser );
+ //>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<DTCPPacketType>
+ public PacketTypeMixin<DTCPHelloPacketType>
{
- typedef PacketTypeMixin<DTCPPacketType> mixin;
- typedef ConcretePacket<DTCPPacketType> packet;
- typedef DTCPPacketParser parser;
+ typedef PacketTypeMixin<DTCPHelloPacketType> mixin;
+ typedef ConcretePacket<DTCPHelloPacketType> packet;
+ typedef DTCPHelloPacketParser parser;
using mixin::nextPacketRange;
using mixin::init;
};
/** \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
+
+\f
+// 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: