Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
a9bdb7b
Initial working version of shared memory
sbernauer Apr 13, 2025
30e80b6
docs: Add some rust-docs
sbernauer Apr 21, 2025
656fbd2
changelog
sbernauer Apr 21, 2025
89fc38d
changelog
sbernauer Apr 21, 2025
0c086d2
changelog
sbernauer Apr 21, 2025
2c39ad4
refactor
sbernauer Apr 21, 2025
122c948
Use #[inline(always)]
sbernauer Apr 21, 2025
061ae67
Use read_unaligned()
sbernauer Apr 21, 2025
3662013
change wording
sbernauer Apr 21, 2025
3d66f95
changelog
sbernauer Apr 21, 2025
7de3e52
Fix info!
sbernauer Apr 22, 2025
cf9a3b7
Use debug! instead of dbg!
sbernauer Apr 22, 2025
abef8ac
Always inline get_size
sbernauer Apr 22, 2025
c3ac0d9
Use NonNull<UnsafeCell<[u8]>> for buffer
sbernauer Apr 22, 2025
303ecf3
Intial skeleton for f-stack
sbernauer Mar 17, 2025
7e573ff
Add config.ini
sbernauer Mar 17, 2025
6ec0b2c
Add parser.c and parser.h
sbernauer Mar 17, 2025
a8cf982
WIP
sbernauer Mar 25, 2025
285e6b9
Open shared memory in C
sbernauer Apr 13, 2025
b646d03
docs: Update README
sbernauer Apr 14, 2025
9a60f5d
Update parser to parse some commands
sbernauer Apr 15, 2025
9424364
Add startup script for more cores (still same performance)
sbernauer Apr 15, 2025
09775d7
Always keep shared memory across restarts
sbernauer Apr 22, 2025
57cf6de
Update RGB logic to new (fixed) shared memory
sbernauer Apr 22, 2025
1f85f74
Merge remote-tracking branch 'origin/main' into feat/f-stack
sbernauer Apr 25, 2025
121986c
Increase read buffer size
sbernauer Apr 25, 2025
f4e0047
Add breakwater-parser C bindings
sbernauer Apr 27, 2025
7ad02f4
Update breakwater-c-binding to return response bytes
sbernauer Apr 29, 2025
8e09680
Add README for breakwater-parser-c-binding
sbernauer Apr 29, 2025
44e436d
Update breakwater-f-stack to use the new c-bindings
sbernauer Apr 29, 2025
85ab614
Improve README
sbernauer Apr 29, 2025
cd387be
Correctly hand to long user input and parser lookahead
sbernauer Apr 29, 2025
b04ccd8
Dont read client for now
sbernauer Apr 29, 2025
36b46a5
Improve parsing
sbernauer Apr 29, 2025
549294a
typo
sbernauer Apr 29, 2025
618be9d
clippy
sbernauer Apr 29, 2025
db4a455
Merge remote-tracking branch 'origin/main' into feat/f-stack
sbernauer Jun 12, 2025
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
1 change: 1 addition & 0 deletions breakwater-f-stack/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build/
30 changes: 30 additions & 0 deletions breakwater-f-stack/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Copied and modified from https://github.com/F-Stack/f-stack/blob/dev/example/Makefile
SERVER_SOURCES := parser.c framebuffer.c breakwater-f-stack.c

ifeq ($(FF_PATH),)
$(error "Please export the environment variable `FF_PATH` and point it to the f-stack root directory. This Makefile assumes you have run 'make' in the '<f-stack root>/lib' folder")
endif

ifneq ($(shell pkg-config --exists libdpdk && echo 0),0)
$(error "No installation of DPDK found, maybe you should export environment variable `PKG_CONFIG_PATH`")
endif

PKGCONF ?= pkg-config

CFLAGS += -O3 -g -gdwarf-2 $(shell $(PKGCONF) --cflags libdpdk)

LIBS+= $(shell $(PKGCONF) --static --libs libdpdk)
LIBS+= -I${FF_PATH}/lib -L${FF_PATH}/lib -Wl,--whole-archive,-lfstack,--no-whole-archive
LIBS+= -Wl,--no-whole-archive -lrt -lm -ldl -lcrypto -pthread -lnuma
# Start the binary with "sudo LD_LIBRARY_PATH=../target/release build/breakwater-f-stack"
LIBS += -l breakwater_parser_c_bindings -L ../target/release/

TARGET="breakwater-f-stack"
all:
mkdir -p build/
cc ${CFLAGS} -DINET6 -o build/${TARGET} $(SERVER_SOURCES) ${LIBS}
cc ${CFLAGS} -o build/${TARGET}-v4-only $(SERVER_SOURCES) ${LIBS}

.PHONY: clean
clean:
rm -rf build/
134 changes: 134 additions & 0 deletions breakwater-f-stack/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
`apt install dpdk libdpdk-dev make pkg-config libnuma-dev libsystemd-dev ethtool`

