bridger: add bridge forwarding accelerator

This package uses BPF to create a fast path which improves bridging performance
by bypassing the bridge layer. It also supports creating tc offload rules for
hardware that supports it.
Hardware offload support can be used with MT7622 + MT7915 once it is merged

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2022-04-06 14:09:34 +02:00
parent 54bcf586b0
commit 64f629e207
3 changed files with 109 additions and 0 deletions

View File

@ -0,0 +1,62 @@
#
# Copyright (C) 2022 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=bridger
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL=https://github.com/nbd168/bridger
PKG_SOURCE_DATE:=2022-04-06
PKG_SOURCE_VERSION:=e8f6814a85b4ea951657e7018c5d77597400f44a
PKG_MIRROR_HASH:=f917e099a9ab2a55745a7254239efabe695a722d5c448342198cdc847a4a24ac
PKG_LICENSE:=GPL-2.0
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
PKG_BUILD_DEPENDS:=bpf-headers
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk
include $(INCLUDE_DIR)/bpf.mk
include $(INCLUDE_DIR)/nls.mk
define Package/bridger
SECTION:=utils
CATEGORY:=Base system
TITLE:=Bridge forwarding accelerator
DEPENDS:=+libbpf +libubox +libubus +libnl-tiny +kmod-sched-core +kmod-sched-flower +kmod-sched-bpf +kmod-sched-act-vlan $(BPF_DEPENDS)
endef
TARGET_CFLAGS += \
-I$(STAGING_DIR)/usr/include/libnl-tiny \
-I$(STAGING_DIR)/usr/include
CMAKE_OPTIONS += \
-DLIBNL_LIBS=-lnl-tiny
define Build/Compile
$(call CompileBPF,$(PKG_BUILD_DIR)/bridger-bpf.c)
$(Build/Compile/Default)
endef
define Package/bridger/install
$(INSTALL_DIR) \
$(1)/etc/config \
$(1)/etc/init.d \
$(1)/lib/bpf \
$(1)/usr/sbin
$(INSTALL_DATA) $(PKG_BUILD_DIR)/bridger-bpf.o $(1)/lib/bpf
$(INSTALL_BIN) \
$(PKG_INSTALL_DIR)/usr/bin/bridger \
$(1)/usr/sbin/
$(INSTALL_DATA) ./files/bridger.conf $(1)/etc/config/bridger
$(INSTALL_BIN) ./files/bridger.init $(1)/etc/init.d/bridger
endef
$(eval $(call BuildPackage,bridger))

View File

@ -0,0 +1,3 @@
config defaults
# example for blacklisting individual devices or bridges
# list blacklist eth0

View File

@ -0,0 +1,44 @@
#!/bin/sh /etc/rc.common
# Copyright (c) 2021 OpenWrt.org
START=19
USE_PROCD=1
PROG=/usr/sbin/bridger
add_blacklist() {
cfg="$1"
config_get blacklist "$cfg" blacklist
for i in $blacklist; do
json_add_string "" "$i"
done
}
reload_service() {
config_load bridger
json_init
json_add_string name "config"
json_add_array devices
config_foreach add_blacklist defaults
json_close_array
ubus call bridger set_blacklist "$(json_dump)"
}
service_triggers() {
procd_add_reload_trigger bridger
}
start_service() {
procd_open_instance
procd_set_param command "$PROG"
procd_set_param respawn
procd_close_instance
}
service_started() {
ubus -t 10 wait_for bridger
[ $? = 0 ] && reload_service
}