Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Rejecting non-native endian BTF overlapped with the addition of support for it. The rest were more simple overlapping changes, except the renesas ravb binding update, which had to follow a file move as well as a YAML conversion. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -519,11 +519,11 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
|
||||
|
||||
if (subflow->use_64bit_ack) {
|
||||
ack_size = TCPOLEN_MPTCP_DSS_ACK64;
|
||||
opts->ext_copy.data_ack = msk->ack_seq;
|
||||
opts->ext_copy.data_ack = READ_ONCE(msk->ack_seq);
|
||||
opts->ext_copy.ack64 = 1;
|
||||
} else {
|
||||
ack_size = TCPOLEN_MPTCP_DSS_ACK32;
|
||||
opts->ext_copy.data_ack32 = (uint32_t)(msk->ack_seq);
|
||||
opts->ext_copy.data_ack32 = (uint32_t)READ_ONCE(msk->ack_seq);
|
||||
opts->ext_copy.ack64 = 0;
|
||||
}
|
||||
opts->ext_copy.use_ack = 1;
|
||||
@@ -817,7 +817,7 @@ static void update_una(struct mptcp_sock *msk,
|
||||
}
|
||||
}
|
||||
|
||||
bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq)
|
||||
bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit)
|
||||
{
|
||||
/* Skip if DATA_FIN was already received.
|
||||
* If updating simultaneously with the recvmsg loop, values
|
||||
@@ -827,7 +827,8 @@ bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq)
|
||||
if (READ_ONCE(msk->rcv_data_fin) || !READ_ONCE(msk->first))
|
||||
return false;
|
||||
|
||||
WRITE_ONCE(msk->rcv_data_fin_seq, data_fin_seq);
|
||||
WRITE_ONCE(msk->rcv_data_fin_seq,
|
||||
expand_ack(READ_ONCE(msk->ack_seq), data_fin_seq, use_64bit));
|
||||
WRITE_ONCE(msk->rcv_data_fin, 1);
|
||||
|
||||
return true;
|
||||
@@ -919,7 +920,7 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
|
||||
*/
|
||||
if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) {
|
||||
if (mp_opt.data_fin && mp_opt.data_len == 1 &&
|
||||
mptcp_update_rcv_data_fin(msk, mp_opt.data_seq) &&
|
||||
mptcp_update_rcv_data_fin(msk, mp_opt.data_seq, mp_opt.dsn64) &&
|
||||
schedule_work(&msk->work))
|
||||
sock_hold(subflow->conn);
|
||||
|
||||
|
@@ -284,7 +284,7 @@ static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,
|
||||
|
||||
if (MPTCP_SKB_CB(skb)->map_seq == msk->ack_seq) {
|
||||
/* in sequence */
|
||||
msk->ack_seq += copy_len;
|
||||
WRITE_ONCE(msk->ack_seq, msk->ack_seq + copy_len);
|
||||
tail = skb_peek_tail(&sk->sk_receive_queue);
|
||||
if (tail && mptcp_try_coalesce(sk, tail, skb))
|
||||
return true;
|
||||
@@ -402,7 +402,7 @@ static void mptcp_check_data_fin(struct sock *sk)
|
||||
if (mptcp_pending_data_fin(sk, &rcv_data_fin_seq)) {
|
||||
struct mptcp_subflow_context *subflow;
|
||||
|
||||
msk->ack_seq++;
|
||||
WRITE_ONCE(msk->ack_seq, msk->ack_seq + 1);
|
||||
WRITE_ONCE(msk->rcv_data_fin, 0);
|
||||
|
||||
sk->sk_shutdown |= RCV_SHUTDOWN;
|
||||
@@ -2039,7 +2039,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
|
||||
msk->remote_key = mp_opt->sndr_key;
|
||||
mptcp_crypto_key_sha(msk->remote_key, NULL, &ack_seq);
|
||||
ack_seq++;
|
||||
msk->ack_seq = ack_seq;
|
||||
WRITE_ONCE(msk->ack_seq, ack_seq);
|
||||
}
|
||||
|
||||
sock_reset_flag(nsk, SOCK_RCU_FREE);
|
||||
@@ -2398,7 +2398,7 @@ bool mptcp_finish_join(struct sock *sk)
|
||||
parent_sock = READ_ONCE(parent->sk_socket);
|
||||
if (parent_sock && !sk->sk_socket)
|
||||
mptcp_sock_graft(sk, parent_sock);
|
||||
subflow->map_seq = msk->ack_seq;
|
||||
subflow->map_seq = READ_ONCE(msk->ack_seq);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@@ -407,7 +407,7 @@ void mptcp_data_ready(struct sock *sk, struct sock *ssk);
|
||||
bool mptcp_finish_join(struct sock *sk);
|
||||
void mptcp_data_acked(struct sock *sk);
|
||||
void mptcp_subflow_eof(struct sock *sk);
|
||||
bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq);
|
||||
bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
|
||||
void mptcp_destroy_common(struct mptcp_sock *msk);
|
||||
|
||||
void __init mptcp_token_init(void);
|
||||
|
@@ -732,7 +732,8 @@ static enum mapping_status get_mapping_status(struct sock *ssk,
|
||||
|
||||
if (mpext->data_fin == 1) {
|
||||
if (data_len == 1) {
|
||||
mptcp_update_rcv_data_fin(msk, mpext->data_seq);
|
||||
bool updated = mptcp_update_rcv_data_fin(msk, mpext->data_seq,
|
||||
mpext->dsn64);
|
||||
pr_debug("DATA_FIN with no payload seq=%llu", mpext->data_seq);
|
||||
if (subflow->map_valid) {
|
||||
/* A DATA_FIN might arrive in a DSS
|
||||
@@ -743,11 +744,23 @@ static enum mapping_status get_mapping_status(struct sock *ssk,
|
||||
skb_ext_del(skb, SKB_EXT_MPTCP);
|
||||
return MAPPING_OK;
|
||||
} else {
|
||||
if (updated && schedule_work(&msk->work))
|
||||
sock_hold((struct sock *)msk);
|
||||
|
||||
return MAPPING_DATA_FIN;
|
||||
}
|
||||
} else {
|
||||
mptcp_update_rcv_data_fin(msk, mpext->data_seq + data_len);
|
||||
pr_debug("DATA_FIN with mapping seq=%llu", mpext->data_seq + data_len);
|
||||
u64 data_fin_seq = mpext->data_seq + data_len;
|
||||
|
||||
/* If mpext->data_seq is a 32-bit value, data_fin_seq
|
||||
* must also be limited to 32 bits.
|
||||
*/
|
||||
if (!mpext->dsn64)
|
||||
data_fin_seq &= GENMASK_ULL(31, 0);
|
||||
|
||||
mptcp_update_rcv_data_fin(msk, data_fin_seq, mpext->dsn64);
|
||||
pr_debug("DATA_FIN with mapping seq=%llu dsn64=%d",
|
||||
data_fin_seq, mpext->dsn64);
|
||||
}
|
||||
|
||||
/* Adjust for DATA_FIN using 1 byte of sequence space */
|
||||
|
Reference in New Issue
Block a user