X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FMPEGDVBBundle%2FDTCPPacket.hh;h=f401cb2ed27f29bddb91c06674c81a7c1602799a;hb=17d44437f7fb8ee68a96ed55fc327c746c161142;hp=5b43e92fcd23c0ec9846fd824efdc86b3a36a99f;hpb=67608d39cb73231d6deaae285aa5477762246e50;p=senf.git diff --git a/Packets/MPEGDVBBundle/DTCPPacket.hh b/Packets/MPEGDVBBundle/DTCPPacket.hh index 5b43e92..f401cb2 100644 --- a/Packets/MPEGDVBBundle/DTCPPacket.hh +++ b/Packets/MPEGDVBBundle/DTCPPacket.hh @@ -1,8 +1,26 @@ -// Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum NETwork research (NET) -// David Wagner +// $Id$ // +// 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 +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + #ifndef DTCPPACKET_HH_ #define DTCPPACKET_HH_ @@ -10,25 +28,29 @@ #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 struct DTCPIPv4AddressListParser : public PacketParserBase { # include SENF_PARSER() - SENF_PARSER_PRIVATE_FIELD ( num_of_fbips, Parse_UInt8 ); - SENF_PARSER_PRIVATE_FIELD ( reserved , Parse_UInt8 ); //must be zero - SENF_PARSER_VEC_N ( fbiplist, num_of_fbips, Parse_INet4Address ); + 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_FINALIZE(DTCPIPv4AddressListParser); }; struct DTCPIPv6AddressListParser : public PacketParserBase { # include SENF_PARSER() - SENF_PARSER_PRIVATE_FIELD ( num_of_fbips, Parse_UInt8 ); - SENF_PARSER_PRIVATE_FIELD ( reserved, Parse_UInt8 ); //must be zero - SENF_PARSER_VEC_N ( fbiplist, num_of_fbips, Parse_INet6Address ); + 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_FINALIZE(DTCPIPv6AddressListParser); }; /** \brief Parse a DTCP packet @@ -37,60 +59,67 @@ namespace senf { \see DTCPPacketType */ - struct Parse_DTCPPacket : public PacketParserBase + struct DTCPPacketParser : 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, Parse_UInt8 ); // 5 according to rfc3077 - SENF_PARSER_FIELD ( sequence_number, Parse_UInt16 ); + 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, Parse_UInt8 ); - /* 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) //3 - * (senf::Parse_ListB< IPv4Packet, num_of_fbips>) //4 + * (senf::ListBParser< IPv4Packet, num_of_fbips>) //4 * (senf::VoidPacketParser) //5 - * (senf::Parse_ListB< IPv6Packet, num_of_fbips>) ); //6 + * (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(Parse_DTCPPacket); + SENF_PARSER_FINALIZE(DTCPPacketParser); }; /** \brief DTCP packet @@ -99,7 +128,7 @@ namespace senf { \ref DTCPPacket \par Fields: - \ref Parse_DTCPPacket + \ref DTCPPacketParser \ingroup protocolbundle_mpegdvb */ @@ -109,7 +138,7 @@ namespace senf { { typedef PacketTypeMixin mixin; typedef ConcretePacket packet; - typedef Parse_DTCPPacket parser; + typedef DTCPPacketParser parser; using mixin::nextPacketRange; using mixin::init;