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

tcp.h (11949B)


      1/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
      2/*
      3 * INET		An implementation of the TCP/IP protocol suite for the LINUX
      4 *		operating system.  INET is implemented using the  BSD Socket
      5 *		interface as the means of communication with the user level.
      6 *
      7 *		Definitions for the TCP protocol.
      8 *
      9 * Version:	@(#)tcp.h	1.0.2	04/28/93
     10 *
     11 * Author:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
     12 *
     13 *		This program is free software; you can redistribute it and/or
     14 *		modify it under the terms of the GNU General Public License
     15 *		as published by the Free Software Foundation; either version
     16 *		2 of the License, or (at your option) any later version.
     17 */
     18#ifndef _UAPI_LINUX_TCP_H
     19#define _UAPI_LINUX_TCP_H
     20
     21#include <linux/types.h>
     22#include <asm/byteorder.h>
     23#include <linux/socket.h>
     24
     25struct tcphdr {
     26	__be16	source;
     27	__be16	dest;
     28	__be32	seq;
     29	__be32	ack_seq;
     30#if defined(__LITTLE_ENDIAN_BITFIELD)
     31	__u16	res1:4,
     32		doff:4,
     33		fin:1,
     34		syn:1,
     35		rst:1,
     36		psh:1,
     37		ack:1,
     38		urg:1,
     39		ece:1,
     40		cwr:1;
     41#elif defined(__BIG_ENDIAN_BITFIELD)
     42	__u16	doff:4,
     43		res1:4,
     44		cwr:1,
     45		ece:1,
     46		urg:1,
     47		ack:1,
     48		psh:1,
     49		rst:1,
     50		syn:1,
     51		fin:1;
     52#else
     53#error	"Adjust your <asm/byteorder.h> defines"
     54#endif
     55	__be16	window;
     56	__sum16	check;
     57	__be16	urg_ptr;
     58};
     59
     60/*
     61 *	The union cast uses a gcc extension to avoid aliasing problems
     62 *  (union is compatible to any of its members)
     63 *  This means this part of the code is -fstrict-aliasing safe now.
     64 */
     65union tcp_word_hdr {
     66	struct tcphdr hdr;
     67	__be32        words[5];
     68};
     69
     70#define tcp_flag_word(tp) (((union tcp_word_hdr *)(tp))->words[3])
     71
     72enum {
     73	TCP_FLAG_CWR = __constant_cpu_to_be32(0x00800000),
     74	TCP_FLAG_ECE = __constant_cpu_to_be32(0x00400000),
     75	TCP_FLAG_URG = __constant_cpu_to_be32(0x00200000),
     76	TCP_FLAG_ACK = __constant_cpu_to_be32(0x00100000),
     77	TCP_FLAG_PSH = __constant_cpu_to_be32(0x00080000),
     78	TCP_FLAG_RST = __constant_cpu_to_be32(0x00040000),
     79	TCP_FLAG_SYN = __constant_cpu_to_be32(0x00020000),
     80	TCP_FLAG_FIN = __constant_cpu_to_be32(0x00010000),
     81	TCP_RESERVED_BITS = __constant_cpu_to_be32(0x0F000000),
     82	TCP_DATA_OFFSET = __constant_cpu_to_be32(0xF0000000)
     83};
     84
     85/*
     86 * TCP general constants
     87 */
     88#define TCP_MSS_DEFAULT		 536U	/* IPv4 (RFC1122, RFC2581) */
     89#define TCP_MSS_DESIRED		1220U	/* IPv6 (tunneled), EDNS0 (RFC3226) */
     90
     91/* TCP socket options */
     92#define TCP_NODELAY		1	/* Turn off Nagle's algorithm. */
     93#define TCP_MAXSEG		2	/* Limit MSS */
     94#define TCP_CORK		3	/* Never send partially complete segments */
     95#define TCP_KEEPIDLE		4	/* Start keeplives after this period */
     96#define TCP_KEEPINTVL		5	/* Interval between keepalives */
     97#define TCP_KEEPCNT		6	/* Number of keepalives before death */
     98#define TCP_SYNCNT		7	/* Number of SYN retransmits */
     99#define TCP_LINGER2		8	/* Life time of orphaned FIN-WAIT-2 state */
    100#define TCP_DEFER_ACCEPT	9	/* Wake up listener only when data arrive */
    101#define TCP_WINDOW_CLAMP	10	/* Bound advertised window */
    102#define TCP_INFO		11	/* Information about this connection. */
    103#define TCP_QUICKACK		12	/* Block/reenable quick acks */
    104#define TCP_CONGESTION		13	/* Congestion control algorithm */
    105#define TCP_MD5SIG		14	/* TCP MD5 Signature (RFC2385) */
    106#define TCP_THIN_LINEAR_TIMEOUTS 16	/* Use linear timeouts for thin streams*/
    107#define TCP_THIN_DUPACK		17	/* Fast retrans. after 1 dupack */
    108#define TCP_USER_TIMEOUT	18	/* How long for loss retry before timeout */
    109#define TCP_REPAIR		19	/* TCP sock is under repair right now */
    110#define TCP_REPAIR_QUEUE	20
    111#define TCP_QUEUE_SEQ		21
    112#define TCP_REPAIR_OPTIONS	22
    113#define TCP_FASTOPEN		23	/* Enable FastOpen on listeners */
    114#define TCP_TIMESTAMP		24
    115#define TCP_NOTSENT_LOWAT	25	/* limit number of unsent bytes in write queue */
    116#define TCP_CC_INFO		26	/* Get Congestion Control (optional) info */
    117#define TCP_SAVE_SYN		27	/* Record SYN headers for new connections */
    118#define TCP_SAVED_SYN		28	/* Get SYN headers recorded for connection */
    119#define TCP_REPAIR_WINDOW	29	/* Get/set window parameters */
    120#define TCP_FASTOPEN_CONNECT	30	/* Attempt FastOpen with connect */
    121#define TCP_ULP			31	/* Attach a ULP to a TCP connection */
    122#define TCP_MD5SIG_EXT		32	/* TCP MD5 Signature with extensions */
    123#define TCP_FASTOPEN_KEY	33	/* Set the key for Fast Open (cookie) */
    124#define TCP_FASTOPEN_NO_COOKIE	34	/* Enable TFO without a TFO cookie */
    125#define TCP_ZEROCOPY_RECEIVE	35
    126#define TCP_INQ			36	/* Notify bytes available to read as a cmsg on read */
    127
    128#define TCP_CM_INQ		TCP_INQ
    129
    130#define TCP_TX_DELAY		37	/* delay outgoing packets by XX usec */
    131
    132
    133#define TCP_REPAIR_ON		1
    134#define TCP_REPAIR_OFF		0
    135#define TCP_REPAIR_OFF_NO_WP	-1	/* Turn off without window probes */
    136
    137struct tcp_repair_opt {
    138	__u32	opt_code;
    139	__u32	opt_val;
    140};
    141
    142struct tcp_repair_window {
    143	__u32	snd_wl1;
    144	__u32	snd_wnd;
    145	__u32	max_window;
    146
    147	__u32	rcv_wnd;
    148	__u32	rcv_wup;
    149};
    150
    151enum {
    152	TCP_NO_QUEUE,
    153	TCP_RECV_QUEUE,
    154	TCP_SEND_QUEUE,
    155	TCP_QUEUES_NR,
    156};
    157
    158/* why fastopen failed from client perspective */
    159enum tcp_fastopen_client_fail {
    160	TFO_STATUS_UNSPEC, /* catch-all */
    161	TFO_COOKIE_UNAVAILABLE, /* if not in TFO_CLIENT_NO_COOKIE mode */
    162	TFO_DATA_NOT_ACKED, /* SYN-ACK did not ack SYN data */
    163	TFO_SYN_RETRANSMITTED, /* SYN-ACK did not ack SYN data after timeout */
    164};
    165
    166/* for TCP_INFO socket option */
    167#define TCPI_OPT_TIMESTAMPS	1
    168#define TCPI_OPT_SACK		2
    169#define TCPI_OPT_WSCALE		4
    170#define TCPI_OPT_ECN		8 /* ECN was negociated at TCP session init */
    171#define TCPI_OPT_ECN_SEEN	16 /* we received at least one packet with ECT */
    172#define TCPI_OPT_SYN_DATA	32 /* SYN-ACK acked data in SYN sent or rcvd */
    173
    174/*
    175 * Sender's congestion state indicating normal or abnormal situations
    176 * in the last round of packets sent. The state is driven by the ACK
    177 * information and timer events.
    178 */
    179enum tcp_ca_state {
    180	/*
    181	 * Nothing bad has been observed recently.
    182	 * No apparent reordering, packet loss, or ECN marks.
    183	 */
    184	TCP_CA_Open = 0,
    185#define TCPF_CA_Open	(1<<TCP_CA_Open)
    186	/*
    187	 * The sender enters disordered state when it has received DUPACKs or
    188	 * SACKs in the last round of packets sent. This could be due to packet
    189	 * loss or reordering but needs further information to confirm packets
    190	 * have been lost.
    191	 */
    192	TCP_CA_Disorder = 1,
    193#define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
    194	/*
    195	 * The sender enters Congestion Window Reduction (CWR) state when it
    196	 * has received ACKs with ECN-ECE marks, or has experienced congestion
    197	 * or packet discard on the sender host (e.g. qdisc).
    198	 */
    199	TCP_CA_CWR = 2,
    200#define TCPF_CA_CWR	(1<<TCP_CA_CWR)
    201	/*
    202	 * The sender is in fast recovery and retransmitting lost packets,
    203	 * typically triggered by ACK events.
    204	 */
    205	TCP_CA_Recovery = 3,
    206#define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
    207	/*
    208	 * The sender is in loss recovery triggered by retransmission timeout.
    209	 */
    210	TCP_CA_Loss = 4
    211#define TCPF_CA_Loss	(1<<TCP_CA_Loss)
    212};
    213
    214struct tcp_info {
    215	__u8	tcpi_state;
    216	__u8	tcpi_ca_state;
    217	__u8	tcpi_retransmits;
    218	__u8	tcpi_probes;
    219	__u8	tcpi_backoff;
    220	__u8	tcpi_options;
    221	__u8	tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
    222	__u8	tcpi_delivery_rate_app_limited:1, tcpi_fastopen_client_fail:2;
    223
    224	__u32	tcpi_rto;
    225	__u32	tcpi_ato;
    226	__u32	tcpi_snd_mss;
    227	__u32	tcpi_rcv_mss;
    228
    229	__u32	tcpi_unacked;
    230	__u32	tcpi_sacked;
    231	__u32	tcpi_lost;
    232	__u32	tcpi_retrans;
    233	__u32	tcpi_fackets;
    234
    235	/* Times. */
    236	__u32	tcpi_last_data_sent;
    237	__u32	tcpi_last_ack_sent;     /* Not remembered, sorry. */
    238	__u32	tcpi_last_data_recv;
    239	__u32	tcpi_last_ack_recv;
    240
    241	/* Metrics. */
    242	__u32	tcpi_pmtu;
    243	__u32	tcpi_rcv_ssthresh;
    244	__u32	tcpi_rtt;
    245	__u32	tcpi_rttvar;
    246	__u32	tcpi_snd_ssthresh;
    247	__u32	tcpi_snd_cwnd;
    248	__u32	tcpi_advmss;
    249	__u32	tcpi_reordering;
    250
    251	__u32	tcpi_rcv_rtt;
    252	__u32	tcpi_rcv_space;
    253
    254	__u32	tcpi_total_retrans;
    255
    256	__u64	tcpi_pacing_rate;
    257	__u64	tcpi_max_pacing_rate;
    258	__u64	tcpi_bytes_acked;    /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
    259	__u64	tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
    260	__u32	tcpi_segs_out;	     /* RFC4898 tcpEStatsPerfSegsOut */
    261	__u32	tcpi_segs_in;	     /* RFC4898 tcpEStatsPerfSegsIn */
    262
    263	__u32	tcpi_notsent_bytes;
    264	__u32	tcpi_min_rtt;
    265	__u32	tcpi_data_segs_in;	/* RFC4898 tcpEStatsDataSegsIn */
    266	__u32	tcpi_data_segs_out;	/* RFC4898 tcpEStatsDataSegsOut */
    267
    268	__u64   tcpi_delivery_rate;
    269
    270	__u64	tcpi_busy_time;      /* Time (usec) busy sending data */
    271	__u64	tcpi_rwnd_limited;   /* Time (usec) limited by receive window */
    272	__u64	tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */
    273
    274	__u32	tcpi_delivered;
    275	__u32	tcpi_delivered_ce;
    276
    277	__u64	tcpi_bytes_sent;     /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
    278	__u64	tcpi_bytes_retrans;  /* RFC4898 tcpEStatsPerfOctetsRetrans */
    279	__u32	tcpi_dsack_dups;     /* RFC4898 tcpEStatsStackDSACKDups */
    280	__u32	tcpi_reord_seen;     /* reordering events seen */
    281
    282	__u32	tcpi_rcv_ooopack;    /* Out-of-order packets received */
    283
    284	__u32	tcpi_snd_wnd;	     /* peer's advertised receive window after
    285				      * scaling (bytes)
    286				      */
    287};
    288
    289/* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
    290enum {
    291	TCP_NLA_PAD,
    292	TCP_NLA_BUSY,		/* Time (usec) busy sending data */
    293	TCP_NLA_RWND_LIMITED,	/* Time (usec) limited by receive window */
    294	TCP_NLA_SNDBUF_LIMITED,	/* Time (usec) limited by send buffer */
    295	TCP_NLA_DATA_SEGS_OUT,	/* Data pkts sent including retransmission */
    296	TCP_NLA_TOTAL_RETRANS,	/* Data pkts retransmitted */
    297	TCP_NLA_PACING_RATE,    /* Pacing rate in bytes per second */
    298	TCP_NLA_DELIVERY_RATE,  /* Delivery rate in bytes per second */
    299	TCP_NLA_SND_CWND,       /* Sending congestion window */
    300	TCP_NLA_REORDERING,     /* Reordering metric */
    301	TCP_NLA_MIN_RTT,        /* minimum RTT */
    302	TCP_NLA_RECUR_RETRANS,  /* Recurring retransmits for the current pkt */
    303	TCP_NLA_DELIVERY_RATE_APP_LMT, /* delivery rate application limited ? */
    304	TCP_NLA_SNDQ_SIZE,	/* Data (bytes) pending in send queue */
    305	TCP_NLA_CA_STATE,	/* ca_state of socket */
    306	TCP_NLA_SND_SSTHRESH,	/* Slow start size threshold */
    307	TCP_NLA_DELIVERED,	/* Data pkts delivered incl. out-of-order */
    308	TCP_NLA_DELIVERED_CE,	/* Like above but only ones w/ CE marks */
    309	TCP_NLA_BYTES_SENT,	/* Data bytes sent including retransmission */
    310	TCP_NLA_BYTES_RETRANS,	/* Data bytes retransmitted */
    311	TCP_NLA_DSACK_DUPS,	/* DSACK blocks received */
    312	TCP_NLA_REORD_SEEN,	/* reordering events seen */
    313	TCP_NLA_SRTT,		/* smoothed RTT in usecs */
    314	TCP_NLA_TIMEOUT_REHASH, /* Timeout-triggered rehash attempts */
    315	TCP_NLA_BYTES_NOTSENT,	/* Bytes in write queue not yet sent */
    316	TCP_NLA_EDT,		/* Earliest departure time (CLOCK_MONOTONIC) */
    317	TCP_NLA_TTL,		/* TTL or hop limit of a packet received */
    318};
    319
    320/* for TCP_MD5SIG socket option */
    321#define TCP_MD5SIG_MAXKEYLEN	80
    322
    323/* tcp_md5sig extension flags for TCP_MD5SIG_EXT */
    324#define TCP_MD5SIG_FLAG_PREFIX		0x1	/* address prefix length */
    325#define TCP_MD5SIG_FLAG_IFINDEX		0x2	/* ifindex set */
    326
    327struct tcp_md5sig {
    328	struct __kernel_sockaddr_storage tcpm_addr;	/* address associated */
    329	__u8	tcpm_flags;				/* extension flags */
    330	__u8	tcpm_prefixlen;				/* address prefix */
    331	__u16	tcpm_keylen;				/* key length */
    332	int	tcpm_ifindex;				/* device index for scope */
    333	__u8	tcpm_key[TCP_MD5SIG_MAXKEYLEN];		/* key (binary) */
    334};
    335
    336/* INET_DIAG_MD5SIG */
    337struct tcp_diag_md5sig {
    338	__u8	tcpm_family;
    339	__u8	tcpm_prefixlen;
    340	__u16	tcpm_keylen;
    341	__be32	tcpm_addr[4];
    342	__u8	tcpm_key[TCP_MD5SIG_MAXKEYLEN];
    343};
    344
    345/* setsockopt(fd, IPPROTO_TCP, TCP_ZEROCOPY_RECEIVE, ...) */
    346
    347#define TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT 0x1
    348struct tcp_zerocopy_receive {
    349	__u64 address;		/* in: address of mapping */
    350	__u32 length;		/* in/out: number of bytes to map/mapped */
    351	__u32 recv_skip_hint;	/* out: amount of bytes to skip */
    352	__u32 inq; /* out: amount of bytes in read queue */
    353	__s32 err; /* out: socket error */
    354	__u64 copybuf_address;	/* in: copybuf address (small reads) */
    355	__s32 copybuf_len; /* in/out: copybuf bytes avail/used or error */
    356	__u32 flags; /* in: flags */
    357	__u64 msg_control; /* ancillary data */
    358	__u64 msg_controllen;
    359	__u32 msg_flags;
    360	__u32 reserved; /* set to 0 for now */
    361};
    362#endif /* _UAPI_LINUX_TCP_H */