Skip to content
Open

tmp #11

Show file tree
Hide file tree
Changes from all commits
Commits
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
21 changes: 13 additions & 8 deletions bpf/include/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#define _COMMON_H_

#include "../../config/kmesh_marcos_def.h"
#include <linux/in.h>
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
Expand All @@ -17,7 +18,17 @@
#include "errno.h"

#if ENHANCED_KERNEL
#include <bpf_helper_defs_ext.h>
#if KERNEL_KFUNC
#include "bpf_kfunc.h"
#else
struct bpf_mem_ptr {
void *ptr;
__u32 size;
};
#include "bpf_helper_defs_ext.h"
#define bpf_km_setsockopt bpf_setsockopt
#define bpf_km_getsockopt bpf_getsockopt
#endif
#endif

#define bpf_unused __attribute__((__unused__))
Expand Down Expand Up @@ -113,14 +124,8 @@ static inline bool is_ipv4_mapped_addr(__u32 ip6[4])
(dst)[3] = (src)[3]; \
} while (0)

#if OE_23_03
#define bpf__strncmp bpf_strncmp
#define GET_SKOPS_REMOTE_PORT(sk_ops) (__u16)((sk_ops)->remote_port)
#else
#define GET_SKOPS_REMOTE_PORT(sk_ops) (__u16)((sk_ops)->remote_port >> 16)
#endif

#define GET_SKOPS_LOCAL_PORT(sk_ops) (__u16)((sk_ops)->local_port)
#define GET_SKOPS_LOCAL_PORT(sk_ops) (__u16)((sk_ops)->local_port)

#define MAX_BUF_LEN 100
#define MAX_IP4_LEN 16
Expand Down
9 changes: 5 additions & 4 deletions bpf/kmesh/ads/cgroup_sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@

#if ENHANCED_KERNEL
#include "route_config.h"
static const char kmesh_module_ulp_name[] = KMESH_MODULE_ULP_NAME;
#endif
#if KMESH_ENABLE_IPV4
#if KMESH_ENABLE_HTTP

