// 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
BOOST_CHECK_EQUAL( pICMPv6->checksum(), 0x50cc);
}
-BOOST_AUTO_UNIT_TEST(ipv6Extensions_hopByHop_create)
-{
- try{
- std::ostringstream oss (std::ostringstream::out);
+BOOST_AUTO_UNIT_TEST(ipv6Extensions_hopByHop_create)
+{
+ std::ostringstream oss (std::ostringstream::out);
unsigned char HopByHop_packetData[] = {
//Ethernet
0x33 ,0x33 ,0x00 ,0x00 ,0x00 ,0x16 , //destination MAC
0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //IPv6 Destination address ff02::16
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16,
- //HopByHop option
+// HopByHop option
0x3a, //next Header (ICMPv6)
0x00, //Length (0 = 8Bytes)
- //option Header
+// option Header
0x05, //option type
0x02, //option Length (= 2 byte)
0x00, 0x00, //data (zero data here ...)
0x01, 0x00, //padding
- //ICMPv6
+// ICMPv6
0x8f, //type 143
0x00, //code 0, should always be 0
0x50 ,0xcc , //checksum
- //MLDv2
+// MLDv2
0x00 ,0x00 , //reserved, zero by default
0x00 ,0x01 , //nr of McAddressRecords
0x04 , //recordType
}
senf::ICMPv6Packet icmp (senf::ICMPv6Packet::createAfter (pext));
- icmp->type() = 0x8f;
icmp->code() = 0u;
- icmp->checksum() = 0u;
senf::MLDv2ListenerReport mld ( senf::MLDv2ListenerReport::createAfter(icmp) );
{
senf::MLDv2ListenerReport::Parser::mcastAddrRecords_t::container c (mld->mcastAddrRecords() );
c.back().mcAddress() = addr;
}
eth.finalizeAll();
- SENF_CHECK_NO_THROW( ip.dump(oss) );
+ SENF_CHECK_NO_THROW( eth.dump(oss) );
SENF_CHECK_EQUAL_COLLECTIONS(
HopByHop_packetData, HopByHop_packetData+sizeof(HopByHop_packetData),
eth.data().begin(), eth.data().end() );
- eth.dump(std::cout);
- senf::hexdump(eth.data().begin(), eth.data().end(), std::cout);
- std::cout << "\n\n" << std::endl;
- senf::hexdump(boost::begin(HopByHop_packetData), boost::end(HopByHop_packetData), std::cout);
- }
- catch (std::exception & e)
+}
+
+namespace {
+ struct IPv6ChecksumOptionTLVParser : public senf::IPv6OptionTLVParser
+ {
+ # include SENF_PARSER()
+ SENF_PARSER_INHERIT ( IPv6OptionTLVParser );
+ SENF_PARSER_FIELD ( slfNetType, senf::UInt8Parser );
+ SENF_PARSER_FIELD ( checksum, senf::UInt32Parser );
+
+ SENF_PARSER_INIT() {
+ optionType() = typeCode;
+ optionLength() = senf::init_bytes<IPv6ChecksumOptionTLVParser>::value -senf::init_bytes<IPv6OptionTLVParser>::value;
+ slfNetType() = SN_typeCode;
+ }
+ SENF_PARSER_FINALIZE ( IPv6ChecksumOptionTLVParser );
+ static const boost::uint8_t typeCode = 0x0d;
+ static const boost::uint8_t SN_typeCode = 0x4d;
+ };
+}
+
+BOOST_AUTO_UNIT_TEST(ipv6Extensions_hopByHop_create_SN) {
+ unsigned char data[] = {
+ 0x3a, 0x01, // Hop-By-Hop Header (nextHeader, length)
+ 0x0d, 0x05, // option type, length
+ // option value: slfNetType, checksum
+ 0x01, 0x01, 0x23, 0x45, 0x67,
+ // padding (PadN option: type, length, 0-padding)
+ 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ senf::IPv6HopByHopOptionsPacket p ( senf::IPv6HopByHopOptionsPacket::create() );
+ p->nextHeader() = 0x3a;
{
- std::cerr << e.what() << std::endl; throw;
+ senf::IPv6HopByHopOptionsPacket::Parser::options_t::container optC(p->options() );
+ {
+ IPv6ChecksumOptionTLVParser opt (
+ optC.push_back_space().init<IPv6ChecksumOptionTLVParser>());
+ SENF_CHECK_NO_THROW( opt.slfNetType() = 1u) ;
+ opt.checksum() = 0x01234567u;
+ }
}
+
+ SENF_CHECK_EQUAL_COLLECTIONS( data, data+sizeof(data),
+ p.data().begin(), p.data().end() );
}
///////////////////////////////cc.e////////////////////////////////////////