add icmps handler
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
#define IPACKETHANDLER_H
|
||||
|
||||
#include "Main_t.h"
|
||||
|
||||
#include "IPacketHandler_t.h"
|
||||
namespace Tins
|
||||
{
|
||||
class PDU;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
interface IPacketHandler;
|
||||
typedef std::shared_ptr<IPacketHandler> SPtrIPacketHandler;
|
||||
typedef std::unique_ptr<IPacketHandler> UPtrIPacketHandler;
|
||||
typedef std::list<SPtrIPacketHandler> SPtrIPacketHandlerList;
|
||||
|
||||
#endif // ABSTRACTPACKETHANDLER_T_H_INCLUDED
|
||||
|
||||
57
src/Icmp4ToIcmp6PacketHandler.cpp
Normal file
57
src/Icmp4ToIcmp6PacketHandler.cpp
Normal file
@@ -0,0 +1,57 @@
|
||||
#include "Icmp4ToIcmp6PacketHandler.h"
|
||||
#include <tins/icmp.h>
|
||||
#include <tins/icmpv6.h>
|
||||
#include <tins/ip.h>
|
||||
|
||||
Icmp4ToIcmp6PacketHandler::Icmp4ToIcmp6PacketHandler(const Tins::IPv6Address & newPrefix) : Ip4ToIp6PacketHandler(newPrefix)
|
||||
{
|
||||
}
|
||||
|
||||
Icmp4ToIcmp6PacketHandler::~Icmp4ToIcmp6PacketHandler()
|
||||
{
|
||||
}
|
||||
|
||||
bool Icmp4ToIcmp6PacketHandler::handle(IN const Tins::PDU & pdu, IN IPacketHandler * callBackHandler)
|
||||
{
|
||||
// callback handvet requeried
|
||||
if (callBackHandler == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// get ipv4 packet
|
||||
const Tins::ICMP * icmpv4Pdu = pdu.find_pdu<Tins::ICMP>();
|
||||
if(icmpv4Pdu == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// create icmp6 pdu
|
||||
const Tins::ICMP::Flags type = icmpv4Pdu->type();
|
||||
std::unique_ptr<Tins::ICMPv6> icmpv6Pdu;
|
||||
switch (type) {
|
||||
case Tins::ICMP::Flags::ECHO_REPLY:
|
||||
icmpv6Pdu = std::make_unique<Tins::ICMPv6>(Tins::ICMPv6::ECHO_REQUEST);
|
||||
break;
|
||||
case Tins::ICMP::Flags::ECHO_REQUEST:
|
||||
icmpv6Pdu = std::make_unique<Tins::ICMPv6>(Tins::ICMPv6::ECHO_REPLY);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
icmpv6Pdu->identifier(icmpv4Pdu->id());
|
||||
icmpv6Pdu->sequence(icmpv4Pdu->sequence());
|
||||
icmpv6Pdu->code(0);
|
||||
|
||||
// replace icmp4 with icmp6 content, adress translation will bo den by Ip4ToIp6PacketHandler
|
||||
const Tins::IP * ipPdu = pdu.find_pdu<Tins::IP>();
|
||||
if(ipPdu == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Tins::IP * cloneIpPdu = ipPdu->clone();
|
||||
cloneIpPdu->inner_pdu(*icmpv6Pdu);
|
||||
return Ip4ToIp6PacketHandler::handle(*cloneIpPdu, callBackHandler);
|
||||
}
|
||||
15
src/Icmp4ToIcmp6PacketHandler.h
Normal file
15
src/Icmp4ToIcmp6PacketHandler.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#ifndef ICMP4TOICMP6PACKETHANDLER_H
|
||||
#define ICMP4TOICMP6PACKETHANDLER_H
|
||||
|
||||
#include "Ip4ToIp6PacketHandler.h"
|
||||
|
||||
class Icmp4ToIcmp6PacketHandler : public Ip4ToIp6PacketHandler
|
||||
{
|
||||
public:
|
||||
|
||||
Icmp4ToIcmp6PacketHandler(const Tins::IPv6Address & prefix);
|
||||
virtual ~Icmp4ToIcmp6PacketHandler();
|
||||
|
||||
virtual bool handle(IN const Tins::PDU & pdu, IN IPacketHandler * callBackHandler = nullptr) override;
|
||||
};
|
||||
#endif
|
||||
62
src/Icmp6ToIcmp4PacketHandler.cpp
Normal file
62
src/Icmp6ToIcmp4PacketHandler.cpp
Normal file
@@ -0,0 +1,62 @@
|
||||
#include "Icmp6ToIcmp4PacketHandler.h"
|
||||
#include <tins/icmp.h>
|
||||
#include <tins/icmpv6.h>
|
||||
#include <tins/ipv6.h>
|
||||
#include "NdpToArpPacketHandler.h"
|
||||
|
||||
Icmp6ToIcmp4PacketHandler::Icmp6ToIcmp4PacketHandler() : Ip6ToIp4PacketHandler()
|
||||
{
|
||||
ndpToArpHandler = std::make_unique<NdpToArpPacketHandler>();
|
||||
}
|
||||
|
||||
Icmp6ToIcmp4PacketHandler::~Icmp6ToIcmp4PacketHandler()
|
||||
{
|
||||
}
|
||||
|
||||
bool Icmp6ToIcmp4PacketHandler::handle(IN const Tins::PDU & pdu, IN IPacketHandler * callBackHandler)
|
||||
{
|
||||
// callback handvet requeried
|
||||
if (callBackHandler == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// get icmpv6 packet
|
||||
const Tins::ICMPv6 * icmpv6Pdu = pdu.find_pdu<Tins::ICMPv6>();
|
||||
if(icmpv6Pdu == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// create icmp6 pdu
|
||||
const Tins::ICMPv6::Types type = icmpv6Pdu->type();
|
||||
std::unique_ptr<Tins::ICMP> icmpv4Pdu;
|
||||
switch (type) {
|
||||
case Tins::ICMPv6::ECHO_REPLY:
|
||||
icmpv4Pdu = std::make_unique<Tins::ICMP>(Tins::ICMP::Flags::ECHO_REQUEST);
|
||||
break;
|
||||
case Tins::ICMPv6::ECHO_REQUEST:
|
||||
icmpv4Pdu = std::make_unique<Tins::ICMP>(Tins::ICMP::Flags::ECHO_REPLY);
|
||||
break;
|
||||
case Tins::ICMPv6::NEIGHBOUR_SOLICIT:
|
||||
case Tins::ICMPv6::NEIGHBOUR_ADVERT:
|
||||
return ndpToArpHandler->handle(pdu, callBackHandler);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
icmpv4Pdu->id(icmpv6Pdu->identifier());
|
||||
icmpv4Pdu->sequence(icmpv6Pdu->sequence());
|
||||
icmpv4Pdu->code(0);
|
||||
|
||||
// replace icmp4 with icmp6 content, adress translation will bo den by Ip4ToIp6PacketHandler
|
||||
const Tins::IPv6 * ipv6Pdu = pdu.find_pdu<Tins::IPv6>();
|
||||
if(ipv6Pdu == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Tins::IPv6 * cloneIpv6Pdu = ipv6Pdu->clone();
|
||||
cloneIpv6Pdu->inner_pdu(*icmpv4Pdu);
|
||||
return Ip6ToIp4PacketHandler::handle(*cloneIpv6Pdu, callBackHandler);
|
||||
}
|
||||
17
src/Icmp6ToIcmp4PacketHandler.h
Normal file
17
src/Icmp6ToIcmp4PacketHandler.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef ICMP6TOICMP4PACKETHANDLER_H
|
||||
#define ICMP6TOICMP4PACKETHANDLER_H
|
||||
|
||||
#include "Ip6ToIp4PacketHandler.h"
|
||||
|
||||
class Icmp6ToIcmp4PacketHandler : public Ip6ToIp4PacketHandler
|
||||
{
|
||||
public:
|
||||
|
||||
Icmp6ToIcmp4PacketHandler();
|
||||
virtual ~Icmp6ToIcmp4PacketHandler();
|
||||
|
||||
virtual bool handle(IN const Tins::PDU & pdu, IN IPacketHandler * callBackHandler = nullptr) override;
|
||||
private:
|
||||
UPtrIPacketHandler ndpToArpHandler;
|
||||
};
|
||||
#endif
|
||||
@@ -5,6 +5,10 @@ else ()
|
||||
set (CMAKE_CXX_STANDARD 11)
|
||||
endif ()
|
||||
|
||||
if(COMMAND cmake_policy)
|
||||
cmake_policy(SET CMP0003 NEW)
|
||||
endif(COMMAND cmake_policy)
|
||||
|
||||
project(test_1261nat)
|
||||
set(CMAKE_BUILD_TYPE Debug)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user