Skip to content

Commit 5fc766a

Browse files
lec-bitlec-bit
authored andcommitted
optimize
Signed-off-by: lec-bit <glfhzmy@126.com>
1 parent cbf005d commit 5fc766a

File tree

6 files changed

+101
-113
lines changed

6 files changed

+101
-113
lines changed

bpf/include/bpf_kfunc.h

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2+
/* Copyright Authors of Kmesh */
3+
4+
#include "../../config/kmesh_marcos_def.h"
5+
#include <linux/in.h>
6+
#include <stddef.h>
7+
#include <stdbool.h>
8+
#include <stdint.h>
9+
#include <linux/bpf.h>
10+
#include <sys/socket.h>
11+
#include <bpf/bpf_helpers.h>
12+
#include <bpf/bpf_endian.h>
13+
#include "map_config.h"
14+
15+
#include "errno.h"
16+
17+
struct bpf_mem_ptr {
18+
void *ptr;
19+
__u32 size;
20+
};
21+
22+
extern int bpf_parse_header_msg_func(void *src, int src__sz) __ksym;
23+
extern int bpf_km_header_strnstr_func(void *ctx, int ctx__sz, const char *key, int key__sz, const char *subptr) __ksym;
24+
extern int bpf_km_header_strncmp_func(const char *key, int key__sz, const char *target, int target__sz, int opt) __ksym;
25+
extern int bpf_setsockopt_func(void *bpf_mem, int bpf_mem__sz, int optname, const char *optval, int optval__sz) __ksym;
26+
extern int bpf_getsockopt_func(void *bpf_mem, int bpf_mem__sz, int optname, char *optval, int optval__sz) __ksym;
27+
28+
#define bpf_km_header_strncmp bpf_km_header_strncmp_func
29+
30+
static int bpf_km_header_strnstr(void *ctx, const char *key, int key__sz, const char *subptr, int subptr__sz)
31+
{
32+
struct bpf_mem_ptr msg_tmp = {.ptr = ctx, .size = sizeof(struct bpf_sock_addr)};
33+
return bpf_km_header_strnstr_func(&msg_tmp, sizeof(struct bpf_mem_ptr), key, key__sz, subptr);
34+
}
35+
36+
static int bpf_parse_header_msg(struct bpf_sock_addr *ctx)
37+
{
38+
struct bpf_mem_ptr msg_tmp = {.ptr = ctx, .size = sizeof(struct bpf_sock_addr)};
39+
return bpf_parse_header_msg_func(&msg_tmp, sizeof(struct bpf_mem_ptr));
40+
}
41+
42+
// Due to the limitation of bpf verifier, optval and optval__sz are required to correspond.
43+
// The strnlen function cannot be used here, so the string is redefined.
44+
static int bpf_km_setsockopt(struct bpf_sock_addr *ctx, int level, int optname, const char *optval, int optval__sz)
45+
{
46+
const char kmesh_module_name[] = "kmesh_defer";
47+
if (level != IPPROTO_TCP || optval__sz != sizeof(kmesh_module_name))
48+
return -1;
49+
50+
struct bpf_mem_ptr msg_tmp = {.ptr = ctx, .size = sizeof(struct bpf_sock_addr)};
51+
return bpf_setsockopt_func(
52+
&msg_tmp, sizeof(struct bpf_mem_ptr), optname, (void *)kmesh_module_name, sizeof(kmesh_module_name));
53+
}
54+
55+
static int bpf_km_getsockopt(struct bpf_sock_addr *ctx, int level, int optname, char *optval, int optval__sz)
56+
{
57+
if (level != IPPROTO_TCP) {
58+
return -1;
59+
}
60+
struct bpf_mem_ptr msg_tmp = {.ptr = ctx, .size = sizeof(struct bpf_sock_addr)};
61+
return bpf_getsockopt_func(&msg_tmp, sizeof(struct bpf_mem_ptr), optname, (void *)optval, optval__sz);
62+
}

bpf/include/common.h

Lines changed: 5 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -17,57 +17,15 @@
1717

1818
#include "errno.h"
1919

