add Ip6toipv4Handler

This commit is contained in:
stubbfel
2016-12-02 01:04:42 +01:00
parent 71cb07ea9a
commit 41f8c9243f
19 changed files with 283 additions and 95 deletions

View File

@@ -0,0 +1,4 @@
src
lib/libtins/include
test/src
test/lib/FakeIt

View File

@@ -99,7 +99,7 @@ indent_paren_open_brace = false # false/true
indent_cs_delegate_brace = false # false/true
# Whether the 'namespace' body is indented
indent_namespace = false # false/true
indent_namespace = true # false/true
# Only indent one namespace and no sub-namespaces.
# Requires indent_namespace=true.
@@ -116,7 +116,7 @@ indent_namespace_limit = 0 # number
indent_extern = false # false/true
# Whether the 'class' body is indented
indent_class = false # false/true
indent_class = true # false/true
# Whether to indent the stuff after a leading base class colon
indent_class_colon = false # false/true
@@ -1194,16 +1194,16 @@ nl_using_brace = ignore # ignore/add/remove/force
nl_brace_brace = ignore # ignore/add/remove/force
# Add or remove newline between 'do' and '{'
nl_do_brace = ignore # ignore/add/remove/force
nl_do_brace = add # ignore/add/remove/force
# Add or remove newline between '}' and 'while' of 'do' statement
nl_brace_while = ignore # ignore/add/remove/force
nl_brace_while = add # ignore/add/remove/force
# Add or remove newline between 'switch' and '{'
nl_switch_brace = ignore # ignore/add/remove/force
nl_switch_brace = add # ignore/add/remove/force
# Add or remove newline between 'synchronized' and '{'
nl_synchronized_brace = ignore # ignore/add/remove/force
nl_synchronized_brace = add # ignore/add/remove/force
# Add a newline between ')' and '{' if the ')' is on a different line than the if/for/etc.
# Overrides nl_for_brace, nl_if_brace, nl_switch_brace, nl_while_switch and nl_catch_brace.
@@ -1225,7 +1225,7 @@ nl_after_case = true # false/true
nl_case_colon_brace = ignore # ignore/add/remove/force
# Newline between namespace and {
nl_namespace_brace = ignore # ignore/add/remove/force
nl_namespace_brace = add # ignore/add/remove/force
# Add or remove newline between 'template<>' and whatever follows.
nl_template_class = add # ignore/add/remove/force
@@ -1336,7 +1336,7 @@ nl_func_call_end_multi_line = false # false/true
nl_oc_msg_args = false # false/true
# Add or remove newline between function signature and '{'
nl_fdef_brace = ignore # ignore/add/remove/force
nl_fdef_brace = add # ignore/add/remove/force
# Add or remove newline between C++11 lambda signature and '{'
nl_cpp_ldef_brace = ignore # ignore/add/remove/force
@@ -1388,40 +1388,40 @@ nl_squeeze_ifdef = false # false/true
nl_squeeze_ifdef_top_level = false # false/true
# Add or remove blank line before 'if'
nl_before_if = ignore # ignore/add/remove/force
nl_before_if = remove # ignore/add/remove/force
# Add or remove blank line after 'if' statement
nl_after_if = ignore # ignore/add/remove/force
nl_after_if = add # ignore/add/remove/force
# Add or remove blank line before 'for'
nl_before_for = ignore # ignore/add/remove/force
nl_before_for = remove # ignore/add/remove/force
# Add or remove blank line after 'for' statement
nl_after_for = ignore # ignore/add/remove/force
nl_after_for = add # ignore/add/remove/force
# Add or remove blank line before 'while'
nl_before_while = ignore # ignore/add/remove/force
nl_before_while = remove # ignore/add/remove/force
# Add or remove blank line after 'while' statement
nl_after_while = ignore # ignore/add/remove/force
nl_after_while = add # ignore/add/remove/force
# Add or remove blank line before 'switch'
nl_before_switch = ignore # ignore/add/remove/force
nl_before_switch = remove # ignore/add/remove/force
# Add or remove blank line after 'switch' statement
nl_after_switch = ignore # ignore/add/remove/force
nl_after_switch = add # ignore/add/remove/force
# Add or remove blank line before 'synchronized'
nl_before_synchronized = ignore # ignore/add/remove/force
nl_before_synchronized = remove # ignore/add/remove/force
# Add or remove blank line after 'synchronized' statement
nl_after_synchronized = ignore # ignore/add/remove/force
nl_after_synchronized = add # ignore/add/remove/force
# Add or remove blank line before 'do'
nl_before_do = ignore # ignore/add/remove/force
nl_before_do = remove # ignore/add/remove/force
# Add or remove blank line after 'do/while' statement
nl_after_do = ignore # ignore/add/remove/force
nl_after_do = add # ignore/add/remove/force
# Whether to double-space commented-entries in struct/union/enum
nl_ds_struct_enum_cmt = false # false/true
@@ -1538,22 +1538,22 @@ nl_max = 0 # number
nl_after_func_proto = 0 # number
# The number of newlines after a function prototype, if not followed by another function prototype
nl_after_func_proto_group = 0 # number
nl_after_func_proto_group = 1 # number
# The number of newlines after a function class prototype, if followed by another function class prototype
nl_after_func_class_proto = 0 # number
# The number of newlines after a function class prototype, if not followed by another function class prototype
nl_after_func_class_proto_group = 0 # number
nl_after_func_class_proto_group = 1 # number
# The number of newlines before a multi-line function def body
nl_before_func_body_def = 0 # number
nl_before_func_body_def = 1 # number
# The number of newlines before a multi-line function prototype body
nl_before_func_body_proto = 0 # number
# The number of newlines after '}' of a multi-line function body
nl_after_func_body = 0 # number
nl_after_func_body = 1 # number
# The number of newlines after '}' of a multi-line function body in a class declaration
nl_after_func_body_class = 0 # number
@@ -1563,15 +1563,15 @@ nl_after_func_body_one_liner = 0 # number
# The minimum number of newlines before a multi-line comment.
# Doesn't apply if after a brace open or another multi-line comment.
nl_before_block_comment = 0 # number
nl_before_block_comment = 1 # number
# The minimum number of newlines before a single-line C comment.
# Doesn't apply if after a brace open or other single-line C comments.
nl_before_c_comment = 0 # number
nl_before_c_comment = 1 # number
# The minimum number of newlines before a CPP comment.
# Doesn't apply if after a brace open or other CPP comments.
nl_before_cpp_comment = 0 # number
nl_before_cpp_comment = 1 # number
# Whether to force a newline after a multi-line comment.
nl_after_multiline_comment = false # false/true
@@ -1580,18 +1580,18 @@ nl_after_multiline_comment = false # false/true
nl_after_label_colon = false # false/true
# The number of newlines after '}' or ';' of a struct/enum/union definition
nl_after_struct = 0 # number
nl_after_struct = 1 # number
# The number of newlines before a class definition
nl_before_class = 0 # number
nl_before_class = 1 # number
# The number of newlines after '}' or ';' of a class definition
nl_after_class = 0 # number
nl_after_class = 1 # number
# The number of newlines before a 'private:', 'public:', 'protected:', 'signals:', or 'slots:' label.
# Will not change the newline count if after a brace open.
# 0 = No change.
nl_before_access_spec = 0 # number
nl_before_access_spec = 1 # number
# The number of newlines after a 'private:', 'public:', 'protected:', 'signals:' or 'slots:' label.
# 0 = No change.
@@ -1618,10 +1618,10 @@ nl_between_get_set = 0 # number
nl_property_brace = ignore # ignore/add/remove/force
# Whether to remove blank lines after '{'
eat_blanks_after_open_brace = false # false/true
eat_blanks_after_open_brace = true # false/true
# Whether to remove blank lines before '}'
eat_blanks_before_close_brace = false # false/true
eat_blanks_before_close_brace = true # false/true
# How aggressively to remove extra newlines not in preproc.
# 0: No change
@@ -1647,16 +1647,16 @@ nl_between_annotation = ignore # ignore/add/remove/force
#
# Add or remove braces on single-line 'do' statement
mod_full_brace_do = ignore # ignore/add/remove/force
mod_full_brace_do = add # ignore/add/remove/force
# Add or remove braces on single-line 'for' statement
mod_full_brace_for = ignore # ignore/add/remove/force
mod_full_brace_for = add # ignore/add/remove/force
# Add or remove braces on single-line function definitions. (Pawn)
mod_full_brace_function = ignore # ignore/add/remove/force
mod_full_brace_function = add # ignore/add/remove/force
# Add or remove braces on single-line 'if' statement. Will not remove the braces if they contain an 'else'.
mod_full_brace_if = ignore # ignore/add/remove/force
mod_full_brace_if = add # ignore/add/remove/force
# Make all if/elseif/else statements in a chain be braced or not. Overrides mod_full_brace_if.
# If any must be braced, they are all braced. If all can be unbraced, then the braces are removed.
@@ -1671,10 +1671,10 @@ mod_full_brace_if_chain_only = false # false/true
mod_full_brace_nl = 0 # number
# Add or remove braces on single-line 'while' statement
mod_full_brace_while = ignore # ignore/add/remove/force
mod_full_brace_while = add # ignore/add/remove/force
# Add or remove braces on single-line 'using ()' statement
mod_full_brace_using = ignore # ignore/add/remove/force
mod_full_brace_using = add # ignore/add/remove/force
# Add or remove unnecessary paren on 'return' statement
mod_paren_on_return = ignore # ignore/add/remove/force
@@ -1686,7 +1686,7 @@ mod_pawn_semicolon = false # false/true
mod_full_paren_if_bool = false # false/true
# Whether to remove superfluous semicolons
mod_remove_extra_semicolon = false # false/true
mod_remove_extra_semicolon = true # false/true
# If a function body exceeds the specified number of newlines and doesn't have a comment after
# the close brace, a comment will be added.
@@ -1730,7 +1730,7 @@ mod_move_case_break = false # false/true
mod_case_brace = ignore # ignore/add/remove/force
# If TRUE, it will remove a void 'return;' that appears as the last statement in a function.
mod_remove_empty_return = false # false/true
mod_remove_empty_return = true # false/true
# If TRUE, it will organize the properties (Obj-C)
mod_sort_oc_properties = false # false/true