static const char kmesh_module_name[] = "kmesh_defer";
static char kmesh_module_name_get[KMESH_MODULE_NAME_LEN] = "";
static inline int sock4_traffic_control(struct bpf_sock_addr *ctx)
{
Expand All @@ -42,9 +42,10 @@ static inline int sock4_traffic_control(struct bpf_sock_addr *ctx)
BPF_LOG(DEBUG, KMESH, "bpf find listener addr=[%s:%u]\n", ip2str(&ip, 1), bpf_ntohs(ctx->user_port));

#if ENHANCED_KERNEL
ret = bpf_getsockopt(ctx, IPPROTO_TCP, TCP_ULP, (void *)kmesh_module_name_get, KMESH_MODULE_NAME_LEN);
if (CHECK_MODULE_NAME_NULL(ret) || bpf__strncmp(kmesh_module_name_get, KMESH_MODULE_NAME_LEN, kmesh_module_name)) {
ret = bpf_setsockopt(ctx, IPPROTO_TCP, TCP_ULP, (void *)kmesh_module_name, sizeof(kmesh_module_name));
ret = bpf_km_getsockopt(ctx, IPPROTO_TCP, TCP_ULP, kmesh_module_ulp_name_get, KMESH_MODULE_NAME_LEN);
if (CHECK_MODULE_NAME_NULL(ret)
|| bpf__strncmp(kmesh_module_ulp_name_get, KMESH_MODULE_NAME_LEN, kmesh_module_ulp_name)) {
ret = bpf_km_setsockopt(ctx, IPPROTO_TCP, TCP_ULP, kmesh_module_ulp_name, sizeof(kmesh_module_ulp_name));
if (ret)
BPF_LOG(ERR, KMESH, "bpf set sockopt failed! ret %d\n", ret);
return 0;
Expand Down
11 changes: 0 additions & 11 deletions bpf/kmesh/ads/include/ctx/sock_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,6 @@ typedef struct bpf_sock_ops ctx_buff_t;
name.ipv4 = (ctx)->remote_ip4; \
name.port = (ctx)->remote_port

#if OE_23_03
#define SET_CTX_ADDRESS(ctx, address) \
(ctx)->remote_ip4 = (address)->ipv4; \
(ctx)->remote_port = (address)->port

#define MARK_REJECTED(ctx) \
BPF_LOG(DEBUG, KMESH, "mark reject\n"); \
(ctx)->remote_ip4 = 0; \
(ctx)->remote_port = 0
#else
#define SET_CTX_ADDRESS(ctx, address) \
(ctx)->replylong[2] = (address)->ipv4; \
(ctx)->replylong[3] = (address)->port
Expand All @@ -40,6 +30,5 @@ typedef struct bpf_sock_ops ctx_buff_t;
BPF_LOG(DEBUG, KMESH, "mark reject\n"); \
(ctx)->replylong[2] = 0; \
(ctx)->replylong[3] = 0
#endif

#endif //__BPF_CTX_SOCK_OPS_H
5 changes: 0 additions & 5 deletions bpf/kmesh/ads/include/kmesh_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,6 @@
val; \
})

struct bpf_mem_ptr {
void *ptr;
__u32 size;
};

static inline int bpf__strncmp(const char *dst, int n, const char *src)
{
if (dst == NULL || src == NULL)
Expand Down
8 changes: 8 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,19 @@ if [ "$1" == "-h" -o "$1" == "--help" ]; then
fi

if [ -z "$1" -o "$1" == "-b" -o "$1" == "--build" ]; then
bash kmesh_macros_env_kernel.sh
prepare
make
exit
fi

if [ "$1" == "-d" -o "$1" == "--docker" ]; then
prepare
make kmesh-bpf
make all-binary
exit
fi

if [ "$1" == "-i" -o "$1" == "--install" ]; then
make install
install
Expand Down
29 changes: 6 additions & 23 deletions config/kmesh_marcos_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,33 +24,11 @@
*/
#define MDA_GID_UID_FILTER 1

/*
* openEuler-23.03 is an innovative version of openEuler, in the early time, we
* developed kmesh based on openEuler-23.03, and the implementation of kmesh
* was related to the openEuler-23.03 kernel. Now, the general implementation
* of kmesh differs from the previous openEuler-23.03 version, so we need to
* use this macro to distinguish these differences.
* The main differences between the general implementation of kmesh and the
* openEuler-23.03 version are as follows:
* 1. Use replylong parameter instead of directly modifying the remote IP and Port;
* 2. Use bpf__strncmp instead of bpf_strncmp for string comparison;
* 3. Fix Port shift bug on openEuler-23.03.In the kernel network protocol
* stack, the port is stored in u16, but in the bpf network module, the port
* is stored in u32. Therefore, after the endian conversion, the 16-bit port
* needs to be obtained from the 32-bit data structure.
* You need to find the position of the valid 16 bits. Generally, after the
* port is extended from 16 bits to 32 bits, the port is in the upper 16
* bits after the endian conversion. Therefore, you need to offset the port
* before using the u16 RX port. In some specific kernels, the port stored
* in sockops is in the lower 16 bits and does not need to be offset.
*/
#define OE_23_03 0

/*
* in kernel 6.x version, add the new iter type ITER_UBUF, and we need add code
* for the corresponding scenarios.
*/
#define ITER_TYPE_IS_UBUF 0
#define KERNEL_VERISON6 1

/*
* Kmesh’s Layer 7 acceleration proxy capability relies on kernel enhancements.
Expand All @@ -68,3 +46,8 @@
* is enabled accordingly.
* */
#define LIBBPF_HIGHER_0_6_0_VERSION 0

/*
* Determine whether the current kernel version supports the use of kfunc.
*/
#define KERNEL_KFUNC 0
4 changes: 3 additions & 1 deletion hack/gen_bpf_specs.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,9 @@ func main() {
importPath := filepath.ToSlash(filepath.Join(modulePrefix, "bpf", "kmesh", "bpf2go", real))
pi := pkgInfo{Alias: alias, ImportPath: importPath, OutputDir: real, Entries: list}
pkgsDefault = append(pkgsDefault, pi)
pkgsEnhanced = append(pkgsEnhanced, pi)
if !strings.HasPrefix(real, "dualengine") {
pkgsEnhanced = append(pkgsEnhanced, pi)
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion hack/utils.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ function get_arch() {
function build_kmesh() {
local container_id=$1
docker exec $container_id git config --global --add safe.directory /kmesh
docker exec -e VERSION=$VERSION $container_id sh /kmesh/build.sh
docker exec -e VERSION=$VERSION $container_id sh /kmesh/build.sh -d
docker exec -e VERSION=$VERSION $container_id sh /kmesh/build.sh -i
docker exec $container_id sh -c "$(declare -f copy_to_host); copy_to_host"
}
Expand Down
4 changes: 3 additions & 1 deletion kernel/ko_src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ CURRENT_PATH := $(shell pwd)
DIRS := $(shell find $(CURRENT_PATH) -maxdepth 1 -type d)
BASE_DIRS := $(basename $(patsubst $(CURRENT_PATH)/%, %, $(DIRS)))
BASE_DIRS := $(filter-out $(CURRENT_PATH), $(BASE_DIRS))
CONFIG_FILE := ../../config/kmesh_marcos_def.h
ENHANCED_KERNEL := $(shell grep -q "#define ENHANCED_KERNEL 1" $(CONFIG_FILE) && echo yes || echo no)

ifeq ($(ENHANCED_KERNEL), enhanced)
ifeq ($(ENHANCED_KERNEL), yes)
all:
@for dir in ${BASE_DIRS}; do \
make -C $(CURRENT_PATH)/$$dir; \
Expand Down
3 changes: 2 additions & 1 deletion kernel/ko_src/kmesh/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,13 @@ kmesh-objs = kmesh_main.o defer_connect.o \
kmesh_parse_http_1_1.o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
VMLINUX_PATH := /sys/kernel/btf/vmlinux
PWD := $(shell pwd)

ccflags-y += -Wno-discarded-qualifiers

all:
$(MAKE) -C $(KERNELDIR) M=$(PWD)
$(MAKE) -C $(KERNELDIR) M=$(PWD) KBUILD_VMLINUX_LIBS=$(VMLINUX_PATH) modules

install:
install -dp -m 0500 /lib/modules/kmesh
Expand Down
33 changes: 9 additions & 24 deletions kernel/ko_src/kmesh/defer_connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@

#include "defer_connect.h"

#define KMESH_MODULE_ULP_NAME "kmesh_defer"

static struct proto *kmesh_defer_proto = NULL;
#define KMESH_DELAY_ERROR -1000

#define BPF_CGROUP_RUN_PROG_INET4_CONNECT_KMESH(sk, uaddr, t_ctx) \
({ \
Expand Down Expand Up @@ -54,13 +55,17 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size)
ubase = iov->iov_base;
kbuf_size = iov->iov_len;
} else if (iter_is_iovec(&msg->msg_iter)) {
iov = msg->msg_iter.iov;
#if KERNEL_VERISON6
iov = msg->msg_iter.__iov;
ubase = iov->iov_base;
kbuf_size = iov->iov_len;
#if ITER_TYPE_IS_UBUF
} else if (iter_is_ubuf(&msg->msg_iter)) {
ubase = msg->msg_iter.ubuf;
kbuf_size = msg->msg_iter.count;
#else
iov = msg->msg_iter.iov;
ubase = iov->iov_base;
kbuf_size = iov->iov_len;
#endif
} else
goto connect;
Expand All @@ -79,31 +84,11 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size)
tmpMem.size = kbuf_size;
tmpMem.ptr = kbuf;

#if OE_23_03
tcp_call_bpf_3arg(
sk,
BPF_SOCK_OPS_TCP_DEFER_CONNECT_CB,
((u64)(&tmpMem) & U32_MAX),
(((u64)(&tmpMem) >> 32) & U32_MAX),
kbuf_size);
daddr = sk->sk_daddr;
dport = sk->sk_dport;

// daddr == 0 && dport == 0 are special flags meaning the circuit breaker is open
// Should reject connection here
if (daddr == 0 && dport == 0) {
tcp_set_state(sk, TCP_CLOSE);
sk->sk_route_caps = 0;
inet_sk(sk)->inet_dport = 0;
err = -1;
goto out;
}
#else
uaddr.sin_family = AF_INET;
uaddr.sin_addr.s_addr = daddr;
uaddr.sin_port = dport;
err = BPF_CGROUP_RUN_PROG_INET4_CONNECT_KMESH(sk, (struct sockaddr *)&uaddr, &tmpMem);
#endif

connect:
err = sk->sk_prot->connect(sk, (struct sockaddr *)&uaddr, sizeof(struct sockaddr_in));
if (unlikely(err)) {
Expand Down
43 changes: 39 additions & 4 deletions kmesh_compile_env_pre.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ function dependency_pkg_install() {
if command -v apt >/dev/null; then
echo "Checking for required packages on a Debian-based system..."

packages=(git make clang libbpf-dev llvm linux-tools-generic protobuf-compiler libprotobuf-dev libprotobuf-c-dev protobuf-c-compiler cmake pkg-config gcc-multilib)
packages=(git make clang libbpf-dev llvm linux-tools-generic protobuf-compiler libprotobuf-dev libprotobuf-c-dev protobuf-c-compiler cmake pkg-config gcc-multilib pahole linux-headers)

update_needed=false
for pkg in "${packages[@]}"; do
Expand Down Expand Up @@ -47,7 +47,7 @@ function dependency_pkg_install() {
echo "Checking for required packages on a Red Hat-based system..."

# List of required packages
packages=(git make clang llvm libboundscheck protobuf protobuf-c protobuf-c-devel bpftool libbpf libbpf-devel cmake pkg-config glibc-devel libstdc++-devel)
packages=(git make clang llvm libboundscheck protobuf protobuf-c protobuf-c-devel bpftool libbpf libbpf-devel cmake pkg-config glibc-devel libstdc++-devel dwarves)

# Install each missing package
for pkg in "${packages[@]}"; do
Expand Down Expand Up @@ -104,6 +104,32 @@ function kmesh_set_env() {
export EXTRA_CFLAGS="-O0 -g"
}

function set_config() {
sed -i -r -e "s/($1)([ \t]*)([0-9]+)/\1\2$2/" config/kmesh_marcos_def.h
}

detect_config() {
local kernel_version=$(uname -r)

if [ -f "/proc/config.gz" ]; then
zcat /proc/config.gz 2>/dev/null
return $?
fi

if [ -f "/boot/config-$kernel_version" ]; then
cat "/boot/config-$kernel_version" 2>/dev/null
return $?
fi
}

CONFIG_CONTENT=$(detect_config)

check_config() {
local config_name=$1
value=$(echo "$CONFIG_CONTENT" | grep -w "$config_name" | cut -d= -f2)
echo "$value"
}

function set_enhanced_kernel_env() {
# we use /usr/include/linux/bpf.h to determine the runtime environment’s
# support for kmesh. Considering the case of online image compilation, a
Expand All @@ -118,8 +144,17 @@ function set_enhanced_kernel_env() {
export KERNEL_HEADER_LINUX_BPF=/usr/include/linux/bpf.h
fi

if grep -q "FN(parse_header_msg)" $KERNEL_HEADER_LINUX_BPF; then
export ENHANCED_KERNEL="enhanced"
KERNEL_MAJOR=$(uname -r | awk -F '.' '{print $1}')

zcat /proc/config.gz | grep BTF
cat "/boot/config-$(uname -r)" | grep BTF
check_config "CONFIG_DEBUG_INFO_BTF_MODULES"
check_config "CONFIG_DEBUG_INFO_BTF"
if grep -q "FN(parse_header_msg)" $KERNEL_HEADER_LINUX_BPF ||
[ "$(check_config "CONFIG_DEBUG_INFO_BTF_MODULES")" == "y" ] &&
[ "$(check_config "CONFIG_DEBUG_INFO_BTF")" == "y" ] &&
[ "$KERNEL_MAJOR" -ge 6 ]; then
export ENHANCED_KERNEL="normal"
else
export ENHANCED_KERNEL="normal"
fi
Expand Down
29 changes: 2 additions & 27 deletions kmesh_macros_env.sh
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
#!/bin/bash

VERSION=$(uname -r | cut -d '.' -f 1)
KERNEL_VERSION=$(uname -r | cut -d '-' -f 1)

function set_config() {
sed -i -r -e "s/($1)([ \t]*)([0-9]+)/\1\2$2/" config/kmesh_marcos_def.h
}
source ./kmesh_compile_env_pre.sh
KERNEL_VERSION=$(uname -r | cut -d '.' -f 1)

# MDA_LOOPBACK_ADDR
if grep -q "FN(get_netns_cookie)" $KERNEL_HEADER_LINUX_BPF; then
Expand All @@ -28,27 +24,6 @@ else
set_config MDA_GID_UID_FILTER 0
fi

# OE_23_03
if (uname -r | grep oe2303); then
set_config OE_23_03 1
else
set_config OE_23_03 0
fi

# ITER_TYPE_IS_UBUF
if [ "$VERSION" -ge 6 ]; then
set_config ITER_TYPE_IS_UBUF 1
else
set_config ITER_TYPE_IS_UBUF 0
fi

# ENHANCED_KERNEL
if grep -q "FN(parse_header_msg)" $KERNEL_HEADER_LINUX_BPF; then
set_config ENHANCED_KERNEL 1
else
set_config ENHANCED_KERNEL 0
fi

# Determine libbpf version
if command -v apt >/dev/null; then
LIBBPF_VERSION=$(ls /usr/lib/x86_64-linux-gnu | grep -P 'libbpf\.so\.\d+\.\d+\.\d+$' | sed -n -e 's/^.*libbpf.so.\(.*\)$/\1/p')
Expand Down
Loading
Loading