Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
772d281
integrate dpdk loop
stepanrodimanov Mar 26, 2026
abd3dad
Merge branch 'protocols_between_controller_and_workers' into dpdk-int…
stepanrodimanov Mar 31, 2026
5bee3e4
merge traffic_filtering into dpdk-integration
stepanrodimanov Mar 31, 2026
203ae98
interrupt handler
stepanrodimanov Apr 1, 2026
b610905
fix linter
stepanrodimanov Apr 1, 2026
1e55242
Merge branch 'traffic_filtering' into dpdk-integration
stepanrodimanov Apr 2, 2026
2967fb0
fix bazel build
stepanrodimanov Apr 4, 2026
65eca24
Merge branch 'dpdk-integration' of https://github.com/moevm/grpc_serv…
stepanrodimanov Apr 4, 2026
8283bfb
add send to port in
LapshinAE0 Apr 12, 2026
c50b312
Merge changes dpdk
stepanrodimanov Apr 12, 2026
c770dce
integrate changes dpdk
stepanrodimanov Apr 12, 2026
601ae03
Merge branch 'traffic_filtering' into dpdk-integration
stepanrodimanov Apr 12, 2026
ea99a79
fix linter
stepanrodimanov Apr 12, 2026
5017313
full done
LapshinAE0 Apr 13, 2026
4c76460
add stdint
stepanrodimanov Apr 14, 2026
b4ee8e8
merge sqlite
stepanrodimanov Apr 14, 2026
2a8a6fb
fix build
stepanrodimanov Apr 14, 2026
cd0ecf6
fix linter
stepanrodimanov Apr 14, 2026
cac500e
fix build worker
stepanrodimanov Apr 15, 2026
b970eda
fix build worker
stepanrodimanov Apr 15, 2026
74a2853
fix: remove cache
stepanrodimanov Apr 22, 2026
abf0ff9
Merge branch 'traffic_filtering' into dpdk-integration
stepanrodimanov Apr 22, 2026
aa52eb6
feact: added classification request
stepanrodimanov Apr 22, 2026
997f0aa
fix: fix absolute paths
stepanrodimanov Apr 22, 2026
10248e9
fix: fix absolute paths in main.c
stepanrodimanov Apr 22, 2026
da6b922
fix: fix dockerfile
stepanrodimanov Apr 23, 2026
a06f32d
refactor: clang-format
stepanrodimanov Apr 23, 2026
5e04ff8
fix: fix mutex
stepanrodimanov Apr 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 44 additions & 2 deletions worker/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ proto_library(
name = "communication_proto",
srcs = ["communication.proto"],
deps = [
"@com_google_protobuf//:empty_proto",
"@com_google_protobuf//:any_proto",
"@com_google_protobuf//:struct_proto",
"@com_google_protobuf//:empty_proto",
],
)

Expand All @@ -18,7 +19,7 @@ generate_cc(
name = "communication_cc_grpc_gen",
srcs = [":communication_proto"],
plugin = "@grpc//src/compiler:grpc_cpp_plugin",
well_known_protos = True,
well_known_protos = False,
generate_mocks = True,
)