View File

@@ -1,11 +1,12 @@
#include "AbstractNetworkInterfaceCard.h"
#include "AbstractPacketHandler.h"
AbstractNetworkInterfaceCard::AbstractNetworkInterfaceCard()
{
//ctor
//ctor
}
AbstractNetworkInterfaceCard::~AbstractNetworkInterfaceCard()
{
//dtor
//dtor
}

View File

@@ -1,21 +1,19 @@
#ifndef ABSTRACTNETWORKINTERFACECARD_H
#define ABSTRACTNETWORKINTERFACECARD_H
#include "AbstractPacketHandler_t.h"
#include "AbstractRouter_t.h"
#include "INetworkInterfaceCard.h"
#include "IPacketHandler_t.h"
#include "IRouter_t.h"
class AbstractNetworkInterfaceCard
class AbstractNetworkInterfaceCard : public INetworkInterfaceCard
{
public:
void sendPacket(/*const Tins::Pdu & pdu*/);
void startListen();
void stopListen();
protected:
AbstractNetworkInterfaceCard();
virtual ~AbstractNetworkInterfaceCard();
private:
SPtrAbstractPacketHandlerList handlerList;
SPtrAbstractRouter router;
public:
protected:
AbstractNetworkInterfaceCard();
virtual ~AbstractNetworkInterfaceCard();
private:
SPtrIPacketHandlerList handlerList;
SPtrIRouter router;
};
#endif // ABSTRACTNETWORKINTERFACECARD_H

