Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / net / mptcp / protocol.h
index 20f04ac..aa0ab18 100644 (file)
@@ -140,6 +140,8 @@ struct mptcp_addr_info {
        sa_family_t             family;
        __be16                  port;
        u8                      id;
+       u8                      flags;
+       int                     ifindex;
        union {
                struct in_addr addr;
 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
@@ -150,6 +152,7 @@ struct mptcp_addr_info {
 
 enum mptcp_pm_status {
        MPTCP_PM_ADD_ADDR_RECEIVED,
+       MPTCP_PM_RM_ADDR_RECEIVED,
        MPTCP_PM_ESTABLISHED,
        MPTCP_PM_SUBFLOW_ESTABLISHED,
 };
@@ -157,14 +160,17 @@ enum mptcp_pm_status {
 struct mptcp_pm_data {
        struct mptcp_addr_info local;
        struct mptcp_addr_info remote;
+       struct list_head anno_list;
 
        spinlock_t      lock;           /*protects the whole PM data */
 
-       bool            addr_signal;
+       bool            add_addr_signal;
+       bool            rm_addr_signal;
        bool            server_side;
        bool            work_pending;
        bool            accept_addr;
        bool            accept_subflow;
+       bool            add_addr_echo;
        u8              add_addr_signaled;
        u8              add_addr_accepted;
        u8              local_addr_used;
@@ -174,6 +180,7 @@ struct mptcp_pm_data {
        u8              local_addr_max;
        u8              subflows_max;
        u8              status;
+       u8              rm_id;
 };
 
 struct mptcp_data_frag {
@@ -194,6 +201,8 @@ struct mptcp_sock {
        u64             write_seq;
        u64             ack_seq;
        u64             rcv_data_fin_seq;
+       struct sock     *last_snd;
+       int             snd_burst;
        atomic64_t      snd_una;
        unsigned long   timer_ival;
        u32             token;
@@ -204,6 +213,8 @@ struct mptcp_sock {
        bool            snd_data_fin_enable;
        spinlock_t      join_list_lock;
        struct work_struct work;
+       struct sk_buff  *ooo_last_skb;
+       struct rb_root  out_of_order_queue;
        struct list_head conn_list;
        struct list_head rtx_queue;
        struct list_head join_list;
@@ -268,6 +279,12 @@ mptcp_subflow_rsk(const struct request_sock *rsk)
        return (struct mptcp_subflow_request_sock *)rsk;
 }
 
+enum mptcp_data_avail {
+       MPTCP_SUBFLOW_NODATA,
+       MPTCP_SUBFLOW_DATA_AVAIL,
+       MPTCP_SUBFLOW_OOO_DATA
+};
+
 /* MPTCP subflow context */
 struct mptcp_subflow_context {
        struct  list_head node;/* conn_list of subflows */
@@ -292,10 +309,10 @@ struct mptcp_subflow_context {
                map_valid : 1,
                mpc_map : 1,
                backup : 1,
-               data_avail : 1,
                rx_eof : 1,
                use_64bit_ack : 1, /* Set when we received a 64-bit DSN */
                can_ack : 1;        /* only after processing the remote a key */
+       enum mptcp_data_avail data_avail;
        u32     remote_nonce;
        u64     thmac;
        u32     local_nonce;
@@ -348,10 +365,13 @@ void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
                                     struct mptcp_options_received *mp_opt);
 bool mptcp_subflow_data_available(struct sock *sk);
 void __init mptcp_subflow_init(void);
+void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
+void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
+                      struct mptcp_subflow_context *subflow,
+                      long timeout);
 
 /* called with sk socket lock held */
-int __mptcp_subflow_connect(struct sock *sk, int ifindex,
-                           const struct mptcp_addr_info *loc,
+int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
                            const struct mptcp_addr_info *remote);
 int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock);
 
@@ -388,6 +408,7 @@ 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 use_64bit);
+void mptcp_destroy_common(struct mptcp_sock *msk);
 
 void __init mptcp_token_init(void);
 static inline void mptcp_token_init_request(struct request_sock *req)
@@ -421,26 +442,40 @@ void mptcp_pm_subflow_established(struct mptcp_sock *msk,
 void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id);
 void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
                                const struct mptcp_addr_info *addr);
+void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id);
+void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
+struct mptcp_pm_add_entry *
+mptcp_pm_del_add_timer(struct mptcp_sock *msk,
+                      struct mptcp_addr_info *addr);
 
 int mptcp_pm_announce_addr(struct mptcp_sock *msk,
-                          const struct mptcp_addr_info *addr);
+                          const struct mptcp_addr_info *addr,
+                          bool echo);
 int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_id);
-int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 remote_id);
+int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 local_id);
+
+static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
+{
+       return READ_ONCE(msk->pm.add_addr_signal);
+}
 
-static inline bool mptcp_pm_should_signal(struct mptcp_sock *msk)
+static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
 {
-       return READ_ONCE(msk->pm.addr_signal);
+       return READ_ONCE(msk->pm.rm_addr_signal);
 }
 
-static inline unsigned int mptcp_add_addr_len(int family)
+static inline unsigned int mptcp_add_addr_len(int family, bool echo)
 {
        if (family == AF_INET)
-               return TCPOLEN_MPTCP_ADD_ADDR;
-       return TCPOLEN_MPTCP_ADD_ADDR6;
+               return echo ? TCPOLEN_MPTCP_ADD_ADDR_BASE
+                           : TCPOLEN_MPTCP_ADD_ADDR;
+       return echo ? TCPOLEN_MPTCP_ADD_ADDR6_BASE : TCPOLEN_MPTCP_ADD_ADDR6;
 }
 
-bool mptcp_pm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
-                         struct mptcp_addr_info *saddr);
+bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
+                             struct mptcp_addr_info *saddr, bool *echo);
+bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
+                            u8 *rm_id);
 int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
 
 void __init mptcp_pm_nl_init(void);
@@ -448,6 +483,8 @@ void mptcp_pm_nl_data_init(struct mptcp_sock *msk);
 void mptcp_pm_nl_fully_established(struct mptcp_sock *msk);
 void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk);
 void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk);
+void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk);
+void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, u8 rm_id);
 int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
 
 static inline struct mptcp_ext *mptcp_get_ext(struct sk_buff *skb)
@@ -464,12 +501,12 @@ static inline bool before64(__u64 seq1, __u64 seq2)
 
 void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops);
 
-static inline bool __mptcp_check_fallback(struct mptcp_sock *msk)
+static inline bool __mptcp_check_fallback(const struct mptcp_sock *msk)
 {
        return test_bit(MPTCP_FALLBACK_DONE, &msk->flags);
 }
 
-static inline bool mptcp_check_fallback(struct sock *sk)
+static inline bool mptcp_check_fallback(const struct sock *sk)
 {
        struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
        struct mptcp_sock *msk = mptcp_sk(subflow->conn);