cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mptcp.h (6709B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Multipath TCP
      4 *
      5 * Copyright (c) 2017 - 2019, Intel Corporation.
      6 */
      7
      8#ifndef __NET_MPTCP_H
      9#define __NET_MPTCP_H
     10
     11#include <linux/skbuff.h>
     12#include <linux/tcp.h>
     13#include <linux/types.h>
     14
     15struct mptcp_info;
     16struct mptcp_sock;
     17struct seq_file;
     18
     19/* MPTCP sk_buff extension data */
     20struct mptcp_ext {
     21	union {
     22		u64	data_ack;
     23		u32	data_ack32;
     24	};
     25	u64		data_seq;
     26	u32		subflow_seq;
     27	u16		data_len;
     28	__sum16		csum;
     29	u8		use_map:1,
     30			dsn64:1,
     31			data_fin:1,
     32			use_ack:1,
     33			ack64:1,
     34			mpc_map:1,
     35			frozen:1,
     36			reset_transient:1;
     37	u8		reset_reason:4,
     38			csum_reqd:1,
     39			infinite_map:1;
     40};
     41
     42#define MPTCP_RM_IDS_MAX	8
     43
     44struct mptcp_rm_list {
     45	u8 ids[MPTCP_RM_IDS_MAX];
     46	u8 nr;
     47};
     48
     49struct mptcp_addr_info {
     50	u8			id;
     51	sa_family_t		family;
     52	__be16			port;
     53	union {
     54		struct in_addr	addr;
     55#if IS_ENABLED(CONFIG_MPTCP_IPV6)
     56		struct in6_addr	addr6;
     57#endif
     58	};
     59};
     60
     61struct mptcp_out_options {
     62#if IS_ENABLED(CONFIG_MPTCP)
     63	u16 suboptions;
     64	struct mptcp_rm_list rm_list;
     65	u8 join_id;
     66	u8 backup;
     67	u8 reset_reason:4,
     68	   reset_transient:1,
     69	   csum_reqd:1,
     70	   allow_join_id0:1;
     71	union {
     72		struct {
     73			u64 sndr_key;
     74			u64 rcvr_key;
     75			u64 data_seq;
     76			u32 subflow_seq;
     77			u16 data_len;
     78			__sum16 csum;
     79		};
     80		struct {
     81			struct mptcp_addr_info addr;
     82			u64 ahmac;
     83		};
     84		struct {
     85			struct mptcp_ext ext_copy;
     86			u64 fail_seq;
     87		};
     88		struct {
     89			u32 nonce;
     90			u32 token;
     91			u64 thmac;
     92			u8 hmac[20];
     93		};
     94	};
     95#endif
     96};
     97
     98#ifdef CONFIG_MPTCP
     99extern struct request_sock_ops mptcp_subflow_request_sock_ops;
    100
    101void mptcp_init(void);
    102
    103static inline bool sk_is_mptcp(const struct sock *sk)
    104{
    105	return tcp_sk(sk)->is_mptcp;
    106}
    107
    108static inline bool rsk_is_mptcp(const struct request_sock *req)
    109{
    110	return tcp_rsk(req)->is_mptcp;
    111}
    112
    113static inline bool rsk_drop_req(const struct request_sock *req)
    114{
    115	return tcp_rsk(req)->is_mptcp && tcp_rsk(req)->drop_req;
    116}
    117
    118void mptcp_space(const struct sock *ssk, int *space, int *full_space);
    119bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
    120		       unsigned int *size, struct mptcp_out_options *opts);
    121bool mptcp_synack_options(const struct request_sock *req, unsigned int *size,
    122			  struct mptcp_out_options *opts);
    123bool mptcp_established_options(struct sock *sk, struct sk_buff *skb,
    124			       unsigned int *size, unsigned int remaining,
    125			       struct mptcp_out_options *opts);
    126bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb);
    127
    128void mptcp_write_options(struct tcphdr *th, __be32 *ptr, struct tcp_sock *tp,
    129			 struct mptcp_out_options *opts);
    130
    131void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info);
    132
    133/* move the skb extension owership, with the assumption that 'to' is
    134 * newly allocated
    135 */
    136static inline void mptcp_skb_ext_move(struct sk_buff *to,
    137				      struct sk_buff *from)
    138{
    139	if (!skb_ext_exist(from, SKB_EXT_MPTCP))
    140		return;
    141
    142	if (WARN_ON_ONCE(to->active_extensions))
    143		skb_ext_put(to);
    144
    145	to->active_extensions = from->active_extensions;
    146	to->extensions = from->extensions;
    147	from->active_extensions = 0;
    148}
    149
    150static inline void mptcp_skb_ext_copy(struct sk_buff *to,
    151				      struct sk_buff *from)
    152{
    153	struct mptcp_ext *from_ext;
    154
    155	from_ext = skb_ext_find(from, SKB_EXT_MPTCP);
    156	if (!from_ext)
    157		return;
    158
    159	from_ext->frozen = 1;
    160	skb_ext_copy(to, from);
    161}
    162
    163static inline bool mptcp_ext_matches(const struct mptcp_ext *to_ext,
    164				     const struct mptcp_ext *from_ext)
    165{
    166	/* MPTCP always clears the ext when adding it to the skb, so
    167	 * holes do not bother us here
    168	 */
    169	return !from_ext ||
    170	       (to_ext && from_ext &&
    171	        !memcmp(from_ext, to_ext, sizeof(struct mptcp_ext)));
    172}
    173
    174/* check if skbs can be collapsed.
    175 * MPTCP collapse is allowed if neither @to or @from carry an mptcp data
    176 * mapping, or if the extension of @to is the same as @from.
    177 * Collapsing is not possible if @to lacks an extension, but @from carries one.
    178 */
    179static inline bool mptcp_skb_can_collapse(const struct sk_buff *to,
    180					  const struct sk_buff *from)
    181{
    182	return mptcp_ext_matches(skb_ext_find(to, SKB_EXT_MPTCP),
    183				 skb_ext_find(from, SKB_EXT_MPTCP));
    184}
    185
    186void mptcp_seq_show(struct seq_file *seq);
    187int mptcp_subflow_init_cookie_req(struct request_sock *req,
    188				  const struct sock *sk_listener,
    189				  struct sk_buff *skb);
    190
    191__be32 mptcp_get_reset_option(const struct sk_buff *skb);
    192
    193static inline __be32 mptcp_reset_option(const struct sk_buff *skb)
    194{
    195	if (skb_ext_exist(skb, SKB_EXT_MPTCP))
    196		return mptcp_get_reset_option(skb);
    197
    198	return htonl(0u);
    199}
    200#else
    201
    202static inline void mptcp_init(void)
    203{
    204}
    205
    206static inline bool sk_is_mptcp(const struct sock *sk)
    207{
    208	return false;
    209}
    210
    211static inline bool rsk_is_mptcp(const struct request_sock *req)
    212{
    213	return false;
    214}
    215
    216static inline bool rsk_drop_req(const struct request_sock *req)
    217{
    218	return false;
    219}
    220
    221static inline bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
    222				     unsigned int *size,
    223				     struct mptcp_out_options *opts)
    224{
    225	return false;
    226}
    227
    228static inline bool mptcp_synack_options(const struct request_sock *req,
    229					unsigned int *size,
    230					struct mptcp_out_options *opts)
    231{
    232	return false;
    233}
    234
    235static inline bool mptcp_established_options(struct sock *sk,
    236					     struct sk_buff *skb,
    237					     unsigned int *size,
    238					     unsigned int remaining,
    239					     struct mptcp_out_options *opts)
    240{
    241	return false;
    242}
    243
    244static inline bool mptcp_incoming_options(struct sock *sk,
    245					  struct sk_buff *skb)
    246{
    247	return true;
    248}
    249
    250static inline void mptcp_skb_ext_move(struct sk_buff *to,
    251				      const struct sk_buff *from)
    252{
    253}
    254
    255static inline void mptcp_skb_ext_copy(struct sk_buff *to,
    256				      struct sk_buff *from)
    257{
    258}
    259
    260static inline bool mptcp_skb_can_collapse(const struct sk_buff *to,
    261					  const struct sk_buff *from)
    262{
    263	return true;
    264}
    265
    266static inline void mptcp_space(const struct sock *ssk, int *s, int *fs) { }
    267static inline void mptcp_seq_show(struct seq_file *seq) { }
    268
    269static inline int mptcp_subflow_init_cookie_req(struct request_sock *req,
    270						const struct sock *sk_listener,
    271						struct sk_buff *skb)
    272{
    273	return 0; /* TCP fallback */
    274}
    275
    276static inline __be32 mptcp_reset_option(const struct sk_buff *skb)  { return htonl(0u); }
    277#endif /* CONFIG_MPTCP */
    278
    279#if IS_ENABLED(CONFIG_MPTCP_IPV6)
    280int mptcpv6_init(void);
    281void mptcpv6_handle_mapped(struct sock *sk, bool mapped);
    282#elif IS_ENABLED(CONFIG_IPV6)
    283static inline int mptcpv6_init(void) { return 0; }
    284static inline void mptcpv6_handle_mapped(struct sock *sk, bool mapped) { }
    285#endif
    286
    287#if defined(CONFIG_MPTCP) && defined(CONFIG_BPF_SYSCALL)
    288struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk);
    289#else
    290static inline struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk) { return NULL; }
    291#endif
    292
    293#endif /* __NET_MPTCP_H */