56 lines
1.2 KiB
C++
56 lines
1.2 KiB
C++
#include "IpVersionRouter.h"
|
|
#include <tins/arp.h>
|
|
#include <tins/ip.h>
|
|
#include <tins/ipv6.h>
|
|
#include "INetworkInterfaceCard.h"
|
|
#include "IpPacketFragmentation.h"
|
|
|
|
IpVersionRouter::IpVersionRouter(SPtrINetworkInterfaceCard netv4Card, SPtrINetworkInterfaceCard netv6Card)
|
|
{
|
|
ipv4Card = netv4Card;
|
|
ipv6Card = netv6Card;
|
|
ipv6Fragmentation = std::make_unique<IpPacketFragmentation>(ipv6Card->getMtu());
|
|
}
|
|
|
|
IpVersionRouter::~IpVersionRouter()
|
|
{
|
|
}
|
|
|
|
bool IpVersionRouter::handle(IN const Tins::PDU & pdu, IN IPacketHandler * /* callBackHandler*/)
|
|
{
|
|
const Tins::IPv6 * ipv6Pdu = pdu.find_pdu<Tins::IPv6>();
|
|
if(ipv6Pdu != nullptr)
|
|
{
|
|
if (pdu.size() < ipv6Card->getMtu())
|
|
{
|
|
ipv6Card->sendPacket(pdu);
|
|
return true;
|
|
}
|
|
|
|
return ipv6Fragmentation->handle(pdu, this);
|
|
}
|
|
|
|
const Tins::IP * ipv4Pdu = pdu.find_pdu<Tins::IP>();
|
|
if(ipv4Pdu == nullptr)
|
|
{
|
|
const Tins::ARP * arpPdu = pdu.find_pdu<Tins::ARP>();
|
|
if(arpPdu == nullptr)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
ipv4Card->sendPacket(pdu);
|
|
return true;
|
|
}
|
|
|
|
INetworkInterfaceCard & IpVersionRouter::getIpv4Card() const
|
|
{
|
|
return *ipv4Card;
|
|
}
|
|
|
|
INetworkInterfaceCard & IpVersionRouter::getIpv6Card() const
|
|
{
|
|
return *ipv6Card;
|
|
}
|