X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FMPEGDVBBundle%2FDTCPPacket.hh;h=f401cb2ed27f29bddb91c06674c81a7c1602799a;hb=c0b5c560da72983939b286632ac481e076649ddb;hp=14128050dd51a888b8516e33930b39edc1e5f161;hpb=a1001797645cc68c869ef296f5e9ba13aa8e80c4;p=senf.git diff --git a/Packets/MPEGDVBBundle/DTCPPacket.hh b/Packets/MPEGDVBBundle/DTCPPacket.hh index 1412805..f401cb2 100644 --- a/Packets/MPEGDVBBundle/DTCPPacket.hh +++ b/Packets/MPEGDVBBundle/DTCPPacket.hh @@ -1,9 +1,9 @@ // $Id$ // -// Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum NETwork research (NET) -// David Wagner +// 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 @@ -28,6 +28,10 @@ #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 @@ -37,7 +41,7 @@ namespace senf { 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 { @@ -46,7 +50,7 @@ namespace senf { 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 @@ -65,11 +69,11 @@ namespace senf { 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 @@ -78,37 +82,44 @@ namespace senf { * (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