#include #include #include #include "Definitions.hpp" #include "Threads/DefenseThread.hpp" // ===== PUBLIC ===== // DefenseThread::DefenseThread( MbufContainerReceiving* mbuf_container_from_inside, MbufContainerReceiving* mbuf_container_from_outside, MbufContainerTransmitting* mbuf_container_to_inside, MbufContainerTransmitting* mbuf_container_to_outside) : Thread() , _mbuf_container_from_inside(mbuf_container_from_inside) , _mbuf_container_from_outside(mbuf_container_from_outside) , _mbuf_container_to_inside(mbuf_container_to_inside) , _mbuf_container_to_outside(mbuf_container_to_outside) , _do_treat(false) { _treatment = new Treatment(_mbuf_container_to_outside, _mbuf_container_to_inside, 0); } int DefenseThread::s_run(void* thread_vptr) { DefenseThread* thread = static_cast(thread_vptr); thread->run(); return 0; } // ===== PRIVATE ===== // void DefenseThread::run() { /* LOG_INFO << "\nRunning on lcore " << rte_lcore_id() << ". [Ctrl+C to quit]" << LOG_END; */ // Run until the application is quit or killed. while (likely(_quit == false)) { // std::cout << _do_treat << std::endl; // continue if no packets are received int mbufs_from_inside = _mbuf_container_from_inside->poll_mbufs(); /* if (mbufs_from_inside != 0) { BOOST_LOG_TRIVIAL(info) << "Number of packets received from inside: " << mbufs_from_inside; } */ bool keep = true; for (int i = 0; i < mbufs_from_inside; ++i) { rte_mbuf* mbuf = _mbuf_container_from_inside->get_mbuf_at_index(i); if (PacketInfoCreator::is_ipv4_tcp(mbuf) == true && _do_treat == true) { PacketInfoIpv4Tcp* pkt_info = new PacketInfoIpv4Tcp(mbuf); keep = _treatment->treat_packets_to_outside(pkt_info); if (keep == false) { // delete PacketInfo delete pkt_info; } } else { // fwd // std::cout << _do_treat; _mbuf_container_to_outside->add_mbuf(mbuf); } } _mbuf_container_to_inside->send_mbufs(); _mbuf_container_to_outside->send_mbufs(); // _mbuf_container_to_inside->send_mbufs(); // _mbuf_container_to_outside->send_mbufs(); // for mbuf in pktsFromOutside // pktInfoCreator::determinePacketType without creating a pktinfo // create packetInfo with obtained type // if tcp: treat // else: fwd // destroy pktInfo // Pakete von innen, auch die selbsterzeugten bevorzugen // continue if no packets are received int mbufs_from_outside = _mbuf_container_from_outside->poll_mbufs(); /* if (mbufs_from_outside != 0) { BOOST_LOG_TRIVIAL(info) << "Number of packets received from outside: " << mbufs_from_outside; } */ for (int i = 0; i < mbufs_from_outside; ++i) { rte_mbuf* mbuf = _mbuf_container_from_outside->get_mbuf_at_index(i); if (PacketInfoCreator::is_ipv4_tcp(mbuf) == true && _do_treat == true) { PacketInfoIpv4Tcp* pkt_info = new PacketInfoIpv4Tcp(mbuf); keep = _treatment->treat_packets_to_inside( static_cast(pkt_info)); if (keep == false) { // delete PacketInfo delete pkt_info; } } else { // std::cout << _do_treat; _mbuf_container_to_inside->add_mbuf(mbuf); } } /* if (_mbuf_container_to_inside->get_number_of_mbufs() > 0) { BOOST_LOG_TRIVIAL(info) << "Number of packets sent to inside: " << _mbuf_container_to_inside->get_number_of_mbufs(); } if (_mbuf_container_to_outside->get_number_of_mbufs() > 0) { BOOST_LOG_TRIVIAL(info) << "Number of packets sent to outside: " << _mbuf_container_to_outside->get_number_of_mbufs(); } */ _mbuf_container_to_inside->send_mbufs(); _mbuf_container_to_outside->send_mbufs(); } _running = false; }