mptcp: add accounting for pending data
Preparation patch to track the data pending in the msk write queue. No functional change introduced here Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
caf971df01
commit
f0e6a4cf11
|
@ -1859,6 +1859,7 @@ static int __mptcp_init_sock(struct sock *sk)
|
|||
__set_bit(MPTCP_SEND_SPACE, &msk->flags);
|
||||
INIT_WORK(&msk->work, mptcp_worker);
|
||||
msk->out_of_order_queue = RB_ROOT;
|
||||
msk->first_pending = NULL;
|
||||
|
||||
msk->first = NULL;
|
||||
inet_csk(sk)->icsk_sync_mss = mptcp_sync_mss;
|
||||
|
|
|
@ -187,9 +187,10 @@ struct mptcp_pm_data {
|
|||
struct mptcp_data_frag {
|
||||
struct list_head list;
|
||||
u64 data_seq;
|
||||
int data_len;
|
||||
int offset;
|
||||
int overhead;
|
||||
u16 data_len;
|
||||
u16 offset;
|
||||
u16 overhead;
|
||||
u16 already_sent;
|
||||
struct page *page;
|
||||
};
|
||||
|
||||
|
@ -219,6 +220,7 @@ struct mptcp_sock {
|
|||
struct rb_root out_of_order_queue;
|
||||
struct list_head conn_list;
|
||||
struct list_head rtx_queue;
|
||||
struct mptcp_data_frag *first_pending;
|
||||
struct list_head join_list;
|
||||
struct skb_ext *cached_ext; /* for the next sendmsg */
|
||||
struct socket *subflow; /* outgoing connect/listener/!mp_capable */
|
||||
|
@ -240,6 +242,36 @@ static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
|
|||
return (struct mptcp_sock *)sk;
|
||||
}
|
||||
|
||||
static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk)
|
||||
{
|
||||
const struct mptcp_sock *msk = mptcp_sk(sk);
|
||||
|
||||
return READ_ONCE(msk->first_pending);
|
||||
}
|
||||
|
||||
static inline struct mptcp_data_frag *mptcp_send_next(struct sock *sk)
|
||||
{
|
||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||
struct mptcp_data_frag *cur;
|
||||
|
||||
cur = msk->first_pending;
|
||||
return list_is_last(&cur->list, &msk->rtx_queue) ? NULL :
|
||||
list_next_entry(cur, list);
|
||||
}
|
||||
|
||||
static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk)
|
||||
{
|
||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||
|
||||
if (!msk->first_pending)
|
||||
return NULL;
|
||||
|
||||
if (WARN_ON_ONCE(list_empty(&msk->rtx_queue)))
|
||||
return NULL;
|
||||
|
||||
return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
|
||||
}
|
||||
|
||||
static inline struct mptcp_data_frag *mptcp_rtx_tail(const struct sock *sk)
|
||||
{
|
||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||
|
|
Loading…
Reference in New Issue