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_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 */
 363