### Build f-stack

Hint: The following `default.nix` might be helpful

```
{
nixpkgs ? import <nixpkgs> {},
nixpkgsUnstable ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-unstable.tar.gz") {},
}:

nixpkgs.mkShell {
buildInputs = [
nixpkgs.pkg-config
nixpkgs.meson
nixpkgs.ninja

nixpkgs.dpdk
nixpkgs.openssl # Needed by f-stack
nixpkgs.numactl

# Needed by the redis example app
nixpkgs.zlib
nixpkgs.jemalloc
nixpkgs.jansson
nixpkgs.libpcap
# nixpkgs.libnfnetlink
nixpkgs.libnl
nixpkgs.libelf

# nixpkgsUnstable.dpdk # Uncomment to use dpdk from nixpkgs-unstable
# nixpkgs.imagemagick
nixpkgs.python312Packages.pyelftools # needed for dpdk-pmdinfo.py

# For debugging
# nixpkgs.gdb
];
}
```

`sbernauer@debian:~/pixelflut/f-stack/lib$ make -j 8`

`sbernauer@debian:~/pixelflut/f-stack/example$ make # Only needed for testing`

### Build breakwater-f-stack

`export FF_PATH=/home/sbernauer/pixelflut/f-stack/`

You also need to build the `breakwater-parser-c-bindings`, so that the C program can link and use the `breakwater-parser` Rust functions.
You can do that using `cargo build --release -p breakwater-parser-c-bindings` from the git root.

Afterwards, in this folder, run `make`.

### Run breakwater-f-stack server

#### Prerequisites

You need to have a breakwater server running using `cargo run --release -- --shared-memory-name breakwater --vnc`.
This opens the shared memory region for the breakwater-f-stack server to write into.
You can connect via VNC or append `--native-display` to the breakwater call to get a graphical output.

#### Run breakwater-f-stack

Start server on 0000:02:00.0:

`sudo modprobe uio_pci_generic`

`sudo dpdk-devbind.py --bind=uio_pci_generic 0000:02:00.0`

`sudo bash -c 'echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages'`

As we linked against the dynamic library of `breakwater-parser-c-bindings`, we need to specify the `LD_LIBRARY_PATH` here:

`sudo LD_LIBRARY_PATH=../target/release build/breakwater-f-stack`

Add clients IP:

`sudo ip link set up dev enp1s0f1`

`sudo ip a a 10.0.0.42/8 dev enp1s0f1`

`sudo ip a a 192.168.1.3/24 dev enp1s0f1`

`ping 192.168.1.2` should now succeed (if it doesn't check e.g. `dmesg`).

With a single desktop core from 2011 we can get 4.5 Gbit/s, pretty slow!
Normal breakwater on a single core on the same machine reaches 12G via loopback.

### Run on multiple cores

Disclaimer: While I got it to run on multiple cores I could not get it faster than running on a single core yet!

1. Edit `lcore_mask` in `config.ini`. Hint: It's hexadecimal.
2. Start multiple processes using `sudo ./start.sh`
3. Stop all running processes using `sudo pkill -f breakwater-f-stack`

### Special experiment for virtual device, as my NIC is not supported

f-stack patches:

```patch
diff --git a/lib/ff_config.c b/lib/ff_config.c
index 18380919..a9d74099 100644
--- a/lib/ff_config.c
+++ b/lib/ff_config.c
@@ -1009,6 +1009,9 @@ dpdk_args_setup(struct ff_config *cfg)

}

+ // dpdk_argv[n++] = strdup("--vdev=net_pcap0,iface=lo");
+ dpdk_argv[n++] = strdup("--vdev=net_tap");
+
if (cfg->dpdk.nb_vdev) {
for (i=0; i<cfg->dpdk.nb_vdev; i++) {
sprintf(temp, "--vdev=virtio_user%d,path=%s",
diff --git a/lib/ff_dpdk_if.c b/lib/ff_dpdk_if.c
index f6fe50e5..a3c17e74 100644
--- a/lib/ff_dpdk_if.c
+++ b/lib/ff_dpdk_if.c
@@ -668,8 +668,8 @@ init_port_start(void)
printf("Use symmetric Receive-side Scaling(RSS) key\n");
rsskey = symmetric_rsskey;
}
- port_conf.rx_adv_conf.rss_conf.rss_key = rsskey;
- port_conf.rx_adv_conf.rss_conf.rss_key_len = rsskey_len;
+ // port_conf.rx_adv_conf.rss_conf.rss_key = rsskey;
+ // port_conf.rx_adv_conf.rss_conf.rss_key_len = rsskey_len;
port_conf.rx_adv_conf.rss_conf.rss_hf &= dev_info.flow_type_rss_offloads;
if (port_conf.rx_adv_conf.rss_conf.rss_hf !=
RTE_ETH_RSS_PROTO_MASK) {
```

`sudo ip a a 192.168.1.3/24 dev dtap0`
Loading