Commit d8caa2ed authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'mptcp-refactoring-for-one-selftest-and-csum-validation'

Mat Martineau says:

====================
mptcp: Refactoring for one selftest and csum validation

Patch 1 changes the MPTCP join self tests to depend more on events
rather than delays, so the script runs faster and has more consistent
results.

Patches 2 and 3 get rid of some duplicate code in MPTCP's checksum
validation by modifying and leveraging an existing helper function.
====================

Link: https://lore.kernel.org/r/20220107192524.445137-1-mathew.j.martineau@linux.intel.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 5cad43a5 8401e87f
...@@ -1233,7 +1233,7 @@ static void mptcp_set_rwin(const struct tcp_sock *tp) ...@@ -1233,7 +1233,7 @@ static void mptcp_set_rwin(const struct tcp_sock *tp)
WRITE_ONCE(msk->rcv_wnd_sent, ack_seq); WRITE_ONCE(msk->rcv_wnd_sent, ack_seq);
} }
static u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __sum16 sum) u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum sum)
{ {
struct csum_pseudo_header header; struct csum_pseudo_header header;
__wsum csum; __wsum csum;
...@@ -1248,14 +1248,14 @@ static u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __sum1 ...@@ -1248,14 +1248,14 @@ static u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __sum1
header.data_len = htons(data_len); header.data_len = htons(data_len);
header.csum = 0; header.csum = 0;
csum = csum_partial(&header, sizeof(header), ~csum_unfold(sum)); csum = csum_partial(&header, sizeof(header), sum);
return (__force u16)csum_fold(csum); return (__force u16)csum_fold(csum);
} }
static u16 mptcp_make_csum(const struct mptcp_ext *mpext) static u16 mptcp_make_csum(const struct mptcp_ext *mpext)
{ {
return __mptcp_make_csum(mpext->data_seq, mpext->subflow_seq, mpext->data_len, return __mptcp_make_csum(mpext->data_seq, mpext->subflow_seq, mpext->data_len,
mpext->csum); ~csum_unfold(mpext->csum));
} }
void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp, void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
...@@ -1376,7 +1376,7 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp, ...@@ -1376,7 +1376,7 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
__mptcp_make_csum(opts->data_seq, __mptcp_make_csum(opts->data_seq,
opts->subflow_seq, opts->subflow_seq,
opts->data_len, opts->data_len,
opts->csum), ptr); ~csum_unfold(opts->csum)), ptr);
} else { } else {
put_unaligned_be32(opts->data_len << 16 | put_unaligned_be32(opts->data_len << 16 |
TCPOPT_NOP << 8 | TCPOPT_NOP, ptr); TCPOPT_NOP << 8 | TCPOPT_NOP, ptr);
......
...@@ -725,6 +725,7 @@ void mptcp_token_destroy(struct mptcp_sock *msk); ...@@ -725,6 +725,7 @@ void mptcp_token_destroy(struct mptcp_sock *msk);
void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn); void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);
void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac); void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac);
u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum sum);
void __init mptcp_pm_init(void); void __init mptcp_pm_init(void);
void mptcp_pm_data_init(struct mptcp_sock *msk); void mptcp_pm_data_init(struct mptcp_sock *msk);
......
...@@ -845,9 +845,8 @@ static enum mapping_status validate_data_csum(struct sock *ssk, struct sk_buff * ...@@ -845,9 +845,8 @@ static enum mapping_status validate_data_csum(struct sock *ssk, struct sk_buff *
bool csum_reqd) bool csum_reqd)
{ {
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
struct csum_pseudo_header header;
u32 offset, seq, delta; u32 offset, seq, delta;
__wsum csum; u16 csum;
int len; int len;
if (!csum_reqd) if (!csum_reqd)
...@@ -908,13 +907,11 @@ static enum mapping_status validate_data_csum(struct sock *ssk, struct sk_buff * ...@@ -908,13 +907,11 @@ static enum mapping_status validate_data_csum(struct sock *ssk, struct sk_buff *
* while the pseudo header requires the original DSS data len, * while the pseudo header requires the original DSS data len,
* including that * including that
*/ */
header.data_seq = cpu_to_be64(subflow->map_seq); csum = __mptcp_make_csum(subflow->map_seq,
header.subflow_seq = htonl(subflow->map_subflow_seq); subflow->map_subflow_seq,
header.data_len = htons(subflow->map_data_len + subflow->map_data_fin); subflow->map_data_len + subflow->map_data_fin,
header.csum = 0; subflow->map_data_csum);
if (unlikely(csum)) {
csum = csum_partial(&header, sizeof(header), subflow->map_data_csum);
if (unlikely(csum_fold(csum))) {
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DATACSUMERR); MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DATACSUMERR);
subflow->send_mp_fail = 1; subflow->send_mp_fail = 1;
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPFAILTX); MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPFAILTX);
......
...@@ -238,6 +238,45 @@ is_v6() ...@@ -238,6 +238,45 @@ is_v6()
[ -z "${1##*:*}" ] [ -z "${1##*:*}" ]
} }
# $1: ns, $2: port
wait_local_port_listen()
{
local listener_ns="${1}"
local port="${2}"
local port_hex i
port_hex="$(printf "%04X" "${port}")"
for i in $(seq 10); do
ip netns exec "${listener_ns}" cat /proc/net/tcp* | \
awk "BEGIN {rc=1} {if (\$2 ~ /:${port_hex}\$/ && \$4 ~ /0A/) {rc=0; exit}} END {exit rc}" &&
break
sleep 0.1
done
}
rm_addr_count()
{
ns=${1}
ip netns exec ${ns} nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'
}
# $1: ns, $2: old rm_addr counter in $ns
wait_rm_addr()
{
local ns="${1}"
local old_cnt="${2}"
local cnt
local i
for i in $(seq 10); do
cnt=$(rm_addr_count ${ns})
[ "$cnt" = "${old_cnt}" ] || break
sleep 0.1
done
}
do_transfer() do_transfer()
{ {
listener_ns="$1" listener_ns="$1"
...@@ -307,7 +346,7 @@ do_transfer() ...@@ -307,7 +346,7 @@ do_transfer()
fi fi
spid=$! spid=$!
sleep 1 wait_local_port_listen "${listener_ns}" "${port}"
if [ "$test_link_fail" -eq 0 ];then if [ "$test_link_fail" -eq 0 ];then
timeout ${timeout_test} \ timeout ${timeout_test} \
...@@ -324,10 +363,13 @@ do_transfer() ...@@ -324,10 +363,13 @@ do_transfer()
fi fi
cpid=$! cpid=$!
# let the mptcp subflow be established in background before
# do endpoint manipulation
[ $addr_nr_ns1 = "0" -a $addr_nr_ns2 = "0" ] || sleep 1
if [ $addr_nr_ns1 -gt 0 ]; then if [ $addr_nr_ns1 -gt 0 ]; then
let add_nr_ns1=addr_nr_ns1 let add_nr_ns1=addr_nr_ns1
counter=2 counter=2
sleep 1
while [ $add_nr_ns1 -gt 0 ]; do while [ $add_nr_ns1 -gt 0 ]; do
local addr local addr
if is_v6 "${connect_addr}"; then if is_v6 "${connect_addr}"; then
...@@ -339,7 +381,6 @@ do_transfer() ...@@ -339,7 +381,6 @@ do_transfer()
let counter+=1 let counter+=1
let add_nr_ns1-=1 let add_nr_ns1-=1
done done
sleep 1
elif [ $addr_nr_ns1 -lt 0 ]; then elif [ $addr_nr_ns1 -lt 0 ]; then
let rm_nr_ns1=-addr_nr_ns1 let rm_nr_ns1=-addr_nr_ns1
if [ $rm_nr_ns1 -lt 8 ]; then if [ $rm_nr_ns1 -lt 8 ]; then
...@@ -347,22 +388,19 @@ do_transfer() ...@@ -347,22 +388,19 @@ do_transfer()
pos=1 pos=1
dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`) dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`)
if [ ${#dump[@]} -gt 0 ]; then if [ ${#dump[@]} -gt 0 ]; then
sleep 1
while [ $counter -le $rm_nr_ns1 ] while [ $counter -le $rm_nr_ns1 ]
do do
id=${dump[$pos]} id=${dump[$pos]}
rm_addr=$(rm_addr_count ${connector_ns})
ip netns exec ${listener_ns} ./pm_nl_ctl del $id ip netns exec ${listener_ns} ./pm_nl_ctl del $id
sleep 1 wait_rm_addr ${connector_ns} ${rm_addr}
let counter+=1 let counter+=1
let pos+=5 let pos+=5
done done
fi fi
elif [ $rm_nr_ns1 -eq 8 ]; then elif [ $rm_nr_ns1 -eq 8 ]; then
sleep 1
ip netns exec ${listener_ns} ./pm_nl_ctl flush ip netns exec ${listener_ns} ./pm_nl_ctl flush
elif [ $rm_nr_ns1 -eq 9 ]; then elif [ $rm_nr_ns1 -eq 9 ]; then
sleep 1
ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr} ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr}
fi fi
fi fi
...@@ -373,10 +411,13 @@ do_transfer() ...@@ -373,10 +411,13 @@ do_transfer()
addr_nr_ns2=${addr_nr_ns2:9} addr_nr_ns2=${addr_nr_ns2:9}
fi fi
# if newly added endpoints must be deleted, give the background msk
# some time to created them
[ $addr_nr_ns1 -gt 0 -a $addr_nr_ns2 -lt 0 ] && sleep 1
if [ $addr_nr_ns2 -gt 0 ]; then if [ $addr_nr_ns2 -gt 0 ]; then
let add_nr_ns2=addr_nr_ns2 let add_nr_ns2=addr_nr_ns2
counter=3 counter=3
sleep 1
while [ $add_nr_ns2 -gt 0 ]; do while [ $add_nr_ns2 -gt 0 ]; do
local addr local addr
if is_v6 "${connect_addr}"; then if is_v6 "${connect_addr}"; then
...@@ -388,7 +429,6 @@ do_transfer() ...@@ -388,7 +429,6 @@ do_transfer()
let counter+=1 let counter+=1
let add_nr_ns2-=1 let add_nr_ns2-=1
done done
sleep 1
elif [ $addr_nr_ns2 -lt 0 ]; then elif [ $addr_nr_ns2 -lt 0 ]; then
let rm_nr_ns2=-addr_nr_ns2 let rm_nr_ns2=-addr_nr_ns2
if [ $rm_nr_ns2 -lt 8 ]; then if [ $rm_nr_ns2 -lt 8 ]; then
...@@ -396,19 +436,18 @@ do_transfer() ...@@ -396,19 +436,18 @@ do_transfer()
pos=1 pos=1
dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`) dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`)
if [ ${#dump[@]} -gt 0 ]; then if [ ${#dump[@]} -gt 0 ]; then
sleep 1
while [ $counter -le $rm_nr_ns2 ] while [ $counter -le $rm_nr_ns2 ]
do do
# rm_addr are serialized, allow the previous one to complete
id=${dump[$pos]} id=${dump[$pos]}
rm_addr=$(rm_addr_count ${listener_ns})
ip netns exec ${connector_ns} ./pm_nl_ctl del $id ip netns exec ${connector_ns} ./pm_nl_ctl del $id
sleep 1 wait_rm_addr ${listener_ns} ${rm_addr}
let counter+=1 let counter+=1
let pos+=5 let pos+=5
done done
fi fi
elif [ $rm_nr_ns2 -eq 8 ]; then elif [ $rm_nr_ns2 -eq 8 ]; then
sleep 1
ip netns exec ${connector_ns} ./pm_nl_ctl flush ip netns exec ${connector_ns} ./pm_nl_ctl flush
elif [ $rm_nr_ns2 -eq 9 ]; then elif [ $rm_nr_ns2 -eq 9 ]; then
local addr local addr
...@@ -417,7 +456,6 @@ do_transfer() ...@@ -417,7 +456,6 @@ do_transfer()
else else
addr="10.0.1.2" addr="10.0.1.2"
fi fi
sleep 1
ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr
fi fi
fi fi
...@@ -539,6 +577,14 @@ run_tests() ...@@ -539,6 +577,14 @@ run_tests()
lret=$? lret=$?
} }
dump_stats()
{
echo Server ns stats
ip netns exec $ns1 nstat -as | grep Tcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep Tcp
}
chk_csum_nr() chk_csum_nr()
{ {
local msg=${1:-""} local msg=${1:-""}
...@@ -570,12 +616,7 @@ chk_csum_nr() ...@@ -570,12 +616,7 @@ chk_csum_nr()
else else
echo "[ ok ]" echo "[ ok ]"
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
} }
chk_fail_nr() chk_fail_nr()
...@@ -607,12 +648,7 @@ chk_fail_nr() ...@@ -607,12 +648,7 @@ chk_fail_nr()
echo "[ ok ]" echo "[ ok ]"
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
} }
chk_join_nr() chk_join_nr()
...@@ -656,12 +692,7 @@ chk_join_nr() ...@@ -656,12 +692,7 @@ chk_join_nr()
else else
echo "[ ok ]" echo "[ ok ]"
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
if [ $checksum -eq 1 ]; then if [ $checksum -eq 1 ]; then
chk_csum_nr chk_csum_nr
chk_fail_nr 0 0 chk_fail_nr 0 0
...@@ -823,12 +854,7 @@ chk_add_nr() ...@@ -823,12 +854,7 @@ chk_add_nr()
echo "" echo ""
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
} }
chk_rm_nr() chk_rm_nr()
...@@ -871,12 +897,7 @@ chk_rm_nr() ...@@ -871,12 +897,7 @@ chk_rm_nr()
echo "[ ok ]" echo "[ ok ]"
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
} }
chk_prio_nr() chk_prio_nr()
...@@ -908,12 +929,7 @@ chk_prio_nr() ...@@ -908,12 +929,7 @@ chk_prio_nr()
echo "[ ok ]" echo "[ ok ]"
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
} }
chk_link_usage() chk_link_usage()
...@@ -1651,7 +1667,7 @@ add_addr_ports_tests() ...@@ -1651,7 +1667,7 @@ add_addr_ports_tests()
ip netns exec $ns2 ./pm_nl_ctl limits 1 3 ip netns exec $ns2 ./pm_nl_ctl limits 1 3
ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow
chk_join_nr "flush subflows and signal with port" 3 3 3 chk_join_nr "flush subflows and signal with port" 3 3 3
chk_add_nr 1 1 chk_add_nr 1 1
chk_rm_nr 2 2 chk_rm_nr 2 2
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment