diff --git a/dev-utils/.clang_complete b/dev-utils/.clang_complete new file mode 100644 index 0000000..53c2341 --- /dev/null +++ b/dev-utils/.clang_complete @@ -0,0 +1,4 @@ +src +lib/libtins/include +test/src +test/lib/FakeIt diff --git a/dev-utils/uncrustify.cfg b/dev-utils/uncrustify.cfg index 68c0c04..8d4bf55 100644 --- a/dev-utils/uncrustify.cfg +++ b/dev-utils/uncrustify.cfg @@ -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 diff --git a/src/AbstractNetworkInterfaceCard.cpp b/src/AbstractNetworkInterfaceCard.cpp index 3db7708..962db07 100644 --- a/src/AbstractNetworkInterfaceCard.cpp +++ b/src/AbstractNetworkInterfaceCard.cpp @@ -1,11 +1,12 @@ #include "AbstractNetworkInterfaceCard.h" +#include "AbstractPacketHandler.h" AbstractNetworkInterfaceCard::AbstractNetworkInterfaceCard() { - //ctor + //ctor } AbstractNetworkInterfaceCard::~AbstractNetworkInterfaceCard() { - //dtor + //dtor } diff --git a/src/AbstractNetworkInterfaceCard.h b/src/AbstractNetworkInterfaceCard.h index d101b9c..1c3a26c 100644 --- a/src/AbstractNetworkInterfaceCard.h +++ b/src/AbstractNetworkInterfaceCard.h @@ -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 diff --git a/src/AbstractPacketHandler.h b/src/AbstractPacketHandler.h index 83cf6e5..f93d814 100644 --- a/src/AbstractPacketHandler.h +++ b/src/AbstractPacketHandler.h @@ -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 diff --git a/src/AbstractPacketHandler_t.h b/src/AbstractPacketHandler_t.h deleted file mode 100644 index 634b5e7..0000000 --- a/src/AbstractPacketHandler_t.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef ABSTRACTPACKETHANDLER_T_H_INCLUDED -#define ABSTRACTPACKETHANDLER_T_H_INCLUDED - -#include -#include - -class AbstractPacketHandler; -typedef std::shared_ptr SPtrAbstractPacketHandler; -typedef std::list SPtrAbstractPacketHandlerList; - -#endif // ABSTRACTPACKETHANDLER_T_H_INCLUDED diff --git a/src/AbstractRouter.cpp b/src/AbstractRouter.cpp index 8974e17..ba9c7f3 100644 --- a/src/AbstractRouter.cpp +++ b/src/AbstractRouter.cpp @@ -2,10 +2,9 @@ AbstractRouter::AbstractRouter() { - //ctor + //ctor } - AbstractRouter::~AbstractRouter() { - //dtor + //dtor } diff --git a/src/AbstractRouter.h b/src/AbstractRouter.h index 4e62c6e..ebeb7ba 100644 --- a/src/AbstractRouter.h +++ b/src/AbstractRouter.h @@ -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 diff --git a/src/INetworkInterfaceCard.h b/src/INetworkInterfaceCard.h new file mode 100644 index 0000000..a3a629a --- /dev/null +++ b/src/INetworkInterfaceCard.h @@ -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 diff --git a/src/IPacketHandler.h b/src/IPacketHandler.h new file mode 100644 index 0000000..dc77f25 --- /dev/null +++ b/src/IPacketHandler.h @@ -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 diff --git a/src/IPacketHandler_t.h b/src/IPacketHandler_t.h new file mode 100644 index 0000000..334830c --- /dev/null +++ b/src/IPacketHandler_t.h @@ -0,0 +1,12 @@ +#ifndef IPACKETHANDLER_T_H +#define IPACKETHANDLER_T_H + +#include +#include +#include "Main_t.h" + +interface IPacketHandler; +typedef std::shared_ptr SPtrIPacketHandler; +typedef std::list SPtrIPacketHandlerList; + +#endif // ABSTRACTPACKETHANDLER_T_H_INCLUDED diff --git a/src/IRouter.h b/src/IRouter.h new file mode 100644 index 0000000..79aa844 --- /dev/null +++ b/src/IRouter.h @@ -0,0 +1,10 @@ +#ifndef IROUTER_H +#define IROUTER_H + +#include "IPacketHandler.h" + +interface IRouter: IPacketHandler +{ +}; + +#endif diff --git a/src/AbstractRouter_t.h b/src/IRouter_t.h similarity index 53% rename from src/AbstractRouter_t.h rename to src/IRouter_t.h index 6c746b2..6334d91 100644 --- a/src/AbstractRouter_t.h +++ b/src/IRouter_t.h @@ -1,9 +1,9 @@ #ifndef ABSTRACTROUTER_T_H_INCLUDED #define ABSTRACTROUTER_T_H_INCLUDED -#include +#include "Main_t.h" -class AbstractRouter; -typedef std::shared_ptr SPtrAbstractRouter; +interface IRouter; +typedef std::shared_ptr SPtrIRouter; #endif // ABSTRACTROUTER_T_H_INCLUDED diff --git a/src/Ip6ToIp4PacketHandler.cpp b/src/Ip6ToIp4PacketHandler.cpp new file mode 100644 index 0000000..5f3f7c6 --- /dev/null +++ b/src/Ip6ToIp4PacketHandler.cpp @@ -0,0 +1,63 @@ +#include "Ip6ToIp4PacketHandler.h" +#include "tins/ethernetII.h" +#include +#include +#include "IpAddressTranslator.h" + +namespace std +{ + template + std::unique_ptr make_unique(Args && ... args) + { + return std::unique_ptr(new T(std::forward(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(); + if(ipv6Pdu == nullptr) + { + return false; + } + + const Tins::EthernetII * ethPdu = pdu.find_pdu(); + 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 srcIp4Address = std::make_unique(srcIp4AddressBytes); + std::unique_ptr dstIp4Address = std::make_unique(dstIp4AddressBytes); + + // create ip4 pdu + std::unique_ptr ipv4Pdu = std::make_unique(*srcIp4Address, *dstIp4Address); + + // create forwarding frame + std::unique_ptr ptrForwardEthPdu = std::make_unique(); + Tins::EthernetII & forwardEthPdu = *ptrForwardEthPdu; + forwardEthPdu /= *ethPdu; + forwardEthPdu /= *ipv4Pdu; + forwardEthPdu /= *ipPayloadPdu; + + // forward frame + return callBackHandler->handle(forwardEthPdu, this); +} diff --git a/src/Ip6ToIp4PacketHandler.h b/src/Ip6ToIp4PacketHandler.h new file mode 100644 index 0000000..bc47fda --- /dev/null +++ b/src/Ip6ToIp4PacketHandler.h @@ -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 diff --git a/src/IpAddressTranslator.cpp b/src/IpAddressTranslator.cpp new file mode 100644 index 0000000..588ba22 --- /dev/null +++ b/src/IpAddressTranslator.cpp @@ -0,0 +1,30 @@ +#include "IpAddressTranslator.h" +#include +#include + +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( &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( &ipBytesNetworkOrder ); + for (int i = lastAddressByteIndex; i > -1; i--) + { + it--; + *it = ptrIpByte[i]; + } +} diff --git a/src/IpAddressTranslator.h b/src/IpAddressTranslator.h new file mode 100644 index 0000000..daf8ad6 --- /dev/null +++ b/src/IpAddressTranslator.h @@ -0,0 +1,22 @@ +#ifndef IPADDRESSTRANSLATOR_H +#define IPADDRESSTRANSLATOR_H + +#include +#include +#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 diff --git a/src/Main.cpp b/src/Main.cpp index 8714fab..e539e2e 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -1,8 +1,8 @@ - #include +#include - int main(void) - { - printf("Hello, World\n"); +int main(void) +{ + printf("Hello, Worliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad\n"); - return 0; - } + return 0; +} diff --git a/src/Main_t.h b/src/Main_t.h new file mode 100644 index 0000000..f21fa3f --- /dev/null +++ b/src/Main_t.h @@ -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