Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from David Miller: 1) More jumbo frame fixes in r8169, from Heiner Kallweit. 2) Fix bpf build in minimal configuration, from Alexei Starovoitov. 3) Use after free in slcan driver, from Jouni Hogander. 4) Flower classifier port ranges don't work properly in the HW offload case, from Yoshiki Komachi. 5) Use after free in hns3_nic_maybe_stop_tx(), from Yunsheng Lin. 6) Out of bounds access in mqprio_dump(), from Vladyslav Tarasiuk. 7) Fix flow dissection in dsa TX path, from Alexander Lobakin. 8) Stale syncookie timestampe fixes from Guillaume Nault. [ Did an evil merge to silence a warning introduced by this pull - Linus ] * git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (84 commits) r8169: fix rtl_hw_jumbo_disable for RTL8168evl net_sched: validate TCA_KIND attribute in tc_chain_tmplt_add() r8169: add missing RX enabling for WoL on RTL8125 vhost/vsock: accept only packets with the right dst_cid net: phy: dp83867: fix hfs boot in rgmii mode net: ethernet: ti: cpsw: fix extra rx interrupt inet: protect against too small mtu values. gre: refetch erspan header from skb->data after pskb_may_pull() pppoe: remove redundant BUG_ON() check in pppoe_pernet tcp: Protect accesses to .ts_recent_stamp with {READ,WRITE}_ONCE() tcp: tighten acceptance of ACKs not matching a child socket tcp: fix rejected syncookies due to stale timestamps lpc_eth: kernel BUG on remove tcp: md5: fix potential overestimation of TCP option space net: sched: allow indirect blocks to bind to clsact in TC net: core: rename indirect block ingress cb function net-sysfs: Call dev_hold always in netdev_queue_add_kobject net: dsa: fix flow dissection on Tx path net/tls: Fix return values to avoid ENOTSUPP net: avoid an indirect call in ____sys_recvmsg() ...
This commit is contained in:
1
tools/lib/bpf/.gitignore
vendored
1
tools/lib/bpf/.gitignore
vendored
@@ -1,7 +1,6 @@
|
||||
libbpf_version.h
|
||||
libbpf.pc
|
||||
FEATURE-DUMP.libbpf
|
||||
test_libbpf
|
||||
libbpf.so.*
|
||||
TAGS
|
||||
tags
|
||||
|
@@ -147,12 +147,12 @@ TAGS_PROG := $(if $(shell which etags 2>/dev/null),etags,ctags)
|
||||
|
||||
GLOBAL_SYM_COUNT = $(shell readelf -s --wide $(BPF_IN_SHARED) | \
|
||||
cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
|
||||
awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$8}' | \
|
||||
awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}' | \
|
||||
sort -u | wc -l)
|
||||
VERSIONED_SYM_COUNT = $(shell readelf -s --wide $(OUTPUT)libbpf.so | \
|
||||
grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l)
|
||||
|
||||
CMD_TARGETS = $(LIB_TARGET) $(PC_FILE) $(OUTPUT)test_libbpf
|
||||
CMD_TARGETS = $(LIB_TARGET) $(PC_FILE)
|
||||
|
||||
all: fixdep
|
||||
$(Q)$(MAKE) all_cmd
|
||||
@@ -180,9 +180,9 @@ $(BPF_IN_SHARED): force elfdep bpfdep bpf_helper_defs.h
|
||||
$(BPF_IN_STATIC): force elfdep bpfdep bpf_helper_defs.h
|
||||
$(Q)$(MAKE) $(build)=libbpf OUTPUT=$(STATIC_OBJDIR)
|
||||
|
||||
bpf_helper_defs.h: $(srctree)/include/uapi/linux/bpf.h
|
||||
bpf_helper_defs.h: $(srctree)/tools/include/uapi/linux/bpf.h
|
||||
$(Q)$(srctree)/scripts/bpf_helpers_doc.py --header \
|
||||
--file $(srctree)/include/uapi/linux/bpf.h > bpf_helper_defs.h
|
||||
--file $(srctree)/tools/include/uapi/linux/bpf.h > bpf_helper_defs.h
|
||||
|
||||
$(OUTPUT)libbpf.so: $(OUTPUT)libbpf.so.$(LIBBPF_VERSION)
|
||||
|
||||
@@ -196,9 +196,6 @@ $(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN_SHARED)
|
||||
$(OUTPUT)libbpf.a: $(BPF_IN_STATIC)
|
||||
$(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^
|
||||
|
||||
$(OUTPUT)test_libbpf: test_libbpf.c $(OUTPUT)libbpf.a
|
||||
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(INCLUDES) $^ -lelf -o $@
|
||||
|
||||
$(OUTPUT)libbpf.pc:
|
||||
$(QUIET_GEN)sed -e "s|@PREFIX@|$(prefix)|" \
|
||||
-e "s|@LIBDIR@|$(libdir_SQ)|" \
|
||||
@@ -214,9 +211,9 @@ check_abi: $(OUTPUT)libbpf.so
|
||||
"versioned symbols in $^ ($(VERSIONED_SYM_COUNT))." \
|
||||
"Please make sure all LIBBPF_API symbols are" \
|
||||
"versioned in $(VERSION_SCRIPT)." >&2; \
|
||||
readelf -s --wide $(OUTPUT)libbpf-in.o | \
|
||||
readelf -s --wide $(BPF_IN_SHARED) | \
|
||||
cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
|
||||
awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$8}'| \
|
||||
awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'| \
|
||||
sort -u > $(OUTPUT)libbpf_global_syms.tmp; \
|
||||
readelf -s --wide $(OUTPUT)libbpf.so | \
|
||||
grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | \
|
||||
|
@@ -171,10 +171,8 @@ struct bpf_program {
|
||||
RELO_DATA,
|
||||
} type;
|
||||
int insn_idx;
|
||||
union {
|
||||
int map_idx;
|
||||
int text_off;
|
||||
};
|
||||
int map_idx;
|
||||
int sym_off;
|
||||
} *reloc_desc;
|
||||
int nr_reloc;
|
||||
int log_level;
|
||||
@@ -1819,12 +1817,12 @@ static int bpf_program__record_reloc(struct bpf_program *prog,
|
||||
return -LIBBPF_ERRNO__RELOC;
|
||||
}
|
||||
if (sym->st_value % 8) {
|
||||
pr_warn("bad call relo offset: %lu\n", sym->st_value);
|
||||
pr_warn("bad call relo offset: %llu\n", (__u64)sym->st_value);
|
||||
return -LIBBPF_ERRNO__RELOC;
|
||||
}
|
||||
reloc_desc->type = RELO_CALL;
|
||||
reloc_desc->insn_idx = insn_idx;
|
||||
reloc_desc->text_off = sym->st_value / 8;
|
||||
reloc_desc->sym_off = sym->st_value;
|
||||
obj->has_pseudo_calls = true;
|
||||
return 0;
|
||||
}
|
||||
@@ -1868,6 +1866,7 @@ static int bpf_program__record_reloc(struct bpf_program *prog,
|
||||
reloc_desc->type = RELO_LD64;
|
||||
reloc_desc->insn_idx = insn_idx;
|
||||
reloc_desc->map_idx = map_idx;
|
||||
reloc_desc->sym_off = 0; /* sym->st_value determines map_idx */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1899,6 +1898,7 @@ static int bpf_program__record_reloc(struct bpf_program *prog,
|
||||
reloc_desc->type = RELO_DATA;
|
||||
reloc_desc->insn_idx = insn_idx;
|
||||
reloc_desc->map_idx = map_idx;
|
||||
reloc_desc->sym_off = sym->st_value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3563,8 +3563,8 @@ bpf_program__reloc_text(struct bpf_program *prog, struct bpf_object *obj,
|
||||
return -LIBBPF_ERRNO__RELOC;
|
||||
|
||||
if (prog->idx == obj->efile.text_shndx) {
|
||||
pr_warn("relo in .text insn %d into off %d\n",
|
||||
relo->insn_idx, relo->text_off);
|
||||
pr_warn("relo in .text insn %d into off %d (insn #%d)\n",
|
||||
relo->insn_idx, relo->sym_off, relo->sym_off / 8);
|
||||
return -LIBBPF_ERRNO__RELOC;
|
||||
}
|
||||
|
||||
@@ -3599,7 +3599,7 @@ bpf_program__reloc_text(struct bpf_program *prog, struct bpf_object *obj,
|
||||
prog->section_name);
|
||||
}
|
||||
insn = &prog->insns[relo->insn_idx];
|
||||
insn->imm += relo->text_off + prog->main_prog_cnt - relo->insn_idx;
|
||||
insn->imm += relo->sym_off / 8 + prog->main_prog_cnt - relo->insn_idx;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3622,31 +3622,26 @@ bpf_program__relocate(struct bpf_program *prog, struct bpf_object *obj)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < prog->nr_reloc; i++) {
|
||||
if (prog->reloc_desc[i].type == RELO_LD64 ||
|
||||
prog->reloc_desc[i].type == RELO_DATA) {
|
||||
bool relo_data = prog->reloc_desc[i].type == RELO_DATA;
|
||||
struct bpf_insn *insns = prog->insns;
|
||||
int insn_idx, map_idx;
|
||||
struct reloc_desc *relo = &prog->reloc_desc[i];
|
||||
|
||||
insn_idx = prog->reloc_desc[i].insn_idx;
|
||||
map_idx = prog->reloc_desc[i].map_idx;
|
||||
if (relo->type == RELO_LD64 || relo->type == RELO_DATA) {
|
||||
struct bpf_insn *insn = &prog->insns[relo->insn_idx];
|
||||
|
||||
if (insn_idx + 1 >= (int)prog->insns_cnt) {
|
||||
if (relo->insn_idx + 1 >= (int)prog->insns_cnt) {
|
||||
pr_warn("relocation out of range: '%s'\n",
|
||||
prog->section_name);
|
||||
return -LIBBPF_ERRNO__RELOC;
|
||||
}
|
||||
|
||||
if (!relo_data) {
|
||||
insns[insn_idx].src_reg = BPF_PSEUDO_MAP_FD;
|
||||
if (relo->type != RELO_DATA) {
|
||||
insn[0].src_reg = BPF_PSEUDO_MAP_FD;
|
||||
} else {
|
||||
insns[insn_idx].src_reg = BPF_PSEUDO_MAP_VALUE;
|
||||
insns[insn_idx + 1].imm = insns[insn_idx].imm;
|
||||
insn[0].src_reg = BPF_PSEUDO_MAP_VALUE;
|
||||
insn[1].imm = insn[0].imm + relo->sym_off;
|
||||
}
|
||||
insns[insn_idx].imm = obj->maps[map_idx].fd;
|
||||
} else if (prog->reloc_desc[i].type == RELO_CALL) {
|
||||
err = bpf_program__reloc_text(prog, obj,
|
||||
&prog->reloc_desc[i]);
|
||||
insn[0].imm = obj->maps[relo->map_idx].fd;
|
||||
} else if (relo->type == RELO_CALL) {
|
||||
err = bpf_program__reloc_text(prog, obj, relo);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
@@ -19,3 +19,4 @@ tools/lib/bitmap.c
|
||||
tools/lib/str_error_r.c
|
||||
tools/lib/vsprintf.c
|
||||
tools/lib/zalloc.c
|
||||
scripts/bpf_helpers_doc.py
|
||||
|
1
tools/testing/selftests/bpf/.gitignore
vendored
1
tools/testing/selftests/bpf/.gitignore
vendored
@@ -37,5 +37,6 @@ libbpf.so.*
|
||||
test_hashmap
|
||||
test_btf_dump
|
||||
xdping
|
||||
test_cpp
|
||||
/no_alu32
|
||||
/bpf_gcc
|
||||
|
@@ -71,7 +71,7 @@ TEST_PROGS_EXTENDED := with_addr.sh \
|
||||
# Compile but not part of 'make run_tests'
|
||||
TEST_GEN_PROGS_EXTENDED = test_sock_addr test_skb_cgroup_id_user \
|
||||
flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \
|
||||
test_lirc_mode2_user xdping
|
||||
test_lirc_mode2_user xdping test_cpp
|
||||
|
||||
TEST_CUSTOM_PROGS = urandom_read
|
||||
|
||||
@@ -317,6 +317,10 @@ verifier/tests.h: verifier/*.c
|
||||
$(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT)
|
||||
$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
|
||||
|
||||
# Make sure we are able to include and link libbpf against c++.
|
||||
$(OUTPUT)/test_cpp: test_cpp.cpp $(BPFOBJ)
|
||||
$(CXX) $(CFLAGS) $^ $(LDLIBS) -o $@
|
||||
|
||||
EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) \
|
||||
prog_tests/tests.h map_tests/tests.h verifier/tests.h \
|
||||
feature $(OUTPUT)/*.o $(OUTPUT)/no_alu32 $(OUTPUT)/bpf_gcc
|
||||
|
@@ -2,25 +2,21 @@
|
||||
/* Copyright (c) 2019 Facebook */
|
||||
#include <test_progs.h>
|
||||
|
||||
#define PROG_CNT 3
|
||||
|
||||
void test_fexit_bpf2bpf(void)
|
||||
static void test_fexit_bpf2bpf_common(const char *obj_file,
|
||||
const char *target_obj_file,
|
||||
int prog_cnt,
|
||||
const char **prog_name)
|
||||
{
|
||||
const char *prog_name[PROG_CNT] = {
|
||||
"fexit/test_pkt_access",
|
||||
"fexit/test_pkt_access_subprog1",
|
||||
"fexit/test_pkt_access_subprog2",
|
||||
};
|
||||
struct bpf_object *obj = NULL, *pkt_obj;
|
||||
int err, pkt_fd, i;
|
||||
struct bpf_link *link[PROG_CNT] = {};
|
||||
struct bpf_program *prog[PROG_CNT];
|
||||
struct bpf_link **link = NULL;
|
||||
struct bpf_program **prog = NULL;
|
||||
__u32 duration, retval;
|
||||
struct bpf_map *data_map;
|
||||
const int zero = 0;
|
||||
u64 result[PROG_CNT];
|
||||
u64 *result = NULL;
|
||||
|
||||
err = bpf_prog_load("./test_pkt_access.o", BPF_PROG_TYPE_UNSPEC,
|
||||
err = bpf_prog_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
|
||||
&pkt_obj, &pkt_fd);
|
||||
if (CHECK(err, "prog_load sched cls", "err %d errno %d\n", err, errno))
|
||||
return;
|
||||
@@ -28,7 +24,14 @@ void test_fexit_bpf2bpf(void)
|
||||
.attach_prog_fd = pkt_fd,
|
||||
);
|
||||
|
||||
obj = bpf_object__open_file("./fexit_bpf2bpf.o", &opts);
|
||||
link = calloc(sizeof(struct bpf_link *), prog_cnt);
|
||||
prog = calloc(sizeof(struct bpf_program *), prog_cnt);
|
||||
result = malloc(prog_cnt * sizeof(u64));
|
||||
if (CHECK(!link || !prog || !result, "alloc_memory",
|
||||
"failed to alloc memory"))
|
||||
goto close_prog;
|
||||
|
||||
obj = bpf_object__open_file(obj_file, &opts);
|
||||
if (CHECK(IS_ERR_OR_NULL(obj), "obj_open",
|
||||
"failed to open fexit_bpf2bpf: %ld\n",
|
||||
PTR_ERR(obj)))
|
||||
@@ -38,7 +41,7 @@ void test_fexit_bpf2bpf(void)
|
||||
if (CHECK(err, "obj_load", "err %d\n", err))
|
||||
goto close_prog;
|
||||
|
||||
for (i = 0; i < PROG_CNT; i++) {
|
||||
for (i = 0; i < prog_cnt; i++) {
|
||||
prog[i] = bpf_object__find_program_by_title(obj, prog_name[i]);
|
||||
if (CHECK(!prog[i], "find_prog", "prog %s not found\n", prog_name[i]))
|
||||
goto close_prog;
|
||||
@@ -56,21 +59,54 @@ void test_fexit_bpf2bpf(void)
|
||||
"err %d errno %d retval %d duration %d\n",
|
||||
err, errno, retval, duration);
|
||||
|
||||
err = bpf_map_lookup_elem(bpf_map__fd(data_map), &zero, &result);
|
||||
err = bpf_map_lookup_elem(bpf_map__fd(data_map), &zero, result);
|
||||
if (CHECK(err, "get_result",
|
||||
"failed to get output data: %d\n", err))
|
||||
goto close_prog;
|
||||
|
||||
for (i = 0; i < PROG_CNT; i++)
|
||||
for (i = 0; i < prog_cnt; i++)
|
||||
if (CHECK(result[i] != 1, "result", "fexit_bpf2bpf failed err %ld\n",
|
||||
result[i]))
|
||||
goto close_prog;
|
||||
|
||||
close_prog:
|
||||
for (i = 0; i < PROG_CNT; i++)
|
||||
for (i = 0; i < prog_cnt; i++)
|
||||
if (!IS_ERR_OR_NULL(link[i]))
|
||||
bpf_link__destroy(link[i]);
|
||||
if (!IS_ERR_OR_NULL(obj))
|
||||
bpf_object__close(obj);
|
||||
bpf_object__close(pkt_obj);
|
||||
free(link);
|
||||
free(prog);
|
||||
free(result);
|
||||
}
|
||||
|
||||
static void test_target_no_callees(void)
|
||||
{
|
||||
const char *prog_name[] = {
|
||||
"fexit/test_pkt_md_access",
|
||||
};
|
||||
test_fexit_bpf2bpf_common("./fexit_bpf2bpf_simple.o",
|
||||
"./test_pkt_md_access.o",
|
||||
ARRAY_SIZE(prog_name),
|
||||
prog_name);
|
||||
}
|
||||
|
||||
static void test_target_yes_callees(void)
|
||||
{
|
||||
const char *prog_name[] = {
|
||||
"fexit/test_pkt_access",
|
||||
"fexit/test_pkt_access_subprog1",
|
||||
"fexit/test_pkt_access_subprog2",
|
||||
};
|
||||
test_fexit_bpf2bpf_common("./fexit_bpf2bpf.o",
|
||||
"./test_pkt_access.o",
|
||||
ARRAY_SIZE(prog_name),
|
||||
prog_name);
|
||||
}
|
||||
|
||||
void test_fexit_bpf2bpf(void)
|
||||
{
|
||||
test_target_no_callees();
|
||||
test_target_yes_callees();
|
||||
}
|
||||
|
@@ -6,28 +6,28 @@
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
||||
static volatile __u64 test1_result;
|
||||
__u64 test1_result = 0;
|
||||
BPF_TRACE_1("fentry/bpf_fentry_test1", test1, int, a)
|
||||
{
|
||||
test1_result = a == 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test2_result;
|
||||
__u64 test2_result = 0;
|
||||
BPF_TRACE_2("fentry/bpf_fentry_test2", test2, int, a, __u64, b)
|
||||
{
|
||||
test2_result = a == 2 && b == 3;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test3_result;
|
||||
__u64 test3_result = 0;
|
||||
BPF_TRACE_3("fentry/bpf_fentry_test3", test3, char, a, int, b, __u64, c)
|
||||
{
|
||||
test3_result = a == 4 && b == 5 && c == 6;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test4_result;
|
||||
__u64 test4_result = 0;
|
||||
BPF_TRACE_4("fentry/bpf_fentry_test4", test4,
|
||||
void *, a, char, b, int, c, __u64, d)
|
||||
{
|
||||
@@ -35,7 +35,7 @@ BPF_TRACE_4("fentry/bpf_fentry_test4", test4,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test5_result;
|
||||
__u64 test5_result = 0;
|
||||
BPF_TRACE_5("fentry/bpf_fentry_test5", test5,
|
||||
__u64, a, void *, b, short, c, int, d, __u64, e)
|
||||
{
|
||||
@@ -44,7 +44,7 @@ BPF_TRACE_5("fentry/bpf_fentry_test5", test5,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test6_result;
|
||||
__u64 test6_result = 0;
|
||||
BPF_TRACE_6("fentry/bpf_fentry_test6", test6,
|
||||
__u64, a, void *, b, short, c, int, d, void *, e, __u64, f)
|
||||
{
|
||||
|
@@ -8,7 +8,7 @@ struct sk_buff {
|
||||
unsigned int len;
|
||||
};
|
||||
|
||||
static volatile __u64 test_result;
|
||||
__u64 test_result = 0;
|
||||
BPF_TRACE_2("fexit/test_pkt_access", test_main,
|
||||
struct sk_buff *, skb, int, ret)
|
||||
{
|
||||
@@ -23,7 +23,7 @@ BPF_TRACE_2("fexit/test_pkt_access", test_main,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test_result_subprog1;
|
||||
__u64 test_result_subprog1 = 0;
|
||||
BPF_TRACE_2("fexit/test_pkt_access_subprog1", test_subprog1,
|
||||
struct sk_buff *, skb, int, ret)
|
||||
{
|
||||
@@ -56,7 +56,7 @@ struct args_subprog2 {
|
||||
__u64 args[5];
|
||||
__u64 ret;
|
||||
};
|
||||
static volatile __u64 test_result_subprog2;
|
||||
__u64 test_result_subprog2 = 0;
|
||||
SEC("fexit/test_pkt_access_subprog2")
|
||||
int test_subprog2(struct args_subprog2 *ctx)
|
||||
{
|
||||
|
26
tools/testing/selftests/bpf/progs/fexit_bpf2bpf_simple.c
Normal file
26
tools/testing/selftests/bpf/progs/fexit_bpf2bpf_simple.c
Normal file
@@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright (c) 2019 Facebook */
|
||||
#include <linux/bpf.h>
|
||||
#include "bpf_helpers.h"
|
||||
#include "bpf_trace_helpers.h"
|
||||
|
||||
struct sk_buff {
|
||||
unsigned int len;
|
||||
};
|
||||
|
||||
__u64 test_result = 0;
|
||||
BPF_TRACE_2("fexit/test_pkt_md_access", test_main2,
|
||||
struct sk_buff *, skb, int, ret)
|
||||
{
|
||||
int len;
|
||||
|
||||
__builtin_preserve_access_index(({
|
||||
len = skb->len;
|
||||
}));
|
||||
if (len != 74 || ret != 0)
|
||||
return 0;
|
||||
|
||||
test_result = 1;
|
||||
return 0;
|
||||
}
|
||||
char _license[] SEC("license") = "GPL";
|
@@ -6,28 +6,28 @@
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
||||
static volatile __u64 test1_result;
|
||||
__u64 test1_result = 0;
|
||||
BPF_TRACE_2("fexit/bpf_fentry_test1", test1, int, a, int, ret)
|
||||
{
|
||||
test1_result = a == 1 && ret == 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test2_result;
|
||||
__u64 test2_result = 0;
|
||||
BPF_TRACE_3("fexit/bpf_fentry_test2", test2, int, a, __u64, b, int, ret)
|
||||
{
|
||||
test2_result = a == 2 && b == 3 && ret == 5;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test3_result;
|
||||
__u64 test3_result = 0;
|
||||
BPF_TRACE_4("fexit/bpf_fentry_test3", test3, char, a, int, b, __u64, c, int, ret)
|
||||
{
|
||||
test3_result = a == 4 && b == 5 && c == 6 && ret == 15;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test4_result;
|
||||
__u64 test4_result = 0;
|
||||
BPF_TRACE_5("fexit/bpf_fentry_test4", test4,
|
||||
void *, a, char, b, int, c, __u64, d, int, ret)
|
||||
{
|
||||
@@ -37,7 +37,7 @@ BPF_TRACE_5("fexit/bpf_fentry_test4", test4,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test5_result;
|
||||
__u64 test5_result = 0;
|
||||
BPF_TRACE_6("fexit/bpf_fentry_test5", test5,
|
||||
__u64, a, void *, b, short, c, int, d, __u64, e, int, ret)
|
||||
{
|
||||
@@ -46,7 +46,7 @@ BPF_TRACE_6("fexit/bpf_fentry_test5", test5,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile __u64 test6_result;
|
||||
__u64 test6_result = 0;
|
||||
BPF_TRACE_7("fexit/bpf_fentry_test6", test6,
|
||||
__u64, a, void *, b, short, c, int, d, void *, e, __u64, f,
|
||||
int, ret)
|
||||
|
@@ -15,8 +15,8 @@ struct {
|
||||
__type(value, __u64);
|
||||
} data_map SEC(".maps");
|
||||
|
||||
static volatile __u64 in_val;
|
||||
static volatile __u64 out_val;
|
||||
__u64 in_val = 0;
|
||||
__u64 out_val = 0;
|
||||
|
||||
SEC("raw_tracepoint/sys_enter")
|
||||
int test_mmap(void *ctx)
|
||||
|
@@ -27,8 +27,8 @@ int _version SEC("version") = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
SEC("test1")
|
||||
int process(struct __sk_buff *skb)
|
||||
SEC("classifier/test_pkt_md_access")
|
||||
int test_pkt_md_access(struct __sk_buff *skb)
|
||||
{
|
||||
TEST_FIELD(__u8, len, 0xFF);
|
||||
TEST_FIELD(__u16, len, 0xFFFF);
|
||||
|
@@ -131,6 +131,7 @@ int bpf_testcb(struct bpf_sock_ops *skops)
|
||||
g.bytes_received = skops->bytes_received;
|
||||
g.bytes_acked = skops->bytes_acked;
|
||||
}
|
||||
g.num_close_events++;
|
||||
bpf_map_update_elem(&global_map, &key, &g,
|
||||
BPF_ANY);
|
||||
}
|
||||
|
@@ -120,7 +120,7 @@ int check_ancestor_cgroup_ids(int prog_id)
|
||||
int err = 0;
|
||||
int map_fd;
|
||||
|
||||
expected_ids[0] = 0x100000001; /* root cgroup */
|
||||
expected_ids[0] = get_cgroup_id("/.."); /* root cgroup */
|
||||
expected_ids[1] = get_cgroup_id("");
|
||||
expected_ids[2] = get_cgroup_id(CGROUP_PATH);
|
||||
expected_ids[3] = 0; /* non-existent cgroup */
|
||||
|
@@ -13,5 +13,6 @@ struct tcpbpf_globals {
|
||||
__u64 bytes_received;
|
||||
__u64 bytes_acked;
|
||||
__u32 num_listen;
|
||||
__u32 num_close_events;
|
||||
};
|
||||
#endif
|
||||
|
@@ -16,6 +16,9 @@
|
||||
|
||||
#include "test_tcpbpf.h"
|
||||
|
||||
/* 3 comes from one listening socket + both ends of the connection */
|
||||
#define EXPECTED_CLOSE_EVENTS 3
|
||||
|
||||
#define EXPECT_EQ(expected, actual, fmt) \
|
||||
do { \
|
||||
if ((expected) != (actual)) { \
|
||||
@@ -23,13 +26,14 @@
|
||||
" Actual: %" fmt "\n" \
|
||||
" Expected: %" fmt "\n", \
|
||||
(actual), (expected)); \
|
||||
goto err; \
|
||||
ret--; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
int verify_result(const struct tcpbpf_globals *result)
|
||||
{
|
||||
__u32 expected_events;
|
||||
int ret = 0;
|
||||
|
||||
expected_events = ((1 << BPF_SOCK_OPS_TIMEOUT_INIT) |
|
||||
(1 << BPF_SOCK_OPS_RWND_INIT) |
|
||||
@@ -48,15 +52,15 @@ int verify_result(const struct tcpbpf_globals *result)
|
||||
EXPECT_EQ(0x80, result->bad_cb_test_rv, PRIu32);
|
||||
EXPECT_EQ(0, result->good_cb_test_rv, PRIu32);
|
||||
EXPECT_EQ(1, result->num_listen, PRIu32);
|
||||
EXPECT_EQ(EXPECTED_CLOSE_EVENTS, result->num_close_events, PRIu32);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int verify_sockopt_result(int sock_map_fd)
|
||||
{
|
||||
__u32 key = 0;
|
||||
int ret = 0;
|
||||
int res;
|
||||
int rv;
|
||||
|
||||
@@ -69,9 +73,7 @@ int verify_sockopt_result(int sock_map_fd)
|
||||
rv = bpf_map_lookup_elem(sock_map_fd, &key, &res);
|
||||
EXPECT_EQ(0, rv, "d");
|
||||
EXPECT_EQ(1, res, "d");
|
||||
return 0;
|
||||
err:
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bpf_find_map(const char *test, struct bpf_object *obj,
|
||||
@@ -96,6 +98,7 @@ int main(int argc, char **argv)
|
||||
int error = EXIT_FAILURE;
|
||||
struct bpf_object *obj;
|
||||
int cg_fd = -1;
|
||||
int retry = 10;
|
||||
__u32 key = 0;
|
||||
int rv;
|
||||
|
||||
@@ -134,12 +137,20 @@ int main(int argc, char **argv)
|
||||
if (sock_map_fd < 0)
|
||||
goto err;
|
||||
|
||||
retry_lookup:
|
||||
rv = bpf_map_lookup_elem(map_fd, &key, &g);
|
||||
if (rv != 0) {
|
||||
printf("FAILED: bpf_map_lookup_elem returns %d\n", rv);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (g.num_close_events != EXPECTED_CLOSE_EVENTS && retry--) {
|
||||
printf("Unexpected number of close events (%d), retrying!\n",
|
||||
g.num_close_events);
|
||||
usleep(100);
|
||||
goto retry_lookup;
|
||||
}
|
||||
|
||||
if (verify_result(&g)) {
|
||||
printf("FAILED: Wrong stats\n");
|
||||
goto err;
|
||||
|
@@ -25,10 +25,6 @@
|
||||
#define TLS_PAYLOAD_MAX_LEN 16384
|
||||
#define SOL_TLS 282
|
||||
|
||||
#ifndef ENOTSUPP
|
||||
#define ENOTSUPP 524
|
||||
#endif
|
||||
|
||||
FIXTURE(tls_basic)
|
||||
{
|
||||
int fd, cfd;
|
||||
@@ -1205,11 +1201,11 @@ TEST(non_established) {
|
||||
/* TLS ULP not supported */
|
||||
if (errno == ENOENT)
|
||||
return;
|
||||
EXPECT_EQ(errno, ENOTSUPP);
|
||||
EXPECT_EQ(errno, ENOTCONN);
|
||||
|
||||
ret = setsockopt(sfd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
|
||||
EXPECT_EQ(ret, -1);
|
||||
EXPECT_EQ(errno, ENOTSUPP);
|
||||
EXPECT_EQ(errno, ENOTCONN);
|
||||
|
||||
ret = getsockname(sfd, &addr, &len);
|
||||
ASSERT_EQ(ret, 0);
|
||||
|
Reference in New Issue
Block a user