add ip fragmentation test and fixes
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user