xref: /linux/include/net/mptcp.h (revision 85712484)
13ee17bc7SMat Martineau /* SPDX-License-Identifier: GPL-2.0 */
23ee17bc7SMat Martineau /*
33ee17bc7SMat Martineau  * Multipath TCP
43ee17bc7SMat Martineau  *
53ee17bc7SMat Martineau  * Copyright (c) 2017 - 2019, Intel Corporation.
63ee17bc7SMat Martineau  */
73ee17bc7SMat Martineau 
83ee17bc7SMat Martineau #ifndef __NET_MPTCP_H
93ee17bc7SMat Martineau #define __NET_MPTCP_H
103ee17bc7SMat Martineau 
11*85712484SMat Martineau #include <linux/skbuff.h>
123ee17bc7SMat Martineau #include <linux/types.h>
133ee17bc7SMat Martineau 
143ee17bc7SMat Martineau /* MPTCP sk_buff extension data */
153ee17bc7SMat Martineau struct mptcp_ext {
163ee17bc7SMat Martineau 	u64		data_ack;
173ee17bc7SMat Martineau 	u64		data_seq;
183ee17bc7SMat Martineau 	u32		subflow_seq;
193ee17bc7SMat Martineau 	u16		data_len;
203ee17bc7SMat Martineau 	u8		use_map:1,
213ee17bc7SMat Martineau 			dsn64:1,
223ee17bc7SMat Martineau 			data_fin:1,
233ee17bc7SMat Martineau 			use_ack:1,
243ee17bc7SMat Martineau 			ack64:1,
253ee17bc7SMat Martineau 			__unused:3;
263ee17bc7SMat Martineau 	/* one byte hole */
273ee17bc7SMat Martineau };
283ee17bc7SMat Martineau 
29*85712484SMat Martineau #ifdef CONFIG_MPTCP
30*85712484SMat Martineau 
31*85712484SMat Martineau /* move the skb extension owership, with the assumption that 'to' is
32*85712484SMat Martineau  * newly allocated
33*85712484SMat Martineau  */
34*85712484SMat Martineau static inline void mptcp_skb_ext_move(struct sk_buff *to,
35*85712484SMat Martineau 				      struct sk_buff *from)
36*85712484SMat Martineau {
37*85712484SMat Martineau 	if (!skb_ext_exist(from, SKB_EXT_MPTCP))
38*85712484SMat Martineau 		return;
39*85712484SMat Martineau 
40*85712484SMat Martineau 	if (WARN_ON_ONCE(to->active_extensions))
41*85712484SMat Martineau 		skb_ext_put(to);
42*85712484SMat Martineau 
43*85712484SMat Martineau 	to->active_extensions = from->active_extensions;
44*85712484SMat Martineau 	to->extensions = from->extensions;
45*85712484SMat Martineau 	from->active_extensions = 0;
46*85712484SMat Martineau }
47*85712484SMat Martineau 
48*85712484SMat Martineau static inline bool mptcp_ext_matches(const struct mptcp_ext *to_ext,
49*85712484SMat Martineau 				     const struct mptcp_ext *from_ext)
50*85712484SMat Martineau {
51*85712484SMat Martineau 	/* MPTCP always clears the ext when adding it to the skb, so
52*85712484SMat Martineau 	 * holes do not bother us here
53*85712484SMat Martineau 	 */
54*85712484SMat Martineau 	return !from_ext ||
55*85712484SMat Martineau 	       (to_ext && from_ext &&
56*85712484SMat Martineau 	        !memcmp(from_ext, to_ext, sizeof(struct mptcp_ext)));
57*85712484SMat Martineau }
58*85712484SMat Martineau 
59*85712484SMat Martineau /* check if skbs can be collapsed.
60*85712484SMat Martineau  * MPTCP collapse is allowed if neither @to or @from carry an mptcp data
61*85712484SMat Martineau  * mapping, or if the extension of @to is the same as @from.
62*85712484SMat Martineau  * Collapsing is not possible if @to lacks an extension, but @from carries one.
63*85712484SMat Martineau  */
64*85712484SMat Martineau static inline bool mptcp_skb_can_collapse(const struct sk_buff *to,
65*85712484SMat Martineau 					  const struct sk_buff *from)
66*85712484SMat Martineau {
67*85712484SMat Martineau 	return mptcp_ext_matches(skb_ext_find(to, SKB_EXT_MPTCP),
68*85712484SMat Martineau 				 skb_ext_find(from, SKB_EXT_MPTCP));
69*85712484SMat Martineau }
70*85712484SMat Martineau 
71*85712484SMat Martineau #else
72*85712484SMat Martineau 
73*85712484SMat Martineau static inline void mptcp_skb_ext_move(struct sk_buff *to,
74*85712484SMat Martineau 				      const struct sk_buff *from)
75*85712484SMat Martineau {
76*85712484SMat Martineau }
77*85712484SMat Martineau 
78*85712484SMat Martineau static inline bool mptcp_skb_can_collapse(const struct sk_buff *to,
79*85712484SMat Martineau 					  const struct sk_buff *from)
80*85712484SMat Martineau {
81*85712484SMat Martineau 	return true;
82*85712484SMat Martineau }
83*85712484SMat Martineau 
84*85712484SMat Martineau #endif /* CONFIG_MPTCP */
853ee17bc7SMat Martineau #endif /* __NET_MPTCP_H */
86