Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
0002 /*
0003  * INET     An implementation of the TCP/IP protocol suite for the LINUX
0004  *      operating system.  INET is implemented using the  BSD Socket
0005  *      interface as the means of communication with the user level.
0006  *
0007  *      Definitions for the TCP protocol.
0008  *
0009  * Version: @(#)tcp.h   1.0.2   04/28/93
0010  *
0011  * Author:  Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
0012  *
0013  *      This program is free software; you can redistribute it and/or
0014  *      modify it under the terms of the GNU General Public License
0015  *      as published by the Free Software Foundation; either version
0016  *      2 of the License, or (at your option) any later version.
0017  */
0018 #ifndef _UAPI_LINUX_TCP_H
0019 #define _UAPI_LINUX_TCP_H
0020 
0021 #include <linux/types.h>
0022 #include <asm/byteorder.h>
0023 #include <linux/socket.h>
0024 
0025 struct tcphdr {
0026     __be16  source;
0027     __be16  dest;
0028     __be32  seq;
0029     __be32  ack_seq;
0030 #if defined(__LITTLE_ENDIAN_BITFIELD)
0031     __u16   res1:4,
0032         doff:4,
0033         fin:1,
0034         syn:1,
0035         rst:1,
0036         psh:1,
0037         ack:1,
0038         urg:1,
0039         ece:1,
0040         cwr:1;
0041 #elif defined(__BIG_ENDIAN_BITFIELD)
0042     __u16   doff:4,
0043         res1:4,
0044         cwr:1,
0045         ece:1,
0046         urg:1,
0047         ack:1,
0048         psh:1,
0049         rst:1,
0050         syn:1,
0051         fin:1;
0052 #else
0053 #error  "Adjust your <asm/byteorder.h> defines"
0054 #endif
0055     __be16  window;
0056     __sum16 check;
0057     __be16  urg_ptr;
0058 };
0059 
0060 /*
0061  *  The union cast uses a gcc extension to avoid aliasing problems
0062  *  (union is compatible to any of its members)
0063  *  This means this part of the code is -fstrict-aliasing safe now.
0064  */
0065 union tcp_word_hdr {
0066     struct tcphdr hdr;
0067     __be32        words[5];
0068 };
0069 
0070 #define tcp_flag_word(tp) (((union tcp_word_hdr *)(tp))->words[3])
0071 
0072 enum {
0073     TCP_FLAG_CWR = __constant_cpu_to_be32(0x00800000),
0074     TCP_FLAG_ECE = __constant_cpu_to_be32(0x00400000),
0075     TCP_FLAG_URG = __constant_cpu_to_be32(0x00200000),
0076     TCP_FLAG_ACK = __constant_cpu_to_be32(0x00100000),
0077     TCP_FLAG_PSH = __constant_cpu_to_be32(0x00080000),
0078     TCP_FLAG_RST = __constant_cpu_to_be32(0x00040000),
0079     TCP_FLAG_SYN = __constant_cpu_to_be32(0x00020000),
0080     TCP_FLAG_FIN = __constant_cpu_to_be32(0x00010000),
0081     TCP_RESERVED_BITS = __constant_cpu_to_be32(0x0F000000),
0082     TCP_DATA_OFFSET = __constant_cpu_to_be32(0xF0000000)
0083 };
0084 
0085 /*
0086  * TCP general constants
0087  */
0088 #define TCP_MSS_DEFAULT      536U   /* IPv4 (RFC1122, RFC2581) */
0089 #define TCP_MSS_DESIRED     1220U   /* IPv6 (tunneled), EDNS0 (RFC3226) */
0090 
0091 /* TCP socket options */
0092 #define TCP_NODELAY     1   /* Turn off Nagle's algorithm. */
0093 #define TCP_MAXSEG      2   /* Limit MSS */
0094 #define TCP_CORK        3   /* Never send partially complete segments */
0095 #define TCP_KEEPIDLE        4   /* Start keeplives after this period */
0096 #define TCP_KEEPINTVL       5   /* Interval between keepalives */
0097 #define TCP_KEEPCNT     6   /* Number of keepalives before death */
0098 #define TCP_SYNCNT      7   /* Number of SYN retransmits */
0099 #define TCP_LINGER2     8   /* Life time of orphaned FIN-WAIT-2 state */
0100 #define TCP_DEFER_ACCEPT    9   /* Wake up listener only when data arrive */
0101 #define TCP_WINDOW_CLAMP    10  /* Bound advertised window */
0102 #define TCP_INFO        11  /* Information about this connection. */
0103 #define TCP_QUICKACK        12  /* Block/reenable quick acks */
0104 #define TCP_CONGESTION      13  /* Congestion control algorithm */
0105 #define TCP_MD5SIG      14  /* TCP MD5 Signature (RFC2385) */
0106 #define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/
0107 #define TCP_THIN_DUPACK     17  /* Fast retrans. after 1 dupack */
0108 #define TCP_USER_TIMEOUT    18  /* How long for loss retry before timeout */
0109 #define TCP_REPAIR      19  /* TCP sock is under repair right now */
0110 #define TCP_REPAIR_QUEUE    20
0111 #define TCP_QUEUE_SEQ       21
0112 #define TCP_REPAIR_OPTIONS  22
0113 #define TCP_FASTOPEN        23  /* Enable FastOpen on listeners */
0114 #define TCP_TIMESTAMP       24
0115 #define TCP_NOTSENT_LOWAT   25  /* limit number of unsent bytes in write queue */
0116 #define TCP_CC_INFO     26  /* Get Congestion Control (optional) info */
0117 #define TCP_SAVE_SYN        27  /* Record SYN headers for new connections */
0118 #define TCP_SAVED_SYN       28  /* Get SYN headers recorded for connection */
0119 #define TCP_REPAIR_WINDOW   29  /* Get/set window parameters */
0120 #define TCP_FASTOPEN_CONNECT    30  /* Attempt FastOpen with connect */
0121 #define TCP_ULP         31  /* Attach a ULP to a TCP connection */
0122 #define TCP_MD5SIG_EXT      32  /* TCP MD5 Signature with extensions */
0123 #define TCP_FASTOPEN_KEY    33  /* Set the key for Fast Open (cookie) */
0124 #define TCP_FASTOPEN_NO_COOKIE  34  /* Enable TFO without a TFO cookie */
0125 #define TCP_ZEROCOPY_RECEIVE    35
0126 #define TCP_INQ         36  /* Notify bytes available to read as a cmsg on read */
0127 
0128 #define TCP_CM_INQ      TCP_INQ
0129 
0130 #define TCP_TX_DELAY        37  /* delay outgoing packets by XX usec */
0131 
0132 
0133 #define TCP_REPAIR_ON       1
0134 #define TCP_REPAIR_OFF      0
0135 #define TCP_REPAIR_OFF_NO_WP    -1  /* Turn off without window probes */
0136 
0137 struct tcp_repair_opt {
0138     __u32   opt_code;
0139     __u32   opt_val;
0140 };
0141 
0142 struct tcp_repair_window {
0143     __u32   snd_wl1;
0144     __u32   snd_wnd;
0145     __u32   max_window;
0146 
0147     __u32   rcv_wnd;
0148     __u32   rcv_wup;
0149 };
0150 
0151 enum {
0152     TCP_NO_QUEUE,
0153     TCP_RECV_QUEUE,
0154     TCP_SEND_QUEUE,
0155     TCP_QUEUES_NR,
0156 };
0157 
0158 /* why fastopen failed from client perspective */
0159 enum tcp_fastopen_client_fail {
0160     TFO_STATUS_UNSPEC, /* catch-all */
0161     TFO_COOKIE_UNAVAILABLE, /* if not in TFO_CLIENT_NO_COOKIE mode */
0162     TFO_DATA_NOT_ACKED, /* SYN-ACK did not ack SYN data */
0163     TFO_SYN_RETRANSMITTED, /* SYN-ACK did not ack SYN data after timeout */
0164 };
0165 
0166 /* for TCP_INFO socket option */
0167 #define TCPI_OPT_TIMESTAMPS 1
0168 #define TCPI_OPT_SACK       2
0169 #define TCPI_OPT_WSCALE     4
0170 #define TCPI_OPT_ECN        8 /* ECN was negociated at TCP session init */
0171 #define TCPI_OPT_ECN_SEEN   16 /* we received at least one packet with ECT */
0172 #define TCPI_OPT_SYN_DATA   32 /* SYN-ACK acked data in SYN sent or rcvd */
0173 
0174 /*
0175  * Sender's congestion state indicating normal or abnormal situations
0176  * in the last round of packets sent. The state is driven by the ACK
0177  * information and timer events.
0178  */
0179 enum tcp_ca_state {
0180     /*
0181      * Nothing bad has been observed recently.
0182      * No apparent reordering, packet loss, or ECN marks.
0183      */
0184     TCP_CA_Open = 0,
0185 #define TCPF_CA_Open    (1<<TCP_CA_Open)
0186     /*
0187      * The sender enters disordered state when it has received DUPACKs or
0188      * SACKs in the last round of packets sent. This could be due to packet
0189      * loss or reordering but needs further information to confirm packets
0190      * have been lost.
0191      */
0192     TCP_CA_Disorder = 1,
0193 #define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
0194     /*
0195      * The sender enters Congestion Window Reduction (CWR) state when it
0196      * has received ACKs with ECN-ECE marks, or has experienced congestion
0197      * or packet discard on the sender host (e.g. qdisc).
0198      */
0199     TCP_CA_CWR = 2,
0200 #define TCPF_CA_CWR (1<<TCP_CA_CWR)
0201     /*
0202      * The sender is in fast recovery and retransmitting lost packets,
0203      * typically triggered by ACK events.
0204      */
0205     TCP_CA_Recovery = 3,
0206 #define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
0207     /*
0208      * The sender is in loss recovery triggered by retransmission timeout.
0209      */
0210     TCP_CA_Loss = 4
0211 #define TCPF_CA_Loss    (1<<TCP_CA_Loss)
0212 };
0213 
0214 struct tcp_info {
0215     __u8    tcpi_state;
0216     __u8    tcpi_ca_state;
0217     __u8    tcpi_retransmits;
0218     __u8    tcpi_probes;
0219     __u8    tcpi_backoff;
0220     __u8    tcpi_options;
0221     __u8    tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
0222     __u8    tcpi_delivery_rate_app_limited:1, tcpi_fastopen_client_fail:2;
0223 
0224     __u32   tcpi_rto;
0225     __u32   tcpi_ato;
0226     __u32   tcpi_snd_mss;
0227     __u32   tcpi_rcv_mss;
0228 
0229     __u32   tcpi_unacked;
0230     __u32   tcpi_sacked;
0231     __u32   tcpi_lost;
0232     __u32   tcpi_retrans;
0233     __u32   tcpi_fackets;
0234 
0235     /* Times. */
0236     __u32   tcpi_last_data_sent;
0237     __u32   tcpi_last_ack_sent;     /* Not remembered, sorry. */
0238     __u32   tcpi_last_data_recv;
0239     __u32   tcpi_last_ack_recv;
0240 
0241     /* Metrics. */
0242     __u32   tcpi_pmtu;
0243     __u32   tcpi_rcv_ssthresh;
0244     __u32   tcpi_rtt;
0245     __u32   tcpi_rttvar;
0246     __u32   tcpi_snd_ssthresh;
0247     __u32   tcpi_snd_cwnd;
0248     __u32   tcpi_advmss;
0249     __u32   tcpi_reordering;
0250 
0251     __u32   tcpi_rcv_rtt;
0252     __u32   tcpi_rcv_space;
0253 
0254     __u32   tcpi_total_retrans;
0255 
0256     __u64   tcpi_pacing_rate;
0257     __u64   tcpi_max_pacing_rate;
0258     __u64   tcpi_bytes_acked;    /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
0259     __u64   tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
0260     __u32   tcpi_segs_out;       /* RFC4898 tcpEStatsPerfSegsOut */
0261     __u32   tcpi_segs_in;        /* RFC4898 tcpEStatsPerfSegsIn */
0262 
0263     __u32   tcpi_notsent_bytes;
0264     __u32   tcpi_min_rtt;
0265     __u32   tcpi_data_segs_in;  /* RFC4898 tcpEStatsDataSegsIn */
0266     __u32   tcpi_data_segs_out; /* RFC4898 tcpEStatsDataSegsOut */
0267 
0268     __u64   tcpi_delivery_rate;
0269 
0270     __u64   tcpi_busy_time;      /* Time (usec) busy sending data */
0271     __u64   tcpi_rwnd_limited;   /* Time (usec) limited by receive window */
0272     __u64   tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */
0273 
0274     __u32   tcpi_delivered;
0275     __u32   tcpi_delivered_ce;
0276 
0277     __u64   tcpi_bytes_sent;     /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
0278     __u64   tcpi_bytes_retrans;  /* RFC4898 tcpEStatsPerfOctetsRetrans */
0279     __u32   tcpi_dsack_dups;     /* RFC4898 tcpEStatsStackDSACKDups */
0280     __u32   tcpi_reord_seen;     /* reordering events seen */
0281 
0282     __u32   tcpi_rcv_ooopack;    /* Out-of-order packets received */
0283 
0284     __u32   tcpi_snd_wnd;        /* peer's advertised receive window after
0285                       * scaling (bytes)
0286                       */
0287 };
0288 
0289 /* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
0290 enum {
0291     TCP_NLA_PAD,
0292     TCP_NLA_BUSY,       /* Time (usec) busy sending data */
0293     TCP_NLA_RWND_LIMITED,   /* Time (usec) limited by receive window */
0294     TCP_NLA_SNDBUF_LIMITED, /* Time (usec) limited by send buffer */
0295     TCP_NLA_DATA_SEGS_OUT,  /* Data pkts sent including retransmission */
0296     TCP_NLA_TOTAL_RETRANS,  /* Data pkts retransmitted */
0297     TCP_NLA_PACING_RATE,    /* Pacing rate in bytes per second */
0298     TCP_NLA_DELIVERY_RATE,  /* Delivery rate in bytes per second */
0299     TCP_NLA_SND_CWND,       /* Sending congestion window */
0300     TCP_NLA_REORDERING,     /* Reordering metric */
0301     TCP_NLA_MIN_RTT,        /* minimum RTT */
0302     TCP_NLA_RECUR_RETRANS,  /* Recurring retransmits for the current pkt */
0303     TCP_NLA_DELIVERY_RATE_APP_LMT, /* delivery rate application limited ? */
0304     TCP_NLA_SNDQ_SIZE,  /* Data (bytes) pending in send queue */
0305     TCP_NLA_CA_STATE,   /* ca_state of socket */
0306     TCP_NLA_SND_SSTHRESH,   /* Slow start size threshold */
0307     TCP_NLA_DELIVERED,  /* Data pkts delivered incl. out-of-order */
0308     TCP_NLA_DELIVERED_CE,   /* Like above but only ones w/ CE marks */
0309     TCP_NLA_BYTES_SENT, /* Data bytes sent including retransmission */
0310     TCP_NLA_BYTES_RETRANS,  /* Data bytes retransmitted */
0311     TCP_NLA_DSACK_DUPS, /* DSACK blocks received */
0312     TCP_NLA_REORD_SEEN, /* reordering events seen */
0313     TCP_NLA_SRTT,       /* smoothed RTT in usecs */
0314     TCP_NLA_TIMEOUT_REHASH, /* Timeout-triggered rehash attempts */
0315     TCP_NLA_BYTES_NOTSENT,  /* Bytes in write queue not yet sent */
0316     TCP_NLA_EDT,        /* Earliest departure time (CLOCK_MONOTONIC) */
0317     TCP_NLA_TTL,        /* TTL or hop limit of a packet received */
0318 };
0319 
0320 /* for TCP_MD5SIG socket option */
0321 #define TCP_MD5SIG_MAXKEYLEN    80
0322 
0323 /* tcp_md5sig extension flags for TCP_MD5SIG_EXT */
0324 #define TCP_MD5SIG_FLAG_PREFIX      0x1 /* address prefix length */
0325 #define TCP_MD5SIG_FLAG_IFINDEX     0x2 /* ifindex set */
0326 
0327 struct tcp_md5sig {
0328     struct __kernel_sockaddr_storage tcpm_addr; /* address associated */
0329     __u8    tcpm_flags;             /* extension flags */
0330     __u8    tcpm_prefixlen;             /* address prefix */
0331     __u16   tcpm_keylen;                /* key length */
0332     int tcpm_ifindex;               /* device index for scope */
0333     __u8    tcpm_key[TCP_MD5SIG_MAXKEYLEN];     /* key (binary) */
0334 };
0335 
0336 /* INET_DIAG_MD5SIG */
0337 struct tcp_diag_md5sig {
0338     __u8    tcpm_family;
0339     __u8    tcpm_prefixlen;
0340     __u16   tcpm_keylen;
0341     __be32  tcpm_addr[4];
0342     __u8    tcpm_key[TCP_MD5SIG_MAXKEYLEN];
0343 };
0344 
0345 /* setsockopt(fd, IPPROTO_TCP, TCP_ZEROCOPY_RECEIVE, ...) */
0346 
0347 #define TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT 0x1
0348 struct tcp_zerocopy_receive {
0349     __u64 address;      /* in: address of mapping */
0350     __u32 length;       /* in/out: number of bytes to map/mapped */
0351     __u32 recv_skip_hint;   /* out: amount of bytes to skip */
0352     __u32 inq; /* out: amount of bytes in read queue */
0353     __s32 err; /* out: socket error */
0354     __u64 copybuf_address;  /* in: copybuf address (small reads) */
0355     __s32 copybuf_len; /* in/out: copybuf bytes avail/used or error */
0356     __u32 flags; /* in: flags */
0357     __u64 msg_control; /* ancillary data */
0358     __u64 msg_controllen;
0359     __u32 msg_flags;
0360     __u32 reserved; /* set to 0 for now */
0361 };
0362 #endif /* _UAPI_LINUX_TCP_H */