// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
// Philipp Batroff <philipp.batroff@fokus.fraunhofer.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
// the Free Software Foundation; either version 2 of the License, or
///////////////////////////////cc.p////////////////////////////////////////
namespace {
- senf::PacketRegistry<senf::IpTypes>::RegistrationProxy<senf::IPv6Fragment>
- registerIPv6FragmentType (44);
- senf::PacketRegistry<senf::IpTypes>::RegistrationProxy<senf::IPv6Routing>
- registerIPv6RoutingType (43);
- senf::PacketRegistry<senf::IpTypes>::RegistrationProxy<senf::IPv6HopByHop>
- registerIPv6HopByHopType (0u);
- senf::PacketRegistry<senf::IpTypes>::RegistrationProxy<senf::IPv6Destination>
- registerIPv6DestinationType (60u);
+ senf::PacketRegistry<senf::IpTypes>::RegistrationProxy<senf::IPv6FragmentPacket>
+ registerIPv6FragmentPacketType (44);
+ senf::PacketRegistry<senf::IpTypes>::RegistrationProxy<senf::IPv6RoutingPacket>
+ registerIPv6RoutingPacketType (43);
+ senf::PacketRegistry<senf::IpTypes>::RegistrationProxy<senf::IPv6HopByHopOptionsPacket>
+ registerIPv6HopByHopOptionsPacketType (0u);
+ senf::PacketRegistry<senf::IpTypes>::RegistrationProxy<senf::IPv6DestinationOptionsPacket>
+ registerIPv6DestinationOptionsPacketType (60u);
}
-prefix_ void senf::IPv6FragmentType::dump(packet p, std::ostream & os)
+prefix_ void senf::IPv6FragmentPacketType::dump(packet p, std::ostream & os)
{
os << "Internet protocol Version 6 fragment extension:\n"
<< " next header : " << unsigned(p->nextHeader()) << "\n"
<< " id : " << std::hex << unsigned(p->id()) << "\n";
}
-prefix_ void senf::IPv6RoutingType::dump(packet p, std::ostream & os)
+prefix_ void senf::IPv6RoutingPacketType::dump(packet p, std::ostream & os)
{
os << "Internet protocol Version 6 routing extension:\n"
<< " next header : " << unsigned (p->nextHeader()) << "\n"
<< " header length : " << unsigned (p->headerLength()) << "\n"
<< " routing type : " << unsigned (p->routingType()) << "\n"
- << " segments left : " << unsigned (p->segmentsLeft()) << "\n";
- IPv6Routing::Parser::hopAddresses_t::container hopAddresses (p->hopAddresses());
- os << " further Hop Addresses : \n";
- if ( p->segmentsLeft() != 0 ){
- for (IPv6Routing::Parser::hopAddresses_t::container::iterator i (hopAddresses.begin()); i != hopAddresses.end(); ++i)
- os << *i << "\n";
- }
+ << " segments left : " << unsigned (p->segmentsLeft()) << "\n"
+ << " further Hop Addresses : \n";
+ typedef IPv6RoutingPacket::Parser::hopAddresses_t::container addrContainer_t;
+ addrContainer_t hopAddresses (p->hopAddresses());
+ if ( p->segmentsLeft() != 0 )
+ for (addrContainer_t::iterator i (hopAddresses.begin()); i != hopAddresses.end(); ++i)
+ os << *i << "\n";
}
-prefix_ void senf::IPv6HopByHopType::dump(packet p, std::ostream & os)
+prefix_ void senf::IPv6HopByHopOptionsPacketType::dump(packet p, std::ostream & os)
{
os << "Internet protocol Version 6 Hop-By-Hop extension:\n"
<< " next header : " << unsigned (p->nextHeader()) << "\n"
<< " header length : " << unsigned (p->headerLength()) << "\n";
- os << " OptionTypes:\n";
- IPv6HopByHop::Parser::options_t::container options (p->options());
- IPv6HopByHop::Parser::options_t::container::iterator optIter(options.begin());
- for(;optIter != options.end(); ++optIter){
- os << " AltAction : " << (unsigned) optIter->altAction()
- << "\n ChangeFlag : " << (unsigned) optIter->changeFlag()
- << "\n Option Type : " << (unsigned) optIter->optionType()
- << "\n OptionLength : " << (unsigned) optIter->optionLength() <<"\n";
- senf::hexdump(boost::begin(optIter->value()) , boost::end(optIter->value()), os );
- }
+ os << " OptionTypes:\n";
+ typedef IPv6HopByHopOptionsPacket::Parser::options_t::container optContainer_t;
+ optContainer_t options (p->options());
+ optContainer_t::iterator optIter(options.begin());
+ for(; optIter != options.end(); ++optIter) {
+ os << " AltAction : " << (unsigned) optIter->altAction()
+ << "\n ChangeFlag : " << (unsigned) optIter->changeFlag()
+ << "\n Option Type : " << (unsigned) optIter->optionType()
+ << "\n OptionLength : " << (unsigned) optIter->optionLength() <<"\n";
+ senf::hexdump(boost::begin(optIter->value()) , boost::end(optIter->value()), os );
+ }
}
-prefix_ void senf::IPv6DestinationType::dump(packet p, std::ostream & os)
+prefix_ void senf::IPv6DestinationOptionsPacketType::dump(packet p, std::ostream & os)
{
os << "Internet protocol Version 6 Destination Options extension:\n"
<< " next header : " << unsigned (p->nextHeader()) << "\n"
// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
// Philipp Batroff <philipp.batroff@fokus.fraunhofer.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
// the Free Software Foundation; either version 2 of the License, or
/** \brief IPv6 fragment extension
\par Packet type (typedef):
- \ref IPv6Extension_Fragment
+ \ref IPv6FragmentPacket
\par Fields:
- \ref IPv6PacketParserExtension_Fragment
+ \ref IPv6FragmentPacketParser
\par Associated registries:
\ref IpTypes
\ingroup protocolbundle_default
*/
- struct IPv6FragmentType
+ struct IPv6FragmentPacketType
: public PacketTypeBase,
- public PacketTypeMixin<IPv6FragmentType, IpTypes>
+ public PacketTypeMixin<IPv6FragmentPacketType, IpTypes>
{
#ifndef DOXYGEN
- typedef PacketTypeMixin<IPv6FragmentType, IpTypes> mixin;
+ typedef PacketTypeMixin<IPv6FragmentPacketType, IpTypes> mixin;
#endif
/** \brief IPv6 fragment extension packet typedef */
- typedef ConcretePacket<IPv6FragmentType> packet;
+ typedef ConcretePacket<IPv6FragmentPacketType> packet;
/** \brief typedef to the parser of IPv6 fragment extension packet */
typedef IPv6FragmentPacketParser parser;
static key_t nextPacketKey(packet p)
{ return p->nextHeader(); }
- /** \brief Dump given IPv6Extension_Fragment in readable form to given output stream */
+ /** \brief Dump given IPv6FragmentPacket in readable form to given output stream */
static void dump(packet p, std::ostream & os);
static void finalize(packet p) {
};
/** \brief IPv6 fragment extension packet typedef */
- typedef ConcretePacket<IPv6FragmentType> IPv6Fragment;
+ typedef ConcretePacket<IPv6FragmentPacketType> IPv6FragmentPacket;
// =====================================================================================================
/** \brief Parse in IPv6 routing extension header
- Parser implementing the IPv6 routing Header extension. The fields implemented are:
+ Parser implementing the IPv6 routing Header extension (type 0 only).
+ The fields implemented are:
\image html IPv6Extensions_Routing.png
\see IPv6ExtensionType_Routing \n
- <a href="http://tools.ietf.org/html/rfc2460">RFC 2460</a>
+ <a href="http://tools.ietf.org/html/rfc2460">RFC 2460</a>
*/
-
-//Routing Header Extension (type 0 only)
struct IPv6PRoutingPacketParser : public PacketParserBase
{
-/*
-The Type 0 Routing header has the following format: (RFC 2460)
-
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Next Header | Hdr Ext Len | Routing Type=0| Segments Left |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Reserved |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | |
- + +
- | |
- + Address[1] +
- | |
- + +
- | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- . . .
- . . .
- . . .
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | |
- + +
- | |
- + Address[n] +
- | |
- + +
- | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-*/
+ /*
+ The Type 0 Routing header has the following format: (RFC 2460)
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Next Header | Hdr Ext Len | Routing Type=0| Segments Left |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Reserved |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | |
+ + +
+ | |
+ + Address[1] +
+ | |
+ + +
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ . . .
+ . . .
+ . . .
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | |
+ + +
+ | |
+ + Address[n] +
+ | |
+ + +
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
# include SENF_PARSER()
SENF_PARSER_FIELD ( nextHeader, UInt8Parser );
/** \brief IPv6 routing extension
\par Packet type (typedef):
- \ref IPv6Extension_Routing
+ \ref IPv6RoutingPacket
\par Fields:
- \ref IPv6PacketParserExtension_Routing
+ \ref IPv6PRoutingPacketParser
\par Associated registries:
- \ref IpTypes
+ \ref IpTypes
\par Finalize action:
- Set \a nextHeader from type of next packet if found in \ref IpTypes
+ Set \a nextHeader from type of next packet if found in \ref IpTypes
- \ingroup protocolbundle_default
- */
-
- struct IPv6RoutingType
+ \ingroup protocolbundle_default
+ */
+ struct IPv6RoutingPacketType
: public PacketTypeBase,
- public PacketTypeMixin<IPv6RoutingType, IpTypes>
+ public PacketTypeMixin<IPv6RoutingPacketType, IpTypes>
{
#ifndef DOXYGEN
- typedef PacketTypeMixin<IPv6RoutingType, IpTypes> mixin;
+ typedef PacketTypeMixin<IPv6RoutingPacketType, IpTypes> mixin;
#endif
/** \brief IPv6 routing extension packet typedef */
- typedef ConcretePacket<IPv6RoutingType> packet;
+ typedef ConcretePacket<IPv6RoutingPacketType> packet;
/** \brief typedef to the parser of IPv6 routing extension packet */
typedef IPv6PRoutingPacketParser parser;
static key_t nextPacketKey(packet p)
{ return p->nextHeader(); }
- /** \brief Dump given IPv6Extension_Routing in readable form to given output stream */
+ /** \brief Dump given IPv6RoutingPacket in readable form to given output stream */
static void dump(packet p, std::ostream & os);
static void finalize(packet p) {
};
/** \brief IPv6 routing extension packet typedef */
- typedef ConcretePacket<IPv6RoutingType> IPv6Routing;
+ typedef ConcretePacket<IPv6RoutingPacketType> IPv6RoutingPacket;
// =====================================================================================================
/** \brief Parse in IPv6 Hop-By-Hop extension header
Parser implementing the IPv6 routing Header extension. The fields implemented are:
- \image html IPv6Extensions_HopByHop.png
+ \image html IPv6Extensions_HopByHop.png
- \see IPv6ExtensionType_HopByHop \n
- <a href="http://tools.ietf.org/html/rfc2460">RFC 2460</a>
+ \see IPv6ExtensionType_HopByHop \n
+ <a href="http://tools.ietf.org/html/rfc2460">RFC 2460</a>
*/
-
-// Hop-By-Hop Extension Header
-
- struct IPv6HopByHopPacketParser : public PacketParserBase {
+ struct IPv6HopByHopOptionsPacketParser : public PacketParserBase {
# include SENF_PARSER()
+
SENF_PARSER_FIELD ( nextHeader, UInt8Parser );
SENF_PARSER_FIELD ( headerLength, UInt8Parser );
typedef detail::FixedAuxParserPolicy<UInt8Parser, 1u> ListOptionTypeAuxPolicy;
- typedef detail::ListOptionTypeParser_Policy<GenericOptTypeTLVParser, ListOptionTypeAuxPolicy> ListOptionTypePolicy;
+ typedef detail::ListOptionTypeParser_Policy<
+ IPv6GenericOptionTLVParser, ListOptionTypeAuxPolicy> ListOptionTypePolicy;
typedef ListParser<ListOptionTypePolicy> ListOptionTypeParser;
SENF_PARSER_FIELD ( options, ListOptionTypeParser);
- SENF_PARSER_FINALIZE ( IPv6HopByHopPacketParser );
+ SENF_PARSER_FINALIZE ( IPv6HopByHopOptionsPacketParser );
};
/** \brief IPv6 Hop-By-Hop extension
\par Packet type (typedef):
- \ref IPv6Extension_HopByHop
+ \ref IPv6HopByHopOptionsPacket
\par Fields:
- \ref IPv6PacketParserExtension_HopByHop
+ \ref IPv6HopByHopOptionsPacketParser
\par Associated registries:
- \ref IpTypes
+ \ref IpTypes
\par Finalize action:
- Set \a nextHeader from type of next packet if found in \ref IpTypes
+ Set \a nextHeader from type of next packet if found in \ref IpTypes
- \ingroup protocolbundle_default
+ \ingroup protocolbundle_default
*/
-
- struct IPv6HopByHopType
+ struct IPv6HopByHopOptionsPacketType
: public PacketTypeBase,
- public PacketTypeMixin<IPv6HopByHopType, IpTypes>
+ public PacketTypeMixin<IPv6HopByHopOptionsPacketType, IpTypes>
{
#ifndef DOXYGEN
- typedef PacketTypeMixin<IPv6HopByHopType, IpTypes> mixin;
+ typedef PacketTypeMixin<IPv6HopByHopOptionsPacketType, IpTypes> mixin;
#endif
/** \brief IPv6 Hop-By-Hop extension packet typedef */
- typedef ConcretePacket<IPv6HopByHopType> packet;
+ typedef ConcretePacket<IPv6HopByHopOptionsPacketType> packet;
/** \brief typedef to the parser of IPv6 Hop-By-Hop extension packet */
- typedef IPv6HopByHopPacketParser parser;
+ typedef IPv6HopByHopOptionsPacketParser parser;
using mixin::nextPacketRange;
using mixin::nextPacketType;
static key_t nextPacketKey(packet p)
{ return p->nextHeader(); }
- /** \brief Dump given IPv6Extension_HopByHop in readable form to given output stream */
+
+ /** \brief Dump given IPv6HopByHopOptionsPacket in readable form to given output stream */
static void dump(packet p, std::ostream & os);
static void finalize(packet p) {
};
/** \brief IPv6 routing Hop-By-Hop packet typedef */
- typedef ConcretePacket<IPv6HopByHopType> IPv6HopByHop;
+ typedef ConcretePacket<IPv6HopByHopOptionsPacketType> IPv6HopByHopOptionsPacket;
// =====================================================================================================
/** \brief Parse in IPv6 Destination Options extension header
- Parser implementing the IPv6 Destination Options Header extension. The fields implemented are:
- \image html IPv6Extensions_Destination.png
-
- \see IPv6ExtensionType_Destination \n
- <a href="http://tools.ietf.org/html/rfc2460">RFC 2460</a>
- */
-
- // Destination Options skeleton without TLV-Options
-
- struct IPv6DestinationPacketParser : public PacketParserBase {
+ Parser implementing the IPv6 Destination Options Header extension.
+ The fields implemented are:
+ \image html IPv6Extensions_Destination.png
+ \see IPv6ExtensionType_Destination \n
+ <a href="http://tools.ietf.org/html/rfc2460">RFC 2460</a>
+ */
+ struct IPv6DestinationOptionsPacketParser : public PacketParserBase
+ {
# include SENF_PARSER()
SENF_PARSER_FIELD ( nextHeader, UInt8Parser );
SENF_PARSER_FIELD ( headerLength, UInt8Parser );
- SENF_PARSER_FINALIZE ( IPv6DestinationPacketParser );
+ SENF_PARSER_FINALIZE ( IPv6DestinationOptionsPacketParser );
};
/** \brief IPv6 Destination Options extension
\par Packet type (typedef):
- \ref IPv6Extension_Destination
+ \ref IPv6DestinationOptionsPacket
\par Fields:
- \ref IPv6PacketParserExtension_Destination
+ \ref IPv6DestinationOptionsPacketParser
\par Associated registries:
- \ref IpTypes
+ \ref IpTypes
\par Finalize action:
- Set \a nextHeader from type of next packet if found in \ref IpTypes
+ Set \a nextHeader from type of next packet if found in \ref IpTypes
- \ingroup protocolbundle_default
- */
-
- struct IPv6DestinationType
+ \ingroup protocolbundle_default
+ */
+ struct IPv6DestinationOptionsPacketType
: public PacketTypeBase,
- public PacketTypeMixin<IPv6DestinationType, IpTypes>
+ public PacketTypeMixin<IPv6DestinationOptionsPacketType, IpTypes>
{
#ifndef DOXYGEN
- typedef PacketTypeMixin<IPv6DestinationType, IpTypes> mixin;
+ typedef PacketTypeMixin<IPv6DestinationOptionsPacketType, IpTypes> mixin;
#endif
/** \brief IPv6 Destination Options extension packet typedef */
- typedef ConcretePacket<IPv6DestinationType> packet;
+ typedef ConcretePacket<IPv6DestinationOptionsPacketType> packet;
/** \brief typedef to the parser of IPv6 Destination Options extension packet */
- typedef IPv6DestinationPacketParser parser;
+ typedef IPv6DestinationOptionsPacketParser parser;
using mixin::nextPacketRange;
using mixin::nextPacketType;
static key_t nextPacketKey(packet p)
{ return p->nextHeader(); }
- /** \brief Dump given IPv6Extension_Destination in readable form to given output stream */
+ /** \brief Dump given IPv6DestinationOptionsPacket in readable form to given output stream */
static void dump(packet p, std::ostream & os);
static void finalize(packet p) {
};
/** \brief IPv6 routing Destination Options packet typedef */
- typedef ConcretePacket<IPv6DestinationType> IPv6Destination;
-
+ typedef ConcretePacket<IPv6DestinationOptionsPacketType> IPv6DestinationOptionsPacket;
-} //namespace senf
+}
+
///////////////////////////////hh.e////////////////////////////////////////
//#include "IPv6Extensions.cci"
//#include "IPv6Extensions.ct"
// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
// Philipp Batroff <philipp.batroff@fokus.fraunhofer.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
// the Free Software Foundation; either version 2 of the License, or
std::ostringstream oss (std::ostringstream::out);
SENF_CHECK_NO_THROW( pFragment_packet.dump( oss));
- BOOST_CHECK( pFragment_packet.next().is<senf::IPv6Fragment>() );
+ BOOST_CHECK( pFragment_packet.next().is<senf::IPv6FragmentPacket>() );
- senf::IPv6Fragment fFragment_packet (pFragment_packet.next().as<senf::IPv6Fragment>());
+ senf::IPv6FragmentPacket fFragment_packet (pFragment_packet.next().as<senf::IPv6FragmentPacket>());
BOOST_CHECK_EQUAL( fFragment_packet->nextHeader(), 17u );
BOOST_CHECK_EQUAL( fFragment_packet->fragmentOffset(), 160u );
std::ostringstream oss (std::ostringstream::out);
SENF_CHECK_NO_THROW( pRouting_packet.dump( oss));
- BOOST_REQUIRE( pRouting_packet.next().is<senf::IPv6Routing>() );
+ BOOST_REQUIRE( pRouting_packet.next().is<senf::IPv6RoutingPacket>() );
- senf::IPv6Routing pRouting_extension (pRouting_packet.next().as<senf::IPv6Routing>());
+ senf::IPv6RoutingPacket pRouting_extension (pRouting_packet.next().as<senf::IPv6RoutingPacket>());
BOOST_CHECK_EQUAL( pRouting_extension->nextHeader(), 58u );
BOOST_CHECK_EQUAL( pRouting_extension->headerLength(), 0x00 );
std::ostringstream oss (std::ostringstream::out);
SENF_CHECK_NO_THROW( pHop_packet.dump( oss ));
- BOOST_REQUIRE( pHop_packet.next().is<senf::IPv6HopByHop>() );
- senf::IPv6HopByHop pHop_extension (pHop_packet.next().as<senf::IPv6HopByHop>());
+ BOOST_REQUIRE( pHop_packet.next().is<senf::IPv6HopByHopOptionsPacket>() );
+ senf::IPv6HopByHopOptionsPacket pHop_extension (
+ pHop_packet.next().as<senf::IPv6HopByHopOptionsPacket>());
BOOST_CHECK_EQUAL( pHop_extension->nextHeader(), 58u );
BOOST_CHECK_EQUAL( pHop_extension->headerLength(), 0x00 );
- senf::IPv6HopByHop::Parser::options_t::container optC(pHop_extension->options() );
- senf::IPv6HopByHop::Parser::options_t::container::iterator listIter (optC.begin());
+ senf::IPv6HopByHopOptionsPacket::Parser::options_t::container optC(pHop_extension->options() );
+ senf::IPv6HopByHopOptionsPacket::Parser::options_t::container::iterator listIter (optC.begin());
BOOST_CHECK_EQUAL( listIter->altAction(), 0u);
BOOST_CHECK_EQUAL( listIter->changeFlag(), 0u);
ip->hopLimit() = 1u;
ip->source() = senf::INet6Address::from_string("fe80::219:b9ff:feeb:b226");
ip->destination() = senf::INet6Address::from_string("ff02::16");
- senf::IPv6HopByHop pext (senf::IPv6HopByHop::createAfter(ip) );
+ senf::IPv6HopByHopOptionsPacket pext (senf::IPv6HopByHopOptionsPacket::createAfter(ip) );
pext->nextHeader() = 58u;
pext->headerLength() = 0u;
{
- senf::IPv6HopByHop::Parser::options_t::container optC(pext->options() );
+ senf::IPv6HopByHopOptionsPacket::Parser::options_t::container optC(pext->options() );
optC.push_back_space();
- senf::GenericOptTypeTLVParser opt = optC.back().init<senf::GenericOptTypeTLVParser>();
+ senf::IPv6GenericOptionTLVParser opt = optC.back().init<senf::IPv6GenericOptionTLVParser>();
opt.altAction() = 0u;
opt.changeFlag() = 0u;
opt.optionType() = 5u;
opt.setPayload(val);
optC.push_back_space();
- opt = optC.back().init<senf::GenericOptTypeTLVParser>();
+ opt = optC.back().init<senf::IPv6GenericOptionTLVParser>();
opt.altAction() = 0u;
opt.changeFlag() = 0u;
opt.optionType() = 2u;