20+
#if ENHANCED_KERNEL
21+
#if KERNEL_KFUNC
22+
#include "bpf_kfunc.h"
23+
#else
2024
struct bpf_mem_ptr {
2125
void *ptr;
2226
__u32 size;
2327
};
24-
25-
#if ENHANCED_KERNEL
26-
#if KERNEL_KFUNC
27-
extern int bpf_parse_header_msg_func(void *src, int src__sz) __ksym;
28-
extern int bpf_km_header_strnstr_func(void *ctx, int ctx__sz, const char *key, int key__sz, const char *subptr) __ksym;
29-
extern int bpf_km_header_strncmp_func(const char *key, int key__sz, const char *target, int target__sz, int opt) __ksym;
30-
extern int bpf_setsockopt_func(void *bpf_mem, int bpf_mem__sz, int optname, const char *optval, int optval__sz) __ksym;
31-
extern int bpf_getsockopt_func(void *bpf_mem, int bpf_mem__sz, int optname, char *optval, int optval__sz) __ksym;
32-
33-
#define bpf_km_header_strncmp bpf_km_header_strncmp_func
34-
35-
int bpf_km_header_strnstr(void *ctx, const char *key, int key__sz, const char *subptr, int subptr__sz)
36-
{
37-
struct bpf_mem_ptr msg_tmp = {.ptr = ctx, .size = sizeof(struct bpf_sock_addr)};
38-
return bpf_km_header_strnstr_func(&msg_tmp, sizeof(struct bpf_mem_ptr), key, key__sz, subptr);
39-
}
40-
41-
int bpf_parse_header_msg(struct bpf_sock_addr *ctx)
42-
{
43-
struct bpf_mem_ptr msg_tmp = {.ptr = ctx, .size = sizeof(struct bpf_sock_addr)};
44-
return bpf_parse_header_msg_func(&msg_tmp, sizeof(struct bpf_mem_ptr));
45-
}
46-
47-
// Due to the limitation of bpf verifier, optval and optval__sz are required to correspond.
48-
// The strnlen function cannot be used here, so the string is redefined.
49-
int bpf_km_setsockopt(struct bpf_sock_addr *ctx, int level, int optname, const char *optval, int optval__sz)
50-
{
51-
const char kmesh_module_name[] = "kmesh_defer";
52-
if (level != IPPROTO_TCP || optval__sz != sizeof(kmesh_module_name))
53-
return -1;
54-
55-
struct bpf_mem_ptr msg_tmp = {.ptr = ctx, .size = sizeof(struct bpf_sock_addr)};
56-
return bpf_setsockopt_func(
57-
&msg_tmp, sizeof(struct bpf_mem_ptr), optname, (void *)kmesh_module_name, sizeof(kmesh_module_name));
58-
}
59-
60-
int bpf_km_getsockopt(struct bpf_sock_addr *ctx, int level, int optname, char *optval, int optval__sz)
61-
{
62-
if (level != IPPROTO_TCP) {
63-
return -1;
64-
}
65-
struct bpf_mem_ptr msg_tmp = {.ptr = ctx, .size = sizeof(struct bpf_sock_addr)};
66-
return bpf_getsockopt_func(&msg_tmp, sizeof(struct bpf_mem_ptr), optname, (void *)optval, optval__sz);
67-
}
68-
69-
#else
70-
#include <bpf_helper_defs_ext.h>
28+
#include "bpf_helper_defs_ext.h"
7129
#define bpf_km_setsockopt bpf_setsockopt
7230
#define bpf_km_getsockopt bpf_getsockopt
7331
#endif

