mptcp: fix spurious retransmissions
[linux-2.6-microblaze.git] / net / mptcp / protocol.h
index d67de79..6a164ad 100644 (file)
@@ -95,6 +95,7 @@
 #define MPTCP_WORK_CLOSE_SUBFLOW 5
 #define MPTCP_PUSH_PENDING     6
 #define MPTCP_CLEAN_UNA                7
+#define MPTCP_ERROR_REPORT     8
 
 static inline bool before64(__u64 seq1, __u64 seq2)
 {
@@ -325,20 +326,13 @@ static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk)
        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)
+static inline struct mptcp_data_frag *mptcp_rtx_head(const struct sock *sk)
 {
        struct mptcp_sock *msk = mptcp_sk(sk);
 
-       if (!before64(msk->snd_nxt, READ_ONCE(msk->snd_una)))
+       if (msk->snd_una == READ_ONCE(msk->snd_nxt))
                return NULL;
 
-       return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
-}
-
-static inline struct mptcp_data_frag *mptcp_rtx_head(const struct sock *sk)
-{
-       struct mptcp_sock *msk = mptcp_sk(sk);
-
        return list_first_entry_or_null(&msk->rtx_queue, struct mptcp_data_frag, list);
 }
 
@@ -414,6 +408,7 @@ struct mptcp_subflow_context {
        void    (*tcp_data_ready)(struct sock *sk);
        void    (*tcp_state_change)(struct sock *sk);
        void    (*tcp_write_space)(struct sock *sk);
+       void    (*tcp_error_report)(struct sock *sk);
 
        struct  rcu_head rcu;
 };
@@ -478,6 +473,7 @@ static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
        sk->sk_data_ready = ctx->tcp_data_ready;
        sk->sk_state_change = ctx->tcp_state_change;
        sk->sk_write_space = ctx->tcp_write_space;
+       sk->sk_error_report = ctx->tcp_error_report;
 
        inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
 }
@@ -505,6 +501,7 @@ bool mptcp_finish_join(struct sock *sk);
 bool mptcp_schedule_work(struct sock *sk);
 void __mptcp_check_push(struct sock *sk, struct sock *ssk);
 void __mptcp_data_acked(struct sock *sk);
+void __mptcp_error_report(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 use_64bit);
 void __mptcp_flush_join_list(struct mptcp_sock *msk);