linux/include/uapi/linux/tcp.h
<<
>>
Prefs
   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_REPAIR_ON           1
 131#define TCP_REPAIR_OFF          0
 132#define TCP_REPAIR_OFF_NO_WP    -1      /* Turn off without window probes */
 133
 134struct tcp_repair_opt {
 135        __u32   opt_code;
 136        __u32   opt_val;
 137};
 138
 139struct tcp_repair_window {
 140        __u32   snd_wl1;
 141        __u32   snd_wnd;
 142        __u32   max_window;
 143
 144        __u32   rcv_wnd;
 145        __u32   rcv_wup;
 146};
 147
 148enum {
 149        TCP_NO_QUEUE,
 150        TCP_RECV_QUEUE,
 151        TCP_SEND_QUEUE,
 152        TCP_QUEUES_NR,
 153};
 154
 155/* for TCP_INFO socket option */
 156#define TCPI_OPT_TIMESTAMPS     1
 157#define TCPI_OPT_SACK           2
 158#define TCPI_OPT_WSCALE         4
 159#define TCPI_OPT_ECN            8 /* ECN was negociated at TCP session init */
 160#define TCPI_OPT_ECN_SEEN       16 /* we received at least one packet with ECT */
 161#define TCPI_OPT_SYN_DATA       32 /* SYN-ACK acked data in SYN sent or rcvd */
 162
 163enum tcp_ca_state {
 164        TCP_CA_Open = 0,
 165#define TCPF_CA_Open    (1<<TCP_CA_Open)
 166        TCP_CA_Disorder = 1,
 167#define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
 168        TCP_CA_CWR = 2,
 169#define TCPF_CA_CWR     (1<<TCP_CA_CWR)
 170        TCP_CA_Recovery = 3,
 171#define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
 172        TCP_CA_Loss = 4
 173#define TCPF_CA_Loss    (1<<TCP_CA_Loss)
 174};
 175
 176struct tcp_info {
 177        __u8    tcpi_state;
 178        __u8    tcpi_ca_state;
 179        __u8    tcpi_retransmits;
 180        __u8    tcpi_probes;
 181        __u8    tcpi_backoff;
 182        __u8    tcpi_options;
 183        __u8    tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
 184        __u8    tcpi_delivery_rate_app_limited:1;
 185
 186        __u32   tcpi_rto;
 187        __u32   tcpi_ato;
 188        __u32   tcpi_snd_mss;
 189        __u32   tcpi_rcv_mss;
 190
 191        __u32   tcpi_unacked;
 192        __u32   tcpi_sacked;
 193        __u32   tcpi_lost;
 194        __u32   tcpi_retrans;
 195        __u32   tcpi_fackets;
 196
 197        /* Times. */
 198        __u32   tcpi_last_data_sent;
 199        __u32   tcpi_last_ack_sent;     /* Not remembered, sorry. */
 200        __u32   tcpi_last_data_recv;
 201        __u32   tcpi_last_ack_recv;
 202
 203        /* Metrics. */
 204        __u32   tcpi_pmtu;
 205        __u32   tcpi_rcv_ssthresh;
 206        __u32   tcpi_rtt;
 207        __u32   tcpi_rttvar;
 208        __u32   tcpi_snd_ssthresh;
 209        __u32   tcpi_snd_cwnd;
 210        __u32   tcpi_advmss;
 211        __u32   tcpi_reordering;
 212
 213        __u32   tcpi_rcv_rtt;
 214        __u32   tcpi_rcv_space;
 215
 216        __u32   tcpi_total_retrans;
 217
 218        __u64   tcpi_pacing_rate;
 219        __u64   tcpi_max_pacing_rate;
 220        __u64   tcpi_bytes_acked;    /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
 221        __u64   tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
 222        __u32   tcpi_segs_out;       /* RFC4898 tcpEStatsPerfSegsOut */
 223        __u32   tcpi_segs_in;        /* RFC4898 tcpEStatsPerfSegsIn */
 224
 225        __u32   tcpi_notsent_bytes;
 226        __u32   tcpi_min_rtt;
 227        __u32   tcpi_data_segs_in;      /* RFC4898 tcpEStatsDataSegsIn */
 228        __u32   tcpi_data_segs_out;     /* RFC4898 tcpEStatsDataSegsOut */
 229
 230        __u64   tcpi_delivery_rate;
 231
 232        __u64   tcpi_busy_time;      /* Time (usec) busy sending data */
 233        __u64   tcpi_rwnd_limited;   /* Time (usec) limited by receive window */
 234        __u64   tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */
 235
 236        __u32   tcpi_delivered;
 237        __u32   tcpi_delivered_ce;
 238
 239        __u64   tcpi_bytes_sent;     /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
 240        __u64   tcpi_bytes_retrans;  /* RFC4898 tcpEStatsPerfOctetsRetrans */
 241        __u32   tcpi_dsack_dups;     /* RFC4898 tcpEStatsStackDSACKDups */
 242        __u32   tcpi_reord_seen;     /* reordering events seen */
 243};
 244
 245/* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
 246enum {
 247        TCP_NLA_PAD,
 248        TCP_NLA_BUSY,           /* Time (usec) busy sending data */
 249        TCP_NLA_RWND_LIMITED,   /* Time (usec) limited by receive window */
 250        TCP_NLA_SNDBUF_LIMITED, /* Time (usec) limited by send buffer */
 251        TCP_NLA_DATA_SEGS_OUT,  /* Data pkts sent including retransmission */
 252        TCP_NLA_TOTAL_RETRANS,  /* Data pkts retransmitted */
 253        TCP_NLA_PACING_RATE,    /* Pacing rate in bytes per second */
 254        TCP_NLA_DELIVERY_RATE,  /* Delivery rate in bytes per second */
 255        TCP_NLA_SND_CWND,       /* Sending congestion window */
 256        TCP_NLA_REORDERING,     /* Reordering metric */
 257        TCP_NLA_MIN_RTT,        /* minimum RTT */
 258        TCP_NLA_RECUR_RETRANS,  /* Recurring retransmits for the current pkt */
 259        TCP_NLA_DELIVERY_RATE_APP_LMT, /* delivery rate application limited ? */
 260        TCP_NLA_SNDQ_SIZE,      /* Data (bytes) pending in send queue */
 261        TCP_NLA_CA_STATE,       /* ca_state of socket */
 262        TCP_NLA_SND_SSTHRESH,   /* Slow start size threshold */
 263        TCP_NLA_DELIVERED,      /* Data pkts delivered incl. out-of-order */
 264        TCP_NLA_DELIVERED_CE,   /* Like above but only ones w/ CE marks */
 265        TCP_NLA_BYTES_SENT,     /* Data bytes sent including retransmission */
 266        TCP_NLA_BYTES_RETRANS,  /* Data bytes retransmitted */
 267        TCP_NLA_DSACK_DUPS,     /* DSACK blocks received */
 268        TCP_NLA_REORD_SEEN,     /* reordering events seen */
 269};
 270
 271/* for TCP_MD5SIG socket option */
 272#define TCP_MD5SIG_MAXKEYLEN    80
 273
 274/* tcp_md5sig extension flags for TCP_MD5SIG_EXT */
 275#define TCP_MD5SIG_FLAG_PREFIX          1       /* address prefix length */
 276
 277struct tcp_md5sig {
 278        struct __kernel_sockaddr_storage tcpm_addr;     /* address associated */
 279        __u8    tcpm_flags;                             /* extension flags */
 280        __u8    tcpm_prefixlen;                         /* address prefix */
 281        __u16   tcpm_keylen;                            /* key length */
 282        __u32   __tcpm_pad;                             /* zero */
 283        __u8    tcpm_key[TCP_MD5SIG_MAXKEYLEN];         /* key (binary) */
 284};
 285
 286/* INET_DIAG_MD5SIG */
 287struct tcp_diag_md5sig {
 288        __u8    tcpm_family;
 289        __u8    tcpm_prefixlen;
 290        __u16   tcpm_keylen;
 291        __be32  tcpm_addr[4];
 292        __u8    tcpm_key[TCP_MD5SIG_MAXKEYLEN];
 293};
 294
 295/* setsockopt(fd, IPPROTO_TCP, TCP_ZEROCOPY_RECEIVE, ...) */
 296
 297struct tcp_zerocopy_receive {
 298        __u64 address;          /* in: address of mapping */
 299        __u32 length;           /* in/out: number of bytes to map/mapped */
 300        __u32 recv_skip_hint;   /* out: amount of bytes to skip */
 301};
 302#endif /* _UAPI_LINUX_TCP_H */
 303