kernel/ko_src/kmesh/kmesh_func.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ __bpf_kfunc int bpf_setsockopt_func(void *bpf_mem, int bpf_socket__sz, int optna
3838
struct bpf_mem_ptr *tmp = bpf_mem;
3939
struct bpf_sock_addr_kern *ctx = tmp->ptr;
4040
struct sock *sk = ctx->sk;
41-
int ret = 0;
4241

4342
if (sk == NULL) {
4443
LOG(KERN_ERR, "sk is NULL\n");
@@ -54,9 +53,7 @@ __bpf_kfunc int bpf_getsockopt_func(void *bpf_mem, int bpf_socket__sz, int optna
5453
struct sock *sk = ctx->sk;
5554

5655
struct inet_connection_sock *icsk = inet_csk(sk);
57-
struct tcp_sock *tp = tcp_sk(sk);
58-
struct net *net = sock_net(sk);
59-
int val, len;
56+
int len;
6057

6158
sockptr_t optval = KERNEL_SOCKPTR(opt);
6259
sockptr_t optlen = KERNEL_SOCKPTR(&opt__sz);

kmesh_compile_env_pre.sh

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,32 @@ function kmesh_set_env() {
104104
export EXTRA_CFLAGS="-O0 -g"
105105
}
106106

107+
function set_config() {
108+
sed -i -r -e "s/($1)([ \t]*)([0-9]+)/\1\2$2/" config/kmesh_marcos_def.h
109+
}
110+
111+
detect_config() {
112+
local kernel_version=$(uname -r)
113+
114+
if [ -f "/proc/config.gz" ]; then
115+
zcat /proc/config.gz 2>/dev/null
116+
return $?
117+
fi
118+
119+
if [ -f "/boot/config-$kernel_version" ]; then
120+
cat "/boot/config-$kernel_version" 2>/dev/null
121+
return $?
122+
fi
123+
}
124+
125+
CONFIG_CONTENT=$(detect_config)
126+
127+
check_config() {
128+
local config_name=$1
129+
value=$(echo "$CONFIG_CONTENT" | grep -w "$config_name" | cut -d= -f2)
130+
echo "$value"
131+
}
132+
107133
function set_enhanced_kernel_env() {
108134
# we use /usr/include/linux/bpf.h to determine the runtime environment’s
109135
# support for kmesh. Considering the case of online image compilation, a
@@ -117,8 +143,13 @@ function set_enhanced_kernel_env() {
117143
if [ ! -f "$KERNEL_HEADER_LINUX_BPF" ]; then
118144
export KERNEL_HEADER_LINUX_BPF=/usr/include/linux/bpf.h
119145
fi
146+
147+
KERNEL_MAJOR=$(uname -r | awk -F '.' '{print $1}')
120148

121-
if grep -q "FN(parse_header_msg)" $KERNEL_HEADER_LINUX_BPF; then
149+
if grep -q "FN(parse_header_msg)" $KERNEL_HEADER_LINUX_BPF ||
150+
[ "$(check_config "CONFIG_DEBUG_INFO_BTF_MODULES")" == "y" ] &&
151+
[ "$(check_config "CONFIG_DEBUG_INFO_BTF")" == "y" ] &&
152+
[ "$KERNEL_MAJOR" -ge 6 ]; then
122153
export ENHANCED_KERNEL="enhanced"
123154
else
124155
export ENHANCED_KERNEL="normal"

kmesh_macros_env.sh

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,6 @@
33
VERSION=$(uname -r | cut -d '.' -f 1)
44
KERNEL_VERSION=$(uname -r | cut -d '-' -f 1)
55

6-
function set_config() {
7-
sed -i -r -e "s/($1)([ \t]*)([0-9]+)/\1\2$2/" config/kmesh_marcos_def.h
8-
}
9-
10-
detect_config() {
11-
local kernel_version=$(uname -r)
12-
13-
if [ -f "/proc/config.gz" ]; then
14-
zcat /proc/config.gz 2>/dev/null
15-
return $?
16-
fi
17-
18-
if [ -f "/boot/config-$kernel_version" ]; then
19-
cat "/boot/config-$kernel_version" 2>/dev/null
20-
return $?
21-
fi
22-
}
23-
24-
CONFIG_CONTENT=$(detect_config)
25-
26-
check_config() {
27-
local config_name=$1
28-
value=$(echo "$CONFIG_CONTENT" | grep -E "$config_name" | cut -d= -f2)
29-
echo "$value"
30-
}
31-
326
# MDA_LOOPBACK_ADDR
337
if grep -q "FN(get_netns_cookie)" $KERNEL_HEADER_LINUX_BPF; then
348
set_config MDA_LOOPBACK_ADDR 1
@@ -77,12 +51,3 @@ else
7751
set_config LIBBPF_HIGHER_0_6_0_VERSION 1
7852
fi
7953

80-
# KERNEL_KFUNC
81-
if [ "$(check_config "CONFIG_DEBUG_INFO_BTF_MODULES")" == "y" ] &&
82-
[ "$(check_config "CONFIG_DEBUG_INFO_BTF")" == "y" ] &&
83-
[ "$VERSION" -ge 6 ]; then
84-
set_config ENHANCED_KERNEL 1
85-
set_config KERNEL_KFUNC 1
86-
else
87-
set_config KERNEL_KFUNC 0
88-
fi

kmesh_macros_env_kernel.sh

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,10 @@
11
#!/bin/bash
22

3+
source ./kmesh_compile_env_pre.sh
34
VERSION=$(uname -r | cut -d '.' -f 1)
45
KERNEL_VERSION=$(uname -r | cut -d '-' -f 1)
56
KERNEL_HEADER_LINUX_BPF=/usr/include/linux/bpf.h
67

7-
function set_config() {
8-
sed -i -r -e "s/($1)([ \t]*)([0-9]+)/\1\2$2/" config/kmesh_marcos_def.h
9-
}
10-
11-
detect_config() {
12-
local kernel_version=$(uname -r)
13-
14-
if [ -f "/proc/config.gz" ]; then
15-
zcat /proc/config.gz 2>/dev/null
16-
return $?
17-
fi
18-
19-
if [ -f "/boot/config-$kernel_version" ]; then
20-
cat "/boot/config-$kernel_version" 2>/dev/null
21-
return $?
22-
fi
23-
}
24-
25-
CONFIG_CONTENT=$(detect_config)
26-
27-
check_config() {
28-
local config_name=$1
29-
value=$(echo "$CONFIG_CONTENT" | grep -E "$config_name" | cut -d= -f2)
30-
echo "$value"
31-
}
32-
338
# MDA_LOOPBACK_ADDR
349
if grep -q "FN(get_netns_cookie)" $KERNEL_HEADER_LINUX_BPF; then
3510
set_config MDA_LOOPBACK_ADDR 1

0 commit comments

Comments
 (0)