diff --git a/src/Ip4ToIp6PacketHandler.cpp b/src/Ip4ToIp6PacketHandler.cpp new file mode 100644 index 0000000..2ca1e6c --- /dev/null +++ b/src/Ip4ToIp6PacketHandler.cpp @@ -0,0 +1,74 @@ +#include "Ip4ToIp6PacketHandler.h" +#include +#include +#include +#include +#include "IpAddressTranslator.h" + +Ip4ToIp6PacketHandler::Ip4ToIp6PacketHandler(const Tins::IPv6Address & newPrefix) +{ + prefix = std::make_unique(newPrefix); +} + +Ip4ToIp6PacketHandler::~Ip4ToIp6PacketHandler() +{ +} + +bool Ip4ToIp6PacketHandler::handle(IN const Tins::PDU & pdu, IN IPacketHandler * callBackHandler) +{ + // callback handvet requeried + if (callBackHandler == nullptr) + { + return false; + } + + // get ipv4 packet + const Tins::IP * ipv4Pdu = pdu.find_pdu(); + if(ipv4Pdu == nullptr) + { + return false; + } + + // convert ipv4 addresses to ipv6 addresses + UPtrIPv6Address srcIp6Address = std::make_unique(*prefix); + UPtrIPv6Address dstIp6Address = std::make_unique(*prefix); + IpAddressTranslator::toIpv6Address(ipv4Pdu->src_addr(), *srcIp6Address); + IpAddressTranslator::toIpv6Address(ipv4Pdu->dst_addr(), *dstIp6Address); + + // create ip4 pdu + std::unique_ptr ipv6Pdu = std::make_unique(*dstIp6Address,*srcIp6Address); + + // create forwarding frame + std::unique_ptr ptrForwardEthPdu = std::make_unique(); + Tins::EthernetII & forwardEthPdu = *ptrForwardEthPdu; + + // copy src and dst mac address + const Tins::EthernetII * ethPdu = pdu.find_pdu(); + if(ethPdu != nullptr) + { + forwardEthPdu.src_addr(ethPdu->src_addr()); + forwardEthPdu.dst_addr(ethPdu->dst_addr()); + } + + forwardEthPdu /= *ipv6Pdu; + + //copy ipv4 payload to ip6 payload + const Tins::PDU * ipPayloadPdu = ipv4Pdu->inner_pdu(); + if(ipPayloadPdu != nullptr) + { + forwardEthPdu /= *ipPayloadPdu; + } + + // forward frame + return callBackHandler->handle(forwardEthPdu, this); +} + +const Tins::IPv6Address & Ip4ToIp6PacketHandler::getPrefix() const +{ + return *prefix; +} + +void Ip4ToIp6PacketHandler::setPrefix(const Tins::IPv6Address & newPrefix) +{ + *prefix = newPrefix; +} diff --git a/src/Ip4ToIp6PacketHandler.h b/src/Ip4ToIp6PacketHandler.h new file mode 100644 index 0000000..c975fd6 --- /dev/null +++ b/src/Ip4ToIp6PacketHandler.h @@ -0,0 +1,22 @@ +#ifndef IP4TO6PACKETHANDLER_H +#define IP4TO6PACKETHANDLER_H + +#include "AbstractPacketHandler.h" +#include "Ip6Packet_t.h" + + +class Ip4ToIp6PacketHandler : public AbstractPacketHandler +{ +public: + + Ip4ToIp6PacketHandler(const Tins::IPv6Address & prefix); + virtual ~Ip4ToIp6PacketHandler(); + + virtual bool handle(IN const Tins::PDU & pdu, IN IPacketHandler * callBackHandler = nullptr) override; + + const Tins::IPv6Address & getPrefix() const; + void setPrefix(const Tins::IPv6Address & newPrefix); +private: + UPtrIPv6Address prefix; +}; +#endif diff --git a/src/Ip6Packet_t.h b/src/Ip6Packet_t.h new file mode 100644 index 0000000..f223039 --- /dev/null +++ b/src/Ip6Packet_t.h @@ -0,0 +1,12 @@ +#ifndef IP6PACKET_T_H +#define IP6PACKET_T_H + +#include + +namespace Tins +{ + class IPv6Address; +} + +typedef std::unique_ptr UPtrIPv6Address; +#endif diff --git a/src/Ip6ToIp4PacketHandler.cpp b/src/Ip6ToIp4PacketHandler.cpp index d368b6f..2967962 100644 --- a/src/Ip6ToIp4PacketHandler.cpp +++ b/src/Ip6ToIp4PacketHandler.cpp @@ -1,5 +1,5 @@ #include "Ip6ToIp4PacketHandler.h" -#include "tins/ethernetII.h" +#include #include #include #include "IpAddressTranslator.h" diff --git a/src/Ip6ToIp4PacketHandler.h b/src/Ip6ToIp4PacketHandler.h index bc47fda..342da6f 100644 --- a/src/Ip6ToIp4PacketHandler.h +++ b/src/Ip6ToIp4PacketHandler.h @@ -1,5 +1,5 @@ -#ifndef IP4TO6PACKETHANDLER_H -#define IP4TO6PACKETHANDLER_H +#ifndef IP6TO4PACKETHANDLER_H +#define IP6TO4PACKETHANDLER_H #include "AbstractPacketHandler.h"