Expand All @@ -37,7 +38,15 @@ cc_library(
hdrs = [
"include/worker.hpp",
"include/metrics_collector.hpp",
"include/dpdk_filter/net_port.h",
"include/dpdk_filter/dns_cache.h",
"include/dpdk_filter/filtr_packets.h",
"include/dpdk_filter/pars_packets.h",
"include/dpdk_filter/proc_packets.h",
"include/dpdk_filter/types.h",
"include/dpdk_filter/constants.h",
],
includes = ["include", "include/dpdk_filter"],
srcs = [],
visibility = ["//visibility:public"],
)
Expand All @@ -47,7 +56,12 @@ cc_binary(
srcs = [
"src/main.cpp",
"src/worker.cpp",
"src/dpdk_filter/dns_cache.c",
"src/metrics_collector.cpp",
"src/dpdk_filter/net_port.c",
"src/dpdk_filter/filtr_packets.c",
"src/dpdk_filter/pars_packets.c",
"src/dpdk_filter/proc_packets.c",
],
deps = [
":worker_headers",
Expand All @@ -58,14 +72,42 @@ cc_binary(
"@curl//:curl",
],
copts = [
"-mssse3",
"-msse4.2",
"-mpclmul",
"-maes",
"-I$(GENDIR)/..",
"-I/usr/include",
],
cxxopts = [
"-std=c++17",
],
linkopts = [
"-L/usr/local/openssl/lib",
"-lssl",
"-lcrypto",

"-L/usr/local/lib",
"-lprometheus-cpp-push",
"-lprometheus-cpp-core",

"-L/usr/lib",
"-lrte_eal",
"-lrte_ethdev",
"-lrte_mempool",
"-lrte_mbuf",
"-lrte_bus_vdev",
"-lrte_ring",
"-lrte_telemetry",
"-lrte_kvargs",
"-lrte_log",
"-lrte_net",
"-lrte_hash",
"-lrte_timer",
"-lsqlite3",

"-lnuma",
"-ldl",
"-lpthread",
],
)
66 changes: 46 additions & 20 deletions worker/Dockerfile.cc_x86_to_x86
Original file line number Diff line number Diff line change
@@ -1,17 +1,50 @@
FROM alpine:3.21.3 AS builder

RUN apk update && apk add --no-cache g++ openssl-dev cmake make curl-dev protobuf-dev
RUN apk add bazel --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/
FROM ubuntu:22.04 AS builder

RUN apt-get update && apt-get install -y \
build-essential=12.9* \
cmake=3.22* \
curl=7.81* \
git=1:2.34* \
wget=1.21* \
meson=0.61* \
ninja-build=1.10* \
libssl-dev=3.0* \
protobuf-compiler=3.12* \
libprotobuf-dev=3.12* \
python3=3.10* \
python3-pip=22.0* \
libnuma-dev=2.0* \
pkg-config=0.29* \
libcurl4-openssl-dev=7.81* \
libbpf-dev=1:0.5* \
gcc=4:11* \
g++=4:11* \
m4=1.4* \
libpcap-dev=1.10* \
libsqlite3-dev=3.37* \
&& rm -rf /var/lib/apt/lists/*
Comment on lines +3 to +25
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

версии нужно фиксировать


RUN pip3 install pyelftools
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

аналогично про версии

  • всякие no cache dir и clean нужно делать, если вы выше уже начали ужимать слои через rm -rf /var/lib/apt/lists/*


RUN wget https://github.com/bazelbuild/bazel/releases/download/8.2.1/bazel-8.2.1-linux-x86_64 \
&& chmod +x bazel-8.2.1-linux-x86_64 \
&& mv bazel-8.2.1-linux-x86_64 /usr/local/bin/bazel

RUN wget https://fast.dpdk.org/rel/dpdk-23.11.tar.xz && \
tar -xf dpdk-23.11.tar.xz && \
cd dpdk-23.11 && \
meson setup build --libdir=lib && \
ninja -C build && \
ninja -C build install && \
cd .. && \
rm -rf dpdk-23.11 dpdk-23.11.tar.xz

ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

WORKDIR /app

COPY scripts/get_prometheus_cpp.sh scripts/
RUN sh scripts/get_prometheus_cpp.sh
RUN apk add --no-cache llvm18 clang18
RUN ln -s /usr/lib/llvm18/bin/llvm-ar /bin/llvm-ar-18
RUN ln -s /usr/bin/clang++-18 /usr/bin/clang++
RUN ln -s /usr/bin/clang-18 /usr/bin/clang


COPY ./src/ ./src/
COPY ./include/ ./include/
Expand All @@ -21,17 +54,10 @@ COPY ./communication.proto ./
COPY ./toolchains ./toolchains
COPY ./platforms ./platforms


RUN bazel build //:worker --extra_toolchains=//toolchains/x86_64:cc_toolchain_for_linux_x86_64 --platforms=//platforms:x86_64_linux

FROM alpine:3.21.3

RUN apk update && apk add --no-cache libstdc++ libgcc libssl3 libcurl protobuf-dev

COPY --from=builder /app/bazel-bin/worker /usr/local/bin/worker
COPY --from=builder /app/prometheus-cpp-with-submodules/build/lib/ /usr/lib

RUN bazel build //:worker

WORKDIR /data

ENTRYPOINT ["/usr/local/bin/worker", "/data/test.txt", "sha256"]
RUN ldconfig

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

наверное стоит какой-то мюльтистейдж прикрутить в перспективе

ENTRYPOINT ["/app/bazel-bin/worker"]
8 changes: 5 additions & 3 deletions worker/Makefile.main_riscv
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
CC = riscv64-linux-gnu-gcc

DPDK_PREFIX = ./dpdk-riscv-install
SQLITE_PREFIX = ./sqlite3-riscv-install
PKG_CONFIG = env PKG_CONFIG_LIBDIR=$(DPDK_PREFIX)/lib/pkgconfig pkg-config

CFLAGS_BASE = -Iinclude -O2 $(shell $(PKG_CONFIG) --cflags libdpdk)
Expand All @@ -13,10 +14,11 @@ LDFLAGS = -L$(DPDK_PREFIX)/lib \
-lrte_net \
-lrte_log -ldl \
-lrte_hash \
-sqlite3 \
-lrte_timer \
-Wl,--end-group \
-latomic

-latomic \
-L$(SQLITE_PREFIX)/lib \
-lsqlite3

SRCS = src/dpdk_filter/main.c src/dpdk_filter/net_port.c src/dpdk_filter/filtr_packets.c src/dpdk_filter/pars_packets.c src/dpdk_filter/proc_packets.c src/dpdk_filter/dns_cache.c

Expand Down
4 changes: 2 additions & 2 deletions worker/Makefile.main_x86
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
CC = gcc
CFLAGS_BASE = -Iinclude -O2 -msse4.2 -mpclmul -maes
LDFLAGS = -lrte_eal -lrte_ethdev -lrte_mempool -lrte_mbuf -lrte_bus_vdev -lpthread -lnuma -ldl -lrte_net -lrte_hash -lsqlite3
LDFLAGS = -lrte_eal -lrte_ethdev -lrte_mempool -lrte_mbuf -lrte_bus_vdev -lpthread -lnuma -ldl -lrte_net -lrte_hash -lsqlite3 -lrte_timer

SRCS = src/dpdk_filter/main.c src/dpdk_filter/net_port.c src/dpdk_filter/filtr_packets.c src/dpdk_filter/pars_packets.c src/dpdk_filter/proc_packets.c src/dpdk_filter/dns_cache.c

Expand All @@ -20,4 +20,4 @@ $(TARGET_VIRT): $(SRCS)
clean:
rm -f $(TARGET_REAL) $(TARGET_VIRT)

.PHONY: all clean virt
.PHONY: all clean virt
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new line лучше оставлять

80 changes: 80 additions & 0 deletions worker/README(DPDK FILTRING).md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# Драйвера dpdk
DPDK должен быть собран с драйверами net/af_xdp net/tap


# Кросс-компиляция

## Окружение
Скрипт `scripts/setup-riscv-env.sh` автоматически скачивает (при необходимости) и собирает DPDK 23.11 для архитектуры RISC-V.

```bash
./scripts/setup-riscv-env.sh
```

## SQLite
Если целевая архитектура — RISC-V, SQLite необходимо собрать кросс-компилятором.

```bash
wget https://www.sqlite.org/2024/sqlite-autoconf-3460100.tar.gz
tar -xzf sqlite-autoconf-3460100.tar.gz
cd sqlite-autoconf-3460100

./configure --host=riscv64-linux-gnu --prefix=/path/to/sqlite3-riscv-install
make -j$(nproc)
make install
```

После установки в указанном prefix появятся подкаталоги include/ и lib/ с необходимыми файлами.



# Создание пары veth и TAP-устройства

```bash
sudo ./scripts/set_virt_dev_for_test_xdp.sh
```
Скрипт создаёт пару veth0 - veth1


```bash
sudo ./scripts/set_tap_dev.sh
```
Скрипт создаёт TAP-устройство tap0



# Сборка проекта
Для реальных портов (eth0/eth1):
```bash
make -f Makefile.main_riscv all
```

Для виртуальных портов (veth0/veth1 + tap0):
```bash
make -f Makefile.main_riscv virt
```
Определение макроса -DVIRT_PORTS переключает программу на использование виртуальных интерфейсов.


Перед запуском рекомендуется выполнить скрипт настройки виртуальных устройств:
```bash
sudo ./scripts/set_virt_dev_for_test_xdp.sh
```


# Очистка
```bash
make -f Makefile.main_riscv clean
```

# Запуск
Программа требует прав суперпользователя (для работы с DPDK и XDP):
```bash
sudo ./main-riscv-virt
```


# Примечания
Кэш DNS автоматически сохраняется в cache.db (SQLite) и восстанавливается при перезапуске.

Периодическое сохранение кэша происходит каждый час с помощью таймеров DPDK.
19 changes: 13 additions & 6 deletions worker/helper for association with Worker.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,33 @@
REQUESTED_CLASSIFICATION структура для передачи от контроллера к воркеру:
REQUESTED_CLASSIFICATION - структура для передачи от контроллера к воркеру:

```code
struct requested_classification {
char get_categories[MAX_CATEGORIES][CATEGORY_MAX_LEN] - политика
int get_trust_level - уровень доверия к сайту
char get_categories[MAX_CATEGORIES][CATEGORY_MAX_LEN]
int get_trust_level
}
```

Структура для хранения категории с минимальным уровнем доверия для этой категории:

Структура для хранения категории с минимальным уровнем доверия для этой категории
```code
struct trust_categories_with_lvl {
char locked_by_trust_category[CATEGORY_MAX_LEN];
int trust_lvl;
}
```

у нас есть переменные, которые получаем при инициализации воркера и заносим в структуру (периодически обновляем):

у нас есть переменные, которые получаем при инициализации воркера и заносим в структуру (периодически обновляем)
```code
struct BASE_POLICY {
char locked_categories[MAX_CATEGORIES][CATEGORY_MAX_LEN];
struct trust_categories_with_lvl categories_with_lvl[MAX_CATEGORIES_BY_TRUST_LVL];
char block_domains[MAX_DOMAINS][MAX_LEN_DOMEIN];
char allow_domains[MAX_DOMAINS][MAX_LEN_DOMEIN];
int min_trust_level;
}
```


Добавлен tap порт, по которому проходят пакеты исключений в ядро, обрабатываются и ответ отсылается на входящий порт (port_in)

Добавлен tap порт, по которому проходят пакеты исключений в ядро, обрабатываются и ответ отсылается на входящий порт (port_in)
3 changes: 2 additions & 1 deletion worker/include/dpdk_filter/constants.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifndef CONSTANTS_H
#define CONSTANTS_H

#include <stdint.h>

#define MAX_CATEGORIES_BY_TRUST_LVL 64
#define MAX_DOMAINS 64
Expand All @@ -10,6 +11,6 @@
#define CATEGORY_MAX_LEN 64
#define DNS_CACHE_DEFAULT_TTL (7 * 24 * 60 * 60)
#define LEN_LIST_EXCEPTION_PORTS 1
extern const uint16_t LIST_EXCEPTION_PORTS[LEN_LIST_EXCEPTION_PORTS];
extern const uint16_t LIST_EXCEPTION_PORTS[LEN_LIST_EXCEPTION_PORTS];

#endif
9 changes: 3 additions & 6 deletions worker/include/dpdk_filter/dns_cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,12 @@
#include <rte_hash.h>
#include <rte_jhash.h>
#include <rte_malloc.h>
#include <sqlite3.h>
#include <stdbool.h>
#include <stdint.h>
#include <sqlite3.h>

#include "../../include/dpdk_filter/constants.h"
#include "../../include/dpdk_filter/types.h"



#include "constants.h"
#include "types.h"

void init_dns_cache(void);
int lookup_dns_cache(const char *domain, struct node_cache **return_node);
Expand Down
Loading
Loading