00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef DNET_TCP_H
00012 #define DNET_TCP_H
00013
00014 #define TCP_HDR_LEN 20
00015 #define TCP_OPT_LEN 2
00016 #define TCP_OPT_LEN_MAX 40
00017 #define TCP_HDR_LEN_MAX (TCP_HDR_LEN + TCP_OPT_LEN_MAX)
00018
00019 #ifndef __GNUC__
00020 # define __attribute__(x)
00021 # pragma pack(1)
00022 #endif
00023
00024
00025
00026
00027 struct tcp_hdr {
00028 uint16_t th_sport;
00029 uint16_t th_dport;
00030 uint32_t th_seq;
00031 uint32_t th_ack;
00032 #if DNET_BYTESEX == DNET_BIG_ENDIAN
00033 uint8_t th_off:4,
00034 th_x2:4;
00035 #elif DNET_BYTESEX == DNET_LIL_ENDIAN
00036 uint8_t th_x2:4,
00037 th_off:4;
00038 #else
00039 # error "need to include <dnet.h>"
00040 #endif
00041 uint8_t th_flags;
00042 uint16_t th_win;
00043 uint16_t th_sum;
00044 uint16_t th_urp;
00045 };
00046
00047
00048
00049
00050 #define TH_FIN 0x01
00051 #define TH_SYN 0x02
00052 #define TH_RST 0x04
00053 #define TH_PUSH 0x08
00054 #define TH_ACK 0x10
00055 #define TH_URG 0x20
00056 #define TH_ECE 0x40
00057 #define TH_CWR 0x80
00058
00059 #define TCP_PORT_MAX 65535
00060 #define TCP_WIN_MAX 65535
00061
00062
00063
00064
00065 #define TCP_SEQ_LT(a,b) ((int)((a)-(b)) < 0)
00066 #define TCP_SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0)
00067 #define TCP_SEQ_GT(a,b) ((int)((a)-(b)) > 0)
00068 #define TCP_SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0)
00069
00070
00071
00072
00073 #define TCP_STATE_CLOSED 0
00074 #define TCP_STATE_LISTEN 1
00075 #define TCP_STATE_SYN_SENT 2
00076 #define TCP_STATE_SYN_RECEIVED 3
00077
00078 #define TCP_STATE_ESTABLISHED 4
00079 #define TCP_STATE_CLOSE_WAIT 5
00080
00081 #define TCP_STATE_FIN_WAIT_1 6
00082 #define TCP_STATE_CLOSING 7
00083 #define TCP_STATE_LAST_ACK 8
00084
00085 #define TCP_STATE_FIN_WAIT_2 9
00086 #define TCP_STATE_TIME_WAIT 10
00087 #define TCP_STATE_MAX 11
00088
00089
00090
00091
00092 #define TCP_OPT_EOL 0
00093 #define TCP_OPT_NOP 1
00094 #define TCP_OPT_MSS 2
00095 #define TCP_OPT_WSCALE 3
00096 #define TCP_OPT_SACKOK 4
00097 #define TCP_OPT_SACK 5
00098 #define TCP_OPT_ECHO 6
00099 #define TCP_OPT_ECHOREPLY 7
00100 #define TCP_OPT_TIMESTAMP 8
00101 #define TCP_OPT_POCONN 9
00102 #define TCP_OPT_POSVC 10
00103 #define TCP_OPT_CC 11
00104 #define TCP_OPT_CCNEW 12
00105 #define TCP_OPT_CCECHO 13
00106 #define TCP_OPT_ALTSUM 14
00107 #define TCP_OPT_ALTSUMDATA 15
00108 #define TCP_OPT_SKEETER 16
00109 #define TCP_OPT_BUBBA 17
00110 #define TCP_OPT_TRAILSUM 18
00111 #define TCP_OPT_MD5 19
00112 #define TCP_OPT_SCPS 20
00113 #define TCP_OPT_SNACK 21
00114 #define TCP_OPT_REC 22
00115 #define TCP_OPT_CORRUPT 23
00116 #define TCP_OPT_SNAP 24
00117 #define TCP_OPT_TCPCOMP 26
00118 #define TCP_OPT_MAX 27
00119
00120 #define TCP_OPT_TYPEONLY(type) \
00121 ((type) == TCP_OPT_EOL || (type) == TCP_OPT_NOP)
00122
00123
00124
00125
00126 struct tcp_opt {
00127 uint8_t opt_type;
00128 uint8_t opt_len;
00129 union tcp_opt_data {
00130 uint16_t mss;
00131 uint8_t wscale;
00132 uint16_t sack[19];
00133 uint32_t echo;
00134 uint32_t timestamp[2];
00135 uint32_t cc;
00136 uint8_t cksum;
00137 uint8_t md5[16];
00138 uint8_t data8[TCP_OPT_LEN_MAX - TCP_OPT_LEN];
00139 } opt_data;
00140 } __attribute__((__packed__));
00141
00142 #ifndef __GNUC__
00143 # pragma pack()
00144 #endif
00145
00146 #define tcp_pack_hdr(hdr, sport, dport, seq, ack, flags, win, urp) do { \
00147 struct tcp_hdr *tcp_pack_p = (struct tcp_hdr *)(hdr); \
00148 tcp_pack_p->th_sport = htons(sport); \
00149 tcp_pack_p->th_dport = htons(dport); \
00150 tcp_pack_p->th_seq = htonl(seq); \
00151 tcp_pack_p->th_ack = htonl(ack); \
00152 tcp_pack_p->th_x2 = 0; tcp_pack_p->th_off = 5; \
00153 tcp_pack_p->th_flags = flags; \
00154 tcp_pack_p->th_win = htons(win); \
00155 tcp_pack_p->th_urp = htons(urp); \
00156 } while (0)
00157
00158 #endif