Files
1261Nat/src/IpVersionRouter.cpp
2017-06-16 15:23:28 +02:00

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;
}