mirror of https://gitee.com/openkylin/linux.git
selftests: mptcp: add a test case for MSG_PEEK
Extend mptcp_connect tool with MSG_PEEK support and add a test case in mptcp_connect.sh that checks the data received from/after recv() with MSG_PEEK. Acked-by: Paolo Abeni <pabeni@redhat.com> Co-developed-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Yonglong Li <liyonglong@chinatelecom.cn> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ca4fb89257
commit
df8aee6d6f
|
@ -45,7 +45,14 @@ enum cfg_mode {
|
||||||
CFG_MODE_SENDFILE,
|
CFG_MODE_SENDFILE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum cfg_peek {
|
||||||
|
CFG_NONE_PEEK,
|
||||||
|
CFG_WITH_PEEK,
|
||||||
|
CFG_AFTER_PEEK,
|
||||||
|
};
|
||||||
|
|
||||||
static enum cfg_mode cfg_mode = CFG_MODE_POLL;
|
static enum cfg_mode cfg_mode = CFG_MODE_POLL;
|
||||||
|
static enum cfg_peek cfg_peek = CFG_NONE_PEEK;
|
||||||
static const char *cfg_host;
|
static const char *cfg_host;
|
||||||
static const char *cfg_port = "12000";
|
static const char *cfg_port = "12000";
|
||||||
static int cfg_sock_proto = IPPROTO_MPTCP;
|
static int cfg_sock_proto = IPPROTO_MPTCP;
|
||||||
|
@ -73,6 +80,8 @@ static void die_usage(void)
|
||||||
fprintf(stderr, "\t-M mark -- set socket packet mark\n");
|
fprintf(stderr, "\t-M mark -- set socket packet mark\n");
|
||||||
fprintf(stderr, "\t-u -- check mptcp ulp\n");
|
fprintf(stderr, "\t-u -- check mptcp ulp\n");
|
||||||
fprintf(stderr, "\t-w num -- wait num sec before closing the socket\n");
|
fprintf(stderr, "\t-w num -- wait num sec before closing the socket\n");
|
||||||
|
fprintf(stderr,
|
||||||
|
"\t-P [saveWithPeek|saveAfterPeek] -- save data with/after MSG_PEEK form tcp socket\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,6 +340,8 @@ static size_t do_write(const int fd, char *buf, const size_t len)
|
||||||
|
|
||||||
static ssize_t do_rnd_read(const int fd, char *buf, const size_t len)
|
static ssize_t do_rnd_read(const int fd, char *buf, const size_t len)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
|
char tmp[16384];
|
||||||
size_t cap = rand();
|
size_t cap = rand();
|
||||||
|
|
||||||
cap &= 0xffff;
|
cap &= 0xffff;
|
||||||
|
@ -340,7 +351,17 @@ static ssize_t do_rnd_read(const int fd, char *buf, const size_t len)
|
||||||
else if (cap > len)
|
else if (cap > len)
|
||||||
cap = len;
|
cap = len;
|
||||||
|
|
||||||
return read(fd, buf, cap);
|
if (cfg_peek == CFG_WITH_PEEK) {
|
||||||
|
ret = recv(fd, buf, cap, MSG_PEEK);
|
||||||
|
ret = (ret < 0) ? ret : read(fd, tmp, ret);
|
||||||
|
} else if (cfg_peek == CFG_AFTER_PEEK) {
|
||||||
|
ret = recv(fd, buf, cap, MSG_PEEK);
|
||||||
|
ret = (ret < 0) ? ret : read(fd, buf, cap);
|
||||||
|
} else {
|
||||||
|
ret = read(fd, buf, cap);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_nonblock(int fd)
|
static void set_nonblock(int fd)
|
||||||
|
@ -819,6 +840,26 @@ int parse_mode(const char *mode)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int parse_peek(const char *mode)
|
||||||
|
{
|
||||||
|
if (!strcasecmp(mode, "saveWithPeek"))
|
||||||
|
return CFG_WITH_PEEK;
|
||||||
|
if (!strcasecmp(mode, "saveAfterPeek"))
|
||||||
|
return CFG_AFTER_PEEK;
|
||||||
|
|
||||||
|
fprintf(stderr, "Unknown: %s\n", mode);
|
||||||
|
fprintf(stderr, "Supported MSG_PEEK mode are:\n");
|
||||||
|
fprintf(stderr,
|
||||||
|
"\t\t\"saveWithPeek\" - recv data with flags 'MSG_PEEK' and save the peek data into file\n");
|
||||||
|
fprintf(stderr,
|
||||||
|
"\t\t\"saveAfterPeek\" - read and save data into file after recv with flags 'MSG_PEEK'\n");
|
||||||
|
|
||||||
|
die_usage();
|
||||||
|
|
||||||
|
/* silence compiler warning */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int parse_int(const char *size)
|
static int parse_int(const char *size)
|
||||||
{
|
{
|
||||||
unsigned long s;
|
unsigned long s;
|
||||||
|
@ -846,7 +887,7 @@ static void parse_opts(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "6jr:lp:s:hut:m:S:R:w:M:")) != -1) {
|
while ((c = getopt(argc, argv, "6jr:lp:s:hut:m:S:R:w:M:P:")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'j':
|
case 'j':
|
||||||
cfg_join = true;
|
cfg_join = true;
|
||||||
|
@ -899,6 +940,9 @@ static void parse_opts(int argc, char **argv)
|
||||||
case 'M':
|
case 'M':
|
||||||
cfg_mark = strtol(optarg, NULL, 0);
|
cfg_mark = strtol(optarg, NULL, 0);
|
||||||
break;
|
break;
|
||||||
|
case 'P':
|
||||||
|
cfg_peek = parse_peek(optarg);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -375,7 +375,7 @@ do_transfer()
|
||||||
local srv_proto="$4"
|
local srv_proto="$4"
|
||||||
local connect_addr="$5"
|
local connect_addr="$5"
|
||||||
local local_addr="$6"
|
local local_addr="$6"
|
||||||
local extra_args=""
|
local extra_args="$7"
|
||||||
|
|
||||||
local port
|
local port
|
||||||
port=$((10000+$TEST_COUNT))
|
port=$((10000+$TEST_COUNT))
|
||||||
|
@ -394,9 +394,9 @@ do_transfer()
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$extra_args" ] && $options_log; then
|
if [ -n "$extra_args" ] && $options_log; then
|
||||||
options_log=false
|
|
||||||
echo "INFO: extra options: $extra_args"
|
echo "INFO: extra options: $extra_args"
|
||||||
fi
|
fi
|
||||||
|
options_log=false
|
||||||
|
|
||||||
:> "$cout"
|
:> "$cout"
|
||||||
:> "$sout"
|
:> "$sout"
|
||||||
|
@ -589,6 +589,7 @@ run_tests_lo()
|
||||||
local connector_ns="$2"
|
local connector_ns="$2"
|
||||||
local connect_addr="$3"
|
local connect_addr="$3"
|
||||||
local loopback="$4"
|
local loopback="$4"
|
||||||
|
local extra_args="$5"
|
||||||
local lret=0
|
local lret=0
|
||||||
|
|
||||||
# skip if test programs are running inside same netns for subsequent runs.
|
# skip if test programs are running inside same netns for subsequent runs.
|
||||||
|
@ -608,7 +609,8 @@ run_tests_lo()
|
||||||
local_addr="0.0.0.0"
|
local_addr="0.0.0.0"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} ${local_addr}
|
do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP \
|
||||||
|
${connect_addr} ${local_addr} "${extra_args}"
|
||||||
lret=$?
|
lret=$?
|
||||||
if [ $lret -ne 0 ]; then
|
if [ $lret -ne 0 ]; then
|
||||||
ret=$lret
|
ret=$lret
|
||||||
|
@ -622,14 +624,16 @@ run_tests_lo()
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
do_transfer ${listener_ns} ${connector_ns} MPTCP TCP ${connect_addr} ${local_addr}
|
do_transfer ${listener_ns} ${connector_ns} MPTCP TCP \
|
||||||
|
${connect_addr} ${local_addr} "${extra_args}"
|
||||||
lret=$?
|
lret=$?
|
||||||
if [ $lret -ne 0 ]; then
|
if [ $lret -ne 0 ]; then
|
||||||
ret=$lret
|
ret=$lret
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
do_transfer ${listener_ns} ${connector_ns} TCP MPTCP ${connect_addr} ${local_addr}
|
do_transfer ${listener_ns} ${connector_ns} TCP MPTCP \
|
||||||
|
${connect_addr} ${local_addr} "${extra_args}"
|
||||||
lret=$?
|
lret=$?
|
||||||
if [ $lret -ne 0 ]; then
|
if [ $lret -ne 0 ]; then
|
||||||
ret=$lret
|
ret=$lret
|
||||||
|
@ -637,7 +641,8 @@ run_tests_lo()
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ $do_tcp -gt 1 ] ;then
|
if [ $do_tcp -gt 1 ] ;then
|
||||||
do_transfer ${listener_ns} ${connector_ns} TCP TCP ${connect_addr} ${local_addr}
|
do_transfer ${listener_ns} ${connector_ns} TCP TCP \
|
||||||
|
${connect_addr} ${local_addr} "${extra_args}"
|
||||||
lret=$?
|
lret=$?
|
||||||
if [ $lret -ne 0 ]; then
|
if [ $lret -ne 0 ]; then
|
||||||
ret=$lret
|
ret=$lret
|
||||||
|
@ -653,6 +658,15 @@ run_tests()
|
||||||
run_tests_lo $1 $2 $3 0
|
run_tests_lo $1 $2 $3 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
run_tests_peekmode()
|
||||||
|
{
|
||||||
|
local peekmode="$1"
|
||||||
|
|
||||||
|
echo "INFO: with peek mode: ${peekmode}"
|
||||||
|
run_tests_lo "$ns1" "$ns1" 10.0.1.1 1 "-P ${peekmode}"
|
||||||
|
run_tests_lo "$ns1" "$ns1" dead:beef:1::1 1 "-P ${peekmode}"
|
||||||
|
}
|
||||||
|
|
||||||
make_file "$cin" "client"
|
make_file "$cin" "client"
|
||||||
make_file "$sin" "server"
|
make_file "$sin" "server"
|
||||||
|
|
||||||
|
@ -732,6 +746,9 @@ for sender in $ns1 $ns2 $ns3 $ns4;do
|
||||||
run_tests "$ns4" $sender dead:beef:3::1
|
run_tests "$ns4" $sender dead:beef:3::1
|
||||||
done
|
done
|
||||||
|
|
||||||
|
run_tests_peekmode "saveWithPeek"
|
||||||
|
run_tests_peekmode "saveAfterPeek"
|
||||||
|
|
||||||
time_end=$(date +%s)
|
time_end=$(date +%s)
|
||||||
time_run=$((time_end-time_start))
|
time_run=$((time_end-time_start))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue