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.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
d8caa2ed47
@ -1233,7 +1233,7 @@ static void mptcp_set_rwin(const struct tcp_sock *tp)
|
||||
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;
|
||||
__wsum csum;
|
||||
@ -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.csum = 0;
|
||||
|
||||
csum = csum_partial(&header, sizeof(header), ~csum_unfold(sum));
|
||||
csum = csum_partial(&header, sizeof(header), sum);
|
||||
return (__force u16)csum_fold(csum);
|
||||
}
|
||||
|
||||
static u16 mptcp_make_csum(const struct mptcp_ext *mpext)
|
||||
{
|
||||
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,
|
||||
@ -1376,7 +1376,7 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
|
||||
__mptcp_make_csum(opts->data_seq,
|
||||
opts->subflow_seq,
|
||||
opts->data_len,
|
||||
opts->csum), ptr);
|
||||
~csum_unfold(opts->csum)), ptr);
|
||||
} else {
|
||||
put_unaligned_be32(opts->data_len << 16 |
|
||||
TCPOPT_NOP << 8 | TCPOPT_NOP, ptr);
|
||||
|
@ -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_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 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 *
|
||||
bool csum_reqd)
|
||||
{
|
||||
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
|
||||
struct csum_pseudo_header header;
|
||||
u32 offset, seq, delta;
|
||||
__wsum csum;
|
||||
u16 csum;
|
||||
int len;
|
||||
|
||||
if (!csum_reqd)
|
||||
@ -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,
|
||||
* including that
|
||||
*/
|
||||
header.data_seq = cpu_to_be64(subflow->map_seq);
|
||||
header.subflow_seq = htonl(subflow->map_subflow_seq);
|
||||
header.data_len = htons(subflow->map_data_len + subflow->map_data_fin);
|
||||
header.csum = 0;
|
||||
|
||||
csum = csum_partial(&header, sizeof(header), subflow->map_data_csum);
|
||||
if (unlikely(csum_fold(csum))) {
|
||||
csum = __mptcp_make_csum(subflow->map_seq,
|
||||
subflow->map_subflow_seq,
|
||||
subflow->map_data_len + subflow->map_data_fin,
|
||||
subflow->map_data_csum);
|
||||
if (unlikely(csum)) {
|
||||
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DATACSUMERR);
|
||||
subflow->send_mp_fail = 1;
|
||||
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPFAILTX);
|
||||
|
@ -238,6 +238,45 @@ is_v6()
|
||||
[ -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()
|
||||
{
|
||||
listener_ns="$1"
|
||||
@ -307,7 +346,7 @@ do_transfer()
|
||||
fi
|
||||
spid=$!
|
||||
|
||||
sleep 1
|
||||
wait_local_port_listen "${listener_ns}" "${port}"
|
||||
|
||||
if [ "$test_link_fail" -eq 0 ];then
|
||||
timeout ${timeout_test} \
|
||||
@ -324,10 +363,13 @@ do_transfer()
|
||||
fi
|
||||
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
|
||||
let add_nr_ns1=addr_nr_ns1
|
||||
counter=2
|
||||
sleep 1
|
||||
while [ $add_nr_ns1 -gt 0 ]; do
|
||||
local addr
|
||||
if is_v6 "${connect_addr}"; then
|
||||
@ -339,7 +381,6 @@ do_transfer()
|
||||
let counter+=1
|
||||
let add_nr_ns1-=1
|
||||
done
|
||||
sleep 1
|
||||
elif [ $addr_nr_ns1 -lt 0 ]; then
|
||||
let rm_nr_ns1=-addr_nr_ns1
|
||||
if [ $rm_nr_ns1 -lt 8 ]; then
|
||||
@ -347,22 +388,19 @@ do_transfer()
|
||||
pos=1
|
||||
dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`)
|
||||
if [ ${#dump[@]} -gt 0 ]; then
|
||||
sleep 1
|
||||
|
||||
while [ $counter -le $rm_nr_ns1 ]
|
||||
do
|
||||
id=${dump[$pos]}
|
||||
rm_addr=$(rm_addr_count ${connector_ns})
|
||||
ip netns exec ${listener_ns} ./pm_nl_ctl del $id
|
||||
sleep 1
|
||||
wait_rm_addr ${connector_ns} ${rm_addr}
|
||||
let counter+=1
|
||||
let pos+=5
|
||||
done
|
||||
fi
|
||||
elif [ $rm_nr_ns1 -eq 8 ]; then
|
||||
sleep 1
|
||||
ip netns exec ${listener_ns} ./pm_nl_ctl flush
|
||||
elif [ $rm_nr_ns1 -eq 9 ]; then
|
||||
sleep 1
|
||||
ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr}
|
||||
fi
|
||||
fi
|
||||
@ -373,10 +411,13 @@ do_transfer()
|
||||
addr_nr_ns2=${addr_nr_ns2:9}
|
||||
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
|
||||
let add_nr_ns2=addr_nr_ns2
|
||||
counter=3
|
||||
sleep 1
|
||||
while [ $add_nr_ns2 -gt 0 ]; do
|
||||
local addr
|
||||
if is_v6 "${connect_addr}"; then
|
||||
@ -388,7 +429,6 @@ do_transfer()
|
||||
let counter+=1
|
||||
let add_nr_ns2-=1
|
||||
done
|
||||
sleep 1
|
||||
elif [ $addr_nr_ns2 -lt 0 ]; then
|
||||
let rm_nr_ns2=-addr_nr_ns2
|
||||
if [ $rm_nr_ns2 -lt 8 ]; then
|
||||
@ -396,19 +436,18 @@ do_transfer()
|
||||
pos=1
|
||||
dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`)
|
||||
if [ ${#dump[@]} -gt 0 ]; then
|
||||
sleep 1
|
||||
|
||||
while [ $counter -le $rm_nr_ns2 ]
|
||||
do
|
||||
# rm_addr are serialized, allow the previous one to complete
|
||||
id=${dump[$pos]}
|
||||
rm_addr=$(rm_addr_count ${listener_ns})
|
||||
ip netns exec ${connector_ns} ./pm_nl_ctl del $id
|
||||
sleep 1
|
||||
wait_rm_addr ${listener_ns} ${rm_addr}
|
||||
let counter+=1
|
||||
let pos+=5
|
||||
done
|
||||
fi
|
||||
elif [ $rm_nr_ns2 -eq 8 ]; then
|
||||
sleep 1
|
||||
ip netns exec ${connector_ns} ./pm_nl_ctl flush
|
||||
elif [ $rm_nr_ns2 -eq 9 ]; then
|
||||
local addr
|
||||
@ -417,7 +456,6 @@ do_transfer()
|
||||
else
|
||||
addr="10.0.1.2"
|
||||
fi
|
||||
sleep 1
|
||||
ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr
|
||||
fi
|
||||
fi
|
||||
@ -539,6 +577,14 @@ run_tests()
|
||||
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()
|
||||
{
|
||||
local msg=${1:-""}
|
||||
@ -570,12 +616,7 @@ chk_csum_nr()
|
||||
else
|
||||
echo "[ ok ]"
|
||||
fi
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
}
|
||||
|
||||
chk_fail_nr()
|
||||
@ -607,12 +648,7 @@ chk_fail_nr()
|
||||
echo "[ ok ]"
|
||||
fi
|
||||
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
}
|
||||
|
||||
chk_join_nr()
|
||||
@ -656,12 +692,7 @@ chk_join_nr()
|
||||
else
|
||||
echo "[ ok ]"
|
||||
fi
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
if [ $checksum -eq 1 ]; then
|
||||
chk_csum_nr
|
||||
chk_fail_nr 0 0
|
||||
@ -823,12 +854,7 @@ chk_add_nr()
|
||||
echo ""
|
||||
fi
|
||||
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
}
|
||||
|
||||
chk_rm_nr()
|
||||
@ -871,12 +897,7 @@ chk_rm_nr()
|
||||
echo "[ ok ]"
|
||||
fi
|
||||
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
}
|
||||
|
||||
chk_prio_nr()
|
||||
@ -908,12 +929,7 @@ chk_prio_nr()
|
||||
echo "[ ok ]"
|
||||
fi
|
||||
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
}
|
||||
|
||||
chk_link_usage()
|
||||
@ -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 add 10.0.3.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_add_nr 1 1
|
||||
chk_rm_nr 2 2
|
||||
|
Loading…
x
Reference in New Issue
Block a user