View File

@@ -1,16 +1,15 @@
#ifndef ABSTRACTPACKETHANDLER_H
#define ABSTRACTPACKETHANDLER_H
#include "IPacketHandler.h"
class AbstractPacketHandler
class AbstractPacketHandler : public IPacketHandler
{
public:
protected:
AbstractPacketHandler();
virtual ~AbstractPacketHandler();
private:
public:
protected:
AbstractPacketHandler();
virtual ~AbstractPacketHandler();
private:
};
#endif // ABSTRACTPACKETHANDLER_H

View File

@@ -1,11 +0,0 @@
#ifndef ABSTRACTPACKETHANDLER_T_H_INCLUDED
#define ABSTRACTPACKETHANDLER_T_H_INCLUDED
#include <list>
#include <memory>
class AbstractPacketHandler;
typedef std::shared_ptr<AbstractPacketHandler> SPtrAbstractPacketHandler;
typedef std::list<SPtrAbstractPacketHandler> SPtrAbstractPacketHandlerList;
#endif // ABSTRACTPACKETHANDLER_T_H_INCLUDED

View File

@@ -2,10 +2,9 @@
AbstractRouter::AbstractRouter()
{
//ctor
//ctor
}
AbstractRouter::~AbstractRouter()
{
//dtor
//dtor
}

