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 65typedef 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 74struct 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 149struct 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 191struct 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