// $Id$
//
-// Copyright (C) 2007
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum NETwork research (NET)
-// David Wagner <david.wagner@fokus.fraunhofer.de>
+// 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
// it under the terms of the GNU General Public License as published by
#include "../../Packets/DefaultBundle/IPv4Packet.hh"
#include "../../Packets/DefaultBundle/IPv6Packet.hh"
+#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
+
namespace senf {
//first we have to define some helpers
SENF_PARSER_PRIVATE_FIELD ( reserved , UInt8Parser ); //must be zero
SENF_PARSER_VEC_N ( fbiplist, num_of_fbips, INet4AddressParser );
- SENF_PARSER_FINALIZE(DTCPIPv4AddressListParser);
+ SENF_PARSER_FINALIZE(DTCPIPv4AddressListParser);
};
struct DTCPIPv6AddressListParser : public PacketParserBase {
SENF_PARSER_PRIVATE_FIELD ( reserved, UInt8Parser ); //must be zero
SENF_PARSER_VEC_N ( fbiplist, num_of_fbips, INet6AddressParser );
- SENF_PARSER_FINALIZE(DTCPIPv6AddressListParser);
+ SENF_PARSER_FINALIZE(DTCPIPv6AddressListParser);
};
/** \brief Parse a DTCP packet
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_PARSER_BITFIELD_RO ( 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) //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 ","
+ * -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.
+ * 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.
- */
+ * 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;
- }
- }
- };
+ struct ip_version_translator {
+ static unsigned fromChooser(ip_version_t::value_type in) {
+ switch (in) {
+ case 4: return 0;
+ case 6: return 1;
+ }
+ return 1; //default. should rather throw an exception
+ }
+ static ip_version_t::value_type toChooser(unsigned in) {
+ switch (in) {
+ case 0: return 4;
+ case 1: return 6;
+ }
+ return 6; //default. should rather throw an exception
+ }
+ };
SENF_PARSER_VARIANT_TRANS ( fbiplist, ip_version, ip_version_translator,
(senf::DTCPIPv4AddressListParser) //IPv4
(senf::DTCPIPv6AddressListParser) ); //IPv6
+
+ DTCPIPv4AddressListParser getIpv4AddressList () const { return fbiplist().get<0>(); } // this is the absolute index
+ DTCPIPv6AddressListParser getIpv6AddressList () const { return fbiplist().get<1>(); }
+ void setIpVersion4() const { fbiplist().init<0>(); }
+ void setIpVersion6() const { fbiplist().init<1>(); }
- SENF_PARSER_FINALIZE(DTCPPacketParser);
+ SENF_PARSER_FINALIZE(DTCPPacketParser);
};
/** \brief DTCP packet