mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:1) Use after free in __dev_map_entry_free(), from Eric Dumazet.
1) Use after free in __dev_map_entry_free(), from Eric Dumazet.
2) Fix TCP retransmission timestamps on passive Fast Open, from Yuchung
Cheng.
3) Orphan NFC, we'll take the patches directly into my tree. From
Johannes Berg.
4) We can't recycle cloned TCP skbs, from Eric Dumazet.
5) Some flow dissector bpf test fixes, from Stanislav Fomichev.
6) Fix RCU marking and warnings in rhashtable, from Herbert Xu.
7) Fix some potential fib6 leaks, from Eric Dumazet.
8) Fix a _decode_session4 uninitialized memory read bug fix that got
lost in a merge. From Florian Westphal.
9) Fix ipv6 source address routing wrt. exception route entries, from
Wei Wang.
10) The netdev_xmit_more() conversion was not done %100 properly in mlx5
driver, fix from Tariq Toukan.
11) Clean up botched merge on netfilter kselftest, from Florian
Westphal.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (74 commits)
of_net: fix of_get_mac_address retval if compiled without CONFIG_OF
net: fix kernel-doc warnings for socket.c
net: Treat sock->sk_drops as an unsigned int when printing
kselftests: netfilter: fix leftover net/net-next merge conflict
mlxsw: core: Prevent reading unsupported slave address from SFP EEPROM
mlxsw: core: Prevent QSFP module initialization for old hardware
vsock/virtio: Initialize core virtio vsock before registering the driver
net/mlx5e: Fix possible modify header actions memory leak
net/mlx5e: Fix no rewrite fields with the same match
net/mlx5e: Additional check for flow destination comparison
net/mlx5e: Add missing ethtool driver info for representors
net/mlx5e: Fix number of vports for ingress ACL configuration
net/mlx5e: Fix ethtool rxfh commands when CONFIG_MLX5_EN_RXNFC is disabled
net/mlx5e: Fix wrong xmit_more application
net/mlx5: Fix peer pf disable hca command
net/mlx5: E-Switch, Correct type to u16 for vport_num and int for vport_index
net/mlx5: Add meaningful return codes to status_to_err function
net/mlx5: Imply MLXFW in mlx5_core
Revert "tipc: fix modprobe tipc failed after switch order of device registration"
vsock/virtio: free packets during the socket release
...
This commit is contained in:
commit
78e0365184
93 changed files with 874 additions and 416 deletions
|
|
@ -208,8 +208,8 @@ static int dump_btf_type(const struct btf *btf, __u32 id,
|
|||
break;
|
||||
}
|
||||
case BTF_KIND_FWD: {
|
||||
const char *fwd_kind = BTF_INFO_KIND(t->info) ? "union"
|
||||
: "struct";
|
||||
const char *fwd_kind = BTF_INFO_KFLAG(t->info) ? "union"
|
||||
: "struct";
|
||||
|
||||
if (json_output)
|
||||
jsonw_string_field(w, "fwd_kind", fwd_kind);
|
||||
|
|
|
|||
|
|
@ -879,6 +879,8 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
|
|||
}
|
||||
}
|
||||
|
||||
set_max_rlimit();
|
||||
|
||||
obj = __bpf_object__open_xattr(&attr, bpf_flags);
|
||||
if (IS_ERR_OR_NULL(obj)) {
|
||||
p_err("failed to open object file");
|
||||
|
|
@ -958,8 +960,6 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
|
|||
goto err_close_obj;
|
||||
}
|
||||
|
||||
set_max_rlimit();
|
||||
|
||||
err = bpf_object__load(obj);
|
||||
if (err) {
|
||||
p_err("failed to load object file");
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ struct btf_type {
|
|||
* is the 32 bits arrangement:
|
||||
*/
|
||||
#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24)
|
||||
#define BTF_INT_OFFSET(VAL) (((VAL & 0x00ff0000)) >> 16)
|
||||
#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16)
|
||||
#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff)
|
||||
|
||||
/* Attributes stored in the BTF_INT_ENCODING */
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
#include "btf.h"
|
||||
#include "bpf.h"
|
||||
#include "libbpf.h"
|
||||
#include "libbpf_util.h"
|
||||
#include "libbpf_internal.h"
|
||||
|
||||
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define min(a, b) ((a) < (b) ? (a) : (b))
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@
|
|||
#include "bpf.h"
|
||||
#include "btf.h"
|
||||
#include "str_error.h"
|
||||
#include "libbpf_util.h"
|
||||
#include "libbpf_internal.h"
|
||||
|
||||
#ifndef EM_BPF
|
||||
|
|
@ -1696,7 +1695,7 @@ bpf_object__probe_caps(struct bpf_object *obj)
|
|||
for (i = 0; i < ARRAY_SIZE(probe_fn); i++) {
|
||||
ret = probe_fn[i](obj);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
pr_debug("Probe #%d failed with %d.\n", i, ret);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -21,6 +21,19 @@
|
|||
#define BTF_PARAM_ENC(name, type) (name), (type)
|
||||
#define BTF_VAR_SECINFO_ENC(type, offset, size) (type), (offset), (size)
|
||||
|
||||
extern void libbpf_print(enum libbpf_print_level level,
|
||||
const char *format, ...)
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
|
||||
#define __pr(level, fmt, ...) \
|
||||
do { \
|
||||
libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define pr_warning(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
|
||||
#define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__)
|
||||
#define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__)
|
||||
|
||||
int libbpf__probe_raw_btf(const char *raw_types, size_t types_len,
|
||||
const char *str_sec, size_t str_len);
|
||||
|
||||
|
|
|
|||
|
|
@ -10,19 +10,6 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void libbpf_print(enum libbpf_print_level level,
|
||||
const char *format, ...)
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
|
||||
#define __pr(level, fmt, ...) \
|
||||
do { \
|
||||
libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define pr_warning(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
|
||||
#define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__)
|
||||
#define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__)
|
||||
|
||||
/* Use these barrier functions instead of smp_[rw]mb() when they are
|
||||
* used in a libbpf header file. That way they can be built into the
|
||||
* application that uses libbpf.
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
#include "bpf.h"
|
||||
#include "libbpf.h"
|
||||
#include "libbpf_util.h"
|
||||
#include "libbpf_internal.h"
|
||||
#include "xsk.h"
|
||||
|
||||
#ifndef SOL_XDP
|
||||
|
|
|
|||
1
tools/testing/selftests/bpf/.gitignore
vendored
1
tools/testing/selftests/bpf/.gitignore
vendored
|
|
@ -31,6 +31,7 @@ test_section_names
|
|||
test_tcpnotify_user
|
||||
test_libbpf
|
||||
test_tcp_check_syncookie_user
|
||||
test_sysctl
|
||||
alu32
|
||||
libbpf.pc
|
||||
libbpf.so.*
|
||||
|
|
|
|||
|
|
@ -278,7 +278,7 @@ static int (*bpf_skb_change_type)(void *ctx, __u32 type) =
|
|||
(void *) BPF_FUNC_skb_change_type;
|
||||
static unsigned int (*bpf_get_hash_recalc)(void *ctx) =
|
||||
(void *) BPF_FUNC_get_hash_recalc;
|
||||
static unsigned long long (*bpf_get_current_task)(void *ctx) =
|
||||
static unsigned long long (*bpf_get_current_task)(void) =
|
||||
(void *) BPF_FUNC_get_current_task;
|
||||
static int (*bpf_skb_change_tail)(void *ctx, __u32 len, __u64 flags) =
|
||||
(void *) BPF_FUNC_skb_change_tail;
|
||||
|
|
|
|||
1
tools/testing/selftests/bpf/map_tests/.gitignore
vendored
Normal file
1
tools/testing/selftests/bpf/map_tests/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
tests.h
|
||||
|
|
@ -242,12 +242,12 @@ void test_flow_dissector(void)
|
|||
*/
|
||||
|
||||
err = bpf_prog_attach(prog_fd, 0, BPF_FLOW_DISSECTOR, 0);
|
||||
CHECK(err, "bpf_prog_attach", "err %d errno %d", err, errno);
|
||||
CHECK(err, "bpf_prog_attach", "err %d errno %d\n", err, errno);
|
||||
|
||||
tap_fd = create_tap("tap0");
|
||||
CHECK(tap_fd < 0, "create_tap", "tap_fd %d errno %d", tap_fd, errno);
|
||||
CHECK(tap_fd < 0, "create_tap", "tap_fd %d errno %d\n", tap_fd, errno);
|
||||
err = ifup("tap0");
|
||||
CHECK(err, "ifup", "err %d errno %d", err, errno);
|
||||
CHECK(err, "ifup", "err %d errno %d\n", err, errno);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tests); i++) {
|
||||
struct bpf_flow_keys flow_keys = {};
|
||||
|
|
@ -255,7 +255,7 @@ void test_flow_dissector(void)
|
|||
__u32 key = 0;
|
||||
|
||||
err = tx_tap(tap_fd, &tests[i].pkt, sizeof(tests[i].pkt));
|
||||
CHECK(err < 0, "tx_tap", "err %d errno %d", err, errno);
|
||||
CHECK(err < 0, "tx_tap", "err %d errno %d\n", err, errno);
|
||||
|
||||
err = bpf_map_lookup_elem(keys_fd, &key, &flow_keys);
|
||||
CHECK_ATTR(err, tests[i].name, "bpf_map_lookup_elem %d\n", err);
|
||||
|
|
@ -264,5 +264,6 @@ void test_flow_dissector(void)
|
|||
CHECK_FLOW_KEYS(tests[i].name, flow_keys, tests[i].keys);
|
||||
}
|
||||
|
||||
bpf_prog_detach(prog_fd, BPF_FLOW_DISSECTOR);
|
||||
bpf_object__close(obj);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,9 +18,11 @@
|
|||
#include <sys/wait.h>
|
||||
|
||||
#include <bpf/bpf.h>
|
||||
#include <bpf/libbpf.h>
|
||||
|
||||
#include "bpf_util.h"
|
||||
#include "bpf_rlimit.h"
|
||||
#include "../../../include/linux/filter.h"
|
||||
|
||||
#define LOCAL_FREE_TARGET (128)
|
||||
#define PERCPU_FREE_TARGET (4)
|
||||
|
|
@ -40,6 +42,68 @@ static int create_map(int map_type, int map_flags, unsigned int size)
|
|||
return map_fd;
|
||||
}
|
||||
|
||||
static int bpf_map_lookup_elem_with_ref_bit(int fd, unsigned long long key,
|
||||
void *value)
|
||||
{
|
||||
struct bpf_load_program_attr prog;
|
||||
struct bpf_create_map_attr map;
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_LD_MAP_VALUE(BPF_REG_9, 0, 0),
|
||||
BPF_LD_MAP_FD(BPF_REG_1, fd),
|
||||
BPF_LD_IMM64(BPF_REG_3, key),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
|
||||
BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, 0),
|
||||
BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
|
||||
BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
|
||||
BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
|
||||
BPF_STX_MEM(BPF_DW, BPF_REG_9, BPF_REG_1, 0),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 42),
|
||||
BPF_JMP_IMM(BPF_JA, 0, 0, 1),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 1),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
__u8 data[64] = {};
|
||||
int mfd, pfd, ret, zero = 0;
|
||||
__u32 retval = 0;
|
||||
|
||||
memset(&map, 0, sizeof(map));
|
||||
map.map_type = BPF_MAP_TYPE_ARRAY;
|
||||
map.key_size = sizeof(int);
|
||||
map.value_size = sizeof(unsigned long long);
|
||||
map.max_entries = 1;
|
||||
|
||||
mfd = bpf_create_map_xattr(&map);
|
||||
if (mfd < 0)
|
||||
return -1;
|
||||
|
||||
insns[0].imm = mfd;
|
||||
|
||||
memset(&prog, 0, sizeof(prog));
|
||||
prog.prog_type = BPF_PROG_TYPE_SCHED_CLS;
|
||||
prog.insns = insns;
|
||||
prog.insns_cnt = ARRAY_SIZE(insns);
|
||||
prog.license = "GPL";
|
||||
|
||||
pfd = bpf_load_program_xattr(&prog, NULL, 0);
|
||||
if (pfd < 0) {
|
||||
close(mfd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = bpf_prog_test_run(pfd, 1, data, sizeof(data),
|
||||
NULL, NULL, &retval, NULL);
|
||||
if (ret < 0 || retval != 42) {
|
||||
ret = -1;
|
||||
} else {
|
||||
assert(!bpf_map_lookup_elem(mfd, &zero, value));
|
||||
ret = 0;
|
||||
}
|
||||
close(pfd);
|
||||
close(mfd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int map_subset(int map0, int map1)
|
||||
{
|
||||
unsigned long long next_key = 0;
|
||||
|
|
@ -87,7 +151,7 @@ static int sched_next_online(int pid, int *next_to_try)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Size of the LRU amp is 2
|
||||
/* Size of the LRU map is 2
|
||||
* Add key=1 (+1 key)
|
||||
* Add key=2 (+1 key)
|
||||
* Lookup Key=1
|
||||
|
|
@ -157,7 +221,7 @@ static void test_lru_sanity0(int map_type, int map_flags)
|
|||
* stop LRU from removing key=1
|
||||
*/
|
||||
key = 1;
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(value[0] == 1234);
|
||||
|
||||
key = 3;
|
||||
|
|
@ -167,7 +231,8 @@ static void test_lru_sanity0(int map_type, int map_flags)
|
|||
|
||||
/* key=2 has been removed from the LRU */
|
||||
key = 2;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1);
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
assert(map_equal(lru_map_fd, expected_map_fd));
|
||||
|
||||
|
|
@ -221,7 +286,7 @@ static void test_lru_sanity1(int map_type, int map_flags, unsigned int tgt_free)
|
|||
/* Lookup 1 to tgt_free/2 */
|
||||
end_key = 1 + batch_size;
|
||||
for (key = 1; key < end_key; key++) {
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
}
|
||||
|
|
@ -322,10 +387,11 @@ static void test_lru_sanity2(int map_type, int map_flags, unsigned int tgt_free)
|
|||
end_key = 1 + batch_size;
|
||||
value[0] = 4321;
|
||||
for (key = 1; key < end_key; key++) {
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(value[0] == 4321);
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
|
|
@ -404,7 +470,7 @@ static void test_lru_sanity3(int map_type, int map_flags, unsigned int tgt_free)
|
|||
/* Lookup key 1 to tgt_free*3/2 */
|
||||
end_key = tgt_free + batch_size;
|
||||
for (key = 1; key < end_key; key++) {
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
}
|
||||
|
|
@ -463,7 +529,7 @@ static void test_lru_sanity4(int map_type, int map_flags, unsigned int tgt_free)
|
|||
assert(bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
|
||||
for (key = 1; key <= tgt_free; key++) {
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
}
|
||||
|
|
@ -494,16 +560,16 @@ static void do_test_lru_sanity5(unsigned long long last_key, int map_fd)
|
|||
unsigned long long key, value[nr_cpus];
|
||||
|
||||
/* Ensure the last key inserted by previous CPU can be found */
|
||||
assert(!bpf_map_lookup_elem(map_fd, &last_key, value));
|
||||
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(map_fd, last_key, value));
|
||||
value[0] = 1234;
|
||||
|
||||
key = last_key + 1;
|
||||
assert(!bpf_map_update_elem(map_fd, &key, value, BPF_NOEXIST));
|
||||
assert(!bpf_map_lookup_elem(map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(map_fd, key, value));
|
||||
|
||||
/* Cannot find the last key because it was removed by LRU */
|
||||
assert(bpf_map_lookup_elem(map_fd, &last_key, value));
|
||||
assert(bpf_map_lookup_elem(map_fd, &last_key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
}
|
||||
|
||||
/* Test map with only one element */
|
||||
|
|
@ -590,8 +656,8 @@ static void test_lru_sanity6(int map_type, int map_flags, int tgt_free)
|
|||
/* Make ref bit sticky for key: [1, tgt_free] */
|
||||
for (stable_key = 1; stable_key <= tgt_free; stable_key++) {
|
||||
/* Mark the ref bit */
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &stable_key,
|
||||
value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd,
|
||||
stable_key, value));
|
||||
}
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
|
|
@ -612,6 +678,198 @@ static void test_lru_sanity6(int map_type, int map_flags, int tgt_free)
|
|||
printf("Pass\n");
|
||||
}
|
||||
|
||||
/* Size of the LRU map is 2
|
||||
* Add key=1 (+1 key)
|
||||
* Add key=2 (+1 key)
|
||||
* Lookup Key=1 (datapath)
|
||||
* Lookup Key=2 (syscall)
|
||||
* Add Key=3
|
||||
* => Key=2 will be removed by LRU
|
||||
* Iterate map. Only found key=1 and key=3
|
||||
*/
|
||||
static void test_lru_sanity7(int map_type, int map_flags)
|
||||
{
|
||||
unsigned long long key, value[nr_cpus];
|
||||
int lru_map_fd, expected_map_fd;
|
||||
int next_cpu = 0;
|
||||
|
||||
printf("%s (map_type:%d map_flags:0x%X): ", __func__, map_type,
|
||||
map_flags);
|
||||
|
||||
assert(sched_next_online(0, &next_cpu) != -1);
|
||||
|
||||
if (map_flags & BPF_F_NO_COMMON_LRU)
|
||||
lru_map_fd = create_map(map_type, map_flags, 2 * nr_cpus);
|
||||
else
|
||||
lru_map_fd = create_map(map_type, map_flags, 2);
|
||||
assert(lru_map_fd != -1);
|
||||
|
||||
expected_map_fd = create_map(BPF_MAP_TYPE_HASH, 0, 2);
|
||||
assert(expected_map_fd != -1);
|
||||
|
||||
value[0] = 1234;
|
||||
|
||||
/* insert key=1 element */
|
||||
|
||||
key = 1;
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
|
||||
/* BPF_NOEXIST means: add new element if it doesn't exist */
|
||||
assert(bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST) == -1
|
||||
/* key=1 already exists */
|
||||
&& errno == EEXIST);
|
||||
|
||||
/* insert key=2 element */
|
||||
|
||||
/* check that key=2 is not found */
|
||||
key = 2;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
/* BPF_EXIST means: update existing element */
|
||||
assert(bpf_map_update_elem(lru_map_fd, &key, value, BPF_EXIST) == -1 &&
|
||||
/* key=2 is not there */
|
||||
errno == ENOENT);
|
||||
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
|
||||
/* insert key=3 element */
|
||||
|
||||
/* check that key=3 is not found */
|
||||
key = 3;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
/* check that key=1 can be found and mark the ref bit to
|
||||
* stop LRU from removing key=1
|
||||
*/
|
||||
key = 1;
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(value[0] == 1234);
|
||||
|
||||
/* check that key=2 can be found and do _not_ mark ref bit.
|
||||
* this will be evicted on next update.
|
||||
*/
|
||||
key = 2;
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(value[0] == 1234);
|
||||
|
||||
key = 3;
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
|
||||
/* key=2 has been removed from the LRU */
|
||||
key = 2;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
assert(map_equal(lru_map_fd, expected_map_fd));
|
||||
|
||||
close(expected_map_fd);
|
||||
close(lru_map_fd);
|
||||
|
||||
printf("Pass\n");
|
||||
}
|
||||
|
||||
/* Size of the LRU map is 2
|
||||
* Add key=1 (+1 key)
|
||||
* Add key=2 (+1 key)
|
||||
* Lookup Key=1 (syscall)
|
||||
* Lookup Key=2 (datapath)
|
||||
* Add Key=3
|
||||
* => Key=1 will be removed by LRU
|
||||
* Iterate map. Only found key=2 and key=3
|
||||
*/
|
||||
static void test_lru_sanity8(int map_type, int map_flags)
|
||||
{
|
||||
unsigned long long key, value[nr_cpus];
|
||||
int lru_map_fd, expected_map_fd;
|
||||
int next_cpu = 0;
|
||||
|
||||
printf("%s (map_type:%d map_flags:0x%X): ", __func__, map_type,
|
||||
map_flags);
|
||||
|
||||
assert(sched_next_online(0, &next_cpu) != -1);
|
||||
|
||||
if (map_flags & BPF_F_NO_COMMON_LRU)
|
||||
lru_map_fd = create_map(map_type, map_flags, 2 * nr_cpus);
|
||||
else
|
||||
lru_map_fd = create_map(map_type, map_flags, 2);
|
||||
assert(lru_map_fd != -1);
|
||||
|
||||
expected_map_fd = create_map(BPF_MAP_TYPE_HASH, 0, 2);
|
||||
assert(expected_map_fd != -1);
|
||||
|
||||
value[0] = 1234;
|
||||
|
||||
/* insert key=1 element */
|
||||
|
||||
key = 1;
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
|
||||
/* BPF_NOEXIST means: add new element if it doesn't exist */
|
||||
assert(bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST) == -1
|
||||
/* key=1 already exists */
|
||||
&& errno == EEXIST);
|
||||
|
||||
/* insert key=2 element */
|
||||
|
||||
/* check that key=2 is not found */
|
||||
key = 2;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
/* BPF_EXIST means: update existing element */
|
||||
assert(bpf_map_update_elem(lru_map_fd, &key, value, BPF_EXIST) == -1 &&
|
||||
/* key=2 is not there */
|
||||
errno == ENOENT);
|
||||
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
|
||||
/* insert key=3 element */
|
||||
|
||||
/* check that key=3 is not found */
|
||||
key = 3;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
/* check that key=1 can be found and do _not_ mark ref bit.
|
||||
* this will be evicted on next update.
|
||||
*/
|
||||
key = 1;
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(value[0] == 1234);
|
||||
|
||||
/* check that key=2 can be found and mark the ref bit to
|
||||
* stop LRU from removing key=2
|
||||
*/
|
||||
key = 2;
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(value[0] == 1234);
|
||||
|
||||
key = 3;
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
|
||||
/* key=1 has been removed from the LRU */
|
||||
key = 1;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
assert(map_equal(lru_map_fd, expected_map_fd));
|
||||
|
||||
close(expected_map_fd);
|
||||
close(lru_map_fd);
|
||||
|
||||
printf("Pass\n");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int map_types[] = {BPF_MAP_TYPE_LRU_HASH,
|
||||
|
|
@ -637,6 +895,8 @@ int main(int argc, char **argv)
|
|||
test_lru_sanity4(map_types[t], map_flags[f], tgt_free);
|
||||
test_lru_sanity5(map_types[t], map_flags[f]);
|
||||
test_lru_sanity6(map_types[t], map_flags[f], tgt_free);
|
||||
test_lru_sanity7(map_types[t], map_flags[f]);
|
||||
test_lru_sanity8(map_types[t], map_flags[f]);
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -430,15 +430,15 @@ setup_xfrm() {
|
|||
veth_a_addr="${2}"
|
||||
veth_b_addr="${3}"
|
||||
|
||||
run_cmd "${ns_a} ip -${proto} xfrm state add src ${veth_a_addr} dst ${veth_b_addr} spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel" || return 1
|
||||
run_cmd "${ns_a} ip -${proto} xfrm state add src ${veth_b_addr} dst ${veth_a_addr} spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel"
|
||||
run_cmd "${ns_a} ip -${proto} xfrm policy add dir out mark 10 tmpl src ${veth_a_addr} dst ${veth_b_addr} proto esp mode tunnel"
|
||||
run_cmd "${ns_a} ip -${proto} xfrm policy add dir in mark 10 tmpl src ${veth_b_addr} dst ${veth_a_addr} proto esp mode tunnel"
|
||||
run_cmd ${ns_a} ip -${proto} xfrm state add src ${veth_a_addr} dst ${veth_b_addr} spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel || return 1
|
||||
run_cmd ${ns_a} ip -${proto} xfrm state add src ${veth_b_addr} dst ${veth_a_addr} spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel
|
||||
run_cmd ${ns_a} ip -${proto} xfrm policy add dir out mark 10 tmpl src ${veth_a_addr} dst ${veth_b_addr} proto esp mode tunnel
|
||||
run_cmd ${ns_a} ip -${proto} xfrm policy add dir in mark 10 tmpl src ${veth_b_addr} dst ${veth_a_addr} proto esp mode tunnel
|
||||
|
||||
run_cmd "${ns_b} ip -${proto} xfrm state add src ${veth_a_addr} dst ${veth_b_addr} spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel"
|
||||
run_cmd "${ns_b} ip -${proto} xfrm state add src ${veth_b_addr} dst ${veth_a_addr} spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel"
|
||||
run_cmd "${ns_b} ip -${proto} xfrm policy add dir out mark 10 tmpl src ${veth_b_addr} dst ${veth_a_addr} proto esp mode tunnel"
|
||||
run_cmd "${ns_b} ip -${proto} xfrm policy add dir in mark 10 tmpl src ${veth_a_addr} dst ${veth_b_addr} proto esp mode tunnel"
|
||||
run_cmd ${ns_b} ip -${proto} xfrm state add src ${veth_a_addr} dst ${veth_b_addr} spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel
|
||||
run_cmd ${ns_b} ip -${proto} xfrm state add src ${veth_b_addr} dst ${veth_a_addr} spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel
|
||||
run_cmd ${ns_b} ip -${proto} xfrm policy add dir out mark 10 tmpl src ${veth_b_addr} dst ${veth_a_addr} proto esp mode tunnel
|
||||
run_cmd ${ns_b} ip -${proto} xfrm policy add dir in mark 10 tmpl src ${veth_a_addr} dst ${veth_b_addr} proto esp mode tunnel
|
||||
}
|
||||
|
||||
setup_xfrm4() {
|
||||
|
|
|
|||
|
|
@ -8,6 +8,11 @@ ksft_skip=4
|
|||
ret=0
|
||||
test_inet_nat=true
|
||||
|
||||
cleanup()
|
||||
{
|
||||
for i in 0 1 2; do ip netns del ns$i;done
|
||||
}
|
||||
|
||||
nft --version > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not run test without nft tool"
|
||||
|
|
@ -21,6 +26,13 @@ if [ $? -ne 0 ];then
|
|||
fi
|
||||
|
||||
ip netns add ns0
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not create net namespace"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
ip netns add ns1
|
||||
ip netns add ns2
|
||||
|
||||
|
|
@ -347,7 +359,7 @@ EOF
|
|||
test_masquerade6()
|
||||
{
|
||||
local family=$1
|
||||
local natflags=$1
|
||||
local natflags=$2
|
||||
local lret=0
|
||||
|
||||
ip netns exec ns0 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null
|
||||
|
|
@ -392,18 +404,13 @@ EOF
|
|||
|
||||
ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1
|
||||
if [ $? -ne 0 ] ; then
|
||||
<<<<<<< HEAD
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active $family masquerading"
|
||||
=======
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active ipv6 masquerade $natflags"
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active $family masquerade $natflags"
|
||||
lret=1
|
||||
fi
|
||||
|
||||
# ns1 should have seen packets from ns0, due to masquerade
|
||||
expect="packets 1 bytes 104"
|
||||
for dir in "in6" "out6" ; do
|
||||
|
||||
cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect")
|
||||
if [ $? -ne 0 ]; then
|
||||
bad_counter ns1 ns0$dir "$expect"
|
||||
|
|
@ -433,38 +440,27 @@ EOF
|
|||
fi
|
||||
done
|
||||
|
||||
<<<<<<< HEAD
|
||||
ip netns exec ns0 nft flush chain $family nat postrouting
|
||||
=======
|
||||
ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active ipv6 masquerade $natflags (attempt 2)"
|
||||
lret=1
|
||||
fi
|
||||
|
||||
ip netns exec ns0 nft flush chain ip6 nat postrouting
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
ip netns exec ns0 nft flush chain $family nat postrouting
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: Could not flush $family nat postrouting" 1>&2
|
||||
lret=1
|
||||
fi
|
||||
|
||||
<<<<<<< HEAD
|
||||
test $lret -eq 0 && echo "PASS: $family IPv6 masquerade for ns2"
|
||||
=======
|
||||
test $lret -eq 0 && echo "PASS: IPv6 masquerade $natflags for ns2"
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
test $lret -eq 0 && echo "PASS: $family IPv6 masquerade $natflags for ns2"
|
||||
|
||||
return $lret
|
||||
}
|
||||
|
||||
test_masquerade()
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
local family=$1
|
||||
=======
|
||||
local natflags=$1
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
local natflags=$2
|
||||
local lret=0
|
||||
|
||||
ip netns exec ns0 sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null
|
||||
|
|
@ -509,11 +505,7 @@ EOF
|
|||
|
||||
ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1
|
||||
if [ $? -ne 0 ] ; then
|
||||
<<<<<<< HEAD
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active $family masquerading"
|
||||
=======
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active ip masquere $natflags"
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active $family masquerade $natflags"
|
||||
lret=1
|
||||
fi
|
||||
|
||||
|
|
@ -549,27 +541,19 @@ EOF
|
|||
fi
|
||||
done
|
||||
|
||||
<<<<<<< HEAD
|
||||
ip netns exec ns0 nft flush chain $family nat postrouting
|
||||
=======
|
||||
ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active ip masquerade $natflags (attempt 2)"
|
||||
lret=1
|
||||
fi
|
||||
|
||||
ip netns exec ns0 nft flush chain ip nat postrouting
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
ip netns exec ns0 nft flush chain $family nat postrouting
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: Could not flush $family nat postrouting" 1>&2
|
||||
lret=1
|
||||
fi
|
||||
|
||||
<<<<<<< HEAD
|
||||
test $lret -eq 0 && echo "PASS: $family IP masquerade for ns2"
|
||||
=======
|
||||
test $lret -eq 0 && echo "PASS: IP masquerade $natflags for ns2"
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
test $lret -eq 0 && echo "PASS: $family IP masquerade $natflags for ns2"
|
||||
|
||||
return $lret
|
||||
}
|
||||
|
|
@ -842,21 +826,14 @@ reset_counters
|
|||
$test_inet_nat && test_local_dnat inet
|
||||
$test_inet_nat && test_local_dnat6 inet
|
||||
|
||||
for flags in "" "fully-random"; do
|
||||
reset_counters
|
||||
<<<<<<< HEAD
|
||||
test_masquerade ip
|
||||
test_masquerade6 ip6
|
||||
test_masquerade ip $flags
|
||||
test_masquerade6 ip6 $flags
|
||||
reset_counters
|
||||
$test_inet_nat && test_masquerade inet
|
||||
$test_inet_nat && test_masquerade6 inet
|
||||
=======
|
||||
test_masquerade ""
|
||||
test_masquerade6 ""
|
||||
|
||||
reset_counters
|
||||
test_masquerade "fully-random"
|
||||
test_masquerade6 "fully-random"
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
$test_inet_nat && test_masquerade inet $flags
|
||||
$test_inet_nat && test_masquerade6 inet $flags
|
||||
done
|
||||
|
||||
reset_counters
|
||||
test_redirect ip
|
||||
|
|
@ -865,6 +842,4 @@ reset_counters
|
|||
$test_inet_nat && test_redirect inet
|
||||
$test_inet_nat && test_redirect6 inet
|
||||
|
||||
for i in 0 1 2; do ip netns del ns$i;done
|
||||
|
||||
exit $ret
|
||||
|
|
|
|||
Loading…
Reference in a new issue