mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
All conflicts seemed rather trivial, with some guidance from Saeed Mameed on the tc_ct.c one. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -82,7 +82,9 @@ def build_tests(linux: kunit_kernel.LinuxSourceTree,
|
||||
request.make_options)
|
||||
build_end = time.time()
|
||||
if not success:
|
||||
return KunitResult(KunitStatus.BUILD_FAILURE, 'could not build kernel')
|
||||
return KunitResult(KunitStatus.BUILD_FAILURE,
|
||||
'could not build kernel',
|
||||
build_end - build_start)
|
||||
if not success:
|
||||
return KunitResult(KunitStatus.BUILD_FAILURE,
|
||||
'could not build kernel',
|
||||
|
||||
@@ -10,7 +10,7 @@ import collections
|
||||
import re
|
||||
|
||||
CONFIG_IS_NOT_SET_PATTERN = r'^# CONFIG_(\w+) is not set$'
|
||||
CONFIG_PATTERN = r'^CONFIG_(\w+)=(\S+)$'
|
||||
CONFIG_PATTERN = r'^CONFIG_(\w+)=(\S+|".*")$'
|
||||
|
||||
KconfigEntryBase = collections.namedtuple('KconfigEntry', ['name', 'value'])
|
||||
|
||||
|
||||
@@ -265,11 +265,9 @@ def bubble_up_suite_errors(test_suite_list: List[TestSuite]) -> TestStatus:
|
||||
return bubble_up_errors(lambda x: x.status, test_suite_list)
|
||||
|
||||
def parse_test_result(lines: List[str]) -> TestResult:
|
||||
if not lines:
|
||||
return TestResult(TestStatus.NO_TESTS, [], lines)
|
||||
consume_non_diagnositic(lines)
|
||||
if not parse_tap_header(lines):
|
||||
return None
|
||||
if not lines or not parse_tap_header(lines):
|
||||
return TestResult(TestStatus.NO_TESTS, [], lines)
|
||||
test_suites = []
|
||||
test_suite = parse_test_suite(lines)
|
||||
while test_suite:
|
||||
@@ -282,6 +280,8 @@ def parse_run_tests(kernel_output) -> TestResult:
|
||||
failed_tests = 0
|
||||
crashed_tests = 0
|
||||
test_result = parse_test_result(list(isolate_kunit_output(kernel_output)))
|
||||
if test_result.status == TestStatus.NO_TESTS:
|
||||
print_with_timestamp(red('[ERROR] ') + 'no kunit output detected')
|
||||
for test_suite in test_result.suites:
|
||||
if test_suite.status == TestStatus.SUCCESS:
|
||||
print_suite_divider(green('[PASSED] ') + test_suite.name)
|
||||
|
||||
@@ -170,6 +170,17 @@ class KUnitParserTest(unittest.TestCase):
|
||||
result.status)
|
||||
file.close()
|
||||
|
||||
def test_no_kunit_output(self):
|
||||
crash_log = get_absolute_path(
|
||||
'test_data/test_insufficient_memory.log')
|
||||
file = open(crash_log)
|
||||
print_mock = mock.patch('builtins.print').start()
|
||||
result = kunit_parser.parse_run_tests(
|
||||
kunit_parser.isolate_kunit_output(file.readlines()))
|
||||
print_mock.assert_any_call(StrContains("no kunit output detected"))
|
||||
print_mock.stop()
|
||||
file.close()
|
||||
|
||||
def test_crashed_test(self):
|
||||
crashed_log = get_absolute_path(
|
||||
'test_data/test_is_test_passed-crash.log')
|
||||
|
||||
@@ -21,10 +21,6 @@ include ../../lib.mk
|
||||
$(TEST_GEN_PROGS): $(PROGS)
|
||||
cp $(PROGS) $(OUTPUT)/
|
||||
|
||||
clean:
|
||||
$(CLEAN)
|
||||
rm -f $(PROGS)
|
||||
|
||||
# Common test-unit targets to build common-layout test-cases executables
|
||||
# Needs secondary expansion to properly include the testcase c-file in pre-reqs
|
||||
.SECONDEXPANSION:
|
||||
|
||||
@@ -36,7 +36,7 @@ void test_fentry_fexit(void)
|
||||
fentry_res = (__u64 *)fentry_skel->bss;
|
||||
fexit_res = (__u64 *)fexit_skel->bss;
|
||||
printf("%lld\n", fentry_skel->bss->test1_result);
|
||||
for (i = 0; i < 6; i++) {
|
||||
for (i = 0; i < 8; i++) {
|
||||
CHECK(fentry_res[i] != 1, "result",
|
||||
"fentry_test%d failed err %lld\n", i + 1, fentry_res[i]);
|
||||
CHECK(fexit_res[i] != 1, "result",
|
||||
|
||||
@@ -527,8 +527,8 @@ static void test_skb_less_prog_attach(struct bpf_flow *skel, int tap_fd)
|
||||
|
||||
run_tests_skb_less(tap_fd, skel->maps.last_dissection);
|
||||
|
||||
err = bpf_prog_detach(prog_fd, BPF_FLOW_DISSECTOR);
|
||||
CHECK(err, "bpf_prog_detach", "err %d errno %d\n", err, errno);
|
||||
err = bpf_prog_detach2(prog_fd, 0, BPF_FLOW_DISSECTOR);
|
||||
CHECK(err, "bpf_prog_detach2", "err %d errno %d\n", err, errno);
|
||||
}
|
||||
|
||||
static void test_skb_less_link_create(struct bpf_flow *skel, int tap_fd)
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Test that the flow_dissector program can be updated with a single
|
||||
* syscall by attaching a new program that replaces the existing one.
|
||||
*
|
||||
* Corner case - the same program cannot be attached twice.
|
||||
* Tests for attaching, detaching, and replacing flow_dissector BPF program.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
@@ -116,7 +113,7 @@ static void test_prog_attach_prog_attach(int netns, int prog1, int prog2)
|
||||
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog2));
|
||||
|
||||
out_detach:
|
||||
err = bpf_prog_detach(0, BPF_FLOW_DISSECTOR);
|
||||
err = bpf_prog_detach2(prog2, 0, BPF_FLOW_DISSECTOR);
|
||||
if (CHECK_FAIL(err))
|
||||
perror("bpf_prog_detach");
|
||||
CHECK_FAIL(prog_is_attached(netns));
|
||||
@@ -152,7 +149,7 @@ static void test_prog_attach_link_create(int netns, int prog1, int prog2)
|
||||
DECLARE_LIBBPF_OPTS(bpf_link_create_opts, opts);
|
||||
int err, link;
|
||||
|
||||
err = bpf_prog_attach(prog1, -1, BPF_FLOW_DISSECTOR, 0);
|
||||
err = bpf_prog_attach(prog1, 0, BPF_FLOW_DISSECTOR, 0);
|
||||
if (CHECK_FAIL(err)) {
|
||||
perror("bpf_prog_attach(prog1)");
|
||||
return;
|
||||
@@ -168,7 +165,7 @@ static void test_prog_attach_link_create(int netns, int prog1, int prog2)
|
||||
close(link);
|
||||
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
|
||||
|
||||
err = bpf_prog_detach(-1, BPF_FLOW_DISSECTOR);
|
||||
err = bpf_prog_detach2(prog1, 0, BPF_FLOW_DISSECTOR);
|
||||
if (CHECK_FAIL(err))
|
||||
perror("bpf_prog_detach");
|
||||
CHECK_FAIL(prog_is_attached(netns));
|
||||
@@ -188,7 +185,7 @@ static void test_link_create_prog_attach(int netns, int prog1, int prog2)
|
||||
|
||||
/* Expect failure attaching prog when link exists */
|
||||
errno = 0;
|
||||
err = bpf_prog_attach(prog2, -1, BPF_FLOW_DISSECTOR, 0);
|
||||
err = bpf_prog_attach(prog2, 0, BPF_FLOW_DISSECTOR, 0);
|
||||
if (CHECK_FAIL(!err || errno != EEXIST))
|
||||
perror("bpf_prog_attach(prog2) expected EEXIST");
|
||||
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
|
||||
@@ -211,7 +208,7 @@ static void test_link_create_prog_detach(int netns, int prog1, int prog2)
|
||||
|
||||
/* Expect failure detaching prog when link exists */
|
||||
errno = 0;
|
||||
err = bpf_prog_detach(-1, BPF_FLOW_DISSECTOR);
|
||||
err = bpf_prog_detach2(prog1, 0, BPF_FLOW_DISSECTOR);
|
||||
if (CHECK_FAIL(!err || errno != EINVAL))
|
||||
perror("bpf_prog_detach expected EINVAL");
|
||||
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
|
||||
@@ -231,7 +228,7 @@ static void test_prog_attach_detach_query(int netns, int prog1, int prog2)
|
||||
}
|
||||
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
|
||||
|
||||
err = bpf_prog_detach(0, BPF_FLOW_DISSECTOR);
|
||||
err = bpf_prog_detach2(prog1, 0, BPF_FLOW_DISSECTOR);
|
||||
if (CHECK_FAIL(err)) {
|
||||
perror("bpf_prog_detach");
|
||||
return;
|
||||
@@ -308,6 +305,31 @@ static void test_link_update_replace_old_prog(int netns, int prog1, int prog2)
|
||||
CHECK_FAIL(prog_is_attached(netns));
|
||||
}
|
||||
|
||||
static void test_link_update_same_prog(int netns, int prog1, int prog2)
|
||||
{
|
||||
DECLARE_LIBBPF_OPTS(bpf_link_create_opts, create_opts);
|
||||
DECLARE_LIBBPF_OPTS(bpf_link_update_opts, update_opts);
|
||||
int err, link;
|
||||
|
||||
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &create_opts);
|
||||
if (CHECK_FAIL(link < 0)) {
|
||||
perror("bpf_link_create(prog1)");
|
||||
return;
|
||||
}
|
||||
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
|
||||
|
||||
/* Expect success updating the prog with the same one */
|
||||
update_opts.flags = 0;
|
||||
update_opts.old_prog_fd = 0;
|
||||
err = bpf_link_update(link, prog1, &update_opts);
|
||||
if (CHECK_FAIL(err))
|
||||
perror("bpf_link_update");
|
||||
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
|
||||
|
||||
close(link);
|
||||
CHECK_FAIL(prog_is_attached(netns));
|
||||
}
|
||||
|
||||
static void test_link_update_invalid_opts(int netns, int prog1, int prog2)
|
||||
{
|
||||
DECLARE_LIBBPF_OPTS(bpf_link_create_opts, create_opts);
|
||||
@@ -571,6 +593,8 @@ static void run_tests(int netns)
|
||||
test_link_update_no_old_prog },
|
||||
{ "link update with replace old prog",
|
||||
test_link_update_replace_old_prog },
|
||||
{ "link update with same prog",
|
||||
test_link_update_same_prog },
|
||||
{ "link update invalid opts",
|
||||
test_link_update_invalid_opts },
|
||||
{ "link update invalid prog",
|
||||
|
||||
@@ -7,7 +7,21 @@
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
||||
static inline struct inode *SOCK_INODE(struct socket *socket)
|
||||
#define sk_rmem_alloc sk_backlog.rmem_alloc
|
||||
#define sk_refcnt __sk_common.skc_refcnt
|
||||
|
||||
struct bpf_iter_meta {
|
||||
struct seq_file *seq;
|
||||
__u64 session_id;
|
||||
__u64 seq_num;
|
||||
} __attribute__((preserve_access_index));
|
||||
|
||||
struct bpf_iter__netlink {
|
||||
struct bpf_iter_meta *meta;
|
||||
struct netlink_sock *sk;
|
||||
} __attribute__((preserve_access_index));
|
||||
|
||||
static __attribute__((noinline)) struct inode *SOCK_INODE(struct socket *socket)
|
||||
{
|
||||
return &container_of(socket, struct socket_alloc, socket)->vfs_inode;
|
||||
}
|
||||
|
||||
@@ -55,3 +55,25 @@ int BPF_PROG(test6, __u64 a, void *b, short c, int d, void * e, __u64 f)
|
||||
e == (void *)20 && f == 21;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct bpf_fentry_test_t {
|
||||
struct bpf_fentry_test_t *a;
|
||||
};
|
||||
|
||||
__u64 test7_result = 0;
|
||||
SEC("fentry/bpf_fentry_test7")
|
||||
int BPF_PROG(test7, struct bpf_fentry_test_t *arg)
|
||||
{
|
||||
if (arg == 0)
|
||||
test7_result = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
__u64 test8_result = 0;
|
||||
SEC("fentry/bpf_fentry_test8")
|
||||
int BPF_PROG(test8, struct bpf_fentry_test_t *arg)
|
||||
{
|
||||
if (arg->a == 0)
|
||||
test8_result = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -56,3 +56,25 @@ int BPF_PROG(test6, __u64 a, void *b, short c, int d, void *e, __u64 f, int ret)
|
||||
e == (void *)20 && f == 21 && ret == 111;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct bpf_fentry_test_t {
|
||||
struct bpf_fentry_test *a;
|
||||
};
|
||||
|
||||
__u64 test7_result = 0;
|
||||
SEC("fexit/bpf_fentry_test7")
|
||||
int BPF_PROG(test7, struct bpf_fentry_test_t *arg)
|
||||
{
|
||||
if (arg == 0)
|
||||
test7_result = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
__u64 test8_result = 0;
|
||||
SEC("fexit/bpf_fentry_test8")
|
||||
int BPF_PROG(test8, struct bpf_fentry_test_t *arg)
|
||||
{
|
||||
if (arg->a == 0)
|
||||
test8_result = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ struct {
|
||||
|
||||
struct {
|
||||
__uint(type, BPF_MAP_TYPE_ARRAY);
|
||||
__uint(max_entries, 2);
|
||||
__uint(max_entries, 3);
|
||||
__type(key, int);
|
||||
__type(value, int);
|
||||
} sock_skb_opts SEC(".maps");
|
||||
@@ -94,6 +94,12 @@ struct {
|
||||
SEC("sk_skb1")
|
||||
int bpf_prog1(struct __sk_buff *skb)
|
||||
{
|
||||
int *f, two = 2;
|
||||
|
||||
f = bpf_map_lookup_elem(&sock_skb_opts, &two);
|
||||
if (f && *f) {
|
||||
return *f;
|
||||
}
|
||||
return skb->len;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ int xdp_dummy_prog(struct xdp_md *ctx)
|
||||
/* valid program on DEVMAP entry via SEC name;
|
||||
* has access to egress and ingress ifindex
|
||||
*/
|
||||
SEC("xdp_devmap")
|
||||
SEC("xdp_devmap/map_prog")
|
||||
int xdp_dummy_dm(struct xdp_md *ctx)
|
||||
{
|
||||
char fmt[] = "devmap redirect: dev %u -> dev %u len %u\n";
|
||||
|
||||
@@ -789,19 +789,19 @@ static void test_sockmap(unsigned int tasks, void *data)
|
||||
}
|
||||
|
||||
err = bpf_prog_detach(fd, BPF_SK_SKB_STREAM_PARSER);
|
||||
if (err) {
|
||||
if (!err) {
|
||||
printf("Failed empty parser prog detach\n");
|
||||
goto out_sockmap;
|
||||
}
|
||||
|
||||
err = bpf_prog_detach(fd, BPF_SK_SKB_STREAM_VERDICT);
|
||||
if (err) {
|
||||
if (!err) {
|
||||
printf("Failed empty verdict prog detach\n");
|
||||
goto out_sockmap;
|
||||
}
|
||||
|
||||
err = bpf_prog_detach(fd, BPF_SK_MSG_VERDICT);
|
||||
if (err) {
|
||||
if (!err) {
|
||||
printf("Failed empty msg verdict prog detach\n");
|
||||
goto out_sockmap;
|
||||
}
|
||||
@@ -1090,19 +1090,19 @@ static void test_sockmap(unsigned int tasks, void *data)
|
||||
assert(status == 0);
|
||||
}
|
||||
|
||||
err = bpf_prog_detach(map_fd_rx, __MAX_BPF_ATTACH_TYPE);
|
||||
err = bpf_prog_detach2(parse_prog, map_fd_rx, __MAX_BPF_ATTACH_TYPE);
|
||||
if (!err) {
|
||||
printf("Detached an invalid prog type.\n");
|
||||
goto out_sockmap;
|
||||
}
|
||||
|
||||
err = bpf_prog_detach(map_fd_rx, BPF_SK_SKB_STREAM_PARSER);
|
||||
err = bpf_prog_detach2(parse_prog, map_fd_rx, BPF_SK_SKB_STREAM_PARSER);
|
||||
if (err) {
|
||||
printf("Failed parser prog detach\n");
|
||||
goto out_sockmap;
|
||||
}
|
||||
|
||||
err = bpf_prog_detach(map_fd_rx, BPF_SK_SKB_STREAM_VERDICT);
|
||||
err = bpf_prog_detach2(verdict_prog, map_fd_rx, BPF_SK_SKB_STREAM_VERDICT);
|
||||
if (err) {
|
||||
printf("Failed parser prog detach\n");
|
||||
goto out_sockmap;
|
||||
|
||||
@@ -85,6 +85,7 @@ int txmsg_ktls_skb_drop;
|
||||
int txmsg_ktls_skb_redir;
|
||||
int ktls;
|
||||
int peek_flag;
|
||||
int skb_use_parser;
|
||||
|
||||
static const struct option long_options[] = {
|
||||
{"help", no_argument, NULL, 'h' },
|
||||
@@ -174,6 +175,7 @@ static void test_reset(void)
|
||||
txmsg_apply = txmsg_cork = 0;
|
||||
txmsg_ingress = txmsg_redir_skb = 0;
|
||||
txmsg_ktls_skb = txmsg_ktls_skb_drop = txmsg_ktls_skb_redir = 0;
|
||||
skb_use_parser = 0;
|
||||
}
|
||||
|
||||
static int test_start_subtest(const struct _test *t, struct sockmap_options *o)
|
||||
@@ -1211,6 +1213,11 @@ run:
|
||||
}
|
||||
}
|
||||
|
||||
if (skb_use_parser) {
|
||||
i = 2;
|
||||
err = bpf_map_update_elem(map_fd[7], &i, &skb_use_parser, BPF_ANY);
|
||||
}
|
||||
|
||||
if (txmsg_drop)
|
||||
options->drop_expected = true;
|
||||
|
||||
@@ -1650,6 +1657,16 @@ static void test_txmsg_cork(int cgrp, struct sockmap_options *opt)
|
||||
test_send(opt, cgrp);
|
||||
}
|
||||
|
||||
static void test_txmsg_ingress_parser(int cgrp, struct sockmap_options *opt)
|
||||
{
|
||||
txmsg_pass = 1;
|
||||
skb_use_parser = 512;
|
||||
opt->iov_length = 256;
|
||||
opt->iov_count = 1;
|
||||
opt->rate = 2;
|
||||
test_exec(cgrp, opt);
|
||||
}
|
||||
|
||||
char *map_names[] = {
|
||||
"sock_map",
|
||||
"sock_map_txmsg",
|
||||
@@ -1748,6 +1765,7 @@ struct _test test[] = {
|
||||
{"txmsg test pull-data", test_txmsg_pull},
|
||||
{"txmsg test pop-data", test_txmsg_pop},
|
||||
{"txmsg test push/pop data", test_txmsg_push_pop},
|
||||
{"txmsg text ingress parser", test_txmsg_ingress_parser},
|
||||
};
|
||||
|
||||
static int check_whitelist(struct _test *t, struct sockmap_options *opt)
|
||||
|
||||
@@ -63,6 +63,8 @@ ALL_TESTS="$ALL_TESTS 0008:150:1"
|
||||
ALL_TESTS="$ALL_TESTS 0009:150:1"
|
||||
ALL_TESTS="$ALL_TESTS 0010:1:1"
|
||||
ALL_TESTS="$ALL_TESTS 0011:1:1"
|
||||
ALL_TESTS="$ALL_TESTS 0012:1:1"
|
||||
ALL_TESTS="$ALL_TESTS 0013:1:1"
|
||||
|
||||
# Kselftest framework requirement - SKIP code is 4.
|
||||
ksft_skip=4
|
||||
@@ -470,6 +472,38 @@ kmod_test_0011()
|
||||
echo "$MODPROBE" > /proc/sys/kernel/modprobe
|
||||
}
|
||||
|
||||
kmod_check_visibility()
|
||||
{
|
||||
local name="$1"
|
||||
local cmd="$2"
|
||||
|
||||
modprobe $DEFAULT_KMOD_DRIVER
|
||||
|
||||
local priv=$(eval $cmd)
|
||||
local unpriv=$(capsh --drop=CAP_SYSLOG -- -c "$cmd")
|
||||
|
||||
if [ "$priv" = "$unpriv" ] || \
|
||||
[ "${priv:0:3}" = "0x0" ] || \
|
||||
[ "${unpriv:0:3}" != "0x0" ] ; then
|
||||
echo "${FUNCNAME[0]}: FAIL, $name visible to unpriv: '$priv' vs '$unpriv'" >&2
|
||||
exit 1
|
||||
else
|
||||
echo "${FUNCNAME[0]}: OK!"
|
||||
fi
|
||||
}
|
||||
|
||||
kmod_test_0012()
|
||||
{
|
||||
kmod_check_visibility /proc/modules \
|
||||
"grep '^${DEFAULT_KMOD_DRIVER}\b' /proc/modules | awk '{print \$NF}'"
|
||||
}
|
||||
|
||||
kmod_test_0013()
|
||||
{
|
||||
kmod_check_visibility '/sys/module/*/sections/*' \
|
||||
"cat /sys/module/${DEFAULT_KMOD_DRIVER}/sections/.*text | head -n1"
|
||||
}
|
||||
|
||||
list_tests()
|
||||
{
|
||||
echo "Test ID list:"
|
||||
@@ -489,6 +523,8 @@ list_tests()
|
||||
echo "0009 x $(get_test_count 0009) - multithreaded - push kmod_concurrent over max_modprobes for get_fs_type()"
|
||||
echo "0010 x $(get_test_count 0010) - test nonexistent modprobe path"
|
||||
echo "0011 x $(get_test_count 0011) - test completely disabling module autoloading"
|
||||
echo "0012 x $(get_test_count 0012) - test /proc/modules address visibility under CAP_SYSLOG"
|
||||
echo "0013 x $(get_test_count 0013) - test /sys/module/*/sections/* visibility under CAP_SYSLOG"
|
||||
}
|
||||
|
||||
usage()
|
||||
|
||||
@@ -36,7 +36,7 @@ struct ksft_count {
|
||||
static struct ksft_count ksft_cnt;
|
||||
static unsigned int ksft_plan;
|
||||
|
||||
static inline int ksft_test_num(void)
|
||||
static inline unsigned int ksft_test_num(void)
|
||||
{
|
||||
return ksft_cnt.ksft_pass + ksft_cnt.ksft_fail +
|
||||
ksft_cnt.ksft_xfail + ksft_cnt.ksft_xpass +
|
||||
|
||||
@@ -747,6 +747,19 @@ ipv6_fcnal_runtime()
|
||||
run_cmd "$IP nexthop add id 86 via 2001:db8:91::2 dev veth1"
|
||||
run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81"
|
||||
|
||||
# rpfilter and default route
|
||||
$IP nexthop flush >/dev/null 2>&1
|
||||
run_cmd "ip netns exec me ip6tables -t mangle -I PREROUTING 1 -m rpfilter --invert -j DROP"
|
||||
run_cmd "$IP nexthop add id 91 via 2001:db8:91::2 dev veth1"
|
||||
run_cmd "$IP nexthop add id 92 via 2001:db8:92::2 dev veth3"
|
||||
run_cmd "$IP nexthop add id 93 group 91/92"
|
||||
run_cmd "$IP -6 ro add default nhid 91"
|
||||
run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1"
|
||||
log_test $? 0 "Nexthop with default route and rpfilter"
|
||||
run_cmd "$IP -6 ro replace default nhid 93"
|
||||
run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1"
|
||||
log_test $? 0 "Nexthop with multipath default route and rpfilter"
|
||||
|
||||
# TO-DO:
|
||||
# existing route with old nexthop; append route with new nexthop
|
||||
# existing route with old nexthop; replace route with new
|
||||
|
||||
@@ -7,7 +7,7 @@ noarg:
|
||||
# The EBB handler is 64-bit code and everything links against it
|
||||
CFLAGS += -m64
|
||||
|
||||
TMPOUT = $(OUTPUT)/
|
||||
TMPOUT = $(OUTPUT)/TMPDIR/
|
||||
# Toolchains may build PIE by default which breaks the assembly
|
||||
no-pie-option := $(call try-run, echo 'int main() { return 0; }' | \
|
||||
$(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -no-pie -x c - -o "$$TMP", -no-pie)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user