add ip fragmentation test and fixes

This commit is contained in:
stubbfel
2017-06-14 23:53:45 +02:00
parent 1345a8013c
commit 5185c025d8
6 changed files with 133 additions and 29 deletions

View File

@@ -2,6 +2,8 @@
#include <tins/ipv6.h>
#include <tins/rawpdu.h>
const size_t IpPacketFragmentation::fragmentionHeadersize = sizeof (FragmentionHeaderUnion) - 1;
IpPacketFragmentation::IpPacketFragmentation(const size_t newMtu) : mtu(newMtu), idCounter()
{
}
@@ -12,10 +14,10 @@ IpPacketFragmentation::~IpPacketFragmentation()
}
void IpPacketFragmentation::addExtensionHeader(IN const uint8_t nextHeader, IN const uint8_t *startPtr, IN Tins::IPv6 & ipFragmentPdu)
void IpPacketFragmentation::addExtensionHeader(IN const uint8_t nextHeader, IN const uint8_t *startPtr, IN Tins::IPv6 & ipFragmentPdu, const size_t headersize)
{
Tins::IPv6::ext_header fragmentionHeader(nextHeader, fragmentionHeadersize , startPtr);
ipFragmentPdu.add_ext_header(fragmentionHeader);
Tins::IPv6::ext_header extensionHeader(nextHeader, headersize , startPtr);
ipFragmentPdu.add_ext_header(extensionHeader);
}
void IpPacketFragmentation::initFragmentationHeader(FragmentionHeaderStruct* ptrFragmentionHeaderStruct)
@@ -35,7 +37,7 @@ bool IpPacketFragmentation::handle(IN const Tins::PDU & pdu, IN IPacketHandler *
}
const size_t originPduSize = pdu.size();
const size_t fragmentationCount = originPduSize + 1;
const size_t fragmentationCount = (originPduSize / mtu) + 1;
if (fragmentationCount < 2)
{
return callBackHandler->handle(pdu, this);
@@ -48,7 +50,7 @@ bool IpPacketFragmentation::handle(IN const Tins::PDU & pdu, IN IPacketHandler *
}
Tins::PDU * ipDataPdu = ipPdu->inner_pdu();
if (ipPdu == nullptr)
if (ipDataPdu == nullptr)
{
return false;
}
@@ -91,8 +93,11 @@ bool IpPacketFragmentation::createAndForwardFragmend(IN const Tins::PDU & pdu, I
return false;
}
addExtensionHeader(ptrFragmentionHeaderStruct->NextHeader, ptrStartFragmentionHeader, *ipFragmentPdu);
// Tins::IPv6::ext_header fragmentionHeader(ptrFragmentionHeaderStruct->NextHeader, IpPacketFragmentation::fragmentionHeadersize , ptrStartFragmentionHeader);
// ipFragmentPdu->add_ext_header(fragmentionHeader);
addExtensionHeader(ptrFragmentionHeaderStruct->NextHeader, ptrStartFragmentionHeader, *ipFragmentPdu, IpPacketFragmentation::fragmentionHeadersize);
addExtensionHeader(Tins::IPv6::NO_NEXT_HEADER, nullptr, *ipFragmentPdu, 0);
SPtrRawPDU rawFragmentPdu = std::make_shared<Tins::RawPDU>(fragmentPayload->data(), static_cast<uint32_t>(fragmentPayload->size()));
ipFragmentPdu->inner_pdu(rawFragmentPdu.get());
return callBackHandler->handle(pdu, this);
return callBackHandler->handle(*fragmentPdu, this);
}