Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
drivers/net/ethernet/freescale/fec.h7d650df99d("net: fec: add pm_qos support on imx6q platform")40c79ce13b("net: fec: add stop mode support for imx8 platform") Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
@@ -754,7 +754,7 @@ void vm_install_exception_handler(struct kvm_vm *vm, int vector,
|
||||
void (*handler)(struct ex_regs *));
|
||||
|
||||
/* If a toddler were to say "abracadabra". */
|
||||
#define KVM_EXCEPTION_MAGIC 0xabacadabaull
|
||||
#define KVM_EXCEPTION_MAGIC 0xabacadabaULL
|
||||
|
||||
/*
|
||||
* KVM selftest exception fixup uses registers to coordinate with the exception
|
||||
@@ -786,7 +786,7 @@ void vm_install_exception_handler(struct kvm_vm *vm, int vector,
|
||||
"lea 1f(%%rip), %%r10\n\t" \
|
||||
"lea 2f(%%rip), %%r11\n\t" \
|
||||
"1: " insn "\n\t" \
|
||||
"mov $0, %[vector]\n\t" \
|
||||
"movb $0, %[vector]\n\t" \
|
||||
"jmp 3f\n\t" \
|
||||
"2:\n\t" \
|
||||
"mov %%r9b, %[vector]\n\t" \
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* Copyright © 2017-2020 Mickaël Salaün <mic@digikod.net>
|
||||
* Copyright © 2020 ANSSI
|
||||
* Copyright © 2020-2021 Microsoft Corporation
|
||||
* Copyright © 2020-2022 Microsoft Corporation
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
@@ -371,6 +371,13 @@ TEST_F_FORK(layout1, inval)
|
||||
ASSERT_EQ(EINVAL, errno);
|
||||
path_beneath.allowed_access &= ~LANDLOCK_ACCESS_FS_EXECUTE;
|
||||
|
||||
/* Tests with denied-by-default access right. */
|
||||
path_beneath.allowed_access |= LANDLOCK_ACCESS_FS_REFER;
|
||||
ASSERT_EQ(-1, landlock_add_rule(ruleset_fd, LANDLOCK_RULE_PATH_BENEATH,
|
||||
&path_beneath, 0));
|
||||
ASSERT_EQ(EINVAL, errno);
|
||||
path_beneath.allowed_access &= ~LANDLOCK_ACCESS_FS_REFER;
|
||||
|
||||
/* Test with unknown (64-bits) value. */
|
||||
path_beneath.allowed_access |= (1ULL << 60);
|
||||
ASSERT_EQ(-1, landlock_add_rule(ruleset_fd, LANDLOCK_RULE_PATH_BENEATH,
|
||||
@@ -1826,6 +1833,20 @@ TEST_F_FORK(layout1, link)
|
||||
ASSERT_EQ(0, link(file1_s1d3, file2_s1d3));
|
||||
}
|
||||
|
||||
static int test_rename(const char *const oldpath, const char *const newpath)
|
||||
{
|
||||
if (rename(oldpath, newpath))
|
||||
return errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test_exchange(const char *const oldpath, const char *const newpath)
|
||||
{
|
||||
if (renameat2(AT_FDCWD, oldpath, AT_FDCWD, newpath, RENAME_EXCHANGE))
|
||||
return errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
TEST_F_FORK(layout1, rename_file)
|
||||
{
|
||||
const struct rule rules[] = {
|
||||
@@ -1867,10 +1888,10 @@ TEST_F_FORK(layout1, rename_file)
|
||||
* to a different directory (which allows file removal).
|
||||
*/
|
||||
ASSERT_EQ(-1, rename(file1_s2d1, file1_s1d3));
|
||||
ASSERT_EQ(EXDEV, errno);
|
||||
ASSERT_EQ(EACCES, errno);
|
||||
ASSERT_EQ(-1, renameat2(AT_FDCWD, file1_s2d1, AT_FDCWD, file1_s1d3,
|
||||
RENAME_EXCHANGE));
|
||||
ASSERT_EQ(EXDEV, errno);
|
||||
ASSERT_EQ(EACCES, errno);
|
||||
ASSERT_EQ(-1, renameat2(AT_FDCWD, dir_s2d2, AT_FDCWD, file1_s1d3,
|
||||
RENAME_EXCHANGE));
|
||||
ASSERT_EQ(EXDEV, errno);
|
||||
@@ -1894,7 +1915,7 @@ TEST_F_FORK(layout1, rename_file)
|
||||
ASSERT_EQ(EXDEV, errno);
|
||||
ASSERT_EQ(0, unlink(file1_s1d3));
|
||||
ASSERT_EQ(-1, rename(file1_s2d1, file1_s1d3));
|
||||
ASSERT_EQ(EXDEV, errno);
|
||||
ASSERT_EQ(EACCES, errno);
|
||||
|
||||
/* Exchanges and renames files with same parent. */
|
||||
ASSERT_EQ(0, renameat2(AT_FDCWD, file2_s2d3, AT_FDCWD, file1_s2d3,
|
||||
@@ -2014,6 +2035,115 @@ TEST_F_FORK(layout1, reparent_refer)
|
||||
ASSERT_EQ(0, rename(dir_s1d3, dir_s2d3));
|
||||
}
|
||||
|
||||
/* Checks renames beneath dir_s1d1. */
|
||||
static void refer_denied_by_default(struct __test_metadata *const _metadata,
|
||||
const struct rule layer1[],
|
||||
const int layer1_err,
|
||||
const struct rule layer2[])
|
||||
{
|
||||
int ruleset_fd;
|
||||
|
||||
ASSERT_EQ(0, unlink(file1_s1d2));
|
||||
|
||||
ruleset_fd = create_ruleset(_metadata, layer1[0].access, layer1);
|
||||
ASSERT_LE(0, ruleset_fd);
|
||||
enforce_ruleset(_metadata, ruleset_fd);
|
||||
ASSERT_EQ(0, close(ruleset_fd));
|
||||
|
||||
/*
|
||||
* If the first layer handles LANDLOCK_ACCESS_FS_REFER (according to
|
||||
* layer1_err), then it allows some different-parent renames and links.
|
||||
*/
|
||||
ASSERT_EQ(layer1_err, test_rename(file1_s1d1, file1_s1d2));
|
||||
if (layer1_err == 0)
|
||||
ASSERT_EQ(layer1_err, test_rename(file1_s1d2, file1_s1d1));
|
||||
ASSERT_EQ(layer1_err, test_exchange(file2_s1d1, file2_s1d2));
|
||||
ASSERT_EQ(layer1_err, test_exchange(file2_s1d2, file2_s1d1));
|
||||
|
||||
ruleset_fd = create_ruleset(_metadata, layer2[0].access, layer2);
|
||||
ASSERT_LE(0, ruleset_fd);
|
||||
enforce_ruleset(_metadata, ruleset_fd);
|
||||
ASSERT_EQ(0, close(ruleset_fd));
|
||||
|
||||
/*
|
||||
* Now, either the first or the second layer does not handle
|
||||
* LANDLOCK_ACCESS_FS_REFER, which means that any different-parent
|
||||
* renames and links are denied, thus making the layer handling
|
||||
* LANDLOCK_ACCESS_FS_REFER null and void.
|
||||
*/
|
||||
ASSERT_EQ(EXDEV, test_rename(file1_s1d1, file1_s1d2));
|
||||
ASSERT_EQ(EXDEV, test_exchange(file2_s1d1, file2_s1d2));
|
||||
ASSERT_EQ(EXDEV, test_exchange(file2_s1d2, file2_s1d1));
|
||||
}
|
||||
|
||||
const struct rule layer_dir_s1d1_refer[] = {
|
||||
{
|
||||
.path = dir_s1d1,
|
||||
.access = LANDLOCK_ACCESS_FS_REFER,
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
const struct rule layer_dir_s1d1_execute[] = {
|
||||
{
|
||||
/* Matches a parent directory. */
|
||||
.path = dir_s1d1,
|
||||
.access = LANDLOCK_ACCESS_FS_EXECUTE,
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
const struct rule layer_dir_s2d1_execute[] = {
|
||||
{
|
||||
/* Does not match a parent directory. */
|
||||
.path = dir_s2d1,
|
||||
.access = LANDLOCK_ACCESS_FS_EXECUTE,
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
/*
|
||||
* Tests precedence over renames: denied by default for different parent
|
||||
* directories, *with* a rule matching a parent directory, but not directly
|
||||
* denying access (with MAKE_REG nor REMOVE).
|
||||
*/
|
||||
TEST_F_FORK(layout1, refer_denied_by_default1)
|
||||
{
|
||||
refer_denied_by_default(_metadata, layer_dir_s1d1_refer, 0,
|
||||
layer_dir_s1d1_execute);
|
||||
}
|
||||
|
||||
/*
|
||||
* Same test but this time turning around the ABI version order: the first
|
||||
* layer does not handle LANDLOCK_ACCESS_FS_REFER.
|
||||
*/
|
||||
TEST_F_FORK(layout1, refer_denied_by_default2)
|
||||
{
|
||||
refer_denied_by_default(_metadata, layer_dir_s1d1_execute, EXDEV,
|
||||
layer_dir_s1d1_refer);
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests precedence over renames: denied by default for different parent
|
||||
* directories, *without* a rule matching a parent directory, but not directly
|
||||
* denying access (with MAKE_REG nor REMOVE).
|
||||
*/
|
||||
TEST_F_FORK(layout1, refer_denied_by_default3)
|
||||
{
|
||||
refer_denied_by_default(_metadata, layer_dir_s1d1_refer, 0,
|
||||
layer_dir_s2d1_execute);
|
||||
}
|
||||
|
||||
/*
|
||||
* Same test but this time turning around the ABI version order: the first
|
||||
* layer does not handle LANDLOCK_ACCESS_FS_REFER.
|
||||
*/
|
||||
TEST_F_FORK(layout1, refer_denied_by_default4)
|
||||
{
|
||||
refer_denied_by_default(_metadata, layer_dir_s2d1_execute, EXDEV,
|
||||
layer_dir_s1d1_refer);
|
||||
}
|
||||
|
||||
TEST_F_FORK(layout1, reparent_link)
|
||||
{
|
||||
const struct rule layer1[] = {
|
||||
@@ -2336,11 +2466,12 @@ TEST_F_FORK(layout1, reparent_exdev_layers_rename1)
|
||||
ASSERT_EQ(EXDEV, errno);
|
||||
|
||||
/*
|
||||
* However, moving the file2_s1d3 file below dir_s2d3 is allowed
|
||||
* because it cannot inherit MAKE_REG nor MAKE_DIR rights (which are
|
||||
* dedicated to directories).
|
||||
* Moving the file2_s1d3 file below dir_s2d3 is denied because the
|
||||
* second layer does not handle REFER, which is always denied by
|
||||
* default.
|
||||
*/
|
||||
ASSERT_EQ(0, rename(file2_s1d3, file1_s2d3));
|
||||
ASSERT_EQ(-1, rename(file2_s1d3, file1_s2d3));
|
||||
ASSERT_EQ(EXDEV, errno);
|
||||
}
|
||||
|
||||
TEST_F_FORK(layout1, reparent_exdev_layers_rename2)
|
||||
@@ -2373,8 +2504,12 @@ TEST_F_FORK(layout1, reparent_exdev_layers_rename2)
|
||||
ASSERT_EQ(EACCES, errno);
|
||||
ASSERT_EQ(-1, rename(file1_s1d1, file1_s2d3));
|
||||
ASSERT_EQ(EXDEV, errno);
|
||||
/* Modify layout! */
|
||||
ASSERT_EQ(0, rename(file2_s1d2, file1_s2d3));
|
||||
/*
|
||||
* Modifying the layout is now denied because the second layer does not
|
||||
* handle REFER, which is always denied by default.
|
||||
*/
|
||||
ASSERT_EQ(-1, rename(file2_s1d2, file1_s2d3));
|
||||
ASSERT_EQ(EXDEV, errno);
|
||||
|
||||
/* Without REFER source, EACCES wins over EXDEV. */
|
||||
ASSERT_EQ(-1, rename(dir_s1d1, file1_s2d2));
|
||||
|
||||
@@ -47,7 +47,6 @@ enum {
|
||||
MODE_MIXED = 3,
|
||||
};
|
||||
|
||||
static bool cfg_flush = false;
|
||||
static bool cfg_cork = false;
|
||||
static int cfg_mode = MODE_ZC_FIXED;
|
||||
static int cfg_nr_reqs = 8;
|
||||
@@ -166,21 +165,6 @@ static int io_uring_register_buffers(struct io_uring *ring,
|
||||
return (ret < 0) ? -errno : ret;
|
||||
}
|
||||
|
||||
static int io_uring_register_notifications(struct io_uring *ring,
|
||||
unsigned nr,
|
||||
struct io_uring_notification_slot *slots)
|
||||
{
|
||||
int ret;
|
||||
struct io_uring_notification_register r = {
|
||||
.nr_slots = nr,
|
||||
.data = (unsigned long)slots,
|
||||
};
|
||||
|
||||
ret = syscall(__NR_io_uring_register, ring->ring_fd,
|
||||
IORING_REGISTER_NOTIFIERS, &r, sizeof(r));
|
||||
return (ret < 0) ? -errno : ret;
|
||||
}
|
||||
|
||||
static int io_uring_mmap(int fd, struct io_uring_params *p,
|
||||
struct io_uring_sq *sq, struct io_uring_cq *cq)
|
||||
{
|
||||
@@ -297,11 +281,10 @@ static inline void io_uring_prep_send(struct io_uring_sqe *sqe, int sockfd,
|
||||
|
||||
static inline void io_uring_prep_sendzc(struct io_uring_sqe *sqe, int sockfd,
|
||||
const void *buf, size_t len, int flags,
|
||||
unsigned slot_idx, unsigned zc_flags)
|
||||
unsigned zc_flags)
|
||||
{
|
||||
io_uring_prep_send(sqe, sockfd, buf, len, flags);
|
||||
sqe->opcode = (__u8) IORING_OP_SENDZC_NOTIF;
|
||||
sqe->notification_idx = slot_idx;
|
||||
sqe->opcode = (__u8) IORING_OP_SEND_ZC;
|
||||
sqe->ioprio = zc_flags;
|
||||
}
|
||||
|
||||
@@ -374,7 +357,6 @@ static int do_setup_tx(int domain, int type, int protocol)
|
||||
|
||||
static void do_tx(int domain, int type, int protocol)
|
||||
{
|
||||
struct io_uring_notification_slot b[1] = {{.tag = NOTIF_TAG}};
|
||||
struct io_uring_sqe *sqe;
|
||||
struct io_uring_cqe *cqe;
|
||||
unsigned long packets = 0, bytes = 0;
|
||||
@@ -390,10 +372,6 @@ static void do_tx(int domain, int type, int protocol)
|
||||
if (ret)
|
||||
error(1, ret, "io_uring: queue init");
|
||||
|
||||
ret = io_uring_register_notifications(&ring, 1, b);
|
||||
if (ret)
|
||||
error(1, ret, "io_uring: tx ctx registration");
|
||||
|
||||
iov.iov_base = payload;
|
||||
iov.iov_len = cfg_payload_len;
|
||||
|
||||
@@ -409,9 +387,8 @@ static void do_tx(int domain, int type, int protocol)
|
||||
for (i = 0; i < cfg_nr_reqs; i++) {
|
||||
unsigned zc_flags = 0;
|
||||
unsigned buf_idx = 0;
|
||||
unsigned slot_idx = 0;
|
||||
unsigned mode = cfg_mode;
|
||||
unsigned msg_flags = 0;
|
||||
unsigned msg_flags = MSG_WAITALL;
|
||||
|
||||
if (cfg_mode == MODE_MIXED)
|
||||
mode = rand() % 3;
|
||||
@@ -423,13 +400,10 @@ static void do_tx(int domain, int type, int protocol)
|
||||
cfg_payload_len, msg_flags);
|
||||
sqe->user_data = NONZC_TAG;
|
||||
} else {
|
||||
if (cfg_flush) {
|
||||
zc_flags |= IORING_RECVSEND_NOTIF_FLUSH;
|
||||
compl_cqes++;
|
||||
}
|
||||
compl_cqes++;
|
||||
io_uring_prep_sendzc(sqe, fd, payload,
|
||||
cfg_payload_len,
|
||||
msg_flags, slot_idx, zc_flags);
|
||||
msg_flags, zc_flags);
|
||||
if (mode == MODE_ZC_FIXED) {
|
||||
sqe->ioprio |= IORING_RECVSEND_FIXED_BUF;
|
||||
sqe->buf_index = buf_idx;
|
||||
@@ -442,51 +416,57 @@ static void do_tx(int domain, int type, int protocol)
|
||||
if (ret != cfg_nr_reqs)
|
||||
error(1, ret, "submit");
|
||||
|
||||
if (cfg_cork)
|
||||
do_setsockopt(fd, IPPROTO_UDP, UDP_CORK, 0);
|
||||
for (i = 0; i < cfg_nr_reqs; i++) {
|
||||
ret = io_uring_wait_cqe(&ring, &cqe);
|
||||
if (ret)
|
||||
error(1, ret, "wait cqe");
|
||||
|
||||
if (cqe->user_data == NOTIF_TAG) {
|
||||
if (cqe->user_data != NONZC_TAG &&
|
||||
cqe->user_data != ZC_TAG)
|
||||
error(1, -EINVAL, "invalid cqe->user_data");
|
||||
|
||||
if (cqe->flags & IORING_CQE_F_NOTIF) {
|
||||
if (cqe->flags & IORING_CQE_F_MORE)
|
||||
error(1, -EINVAL, "invalid notif flags");
|
||||
compl_cqes--;
|
||||
i--;
|
||||
} else if (cqe->user_data != NONZC_TAG &&
|
||||
cqe->user_data != ZC_TAG) {
|
||||
error(1, cqe->res, "invalid user_data");
|
||||
} else if (cqe->res <= 0 && cqe->res != -EAGAIN) {
|
||||
} else if (cqe->res <= 0) {
|
||||
if (cqe->flags & IORING_CQE_F_MORE)
|
||||
error(1, cqe->res, "more with a failed send");
|
||||
error(1, cqe->res, "send failed");
|
||||
} else {
|
||||
if (cqe->res > 0) {
|
||||
packets++;
|
||||
bytes += cqe->res;
|
||||
}
|
||||
/* failed requests don't flush */
|
||||
if (cfg_flush &&
|
||||
cqe->res <= 0 &&
|
||||
cqe->user_data == ZC_TAG)
|
||||
compl_cqes--;
|
||||
if (cqe->user_data == ZC_TAG &&
|
||||
!(cqe->flags & IORING_CQE_F_MORE))
|
||||
error(1, cqe->res, "missing more flag");
|
||||
packets++;
|
||||
bytes += cqe->res;
|
||||
}
|
||||
io_uring_cqe_seen(&ring);
|
||||
}
|
||||
if (cfg_cork)
|
||||
do_setsockopt(fd, IPPROTO_UDP, UDP_CORK, 0);
|
||||
} while (gettimeofday_ms() < tstop);
|
||||
|
||||
if (close(fd))
|
||||
error(1, errno, "close");
|
||||
while (compl_cqes) {
|
||||
ret = io_uring_wait_cqe(&ring, &cqe);
|
||||
if (ret)
|
||||
error(1, ret, "wait cqe");
|
||||
if (cqe->flags & IORING_CQE_F_MORE)
|
||||
error(1, -EINVAL, "invalid notif flags");
|
||||
if (!(cqe->flags & IORING_CQE_F_NOTIF))
|
||||
error(1, -EINVAL, "missing notif flag");
|
||||
|
||||
io_uring_cqe_seen(&ring);
|
||||
compl_cqes--;
|
||||
}
|
||||
|
||||
fprintf(stderr, "tx=%lu (MB=%lu), tx/s=%lu (MB/s=%lu)\n",
|
||||
packets, bytes >> 20,
|
||||
packets / (cfg_runtime_ms / 1000),
|
||||
(bytes >> 20) / (cfg_runtime_ms / 1000));
|
||||
|
||||
while (compl_cqes) {
|
||||
ret = io_uring_wait_cqe(&ring, &cqe);
|
||||
if (ret)
|
||||
error(1, ret, "wait cqe");
|
||||
io_uring_cqe_seen(&ring);
|
||||
compl_cqes--;
|
||||
}
|
||||
if (close(fd))
|
||||
error(1, errno, "close");
|
||||
}
|
||||
|
||||
static void do_test(int domain, int type, int protocol)
|
||||
@@ -500,8 +480,8 @@ static void do_test(int domain, int type, int protocol)
|
||||
|
||||
static void usage(const char *filepath)
|
||||
{
|
||||
error(1, 0, "Usage: %s [-f] [-n<N>] [-z0] [-s<payload size>] "
|
||||
"(-4|-6) [-t<time s>] -D<dst_ip> udp", filepath);
|
||||
error(1, 0, "Usage: %s (-4|-6) (udp|tcp) -D<dst_ip> [-s<payload size>] "
|
||||
"[-t<time s>] [-n<batch>] [-p<port>] [-m<mode>]", filepath);
|
||||
}
|
||||
|
||||
static void parse_opts(int argc, char **argv)
|
||||
@@ -519,7 +499,7 @@ static void parse_opts(int argc, char **argv)
|
||||
usage(argv[0]);
|
||||
cfg_payload_len = max_payload_len;
|
||||
|
||||
while ((c = getopt(argc, argv, "46D:p:s:t:n:fc:m:")) != -1) {
|
||||
while ((c = getopt(argc, argv, "46D:p:s:t:n:c:m:")) != -1) {
|
||||
switch (c) {
|
||||
case '4':
|
||||
if (cfg_family != PF_UNSPEC)
|
||||
@@ -548,9 +528,6 @@ static void parse_opts(int argc, char **argv)
|
||||
case 'n':
|
||||
cfg_nr_reqs = strtoul(optarg, NULL, 0);
|
||||
break;
|
||||
case 'f':
|
||||
cfg_flush = 1;
|
||||
break;
|
||||
case 'c':
|
||||
cfg_cork = strtol(optarg, NULL, 0);
|
||||
break;
|
||||
@@ -583,8 +560,6 @@ static void parse_opts(int argc, char **argv)
|
||||
|
||||
if (cfg_payload_len > max_payload_len)
|
||||
error(1, 0, "-s: payload exceeds max (%d)", max_payload_len);
|
||||
if (cfg_mode == MODE_NONZC && cfg_flush)
|
||||
error(1, 0, "-f: only zerocopy modes support notifications");
|
||||
if (optind != argc - 1)
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
@@ -25,15 +25,11 @@ readonly path_sysctl_mem="net.core.optmem_max"
|
||||
# No arguments: automated test
|
||||
if [[ "$#" -eq "0" ]]; then
|
||||
IPs=( "4" "6" )
|
||||
protocols=( "tcp" "udp" )
|
||||
|
||||
for IP in "${IPs[@]}"; do
|
||||
for proto in "${protocols[@]}"; do
|
||||
for mode in $(seq 1 3); do
|
||||
$0 "$IP" "$proto" -m "$mode" -t 1 -n 32
|
||||
$0 "$IP" "$proto" -m "$mode" -t 1 -n 32 -f
|
||||
$0 "$IP" "$proto" -m "$mode" -t 1 -n 32 -c -f
|
||||
done
|
||||
for mode in $(seq 1 3); do
|
||||
$0 "$IP" udp -m "$mode" -t 1 -n 32
|
||||
$0 "$IP" tcp -m "$mode" -t 1 -n 32
|
||||
done
|
||||
done
|
||||
|
||||
|
||||
@@ -102,26 +102,42 @@ check_for_helper()
|
||||
|
||||
ip netns exec ${netns} conntrack -L -f $family -p tcp --dport $port 2> /dev/null |grep -q 'helper=ftp'
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "FAIL: ${netns} did not show attached helper $message" 1>&2
|
||||
ret=1
|
||||
if [ $autoassign -eq 0 ] ;then
|
||||
echo "FAIL: ${netns} did not show attached helper $message" 1>&2
|
||||
ret=1
|
||||
else
|
||||
echo "PASS: ${netns} did not show attached helper $message" 1>&2
|
||||
fi
|
||||
else
|
||||
if [ $autoassign -eq 0 ] ;then
|
||||
echo "PASS: ${netns} connection on port $port has ftp helper attached" 1>&2
|
||||
else
|
||||
echo "FAIL: ${netns} connection on port $port has ftp helper attached" 1>&2
|
||||
ret=1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "PASS: ${netns} connection on port $port has ftp helper attached" 1>&2
|
||||
return 0
|
||||
}
|
||||
|
||||
test_helper()
|
||||
{
|
||||
local port=$1
|
||||
local msg=$2
|
||||
local autoassign=$2
|
||||
|
||||
if [ $autoassign -eq 0 ] ;then
|
||||
msg="set via ruleset"
|
||||
else
|
||||
msg="auto-assign"
|
||||
fi
|
||||
|
||||
sleep 3 | ip netns exec ${ns2} nc -w 2 -l -p $port > /dev/null &
|
||||
|
||||
sleep 1 | ip netns exec ${ns1} nc -w 2 10.0.1.2 $port > /dev/null &
|
||||
sleep 1
|
||||
|
||||
check_for_helper "$ns1" "ip $msg" $port
|
||||
check_for_helper "$ns2" "ip $msg" $port
|
||||
check_for_helper "$ns1" "ip $msg" $port $autoassign
|
||||
check_for_helper "$ns2" "ip $msg" $port $autoassign
|
||||
|
||||
wait
|
||||
|
||||
@@ -173,9 +189,9 @@ if [ $? -ne 0 ];then
|
||||
fi
|
||||
fi
|
||||
|
||||
test_helper 2121 "set via ruleset"
|
||||
ip netns exec ${ns1} sysctl -q 'net.netfilter.nf_conntrack_helper=1'
|
||||
ip netns exec ${ns2} sysctl -q 'net.netfilter.nf_conntrack_helper=1'
|
||||
test_helper 21 "auto-assign"
|
||||
test_helper 2121 0
|
||||
ip netns exec ${ns1} sysctl -qe 'net.netfilter.nf_conntrack_helper=1'
|
||||
ip netns exec ${ns2} sysctl -qe 'net.netfilter.nf_conntrack_helper=1'
|
||||
test_helper 21 1
|
||||
|
||||
exit $ret
|
||||
|
||||
Reference in New Issue
Block a user