1 #pragma once 2 3 #include <features.h> 4 5 #define TCP_NODELAY 1 6 #define TCP_MAXSEG 2 7 #define TCP_CORK 3 8 #define TCP_KEEPIDLE 4 9 #define TCP_KEEPINTVL 5 10 #define TCP_KEEPCNT 6 11 #define TCP_SYNCNT 7 12 #define TCP_LINGER2 8 13 #define TCP_DEFER_ACCEPT 9 14 #define TCP_WINDOW_CLAMP 10 15 #define TCP_INFO 11 16 #define TCP_QUICKACK 12 17 #define TCP_CONGESTION 13 18 #define TCP_MD5SIG 14 19 #define TCP_THIN_LINEAR_TIMEOUTS 16 20 #define TCP_THIN_DUPACK 17 21 #define TCP_USER_TIMEOUT 18 22 #define TCP_REPAIR 19 23 #define TCP_REPAIR_QUEUE 20 24 #define TCP_QUEUE_SEQ 21 25 #define TCP_REPAIR_OPTIONS 22 26 #define TCP_FASTOPEN 23 27 #define TCP_TIMESTAMP 24 28 #define TCP_NOTSENT_LOWAT 25 29 #define TCP_CC_INFO 26 30 #define TCP_SAVE_SYN 27 31 #define TCP_SAVED_SYN 28 32 33 #define TCP_ESTABLISHED 1 34 #define TCP_SYN_SENT 2 35 #define TCP_SYN_RECV 3 36 #define TCP_FIN_WAIT1 4 37 #define TCP_FIN_WAIT2 5 38 #define TCP_TIME_WAIT 6 39 #define TCP_CLOSE 7 40 #define TCP_CLOSE_WAIT 8 41 #define TCP_LAST_ACK 9 42 #define TCP_LISTEN 10 43 #define TCP_CLOSING 11 44 45 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) 46 #define TCPOPT_EOL 0 47 #define TCPOPT_NOP 1 48 #define TCPOPT_MAXSEG 2 49 #define TCPOPT_WINDOW 3 50 #define TCPOPT_SACK_PERMITTED 4 51 #define TCPOPT_SACK 5 52 #define TCPOPT_TIMESTAMP 8 53 #define TCPOLEN_SACK_PERMITTED 2 54 #define TCPOLEN_WINDOW 3 55 #define TCPOLEN_MAXSEG 4 56 #define TCPOLEN_TIMESTAMP 10 57 58 #define SOL_TCP 6 59 60 #include <endian.h> 61 #include <stdint.h> 62 #include <sys/socket.h> 63 #include <sys/types.h> 64 65 typedef uint32_t tcp_seq; 66 67 #define TH_FIN 0x01 68 #define TH_SYN 0x02 69 #define TH_RST 0x04 70 #define TH_PUSH 0x08 71 #define TH_ACK 0x10 72 #define TH_URG 0x20 73 74 struct tcphdr { 75 #ifdef _GNU_SOURCE 76 #ifdef __GNUC__ 77 __extension__ 78 #endif 79 union { 80 struct { 81 82 uint16_t source; 83 uint16_t dest; 84 uint32_t seq; 85 uint32_t ack_seq; 86 #if __BYTE_ORDER == __LITTLE_ENDIAN 87 uint16_t res1 : 4; 88 uint16_t doff : 4; 89 uint16_t fin : 1; 90 uint16_t syn : 1; 91 uint16_t rst : 1; 92 uint16_t psh : 1; 93 uint16_t ack : 1; 94 uint16_t urg : 1; 95 uint16_t res2 : 2; 96 #else 97 uint16_t doff : 4; 98 uint16_t res1 : 4; 99 uint16_t res2 : 2; 100 uint16_t urg : 1; 101 uint16_t ack : 1; 102 uint16_t psh : 1; 103 uint16_t rst : 1; 104 uint16_t syn : 1; 105 uint16_t fin : 1; 106 #endif 107 uint16_t window; 108 uint16_t check; 109 uint16_t urg_ptr; 110 }; 111 struct { 112 #endif 113 114 uint16_t th_sport; 115 uint16_t th_dport; 116 uint32_t th_seq; 117 uint32_t th_ack; 118 #if __BYTE_ORDER == __LITTLE_ENDIAN 119 uint8_t th_x2 : 4; 120 uint8_t th_off : 4; 121 #else 122 uint8_t th_off : 4; 123 uint8_t th_x2 : 4; 124 #endif 125 uint8_t th_flags; 126 uint16_t th_win; 127 uint16_t th_sum; 128 uint16_t th_urp; 129 130 #ifdef _GNU_SOURCE 131 }; 132 }; 133 #endif 134 }; 135 #endif 136 137 #ifdef _GNU_SOURCE 138 #define TCPI_OPT_TIMESTAMPS 1 139 #define TCPI_OPT_SACK 2 140 #define TCPI_OPT_WSCALE 4 141 #define TCPI_OPT_ECN 8 142 143 #define TCP_CA_Open 0 144 #define TCP_CA_Disorder 1 145 #define TCP_CA_CWR 2 146 #define TCP_CA_Recovery 3 147 #define TCP_CA_Loss 4 148 149 struct tcp_info { 150 uint8_t tcpi_state; 151 uint8_t tcpi_ca_state; 152 uint8_t tcpi_retransmits; 153 uint8_t tcpi_probes; 154 uint8_t tcpi_backoff; 155 uint8_t tcpi_options; 156 uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4; 157 uint32_t tcpi_rto; 158 uint32_t tcpi_ato; 159 uint32_t tcpi_snd_mss; 160 uint32_t tcpi_rcv_mss; 161 uint32_t tcpi_unacked; 162 uint32_t tcpi_sacked; 163 uint32_t tcpi_lost; 164 uint32_t tcpi_retrans; 165 uint32_t tcpi_fackets; 166 uint32_t tcpi_last_data_sent; 167 uint32_t tcpi_last_ack_sent; 168 uint32_t tcpi_last_data_recv; 169 uint32_t tcpi_last_ack_recv; 170 uint32_t tcpi_pmtu; 171 uint32_t tcpi_rcv_ssthresh; 172 uint32_t tcpi_rtt; 173 uint32_t tcpi_rttvar; 174 uint32_t tcpi_snd_ssthresh; 175 uint32_t tcpi_snd_cwnd; 176 uint32_t tcpi_advmss; 177 uint32_t tcpi_reordering; 178 uint32_t tcpi_rcv_rtt; 179 uint32_t tcpi_rcv_space; 180 uint32_t tcpi_total_retrans; 181 uint64_t tcpi_pacing_rate; 182 uint64_t tcpi_max_pacing_rate; 183 uint64_t tcpi_bytes_acked; 184 uint64_t tcpi_bytes_received; 185 uint32_t tcpi_segs_out; 186 uint32_t tcpi_segs_in; 187 }; 188 189 #define TCP_MD5SIG_MAXKEYLEN 80 190 191 struct tcp_md5sig { 192 struct sockaddr_storage tcpm_addr; 193 uint16_t __tcpm_pad1; 194 uint16_t tcpm_keylen; 195 uint32_t __tcpm_pad2; 196 uint8_t tcpm_key[TCP_MD5SIG_MAXKEYLEN]; 197 }; 198 199 #endif 200