From d67499febfe144cb9559bace95c1143cd557cd54 Mon Sep 17 00:00:00 2001 From: deniskhud Date: Sun, 22 Feb 2026 13:38:02 +0100 Subject: [PATCH] add: cpp version, moved code to separate directories --- .../cpp/CMakeLists.txt | 48 ++ .../network-traffic-analyzer/cpp/README.md | 87 ++++ .../network-traffic-analyzer/cpp/example.png | Bin 0 -> 235248 bytes .../cpp/include/TUI/view.hpp | 40 ++ .../cpp/include/capture/pcapCapture.hpp | 107 +++++ .../cpp/include/cli/argsParse.hpp | 14 + .../cpp/include/cli/filter.hpp | 26 ++ .../cpp/include/packet/IP.hpp | 91 ++++ .../cpp/include/packet/packet.hpp | 59 +++ .../cpp/include/stats/protocolStats.hpp | 120 +++++ .../network-traffic-analyzer/cpp/main.cpp | 153 +++++++ .../cpp/src/TUI/view.cpp | 229 ++++++++++ .../cpp/src/capture/pcapCapture.cpp | 206 +++++++++ .../cpp/src/cli/argsParse.cpp | 64 +++ .../cpp/src/cli/filter.cpp | 77 ++++ .../cpp/src/packet/IP.cpp | 211 +++++++++ .../cpp/src/packet/packet.cpp | 49 ++ .../cpp/src/stats/protocolStats.cpp | 421 ++++++++++++++++++ .../{ => python}/LICENSE | 0 .../{ => python}/README.md | 0 .../{ => python}/justfile | 0 .../{ => python}/learn/00-OVERVIEW.md | 0 .../{ => python}/learn/01-CONCEPTS.md | 0 .../{ => python}/learn/02-ARCHITECTURE.md | 0 .../{ => python}/learn/03-IMPLEMENTATION.md | 0 .../{ => python}/learn/04-CHALLENGES.md | 0 .../{ => python}/pyproject.toml | 0 .../{ => python}/src/netanal/__init__.py | 0 .../{ => python}/src/netanal/__main__.py | 0 .../{ => python}/src/netanal/analyzer.py | 0 .../{ => python}/src/netanal/capture.py | 0 .../{ => python}/src/netanal/constants.py | 0 .../{ => python}/src/netanal/exceptions.py | 0 .../{ => python}/src/netanal/export.py | 0 .../{ => python}/src/netanal/filters.py | 0 .../{ => python}/src/netanal/main.py | 0 .../{ => python}/src/netanal/models.py | 0 .../{ => python}/src/netanal/output.py | 0 .../{ => python}/src/netanal/statistics.py | 0 .../{ => python}/src/netanal/visualization.py | 0 .../{ => python}/tests/__init__.py | 0 .../{ => python}/tests/test_filters.py | 0 .../{ => python}/tests/test_models.py | 0 .../{ => python}/uv.lock | 0 44 files changed, 2002 insertions(+) create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/CMakeLists.txt create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/README.md create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/example.png create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/include/TUI/view.hpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/include/capture/pcapCapture.hpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/include/cli/argsParse.hpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/include/cli/filter.hpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/include/packet/IP.hpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/include/packet/packet.hpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/include/stats/protocolStats.hpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/main.cpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/src/TUI/view.cpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/src/capture/pcapCapture.cpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/src/cli/argsParse.cpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/src/cli/filter.cpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/src/packet/IP.cpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/src/packet/packet.cpp create mode 100644 PROJECTS/beginner/network-traffic-analyzer/cpp/src/stats/protocolStats.cpp rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/LICENSE (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/README.md (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/justfile (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/learn/00-OVERVIEW.md (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/learn/01-CONCEPTS.md (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/learn/02-ARCHITECTURE.md (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/learn/03-IMPLEMENTATION.md (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/learn/04-CHALLENGES.md (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/pyproject.toml (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/__init__.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/__main__.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/analyzer.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/capture.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/constants.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/exceptions.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/export.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/filters.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/main.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/models.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/output.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/statistics.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/src/netanal/visualization.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/tests/__init__.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/tests/test_filters.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/tests/test_models.py (100%) rename PROJECTS/beginner/network-traffic-analyzer/{ => python}/uv.lock (100%) diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/CMakeLists.txt b/PROJECTS/beginner/network-traffic-analyzer/cpp/CMakeLists.txt new file mode 100644 index 00000000..f9070c3d --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/CMakeLists.txt @@ -0,0 +1,48 @@ +cmake_minimum_required(VERSION 3.31) +project(network-traffic-analyzer) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +link_libraries(pcap) + +find_package(Boost REQUIRED COMPONENTS program_options) +add_executable(network-traffic-analyzer main.cpp + "include/capture/pcapCapture.hpp" + src/capture/pcapCapture.cpp + "include/cli/argsParse.hpp" + include/packet/packet.hpp + include/packet/IP.hpp + src/packet/IP.cpp + include/stats/protocolStats.hpp + src/stats/protocolStats.cpp + src/packet/packet.cpp + src/cli/argsParse.cpp + include/cli/filter.hpp + src/cli/filter.cpp + include/TUI/view.hpp + src/TUI/view.cpp +) + +include(FetchContent) + +set(FETCHCONTENT_UPDATES_DISCONNECTED ON) +set(FETCHCONTENT_QUIET OFF) + +FetchContent_Declare(ftxui + GIT_REPOSITORY https://github.com/arthursonzogni/ftxui.git + GIT_TAG v5.0.0 + GIT_PROGRESS TRUE + GIT_SHALLOW TRUE + EXCLUDE_FROM_ALL +) +FetchContent_MakeAvailable(ftxui) + + +target_link_libraries(network-traffic-analyzer + Boost::program_options + ftxui::screen + ftxui::dom + ftxui::component +) diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/README.md b/PROJECTS/beginner/network-traffic-analyzer/cpp/README.md new file mode 100644 index 00000000..b0bd911f --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/README.md @@ -0,0 +1,87 @@ +```ruby +▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄ ▄▄ ▄▄▄▄ ▄▄▄ ▄▄ ▄▄ ▄▄▄ ▄▄ ▄▄ ▄▄ ▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄ + ██ ██▄█▄ ██▀██ ██▄▄ ██▄▄ ██ ██▀▀▀ ██▀██ ███▄██ ██▀██ ██ ▀███▀ ▄█▀ ██▄▄ ██▄█▄ + ██ ██ ██ ██▀██ ██ ██ ██ ▀████ ██▀██ ██ ▀██ ██▀██ ██▄▄▄ █ ▄██▄▄ ██▄▄▄ ██ ██ + +``` + +>A high-performance CLI network analyzer built with libpcap for raw packet capture and FTXUI for a fully interactive terminal UI. +The application captures packets directly from a network interface, parses protocol headers manually, aggregates statistics in real time + +--- +![Preview](example.png) + +> [!IMPORTANT] +> Packet capture requires elevated privileges. + +Run with: + +```bash +sudo ./network-traffic-analyzer +``` + +Or grant capabilities: + +```bash +sudo setcap cap_net_raw,cap_net_admin=eip ./network-traffic-analyzer +``` + +--- + +# Features +1) ## Live Packet Capture +- Capture traffic from a selected network interface +- Support for BPF filters (e.g. tcp, port 80, udp) +- Real-time processing using libpcap + +2) ## Real-Time Statistics Engine +- Total packets & traffic volume +- Transport protocol distribution (TCP / UDP / ICMP) +- Application-level classification (port-based) +- Top IP addresses +- Top source > destination pairs + +3) ## Flexible Capture Modes +- Live capture from selected network interface (-i, --interface) +- Offline analysis from .pcap file (-r, --offline) +- Packet count limit (-c) +- Time limit for capture (-t) +- Interface discovery (--interfaces) + +> [!TIP] +> For the complete list of CLI options, use: +> `--help` + +# Technologies +- C++20+ +- Boost::program_options +- libpcap +- FTXUI +- CMake + +# Build +``` +mkdir build && cd build +cmake .. +make +``` + +# Usage Example + +### Live capture on eth0 +``` +sudo ./network-traffic-analyzer -i eth0 +``` +### Capture 100 packets +``` +sudo ./network-traffic-analyzer -i wlan0 -c 100 +``` +### Analyze offline pcap file +``` +sudo ./network-traffic-analyzer --offline traffic.pcap +``` +### Export results (json / csv) +``` +sudo ./network-traffic-analyzer --json result.json --csv result.csv + +``` diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/example.png b/PROJECTS/beginner/network-traffic-analyzer/cpp/example.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc88ba02a8553f2a20ec6065f39e7c9647e970b GIT binary patch literal 235248 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�{zW2Ao^}oN$&byur*QC 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 literal 0 HcmV?d00001 diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/include/TUI/view.hpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/TUI/view.hpp new file mode 100644 index 00000000..29e78883 --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/TUI/view.hpp @@ -0,0 +1,40 @@ +#ifndef VIEW_HPP +#define VIEW_HPP +#include "../stats/protocolStats.hpp" +#include + +class View { +public: + ftxui::Element render( + const StatsSnapshot& data, + const std::string& interface, + const std::string& filter, + bool capture_finished, + std::chrono::seconds timer + ); + +private: + ftxui::Element render_header( + const StatsSnapshot& data, + const std::string& interface, + const std::string& filter + ); + ftxui::Element render_stats(const StatsSnapshot& data); + + ftxui::Element render_transport(const StatsSnapshot& data); + ftxui::Element render_application(const StatsSnapshot& data); + ftxui::Element render_ip(const StatsSnapshot& data); + ftxui::Element render_pairs(const StatsSnapshot& data); + ftxui::Element render_bandwidth(const StatsSnapshot& data); + ftxui::Element render_packets(const StatsSnapshot& data); + + ftxui::Element render_footer( + bool capture_finished, + std::chrono::seconds timer + ); +}; + + + + +#endif //VIEW_HPP diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/include/capture/pcapCapture.hpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/capture/pcapCapture.hpp new file mode 100644 index 00000000..1320b558 --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/capture/pcapCapture.hpp @@ -0,0 +1,107 @@ +#ifndef PCAPCAPTURE_HPP +#define PCAPCAPTURE_HPP + +#include +#include +#include +#include +#include + +//include C libraries +extern "C" { +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define SNAP_LEN 1518 +} + +#include "../packet/IP.hpp" +#include "../../include/stats/protocolStats.hpp" +#include "../packet/packet.hpp" + +/** + * Packet capture engine based on libpcap + * + * Supports: + * - Live capture from network interface + * - Offline capture from .pcap file + * - BPF filtering + * - Separate capture thread (for live mode) + * + * Workflow: + * initialize() -> load interfaces + * set_capabilities()-> configure capture parameters + * start() -> start live capture (threaded) + * start_offline() -> process file synchronously + * stop() -> stop capture and cleanup + */ + +class PcapCapture { +private: + /* libpcap error buffer */ + char errbuf[PCAP_ERRBUF_SIZE]; + + /* filter expression (compiled before capture) */ + std::string filter_exp = ""; + /* compiled filter program (expression) */ + struct bpf_program fp = {}; + /* Active pcap handle */ + pcap_t *handle = nullptr; + + /* Network mask and IP */ + bpf_u_int32 mask = 0; + bpf_u_int32 net = 0; + + /* Number of packets to capture */ + int num_packets = 0; + + /* Linked list of available interfaces */ + pcap_if_t *interfaces = nullptr; + + /* Selected network interface */ + std::string interface; + /** + * Static wrapper required by C-style libpcap callback. + * + * Since libpcap expects a C function pointer, + * we use a static function and forward the call + * to the class instance. + */ + static void callback(u_char *args, const struct pcap_pkthdr *header, const u_char *packet); + // packet processing logic + void got_packet(const struct pcap_pkthdr *header, const u_char *packet); + + /* Separate thread used for live capture */ + std::thread thread; + std::atomic running{false}; + +public: + + void print_interfaces(); + + bool isRunning() { + return running; + } + void setRunning(bool running) { + this->running = running; + } + /* Pointer to statistics engine */ + Stats* stats; + + void set_capabilities(std::string& interface, int num_packets, std::string& filter_exp, int packets_limit, Stats* stats); + void initialize(); + + + void start(); + void start_offline(std::string fpath); + void stop(); +}; + + +#endif //PCAPCAPTURE_HPP diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/include/cli/argsParse.hpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/cli/argsParse.hpp new file mode 100644 index 00000000..9795e854 --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/cli/argsParse.hpp @@ -0,0 +1,14 @@ +#ifndef ARGSPARSE_HPP +#define ARGSPARSE_HPP +#include + +namespace po = boost::program_options; +struct argsParser { + po::options_description desc; + po::variables_map vm; + void print_help() const; + + argsParser(int argc, char** argv); +}; + +#endif //ARGSPARSE_HPP diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/include/cli/filter.hpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/cli/filter.hpp new file mode 100644 index 00000000..95c66e24 --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/cli/filter.hpp @@ -0,0 +1,26 @@ +#ifndef FILTER_HPP +#define FILTER_HPP +#include +#include + +enum filter_type { + PROTOCOL, + PORT, + IP_TYPE, + IP_SRC, + IP_DEST, + NONE +}; + +struct filter { + filter_type type; + std::string val; +}; + + +filter parse(std::string str); +std::string get_bpf_filter(std::vector& f); + + + +#endif //FILTER_HPP diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/include/packet/IP.hpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/packet/IP.hpp new file mode 100644 index 00000000..c1a4860a --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/packet/IP.hpp @@ -0,0 +1,91 @@ +#ifndef IP_HPP +#define IP_HPP +#include +#include +#include +#include +#include "packet.hpp" + +/* virtual class for our IPv4, IPv6 classes */ +class IP_class { +protected: + virtual void handle_tcp() = 0; + virtual void handle_udp() = 0; + virtual void handle_icmp() = 0; + virtual void handle_icmpv6() = 0; + virtual void handle_igmp() = 0; + uint16_t payload_len = 0; +public: + //getters + virtual std::string get_source() = 0; + virtual std::string get_dest() = 0; + virtual uint16_t get_src_port() = 0; + virtual uint16_t get_dest_port() = 0; + virtual TransportProtocol get_protocol() = 0; + + uint16_t get_payload_len(); + + const uint8_t* payload_ptr = nullptr; + const uint8_t* get_payload_ptr() const { return payload_ptr; } + + virtual ~IP_class() = default; + +}; +/*** ip4 ***/ +class IPv4 : public IP_class { +private: + const ip* ip_hdr = nullptr; + int ip_hdr_len = 0; + uint16_t src_port = 0; + uint16_t dest_port = 0; +protected: + void handle_tcp() override; + void handle_udp() override; + void handle_icmp() override; + void handle_icmpv6() override; + void handle_igmp() override; + +public: + TransportProtocol get_protocol() override; + std::string get_source() override; + std::string get_dest() override; + uint16_t get_src_port() override; + uint16_t get_dest_port() override; + + explicit IPv4(const u_char* data); +}; + + + +/*** ipv6 ***/ +class IPv6 : public IP_class{ +protected: + void handle_tcp() override; + void handle_udp() override; + void handle_icmp() override; + void handle_icmpv6() override; + void handle_igmp() override; +private: + const ip6_hdr* ip_hdr = nullptr; + int ip_hdr_len = 40; + + in6_addr ip_source; + in6_addr ip_dest; + + uint16_t src_port; + uint16_t dest_port; + + const uint8_t* ptr = nullptr; + +public: + explicit IPv6(const u_char* data); + + TransportProtocol get_protocol() override; + std::string get_source() override; + std::string get_dest() override; + uint16_t get_src_port() override; + uint16_t get_dest_port() override; + +}; + +#endif //IP_HPP diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/include/packet/packet.hpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/packet/packet.hpp new file mode 100644 index 00000000..39e55bba --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/packet/packet.hpp @@ -0,0 +1,59 @@ +#ifndef PACKET_HPP +#define PACKET_HPP +#include +#include +#include +enum IPVersion { + v4, v6, +}; + +enum class TransportProtocol { + TCP = 1, + UDP = 2, + ICMP = 3, + ICMP6 = 4, + IGMP = 5, + UNKNOWN = -1, +}; + +enum class ApplicationProtocol { + HTTP, + HTTPS, + DNS, + FTP, + SSH, + SMTP, + QUIC, + NTP, + UNKNOWN, +}; + +struct Packet { + IPVersion ip_version; + TransportProtocol transport_protocol; + ApplicationProtocol application_protocol; + //src address + std::string src; + //dest address + std::string dst; + uint16_t src_port; + uint16_t dst_port; + + uint32_t total_len; + uint16_t payload_len; + + const uint8_t* payload_ptr; + + Packet(IPVersion version, TransportProtocol protocol, std::string src, std::string dst, + uint16_t src_port, uint16_t dst_port, uint32_t total_len, uint16_t payload, const uint8_t* payload_ptr) : ip_version(version), transport_protocol(protocol), + src(std::move(src)), dst(std::move(dst)), src_port(src_port), dst_port(dst_port), total_len(total_len), payload_len(payload), + payload_ptr(payload_ptr) + { + this->application_protocol = get_application_protocol(); + } + Packet() { } + +private: + ApplicationProtocol get_application_protocol(); +}; +#endif //PACKET_HPP diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/include/stats/protocolStats.hpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/stats/protocolStats.hpp new file mode 100644 index 00000000..13e77383 --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/include/stats/protocolStats.hpp @@ -0,0 +1,120 @@ +#ifndef PROTOCOLSTATS_HPP +#define PROTOCOLSTATS_HPP + +#include +#include +#include "../packet/packet.hpp" +#include +#include +#include +#include +#include +#include "ftxui/dom/elements.hpp" + +using namespace ftxui; +struct protocolStats { + uint32_t packets = 0; + uint32_t bytes = 0; +}; + +struct trafficStats { + uint32_t total_packets = 0; + uint32_t total_bytes = 0; +}; + +struct IPStats { + uint32_t bytes_sent = 0; + uint32_t bytes_received = 0; + + uint32_t packets_sent = 0; + uint32_t packets_received = 0; +}; + +struct BandwidthPoint { + double timestamp; + double bytes_per_sec; +}; + +struct StatsSnapshot { + std::vector> transport_rows; + std::vector> app_rows; + std::vector> rows; + std::vector> pairs_rows; + std::vector> packets_rows; + + uint32_t total_p = 0, total_b = 0; + //bandwidth + std::vector bandwidth_history; + double bandwidth = 0; + mutable double max_bandwidth = 0; + +}; + + +/** + * @brief Thread-safe statistics engine. + * + * Responsible for: + * - Aggregating packet statistics + * - Maintaining protocol distributions + * - Tracking IP traffic + * - Calculating bandwidth + * - Providing snapshot for UI rendering + * + * All write operations are protected by mutex. + */ +class Stats { +private: + std::mutex mtx; + + uint32_t last_b = 0; + + std::chrono::steady_clock::time_point last_tick; + + + std::unordered_map transport_map; + std::unordered_map application_map; + std::unordered_map ip_map; + + std::map, protocolStats> pairs; + + std::deque packets; + int limit_packets = 10; + + +public: + + void push(const Packet& p) { + std::lock_guard lock(mtx); + if (packets.size() > static_cast(limit_packets)) { + packets.pop_front(); + } + packets.push_back(p); + } + + StatsSnapshot snapshot; + void update_bandwidth(); + double smooth_value(size_t i, size_t start); + double smooth_bandwidth = 0.0; + + void set_packets_limit(int limit) { + limit_packets = limit; + } + + void add_packet(Packet &packet); + + void update_transport_stats(); + void update_application_stats(); + void update_ip_stats(size_t limit); + void update_pairs(size_t limit = 10); + void update_packets(); + + void export_csv(const std::string& filename); + void export_json(const std::string& filename); + + Stats(); +}; + + + +#endif //PROTOCOLSTATS_HPP diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/main.cpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/main.cpp new file mode 100644 index 00000000..7aa3910f --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/main.cpp @@ -0,0 +1,153 @@ +#include "include/capture/pcapCapture.hpp" +#include +#include +#include +#include "include/cli/filter.hpp" +#include +#include +#include + + +#include "include/cli/argsParse.hpp" +#include "include/TUI/view.hpp" +#define SNAP_LEN 1518 + +int main(int argc, char **argv) +{ + /* initialize capture */ + PcapCapture capture; + capture.initialize(); + + /* initialize stats */ + Stats stats; + + /* initializing the command line parser */ + argsParser parser(argc, argv); + + /* check helper flags */ + if (parser.vm.contains("help")) { + parser.print_help(); + return 0; + } + if (parser.vm.contains("interfaces")) { + capture.print_interfaces(); + return 0; + } + /* take the arguments of the flags into variables */ + std::string interface = parser.vm["interface"].as(); + int count = parser.vm["count"].as(); + int limit = parser.vm["limit"].as(); + int time = parser.vm["time"].as(); + std::string filterString = ""; + + /* get a filter, use vector for multiple */ + std::vector filters; + if (parser.vm.contains("filter")) { + auto& f = parser.vm["filter"].as>(); + for (auto& x : f) { + filters.push_back(parse(x)); + filterString += x + " "; + } + } + /* converting the filter to a pcap readable string */ + std::string expression = get_bpf_filter(filters); + + bool isOffline = parser.vm.contains("offline"); + + /* set the flags to capture engine */ + capture.set_capabilities(interface, count, expression, limit, &stats); + + + std::atomic capture_finished = false; + + /* if we capture packets offline, we read the file in full, then print the result */ + if (isOffline) { + + capture.start_offline(parser.vm["offline"].as()); + + /* full recalculation of statistics after file processing */ + stats.update_packets(); + stats.update_application_stats(); + stats.update_transport_stats(); + stats.update_ip_stats(10); + stats.update_pairs(); + stats.update_bandwidth(); + } + /* otherwise start live capture */ + else { + capture.start(); + } + + /* UI */ + using namespace ftxui; + auto screen = ScreenInteractive::Fullscreen(); + /* our class for UI */ + View view; + + /* timer */ + std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now(); + std::chrono::seconds timer{0}; + + auto renderer = Renderer([&] { + auto snapshot = stats.snapshot; + return view.render(snapshot, + interface, + filterString, + capture_finished, + timer); + }); + + auto component = CatchEvent(renderer, [&](Event e) { + if (e == Event::Character('q') || e == Event::Escape) { + capture.stop(); + screen.Exit(); + } + return true; + }); + + + std::thread updater; + + if (!isOffline) { + updater = std::thread([&] { + while (capture.isRunning()) { + + stats.update_packets(); + stats.update_application_stats(); + stats.update_transport_stats(); + stats.update_ip_stats(10); + stats.update_pairs(); + stats.update_bandwidth(); + + screen.PostEvent(Event::Custom); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); + + auto current_time = std::chrono::steady_clock::now(); + timer = std::chrono::duration_cast( + current_time - begin); + + if (timer >= std::chrono::seconds(time)) + break; + } + + capture_finished = true; + screen.PostEvent(Event::Custom); + }); + } + + screen.Loop(component); + + if (updater.joinable()) + updater.join(); + + /* check export flags */ + if (parser.vm.contains("csv")) { + stats.export_csv(parser.vm["csv"].as()); + } + if (parser.vm.contains("json")) { + stats.export_json(parser.vm["json"].as()); + } + + return 0; +} + diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/src/TUI/view.cpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/TUI/view.cpp new file mode 100644 index 00000000..588734d9 --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/TUI/view.cpp @@ -0,0 +1,229 @@ +#include "../../include/TUI/view.hpp" +#include "ftxui/dom/table.hpp" + + +ftxui::Element View::render(const StatsSnapshot& data, const std::string& interface, const std::string& filter, + bool capture_finished, std::chrono::seconds timer) { + auto header = render_header(data, interface, filter); + + auto transport_section = + hbox({ + render_transport(data) | flex, + separator(), + render_application(data) | flex, + separator(), + render_pairs(data) | flex, + }) | border; + + auto ip_section = + hbox({ + render_ip(data) + | border + | size(HEIGHT, LESS_THAN, 10) + | frame + | vscroll_indicator, + + render_bandwidth(data) + | border + | flex + }); + + auto left_panel = + vbox({ + transport_section, + separator(), + ip_section, + }) | flex_grow; + + auto right_panel = + render_packets(data) + | border + | size(WIDTH, EQUAL, 100) + | frame + | vscroll_indicator; + + auto body = + hbox({ + left_panel, + separator(), + right_panel, + }) | flex; + + auto footer = render_footer(capture_finished, timer); + + return vbox({ + header, + separator(), + body, + separator(), + footer, + }); +} +/** + * @brief Renders top header section. + * + * Displays: + * - Application title + * - Active interface + * - Active filter + * - Traffic summary + */ +ftxui::Element View::render_header(const StatsSnapshot& data, const std::string& interface, const std::string& filter) { + return hbox({ + vbox({ + text("Network Traffic Analyzer") | bold, + text("Interface: " + interface), + text("Filter: " + filter), + }) | flex, + separator(), + render_stats(data) | flex, + }) | border; +} + +ftxui::Element View::render_stats(const StatsSnapshot& data) { + return vbox({ + text("=== Traffic summary ===") | bold, + text("Total packets: " + std::to_string(data.total_p)), + text(std::format( + "Total bytes : {:.2f} MB", + data.total_b / (1024.0 * 1024.0) + )) + }) | flex; +} + + +ftxui::Element View::render_footer(bool capture_finished, std::chrono::seconds timer) { + return Element({ + capture_finished + ? text("Capture finished (" + std::format("{}", timer) + "). Press 'q' or Esc to exit.") + | bold | color(Color::Yellow) | center + : text("time: " + std::format("{}", timer) + ". Press 'q' or Esc to exit.") | center + | size(HEIGHT, EQUAL, 1) + }); + +} +ftxui::Element View::render_transport(const StatsSnapshot& data) { + Table table(data.transport_rows); + table.SelectAll().Border(LIGHT); + + table.SelectRow(0).Decorate(bold); + table.SelectRow(0).SeparatorVertical(LIGHT); + table.SelectRow(0).Decorate(bold); + table.SelectRow(0).Border(DOUBLE); + + return vbox({ + text("=== Transport protocols === ") | bold, + table.Render() + }) | flex; +} +ftxui::Element View::render_application(const StatsSnapshot& data) { + Table table(data.app_rows); + table.SelectAll().Border(LIGHT); + + table.SelectRow(0).Decorate(bold); + table.SelectRow(0).SeparatorVertical(LIGHT); + table.SelectRow(0).Decorate(bold); + table.SelectRow(0).Border(DOUBLE); + + return vbox({ + text("=== Application protocols ===") | bold, + table.Render() + }) | flex; +} +ftxui::Element View::render_ip(const StatsSnapshot& data) { + + Table table(data.rows); + table.SelectAll().Border(LIGHT); + + table.SelectRow(0).Decorate(bold); + table.SelectRow(0).SeparatorVertical(LIGHT); + table.SelectRow(0).Decorate(bold); + table.SelectRow(0).Border(DOUBLE); + + return vbox({ + text("=== Top IP addresses ===") | bold, + + table.Render() + }) | flex; +} +ftxui::Element View::render_pairs(const StatsSnapshot& data) { + Table table(data.pairs_rows); + table.SelectAll().Border(LIGHT); + + table.SelectRow(0).Decorate(bold); + table.SelectRow(0).SeparatorVertical(LIGHT); + table.SelectRow(0).Decorate(bold); + table.SelectRow(0).Border(DOUBLE); + + return vbox({ + text("=== Top communication pairs ===") | bold, + table.Render() + }) | flex; +} +/** + * @brief Renders bandwidth graph. + * + * Displays last 50 samples. + * Scales dynamically based on max bandwidth. + */ + +ftxui::Element View::render_bandwidth(const StatsSnapshot& data) { + using namespace ftxui; + + GraphFunction fn = [this, data](int width, int height) { + std::vector output(width, 0); + + if (data.bandwidth_history.size() < 2) + return output; + + size_t n = data.bandwidth_history.size(); + size_t start = n > 50 ? n - 50 : 0; + + + double max_bw = 1.0; + for (size_t i = start; i < n; ++i) + max_bw = std::max(max_bw, data.bandwidth_history[i].bytes_per_sec); + + for (int x = 0; x < width; ++x) { + + double t = (double)x / (width - 1); + + + double idx_f = start + t * (n - start - 1); + size_t i0 = (size_t)idx_f; + size_t i1 = std::min(i0 + 1, n - 1); + + + double frac = idx_f - i0; + double bw = + data.bandwidth_history[i0].bytes_per_sec * (1.0 - frac) + + data.bandwidth_history[i1].bytes_per_sec * frac; + + double v = bw / max_bw; + output[x] = static_cast(v * (height - 1)); + } + + return output; + }; + return vbox({ + text(std::format(" Bandwidth: {:.2f} KB / max: {:.2f} KB", data.bandwidth, data.max_bandwidth)) | bold, + graph(fn) + | size(HEIGHT, EQUAL, 20) | size(WIDTH, EQUAL, 60) + | border + | color(Color::Green), +}) ; +} +ftxui::Element View::render_packets(const StatsSnapshot& data) { + Table table(data.packets_rows); + table.SelectAll().Border(LIGHT); + + table.SelectRow(0).Decorate(bold); + table.SelectRow(0).SeparatorVertical(LIGHT); + table.SelectRow(0).Decorate(bold); + table.SelectRow(0).Border(DOUBLE); + return vbox({ + text("=== Packets ===") | bold, + + table.Render() | flex + }) | flex; +} \ No newline at end of file diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/src/capture/pcapCapture.cpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/capture/pcapCapture.cpp new file mode 100644 index 00000000..c5ed7334 --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/capture/pcapCapture.cpp @@ -0,0 +1,206 @@ +#include "../../include/capture/pcapCapture.hpp" +#include "../../include/stats/protocolStats.hpp" + + +/* get a list of all available network interfaces */ +void PcapCapture::initialize() { + /* find all devs available in network, save them to pcap_if_t struct (interfaces) */ + if (pcap_findalldevs(&interfaces, errbuf) == -1) { + fprintf(stderr, "Error: pcap_findalldevs has been failed - %s\n", errbuf); + } +} +/** + * Start live packet capture. + * + * Steps: + * 1. Resolve network mask + * 2. Open device in promiscuous mode + * 3. Compile and apply BPF filter (if provided) + * 4. Start pcap_loop in a separate thread + */ +void PcapCapture::start() { + // getting the netmask of the interface + if (pcap_lookupnet(interface.c_str(), &net, &mask, errbuf) == -1) { + fprintf(stderr, "Couldn't get netmask for device %s: %s\n", + interface.c_str(), errbuf); + net = 0; + mask = 0; + } + + /* open capture device */ + handle = pcap_open_live(interface.c_str(), SNAP_LEN, 1, 1000, errbuf); + if (handle == nullptr) { + fprintf(stderr, "Couldn't open device %s: %s\n", interface.c_str(), errbuf); + exit(EXIT_FAILURE); + } + + if (pcap_datalink(handle) != DLT_EN10MB) { + fprintf(stderr, "%s is not an Ethernet\n", interface.c_str()); + exit(EXIT_FAILURE); + } + if (!filter_exp.empty()) { + /* compile the filter expression */ + if (pcap_compile(handle, &fp, filter_exp.c_str(), 0, net) == -1) { + fprintf(stderr, "Couldn't parse filter %s: %s\n", + filter_exp.c_str(), pcap_geterr(handle)); + exit(EXIT_FAILURE); + } + + + /* apply the compiled filter */ + if (pcap_setfilter(handle, &fp) == -1) { + fprintf(stderr, "Couldn't install filter %s: %s\n", + filter_exp.c_str(), pcap_geterr(handle)); + exit(EXIT_FAILURE); + } + pcap_freecode(&fp); + } + + + + /* start a separate thread */ + running = true; + thread = std::thread([this]() { + if (pcap_loop(handle, num_packets, &PcapCapture::callback, reinterpret_cast(this)) < 0) { + //fprintf(stderr, "Error in pcap_loop: %s\n", pcap_geterr(handle)); + //pcap_close(handle); + } + running = false; + }); + +} + +void PcapCapture::stop() { + if (interfaces) { + pcap_freealldevs(interfaces); + } + if (handle) { + if (running == true) pcap_breakloop(handle); + pcap_close(handle); + //handle = nullptr; + } + + if (thread.joinable()) { + thread.join(); + } + /*if (!filter_exp.empty()) { + pcap_freecode(&fp); + }*/ + +} +/* print all available interfaces */ +void PcapCapture::print_interfaces() { + int i = 0; + for (pcap_if_t *dev = interfaces; dev; dev = dev->next) { + printf("%d. %s ",++i, dev->name); + if (dev->description) { + printf("(%s)\n", dev->description); + } + else { + printf("\n"); + } + } +} +/** + * @brief Static wrapper required by libpcap C API. + * + * Since libpcap expects a C-style function pointer, + * we forward the call to the current class instance. + * + * @param user Pointer to PcapCapture instance + * @param header Packet metadata + * @param packet Raw packet bytes + */ +void PcapCapture::callback( + u_char* user, + const struct pcap_pkthdr* header, + const u_char* packet +) { + auto* self = reinterpret_cast(user); + if (!self->isRunning()) return; + self->got_packet(header, packet); +} + +/** + * @brief Parses a single captured packet. + * + * Responsibilities: + * - Parse Ethernet header + * - Detect IP version (IPv4 / IPv6) + * - Extract transport & application protocols + * - Construct Packet abstraction + * - Forward packet to Stats engine + * + * Only IPv4 and IPv6 are currently processed. + * Other Ethernet types are ignored. + */ +void PcapCapture::got_packet(const struct pcap_pkthdr *header, const u_char *packet) { + if (!running) return; + + // --- Ethernet header --- + const auto* ethernet = reinterpret_cast(packet); + uint16_t ether_type = ntohs(ethernet->ether_type); + + Packet packetView; + + /* if we have a ipv4 type */ + if (ether_type == ETHERTYPE_IP) { + IPv4 ip(packet + sizeof(struct ether_header)); + TransportProtocol prot = ip.get_protocol(); + + packetView = Packet(v4, prot, ip.get_source(), ip.get_dest(), ip.get_src_port(), ip.get_dest_port(), header->len, ip.get_payload_len(), ip.get_payload_ptr()); + stats->add_packet(packetView); + stats->push(packetView); + + } + /* ipv6 type */ + if (ether_type == ETHERTYPE_IPV6) { + IPv6 ip(packet + sizeof(struct ether_header)); + TransportProtocol prot = ip.get_protocol(); + packetView = Packet(v6, prot, ip.get_source(), ip.get_dest(), ip.get_src_port(), ip.get_dest_port(), header->len, ip.get_payload_len(), ip.get_payload_ptr()); + stats->add_packet(packetView); + stats->push(packetView); + + } + if (ether_type == ETHERTYPE_VLAN) { + ethernet = (ether_header*)(packet + 4); + + } + if (ether_type == ETHERTYPE_ARP) { + + } +} + +void PcapCapture::set_capabilities(std::string& interface, int num_packets, std::string& filter_exp, int packets_limit, Stats* stats) { + this->interface = interface; + this->num_packets = num_packets; + this->filter_exp = filter_exp; + this->stats = stats; + this->stats->set_packets_limit(packets_limit); + +} +/** + * @brief Processes packets from an offline .pcap file. + * + * Differences from live mode: + * - Runs synchronously + * - No additional thread is created + * - Blocks until entire file is processed + * + * Used for post-capture analysis and exporting results. + */ +void PcapCapture::start_offline(std::string fpath) { + handle = pcap_open_offline(fpath.c_str(), errbuf); + if (handle == nullptr) { + fprintf(stderr, "Error opening offline file: %s\n", errbuf); + return; + } + + running = true; + + pcap_loop(handle, num_packets, + &PcapCapture::callback, + reinterpret_cast(this)); + + running = false; +} \ No newline at end of file diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/src/cli/argsParse.cpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/cli/argsParse.cpp new file mode 100644 index 00000000..3e10a120 --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/cli/argsParse.cpp @@ -0,0 +1,64 @@ +#include "../../include/cli/argsParse.hpp" +#include + +argsParser::argsParser(int argc, char** argv) { + desc.add_options() + ("help,h", "Display this help message and exit") + ("interfaces, interfaces","Display all possible interfaces") + ("interface,i", po::value()->default_value("wlan0"), + "Network interface to capture packets from (e.g. eth0, wlan0, any)") + + ("count,c", po::value()->default_value(0), + "Number of packets to capture (0 = unlimited)") + ("time, t", po::value()->default_value(INT_MAX),"Working time (in seconds)") + + ("offline,r", po::value(), + "Read packets from an offline pcap file") + + ("filter,f", po::value>()->composing(), + "Traffic filter (can be used multiple times)\n" + " proto: tcp | udp | icmp | dns\n" + " src: Source IP address\n" + " dst: Destination IP address\n" + " port: Source or destination port") + + ("sort,s", po::value()->default_value("bytes"), + "Sort field: bytes | packets | ip") + + ("order,o", po::value()->default_value("desc"), + "Sort order: asc | desc") + + ("limit,n", po::value()->default_value(43), + "Limit number of displayed entries") + + ("csv", po::value(), + "Export analysis results to CSV file") + + ("json", po::value(), + "Export analysis results to JSON file"); + + po::store(po::parse_command_line(argc, argv, desc), vm); + po::notify(vm); +} + +void argsParser::print_help() const { + std::cout << + "Network Traffic Analyzer\n" + "========================\n\n" + "Usage:\n" + " ./network-traffic-analyzer [options]\n\n" + "Description:\n" + " Captures and analyzes network traffic from live interfaces or\n" + " offline pcap files. Provides protocol statistics, top talkers,\n" + " and bandwidth usage information.\n\n"; + + std::cout << desc << "\n"; + + std::cout << + "Examples:\n" + " ./network-traffic-analyzer -i wlan0 --count 100 --time 10\n" + " ./network-traffic-analyzer -i any --filter port:54\n" + " ./network-traffic-analyzer --offline traffic.pcap --json result.json\n\n"; + + std::cout << "To end the program, press 'q' or Esc to exit.\n"; +} \ No newline at end of file diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/src/cli/filter.cpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/cli/filter.cpp new file mode 100644 index 00000000..12dc1570 --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/cli/filter.cpp @@ -0,0 +1,77 @@ +#include "../../include/cli/filter.hpp" + +#include + +filter parse(std::string str) { + auto pos = str.find(':'); + if (pos == std::string::npos) { + + } + + std::string type = str.substr(0, pos); + std::string value = str.substr(pos + 1); + + if (type == "protocol") return {PROTOCOL, value}; + if (type == "port") return {PORT, value}; + if (type == "dest") return {IP_DEST, value}; + if (type == "src") return {IP_SRC, value}; + if (type == "ip") return {IP_TYPE, value}; + return {NONE, value}; +} + +std::string get_bpf_filter(std::vector& f) { + std::map> groups; + + for (const auto& x : f) { + switch (x.type) { + case PROTOCOL: + if (x.val == "dns") + groups[PROTOCOL].push_back("port 53"); + else + groups[PROTOCOL].push_back(x.val); + break; + + case IP_DEST: + groups[IP_DEST].push_back("dst host " + x.val); + break; + + case IP_SRC: + groups[IP_SRC].push_back("src host " + x.val); + break; + + case PORT: + groups[PORT].push_back("port " + x.val); + break; + case IP_TYPE: + groups[IP_TYPE].push_back(x.val); + break; + + default: + break; + } + } + + std::string result; + bool first_group = true; + + for (auto& [type, parts] : groups) { + if (!first_group) + result += " and "; + first_group = false; + + if (parts.size() > 1) + result += "("; + + for (size_t i = 0; i < parts.size(); ++i) { + result += parts[i]; + if (i + 1 < parts.size()) + result += " or "; + } + + if (parts.size() > 1) + result += ")"; + } + + return result; +} + diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/src/packet/IP.cpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/packet/IP.cpp new file mode 100644 index 00000000..01e8164b --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/packet/IP.cpp @@ -0,0 +1,211 @@ +#include "../../include/packet/IP.hpp" + +#include +#include +#include +#include +#include +#include + +uint16_t IP_class::get_payload_len() { + return payload_len; +} + + +/*** Ipv4 ***/ +IPv4::IPv4(const u_char* data) { + ip_hdr = reinterpret_cast(data); + ip_hdr_len = ip_hdr->ip_hl * 4; + if (ip_hdr_len < 20) { + fprintf(stderr, "Failed to initial IPv4 "); + } + + +} + +TransportProtocol IPv4::get_protocol() { + + switch (ip_hdr->ip_p) { + case IPPROTO_TCP: + handle_tcp(); + return TransportProtocol::TCP; + + case IPPROTO_UDP: + handle_udp(); + return TransportProtocol::UDP; + + case IPPROTO_ICMP: + handle_icmp(); + return TransportProtocol::ICMP; + + case IPPROTO_ICMPV6: + handle_icmpv6(); + return TransportProtocol::ICMP6; + + case IPPROTO_IGMP: + handle_igmp(); + return TransportProtocol::IGMP; + + default: + return TransportProtocol::UNKNOWN; + } +} +void IPv4::handle_tcp() { + auto* tcp = reinterpret_cast((u_char*)ip_hdr + ip_hdr_len); + + src_port = ntohs(tcp->source); + dest_port = ntohs(tcp->dest); + + payload_ptr = reinterpret_cast(tcp + tcp->doff * 4); + + payload_len = ntohs(ip_hdr->ip_len) - (ip_hdr_len + tcp->doff * 4); +} +void IPv4::handle_udp() { + auto* udp = reinterpret_cast((u_char*)ip_hdr + ip_hdr_len); + dest_port = ntohs(udp->dest); + src_port = ntohs(udp->source); + + payload_ptr = (u_char*)udp + sizeof(udphdr); + payload_len = ntohs(udp->len) - sizeof(udphdr); +} +void IPv4::handle_icmp() { + auto* icmp = reinterpret_cast((u_char*)ip_hdr + ip_hdr_len); + + +} +void IPv4::handle_icmpv6() { + auto* icmp = reinterpret_cast((u_char*)ip_hdr + ip_hdr_len); + +} +void IPv4::handle_igmp() { + auto* igmp = reinterpret_cast((u_char*)ip_hdr + ip_hdr_len); + +} + +std::string IPv4::get_source() { + return std::string(inet_ntoa(ip_hdr->ip_src)); +} +std::string IPv4::get_dest() { + return std::string(inet_ntoa(ip_hdr->ip_dst)); +} +uint16_t IPv4::get_src_port() { + return src_port; +} +uint16_t IPv4::get_dest_port() { + return dest_port; +} + +/*** Ipv6 ***/ + +IPv6::IPv6(const u_char* data) { + ip_hdr = reinterpret_cast(data); + +} + +TransportProtocol IPv6::get_protocol() { + uint8_t hdr = ip_hdr->ip6_nxt; + + ptr = reinterpret_cast(ip_hdr + 1); + while (true) { + switch (hdr) { + case IPPROTO_TCP: + handle_tcp(); + return TransportProtocol::TCP; + + case IPPROTO_UDP: + handle_udp(); + return TransportProtocol::UDP; + + case IPPROTO_ICMP: + handle_icmp(); + return TransportProtocol::ICMP; + + case IPPROTO_ICMPV6: + handle_icmpv6(); + return TransportProtocol::ICMP6; + + case IPPROTO_IGMP: + handle_igmp(); + return TransportProtocol::IGMP; + /* if we have an extension headers, dont leave from loop, + * keep find a protocol type + */ + case IPPROTO_HOPOPTS: + case IPPROTO_ROUTING: + case IPPROTO_DSTOPTS: { + const auto* ext = reinterpret_cast(ptr); + hdr = ext->ip6e_nxt; + ptr += (ext->ip6e_len + 1) * 8; + break; + } + case IPPROTO_FRAGMENT: { + + const auto* frag = reinterpret_cast(ptr); + hdr = frag->ip6f_nxt; + ptr += sizeof(ip6_frag); + break; + } + default: + return TransportProtocol::UNKNOWN; + } + } + ptr = nullptr; +} + +void IPv6::handle_tcp() { + const auto tcp = reinterpret_cast(ptr); + dest_port = ntohs(tcp->dest); + src_port = ntohs(tcp->source); + + payload_ptr = (const uint8_t*)tcp + tcp->doff * 4; + payload_len = ntohs(ip_hdr->ip6_plen) - tcp->doff * 4; + + ptr = nullptr; + +} +void IPv6::handle_udp() { + const auto udp = reinterpret_cast(ptr); + dest_port = ntohs(udp->dest); + src_port = ntohs(udp->source); + + payload_ptr = (const uint8_t*)udp + sizeof(udphdr); + payload_len = ntohs(udp->len) - sizeof(udphdr); + + ptr = nullptr; + +} +void IPv6::handle_icmp() { + + ptr = nullptr; +} +void IPv6::handle_icmpv6() { + payload_len = ntohs(ip_hdr->ip6_plen) - sizeof(icmp6_hdr); + ptr = nullptr; +} +void IPv6::handle_igmp() { + + ptr = nullptr; +} + +std::string IPv6::get_source() { + char src[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, &ip_hdr->ip6_src, src, sizeof(src)); + return std::string(src); +} + +std::string IPv6::get_dest() { + char dst[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, &ip_hdr->ip6_dst, dst, sizeof(dst)); + return std::string(dst); +} + +uint16_t IPv6::get_src_port() { + return src_port; +} + +uint16_t IPv6::get_dest_port() { + return dest_port; +} + + + diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/src/packet/packet.cpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/packet/packet.cpp new file mode 100644 index 00000000..11b1f81d --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/packet/packet.cpp @@ -0,0 +1,49 @@ +#include "../../include/packet/packet.hpp" +#include + +ApplicationProtocol Packet::get_application_protocol() { + if (!payload_ptr || payload_len < 4) goto check_port; + + if (transport_protocol == TransportProtocol::TCP) { + if (!memcmp(payload_ptr, "GET ", 4) || + !memcmp(payload_ptr, "POST", 4) || + !memcmp(payload_ptr, "HEAD", 4) || + !memcmp(payload_ptr, "PUT ", 4) || + !memcmp(payload_ptr, "HTTP", 4)) + return ApplicationProtocol::HTTP; + } + + if ((src_port == 53 || dst_port == 53) && payload_len >= 12) { + return ApplicationProtocol::DNS; + } + if (transport_protocol == TransportProtocol::TCP && payload_len >= 3) { + if (payload_ptr[0] == 0x16 && payload_ptr[1] == 0x03) + return ApplicationProtocol::HTTPS; + } + +check_port: + uint16_t port = (src_port < dst_port) ? src_port : dst_port; + if (transport_protocol == TransportProtocol::TCP) { + switch (port) { + case 21: return ApplicationProtocol::FTP; + case 22: return ApplicationProtocol::SSH; + case 25: return ApplicationProtocol::SMTP; + case 53: return ApplicationProtocol::DNS; + case 80: return ApplicationProtocol::HTTP; + case 443: return ApplicationProtocol::HTTPS; + default: return ApplicationProtocol::UNKNOWN; + } + } + + if (transport_protocol == TransportProtocol::UDP) { + switch (port) { + case 53: return ApplicationProtocol::DNS; + case 443: return ApplicationProtocol::QUIC; + case 123: return ApplicationProtocol::NTP; + default: return ApplicationProtocol::UNKNOWN; + } + } + + return ApplicationProtocol::UNKNOWN; +} + diff --git a/PROJECTS/beginner/network-traffic-analyzer/cpp/src/stats/protocolStats.cpp b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/stats/protocolStats.cpp new file mode 100644 index 00000000..4be6ca44 --- /dev/null +++ b/PROJECTS/beginner/network-traffic-analyzer/cpp/src/stats/protocolStats.cpp @@ -0,0 +1,421 @@ +#include "../../include/stats/protocolStats.hpp" + +#include "ftxui/dom/table.hpp" + + +Stats::Stats() { + last_tick = std::chrono::steady_clock::now(); +} +/** + * @brief Aggregates a newly captured packet. + * + * Updates: + * - Total packet/byte counters + * - Transport protocol stats + * - Application protocol stats + * - IP-level statistics + * - Communication pairs + * + * Must be called only from capture thread. + * Protected by mutex. + */ +void Stats::add_packet(Packet &packet) { + std::lock_guard lock(mtx); + + ++snapshot.total_p; + snapshot.total_b += packet.total_len; + + auto& t = transport_map[packet.transport_protocol]; + t.packets++; + t.bytes += packet.total_len; + + auto& a = application_map[packet.application_protocol]; + a.packets++; + a.bytes += packet.payload_len; + + ip_map[packet.src].packets_sent++; + ip_map[packet.src].bytes_sent += packet.total_len; + + ip_map[packet.dst].packets_received++; + ip_map[packet.dst].bytes_received += packet.total_len; + + auto key = std::make_pair(packet.src, packet.dst); + pairs[key].packets++; + pairs[key].bytes += packet.total_len; + +} + + +const char* transport_to_str(TransportProtocol p) { + switch (p) { + case TransportProtocol::TCP: return "TCP"; + case TransportProtocol::UDP: return "UDP"; + case TransportProtocol::ICMP: return "ICMP"; + case TransportProtocol::ICMP6: return "ICMP6"; + case TransportProtocol::IGMP: return "IGMP"; + default: return "UNKNOWN"; + } +} + +const char* app_to_str(ApplicationProtocol p) { + switch (p) { + case ApplicationProtocol::HTTP: return "HTTP"; + case ApplicationProtocol::HTTPS: return "HTTPS"; + case ApplicationProtocol::DNS: return "DNS"; + case ApplicationProtocol::FTP: return "FTP"; + case ApplicationProtocol::SSH: return "SSH"; + case ApplicationProtocol::SMTP: return "SMTP"; + case ApplicationProtocol::QUIC: return "QUIC"; + case ApplicationProtocol::NTP: return "NTP"; + default: return "UNKNOWN"; + } +} + +/** + * @brief Rebuilds transport protocol snapshot table. + * + * Sorts protocols by packet count (descending). + * Calculates percentage relative to total traffic. + * + * Called periodically by UI update thread. + */ + +void Stats::update_transport_stats() { + std::lock_guard lock(mtx); + snapshot.transport_rows.clear(); + snapshot.transport_rows.push_back({ "Proto", "Packets", "Bytes", "%" }); + + std::vector> tps( + transport_map.begin(), transport_map.end() + ); + std::sort(tps.begin(), tps.end(), + [](auto& a, auto& b) { + return a.second.packets > b.second.packets; + }); + + for (const auto& [proto, stats] : tps) { + double percent = snapshot.total_b ? stats.bytes * 100.0 / snapshot.total_b : 0.0; + snapshot.transport_rows.push_back({ + transport_to_str(proto), + std::to_string(stats.packets), + std::format("{:.2f}", stats.bytes / (1024.0 * 1024.0)), + std::format("{:.2f}", percent) + }); + + } +} + + +/** + * @brief Rebuilds application protocol snapshot. + * + * Sorted by packet count. + * Percent calculated relative to total bytes. + */ +void Stats::update_application_stats() { + std::lock_guard lock(mtx); + std::vector> apps( + application_map.begin(), application_map.end() + ); + + std::sort(apps.begin(), apps.end(), + [](auto& a, auto& b) { + return a.second.packets > b.second.packets; + }); + + snapshot.app_rows.clear(); + snapshot.app_rows.push_back({ "Proto", "Packets", "Bytes (MB)", "%" }); + + for (const auto& [proto, s] : apps) { + double percent = snapshot.total_b + ? s.bytes * 100.0 / snapshot.total_b + : 0.0; + + snapshot.app_rows.push_back({ + app_to_str(proto), + std::to_string(s.packets), + std::format("{:.2f}", s.bytes / (1024.0 * 1024.0)), + std::format("{:.2f}", percent) + }); + } +} + +/** + * @brief Generates snapshot for top IP addresses. + * + * @param limit Maximum number of IPs to display. + * + * Sorted by transmitted packets (descending). + */ +void Stats::update_ip_stats(size_t limit) { + std::lock_guard lock(mtx); + snapshot.rows.clear(); + + snapshot.rows.push_back({"IP Address", "Packets TX", "Packets RX"}); + std::vector> ips( + ip_map.begin(), ip_map.end() + ); + + std::sort(ips.begin(), ips.end(), + [](auto& a, auto& b) { + return a.second.packets_sent > b.second.packets_sent; + }); + + size_t count = 0; + for (const auto& [ip, s] : ips) { + if (count++ >= limit) break; + snapshot.rows.push_back({ip, + "TX: " + std::to_string(s.packets_sent), + "RX: " + std::to_string(s.packets_received)} + ); + + } +} + +/** + * @brief Builds snapshot of top communication pairs. + * + * @param limit Maximum number of pairs to include. + * + * Sorted by total bytes transferred. + */ + +void Stats::update_pairs(size_t limit) { + std::lock_guard lock(mtx); + std::vector, protocolStats>> vec(pairs.begin(), pairs.end()); + std::sort(vec.begin(), vec.end(), + [](auto& a, auto& b) { + return a.second.bytes > b.second.bytes; + }); + + snapshot.pairs_rows.clear(); + snapshot.pairs_rows.push_back({ "Source", "Destination", "bytes received", "%" }); + size_t count = 0; + for (const auto& [pair, s] : vec) { + + if (count++ >= limit) break; + double percent = snapshot.total_b ? (s.bytes * 100.0 / snapshot.total_b) : 0.0; + snapshot.pairs_rows.push_back({ + pair.first, + pair.second, + std::format("{:.0f}", s.bytes * 1.0), + std::format("{:.2f}", percent), + + }); + + } +} + +void Stats::update_packets(){ + std::lock_guard lock(mtx); + snapshot.packets_rows.clear(); + snapshot.packets_rows.push_back({ "IPVersion", "Transport protocol", "Source", "Destination", "App protocol"}); + + for (auto& packet : packets) { + snapshot.packets_rows.push_back({ + packet.ip_version == IPVersion::v4 ? "IPv4" : "IPv6", + transport_to_str(packet.transport_protocol), + packet.src, + packet.dst, + app_to_str(packet.application_protocol), + + }); + } +} + +double Stats::smooth_value(size_t i, size_t start) { + const int window = 3; + double sum = 0.0; + int count = 0; + + for (int k = -window; k <= window; ++k) { + long idx = (long)i + k; + if (idx >= (long)start && idx < (long)snapshot.bandwidth_history.size()) { + sum += snapshot.bandwidth_history[idx].bytes_per_sec; + count++; + } + } + return count ? sum / count : 0.0; +} +/** + * @brief Calculates current bandwidth (bytes/sec). + * + * Uses: + * - Delta bytes since last tick + * - Time elapsed + * - Exponential smoothing to reduce noise + * + * Stores history for graph rendering. + */ +void Stats::update_bandwidth() { + std::lock_guard lock(mtx); + using namespace std::chrono; + + auto now = steady_clock::now(); + double ts = duration_cast>(now.time_since_epoch()).count(); + double elapsed = duration_cast>(now - last_tick).count(); + + if (elapsed >= 1.0) { + + uint32_t delta_bytes = snapshot.total_b - last_b; + + snapshot.bandwidth = delta_bytes / elapsed; // bytes per second + + last_b = snapshot.total_b; + last_tick = now; + const double alpha = 0.2; + smooth_bandwidth = + alpha * snapshot.bandwidth + (1.0 - alpha) * smooth_bandwidth; + + snapshot.bandwidth_history.push_back({ ts, smooth_bandwidth }); + } + snapshot.max_bandwidth = std::max(snapshot.max_bandwidth, snapshot.bandwidth); + +} + +/** + * @brief Exports current statistics to CSV file. + * + * Includes: + * - Summary + * - Transport protocols + * - Application protocols + * - IP statistics + * - Bandwidth history + */ + +void Stats::export_csv(const std::string& filename) { + std::lock_guard lock(mtx); + std::ofstream file(filename); + if (!file.is_open()) return; + + file << "summary\n"; + file << "total_packets,total_bytes,bandwidth\n"; + file << snapshot.total_p << "," + << snapshot.total_b << "," + << snapshot.bandwidth << "\n\n"; + + // ===== Transport protocols ===== + file << "transport_protocols\n"; + file << "protocol,packets,bytes,percent\n"; + + for (const auto& [proto, s] : transport_map) { + double percent = snapshot.total_b ? (s.bytes * 100.0 / snapshot.total_b) : 0.0; + file << transport_to_str(proto) << "," + << s.packets << "," + << s.bytes << "," + << percent << "\n"; + } + file << "\n"; + + // ===== Application protocols ===== + file << "application_protocols\n"; + file << "protocol,packets,payload_bytes\n"; + + for (const auto& [proto, s] : application_map) { + file << static_cast(proto) << "," + << s.packets << "," + << s.bytes << "\n"; + } + file << "\n"; + + // ===== IP stats ===== + file << "ip_stats\n"; + file << "ip,packets_sent,packets_received,bytes_sent,bytes_received\n"; + + for (const auto& [ip, s] : ip_map) { + file << ip << "," + << s.packets_sent << "," + << s.packets_received << "," + << s.bytes_sent << "," + << s.bytes_received << "\n"; + } + + + //bandwidth + file << "time,bandwidth\n"; + + for (const auto& p : snapshot.bandwidth_history) { + file << p.timestamp << "," << p.bytes_per_sec << "\n"; + } + + file.close(); + +} +/** + * @brief Exports statistics to JSON format. + * + * Designed for: + * - External processing + * - Visualization tools + * - Data pipelines + */ +void Stats::export_json(const std::string& filename) { + std::lock_guard lock(mtx); + std::ofstream file(filename); + if (!file.is_open()) return; + + file << "{\n"; + + // ===== Summary ===== + file << " \"summary\": {\n"; + file << " \"total_packets\": " << snapshot.total_p << ",\n"; + file << " \"total_bytes\": " << snapshot.total_b << ",\n"; + file << " \"bandwidth\": " << snapshot.bandwidth << "\n"; + file << " },\n"; + + // ===== Transport ===== + file << " \"transport\": [\n"; + bool first = true; + for (const auto& [proto, s] : transport_map) { + if (!first) file << ",\n"; + first = false; + + double percent = snapshot.total_b ? (s.bytes * 100.0 / snapshot.total_b) : 0.0; + + file << " {\n"; + file << " \"protocol\": \"" << transport_to_str(proto) << "\",\n"; + file << " \"packets\": " << s.packets << ",\n"; + file << " \"bytes\": " << s.bytes << ",\n"; + file << " \"percent\": " << percent << "\n"; + file << " }"; + } + file << "\n ],\n"; + + // ===== IP stats ===== + file << " \"top_ips\": [\n"; + first = true; + for (const auto& [ip, s] : ip_map) { + if (!first) file << ",\n"; + first = false; + + file << " {\n"; + file << " \"ip\": \"" << ip << "\",\n"; + file << " \"packets_sent\": " << s.packets_sent << ",\n"; + file << " \"packets_received\": " << s.packets_received << ",\n"; + file << " \"bytes_sent\": " << s.bytes_sent << ",\n"; + file << " \"bytes_received\": " << s.bytes_received << "\n"; + file << " }"; + } + file << "\n ]\n"; + + file << ",\n \"communication_pairs\": [\n"; + first = true; + + for (const auto& [pair, s] : pairs) { + if (!first) file << ",\n"; + first = false; + + file << " {\n"; + file << " \"src\": \"" << pair.first << "\",\n"; + file << " \"dst\": \"" << pair.second << "\",\n"; + file << " \"packets\": " << s.packets << ",\n"; + file << " \"bytes\": " << s.bytes << "\n"; + file << " }"; + } + + file << "\n ]"; + + file << "}\n"; + file.close(); +} diff --git a/PROJECTS/beginner/network-traffic-analyzer/LICENSE b/PROJECTS/beginner/network-traffic-analyzer/python/LICENSE similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/LICENSE rename to PROJECTS/beginner/network-traffic-analyzer/python/LICENSE diff --git a/PROJECTS/beginner/network-traffic-analyzer/README.md b/PROJECTS/beginner/network-traffic-analyzer/python/README.md similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/README.md rename to PROJECTS/beginner/network-traffic-analyzer/python/README.md diff --git a/PROJECTS/beginner/network-traffic-analyzer/justfile b/PROJECTS/beginner/network-traffic-analyzer/python/justfile similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/justfile rename to PROJECTS/beginner/network-traffic-analyzer/python/justfile diff --git a/PROJECTS/beginner/network-traffic-analyzer/learn/00-OVERVIEW.md b/PROJECTS/beginner/network-traffic-analyzer/python/learn/00-OVERVIEW.md similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/learn/00-OVERVIEW.md rename to PROJECTS/beginner/network-traffic-analyzer/python/learn/00-OVERVIEW.md diff --git a/PROJECTS/beginner/network-traffic-analyzer/learn/01-CONCEPTS.md b/PROJECTS/beginner/network-traffic-analyzer/python/learn/01-CONCEPTS.md similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/learn/01-CONCEPTS.md rename to PROJECTS/beginner/network-traffic-analyzer/python/learn/01-CONCEPTS.md diff --git a/PROJECTS/beginner/network-traffic-analyzer/learn/02-ARCHITECTURE.md b/PROJECTS/beginner/network-traffic-analyzer/python/learn/02-ARCHITECTURE.md similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/learn/02-ARCHITECTURE.md rename to PROJECTS/beginner/network-traffic-analyzer/python/learn/02-ARCHITECTURE.md diff --git a/PROJECTS/beginner/network-traffic-analyzer/learn/03-IMPLEMENTATION.md b/PROJECTS/beginner/network-traffic-analyzer/python/learn/03-IMPLEMENTATION.md similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/learn/03-IMPLEMENTATION.md rename to PROJECTS/beginner/network-traffic-analyzer/python/learn/03-IMPLEMENTATION.md diff --git a/PROJECTS/beginner/network-traffic-analyzer/learn/04-CHALLENGES.md b/PROJECTS/beginner/network-traffic-analyzer/python/learn/04-CHALLENGES.md similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/learn/04-CHALLENGES.md rename to PROJECTS/beginner/network-traffic-analyzer/python/learn/04-CHALLENGES.md diff --git a/PROJECTS/beginner/network-traffic-analyzer/pyproject.toml b/PROJECTS/beginner/network-traffic-analyzer/python/pyproject.toml similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/pyproject.toml rename to PROJECTS/beginner/network-traffic-analyzer/python/pyproject.toml diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/__init__.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/__init__.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/__init__.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/__init__.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/__main__.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/__main__.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/__main__.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/__main__.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/analyzer.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/analyzer.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/analyzer.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/analyzer.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/capture.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/capture.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/capture.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/capture.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/constants.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/constants.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/constants.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/constants.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/exceptions.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/exceptions.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/exceptions.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/exceptions.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/export.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/export.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/export.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/export.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/filters.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/filters.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/filters.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/filters.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/main.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/main.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/main.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/main.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/models.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/models.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/models.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/models.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/output.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/output.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/output.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/output.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/statistics.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/statistics.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/statistics.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/statistics.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/src/netanal/visualization.py b/PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/visualization.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/src/netanal/visualization.py rename to PROJECTS/beginner/network-traffic-analyzer/python/src/netanal/visualization.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/tests/__init__.py b/PROJECTS/beginner/network-traffic-analyzer/python/tests/__init__.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/tests/__init__.py rename to PROJECTS/beginner/network-traffic-analyzer/python/tests/__init__.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/tests/test_filters.py b/PROJECTS/beginner/network-traffic-analyzer/python/tests/test_filters.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/tests/test_filters.py rename to PROJECTS/beginner/network-traffic-analyzer/python/tests/test_filters.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/tests/test_models.py b/PROJECTS/beginner/network-traffic-analyzer/python/tests/test_models.py similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/tests/test_models.py rename to PROJECTS/beginner/network-traffic-analyzer/python/tests/test_models.py diff --git a/PROJECTS/beginner/network-traffic-analyzer/uv.lock b/PROJECTS/beginner/network-traffic-analyzer/python/uv.lock similarity index 100% rename from PROJECTS/beginner/network-traffic-analyzer/uv.lock rename to PROJECTS/beginner/network-traffic-analyzer/python/uv.lock