View File

@@ -1,16 +1,15 @@
#ifndef ABSTRACTROUTER_H
#define ABSTRACTROUTER_H
#include "INetworkInterfaceCard.h"
class AbstractRouter
class AbstractRouter: public INetworkInterfaceCard
{
public:
protected:
AbstractRouter();
virtual ~AbstractRouter();
private:
public:
protected:
AbstractRouter();
virtual ~AbstractRouter();
private:
};
#endif // ABSTRACTROUTER_H

View File

@@ -0,0 +1,12 @@
#ifndef INETWORKINTERFACECARD_H
#define INETWORKINTERFACECARD_H
#include "IPacketHandler.h"
interface INetworkInterfaceCard : IPacketHandler
{
virtual void sendPacket(IN const Tins::PDU & pdu) = 0;
virtual void startListen() = 0;
virtual void stopListen() = 0;
};
#endif

15
src/IPacketHandler.h Normal file
View File

@@ -0,0 +1,15 @@
#ifndef IPACKETHANDLER_H
#define IPACKETHANDLER_H
#include "Main_t.h"
namespace Tins
{
class PDU;
}
interface IPacketHandler
{
virtual bool handle(IN const Tins::PDU & pdu, IN IPacketHandler * callBackHandler = nullptr) = 0;
};
#endif

12
src/IPacketHandler_t.h Normal file
View File

@@ -0,0 +1,12 @@
#ifndef IPACKETHANDLER_T_H
#define IPACKETHANDLER_T_H
#include <list>
#include <memory>
#include "Main_t.h"
interface IPacketHandler;
typedef std::shared_ptr<IPacketHandler> SPtrIPacketHandler;
typedef std::list<SPtrIPacketHandler> SPtrIPacketHandlerList;
#endif // ABSTRACTPACKETHANDLER_T_H_INCLUDED

10
src/IRouter.h Normal file
View File

@@ -0,0 +1,10 @@
#ifndef IROUTER_H
#define IROUTER_H
#include "IPacketHandler.h"
interface IRouter: IPacketHandler
{
};
#endif

View File

@@ -1,9 +1,9 @@
#ifndef ABSTRACTROUTER_T_H_INCLUDED
#define ABSTRACTROUTER_T_H_INCLUDED
#include <memory>
#include "Main_t.h"
class AbstractRouter;
typedef std::shared_ptr<AbstractRouter> SPtrAbstractRouter;
interface IRouter;
typedef std::shared_ptr<IRouter> SPtrIRouter;
#endif // ABSTRACTROUTER_T_H_INCLUDED

View File

@@ -0,0 +1,63 @@
#include "Ip6ToIp4PacketHandler.h"
#include "tins/ethernetII.h"
#include <tins/ip.h>
#include <tins/ipv6.h>
#include "IpAddressTranslator.h"
namespace std
{
template<typename T, typename ... Args>
std::unique_ptr<T> make_unique(Args && ... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args) ...));
}
}
Ip6ToIp4PacketHandler::Ip6ToIp4PacketHandler()
{}
Ip6ToIp4PacketHandler::~Ip6ToIp4PacketHandler()
{}
bool Ip6ToIp4PacketHandler::handle(const Tins::PDU &pdu, IN IPacketHandler * callBackHandler)
{
if (callBackHandler == nullptr)
{
return false;
}
const Tins::IPv6 * ipv6Pdu = pdu.find_pdu<Tins::IPv6>();
if(ipv6Pdu == nullptr)
{
return false;
}
const Tins::EthernetII * ethPdu = pdu.find_pdu<Tins::EthernetII>();
if(ethPdu == nullptr)
{
return false;
}
const Tins::PDU * ipPayloadPdu = ipv6Pdu->inner_pdu();
if(ipPayloadPdu == nullptr)
{
return false;
}
// convert ipv6 addresses to ipv4 addresses
const uint32_t srcIp4AddressBytes = IpAddressTranslator::toIpv4AddressBytes(ipv6Pdu->src_addr());
const uint32_t dstIp4AddressBytes = IpAddressTranslator::toIpv4AddressBytes(ipv6Pdu->dst_addr());
std::unique_ptr<const Tins::IPv4Address> srcIp4Address = std::make_unique<const Tins::IPv4Address>(srcIp4AddressBytes);
std::unique_ptr<const Tins::IPv4Address> dstIp4Address = std::make_unique<const Tins::IPv4Address>(dstIp4AddressBytes);
// create ip4 pdu
std::unique_ptr<const Tins::IP> ipv4Pdu = std::make_unique<const Tins::IP>(*srcIp4Address, *dstIp4Address);
// create forwarding frame
std::unique_ptr<Tins::EthernetII> ptrForwardEthPdu = std::make_unique<Tins::EthernetII>();
Tins::EthernetII & forwardEthPdu = *ptrForwardEthPdu;
forwardEthPdu /= *ethPdu;
forwardEthPdu /= *ipv4Pdu;
forwardEthPdu /= *ipPayloadPdu;
// forward frame
return callBackHandler->handle(forwardEthPdu, this);
}

