X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FDefaultBundle%2FIPv6Extensions.test.cc;h=0b3d7408509e2e5fc77a761ec8ef7be1ea874f71;hb=dc92fc89c7e2d5eedcaadaebef0a196acd39c07f;hp=4fcd159e3b3991aa57f8a84b8701d2dee4c7f68b;hpb=26610f603ebdd465307b9621f532c1fe19fd5571;p=senf.git diff --git a/senf/Packets/DefaultBundle/IPv6Extensions.test.cc b/senf/Packets/DefaultBundle/IPv6Extensions.test.cc index 4fcd159..0b3d740 100644 --- a/senf/Packets/DefaultBundle/IPv6Extensions.test.cc +++ b/senf/Packets/DefaultBundle/IPv6Extensions.test.cc @@ -149,9 +149,71 @@ BOOST_AUTO_UNIT_TEST(ipv6Extensions) } //============================================================================================== - /* - no unittests for Hop by Hop - and Destination - Options extension Header yet. No real implementation there, only IPv6 extension skeleton implemented. - */ +BOOST_AUTO_UNIT_TEST(ipv6Extensions_hopByHop) +{ + unsigned char HopByHop_packetData[] = { + 0x60, 0x00, 0x00, 0x00, //IP version, class, flow label + 0x00, 0x24, //payload length + 0x00, //next header: IPv6 hop-by-hop option (0) + 0x01, //hop limit (1) + 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //IPv6 Source address (fe80::219:b9ff:feeb:b226) + 0x02, 0x19, 0xb9, 0xff, 0xfe, 0xeb, 0xb2, 0x26, + + 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //IPv6 Destination address ff02::16 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, + //HopByHop option + 0x3a, //next Header (ICMPv6) + 0x00, //Length (0 = 8Bytes) + + //option Header + 0x05, //option type + 0x02, //option Length (= 2 byte) + 0x00, 0x00, //data (zero data here ...) + + 0x02, //option type (2, set for testing purposes only) + 0x00, //option Type length (=0, no data field needed here) + + //ICMPv6 + 0x8f, //type 143 + 0x00, //code 0, should always be 0 + 0x50, 0xcc, //checksum + }; + + std::ostringstream oss (std::ostringstream::out); + + senf::IPv6Packet pHop_packet (senf::IPv6Packet::create(HopByHop_packetData)); + BOOST_CHECK_EQUAL( pHop_packet->version(), 6u ); + BOOST_CHECK_EQUAL( pHop_packet->length(), 36u ); + BOOST_CHECK_EQUAL( pHop_packet->nextHeader(), 0u ); + BOOST_CHECK_EQUAL( pHop_packet->source().value(), senf::INet6Address::from_string("fe80::219:b9ff:feeb:b226") ); + BOOST_CHECK_EQUAL( pHop_packet->destination().value(), senf::INet6Address::from_string("ff02::16") ); + + SENF_CHECK_NO_THROW( pHop_packet.dump( oss )); + BOOST_REQUIRE( pHop_packet.next().is() ); + + //hopByHop extension header + senf::IPv6Extension_HopByHop pHop_extension (pHop_packet.next().as()); + BOOST_CHECK_EQUAL( pHop_extension->nextHeader(), 58u ); + BOOST_CHECK_EQUAL( pHop_extension->headerLength(), 0x00 ); + + SENF_CHECK_NO_THROW( pHop_extension.dump( oss )); + pHop_extension.dump(oss); + senf::IPv6Extension_HopByHop::Parser::options_t::container optC(pHop_extension->options() ); + senf::IPv6Extension_HopByHop::Parser::options_t::container::iterator listIter (optC.begin()); + BOOST_CHECK_EQUAL( listIter->optionType(), 5u); + BOOST_CHECK_EQUAL( listIter->optionLength(), 2u); + ++listIter; + BOOST_CHECK_EQUAL( listIter->optionType(), 2u); + BOOST_CHECK_EQUAL( listIter->optionLength(), 0); + pHop_extension.dump(oss); + + BOOST_REQUIRE( pHop_extension.next().is() ); + senf::ICMPv6Packet pICMPv6 (pHop_extension.next().as()); + BOOST_CHECK_EQUAL( pICMPv6->type(), 0x8f); + BOOST_CHECK_EQUAL( pICMPv6->code(), 0u); + BOOST_CHECK_EQUAL( pICMPv6->checksum(), 0x50cc); +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_