From 7e7e66f0b7dc877e1d046a2c3a9a8b47e73ca3cd Mon Sep 17 00:00:00 2001 From: stubbfel Date: Thu, 15 Dec 2016 01:01:07 +0100 Subject: [PATCH] =?UTF-8?q?use=20|-operator=20to=20calc=20solicited-node?= =?UTF-8?q?=20address=20(draft)=20=09ge=C3=A4ndert:=20=20=20=20=20=20=20li?= =?UTF-8?q?b/libtins=20=09ge=C3=A4ndert:=20=20=20=20=20=20=20src/ArpToNdpP?= =?UTF-8?q?acketHandler.cpp=20=09ge=C3=A4ndert:=20=20=20=20=20=20=20src/Ma?= =?UTF-8?q?in.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/libtins | 2 +- src/ArpToNdpPacketHandler.cpp | 18 +++---- src/Main.cpp | 95 +++++++++++++++++++++++++++++++++-- 3 files changed, 100 insertions(+), 15 deletions(-) diff --git a/lib/libtins b/lib/libtins index a61a361..c9dea75 160000 --- a/lib/libtins +++ b/lib/libtins @@ -1 +1 @@ -Subproject commit a61a361eb1f39248876abcd0e04dd5ee0436b4ae +Subproject commit c9dea752431ac5aa7dbbb374e73b5e459113437f diff --git a/src/ArpToNdpPacketHandler.cpp b/src/ArpToNdpPacketHandler.cpp index c42d05d..d100a42 100644 --- a/src/ArpToNdpPacketHandler.cpp +++ b/src/ArpToNdpPacketHandler.cpp @@ -1,4 +1,5 @@ #include "ArpToNdpPacketHandler.h" +#include #include #include #include @@ -34,17 +35,13 @@ bool ArpToNdpPacketHandler::handle(IN const Tins::PDU & pdu, IN IPacketHandler * } // convert ipv4 addresses to ipv6 addresses - uint32_t ndpMaskField = *ndpMask; - uint32_t targetMaskield = arpPdu->target_ip_addr(); - uint32_t foo = ndpMaskField | targetMaskield; + UPtrIPv6Address srcIp6Address = std::make_unique(*prefix); - UPtrIPv6Address dstIp6Address = std::make_unique(*ndpPrefix); UPtrIPv6Address targetIp6Address = std::make_unique(*prefix); IpAddressTranslator::toIpv6Address(arpPdu->sender_ip_addr(), *srcIp6Address); - IpAddressTranslator::toIpv6Address(Tins::IPv4Address(foo), *dstIp6Address); - + IpAddressTranslator::toIpv6Address(arpPdu->target_ip_addr(), *targetIp6Address); // create ip4 pdu - std::unique_ptr ipv6Pdu = std::make_unique(*dstIp6Address,*srcIp6Address); + std::unique_ptr ipv6Pdu = std::make_unique((*targetIp6Address)|(*ndpPrefix),*srcIp6Address); std::unique_ptr ndpPdu; switch (arpPdu->opcode()) @@ -70,13 +67,16 @@ bool ArpToNdpPacketHandler::handle(IN const Tins::PDU & pdu, IN IPacketHandler * { // @todo to set multicast forwardEthPdu.src_addr(ethPdu->src_addr()); - forwardEthPdu.dst_addr(ethPdu->dst_addr()); + Tins::IPv4Address foo =arpPdu->target_ip_addr(); + std::string string("hello $name"); + Tins::EthernetII::address_type ethernatMask = std::regex_replace("00:00:" + foo.to_string(), std::regex("."), ":"); + Tins::EthernetII::address_type ethernatMask2 = "33:33:FF:00:00:00"; + forwardEthPdu.dst_addr(ethernatMask | ethernatMask2); } forwardEthPdu /= *ipv6Pdu; forwardEthPdu /= *ndpPdu; - // forward frame return callBackHandler->handle(forwardEthPdu, this); } diff --git a/src/Main.cpp b/src/Main.cpp index e539e2e..7c79112 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -1,8 +1,93 @@ -#include +#include +#include +#include +#include -int main(void) +void tprintf(const char* format) // base function { - printf("Hello, Worliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad\n"); - - return 0; + std::cout << format; +} + +template +void tprintf(const char* format, T value, Targs... Fargs) // recursive variadic function +{ + for ( ; *format != '\0'; format++ ) { + if ( *format == '%' ) { + std::cout << value; + tprintf(format+1, Fargs...); // recursive call + return; + } + std::cout << *format; + } +} + +template void func(Ts... args){ + const int size = sizeof...(Ts); +/* int res[size] = {1,args...,2}; + // since initializer lists guarantee sequencing, this can be used to + // call a function on each element of a pack, in order*/ + std::vector dummy = { (args, args)... }; + int size2 = dummy.size(); + size2++; +} + +struct foo{ + int bar = 0; + float bla = 3.12; + std::string blub = "blub"; +}; + +template +class varicdclass{ +public: + + explicit varicdclass(Ts*... mixins) + { + fillList(mixins...); + } + + template + void fillList(T * arg){ + dummy.push_back(arg == nullptr ? new T() : arg); + } + + template + void fillList(T * arg, Us*... args){ + dummy.push_back(arg == nullptr ? new T() : arg); + fillList(args...); + } + std::vector dummy; + + template + int bar (T i) {return 0;} + template + int bar (int i) {return 1;} + template + int bar (float f) {return 2;} +}; + +class dervaricdclass : public varicdclass +{ +public: + dervaricdclass() : varicdclass(nullptr,nullptr,nullptr) + { + } +}; + +int main() +{ + tprintf("% world% %\n","Hello",'!',123); + func(0,0,1,0); + int i = 1; + double d = 3.21; + foo f; + varicdclass dvc(&f,&i, &d); + varicdclass dvc2(nullptr,nullptr,nullptr); + dervaricdclass dvc3; + i++; + + int l = dvc3.bar(1); + int j = dvc3.bar(1.0); + int k = dvc3.bar('1'); + i++; }