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