View File

@@ -0,0 +1,14 @@
#ifndef IP4TO6PACKETHANDLER_H
#define IP4TO6PACKETHANDLER_H
#include "AbstractPacketHandler.h"
class Ip6ToIp4PacketHandler : public AbstractPacketHandler
{
public:
Ip6ToIp4PacketHandler();
virtual ~Ip6ToIp4PacketHandler();
virtual bool handle(IN const Tins::PDU & pdu, IN IPacketHandler * callBackHandler = nullptr) override;
};
#endif

View File

@@ -0,0 +1,30 @@
#include "IpAddressTranslator.h"
#include <tins/ip_address.h>
#include <tins/ipv6_address.h>
const size_t IpAddressTranslator::lastAddressByteIndex = Tins::IPv4Address::address_size - 1;
uint32_t IpAddressTranslator::toIpv4AddressBytes(IN const Tins::IPv6Address & ipv6Address)
{
uint32_t ipBytesNetworkOrder = 0;
uint8_t * ptrIpByte = reinterpret_cast<uint8_t *>( &ipBytesNetworkOrder );
Tins::IPv6Address::const_iterator it = ipv6Address.end();
for (int i = lastAddressByteIndex; i > -1; i--)
{
it--;
ptrIpByte[i] = *it;
}
return ipBytesNetworkOrder;
}
void IpAddressTranslator::toIpv6Address(IN const Tins::IPv4Address & ipv4Address, INOUT Tins::IPv6Address & resultIpv6Address)
{
Tins::IPv6Address::iterator it = resultIpv6Address.end();
uint32_t ipBytesNetworkOrder = ipv4Address;
uint8_t * ptrIpByte = reinterpret_cast<uint8_t *>( &ipBytesNetworkOrder );
for (int i = lastAddressByteIndex; i > -1; i--)
{
it--;
*it = ptrIpByte[i];
}
}

22
src/IpAddressTranslator.h Normal file
View File

@@ -0,0 +1,22 @@
#ifndef IPADDRESSTRANSLATOR_H
#define IPADDRESSTRANSLATOR_H
#include <cstddef>
#include <stdint.h>
#include "Main_t.h"
namespace Tins
{
class IPv4Address;
class IPv6Address;
}
class IpAddressTranslator
{
public:
static void toIpv6Address(IN const Tins::IPv4Address & ipv4Address, INOUT Tins::IPv6Address & resultIpv6Address);
static uint32_t toIpv4AddressBytes(IN const Tins::IPv6Address & ipv6Address);
private:
static const size_t lastAddressByteIndex;
};
#endif

View File

@@ -1,8 +1,8 @@
#include <stdio.h>
#include <stdio.h>
int main(void)
{
printf("Hello, World\n");
int main(void)
{
printf("Hello, Worliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad\n");
return 0;
}
return 0;
}

21
src/Main_t.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef MAIN_T_H
#define MAIN_T_H
#ifndef IN
#define IN
#endif
#ifndef OUT
#define OUT
#endif
#ifndef INOUT
#define INOUT
#endif
#ifndef interface
#define interface struct
#endif
#endif