mikroSDK Reference Manual
tcp.h
Go to the documentation of this file.
1
31#ifndef _TCP_H
32#define _TCP_H
33
34//Dependencies
35#include "net_config.h"
36#include "core/ip.h"
37
38//TCP support
39#ifndef TCP_SUPPORT
40 #define TCP_SUPPORT ENABLED
41#elif (TCP_SUPPORT != ENABLED && TCP_SUPPORT != DISABLED)
42 #error TCP_SUPPORT parameter is not valid
43#endif
44
45//TCP tick interval
46#ifndef TCP_TICK_INTERVAL
47 #define TCP_TICK_INTERVAL 100
48#elif (TCP_TICK_INTERVAL < 10)
49 #error TCP_TICK_INTERVAL parameter is not valid
50#endif
51
52//Maximum segment size
53#ifndef TCP_MAX_MSS
54 #define TCP_MAX_MSS 1430
55#elif (TCP_MAX_MSS < 536)
56 #error TCP_MAX_MSS parameter is not valid
57#endif
58
59//Mimimum acceptable segment size
60#ifndef TCP_MIN_MSS
61 #define TCP_MIN_MSS 64
62#elif (TCP_MIN_MSS < 1)
63 #error TCP_MIN_MSS parameter is not valid
64#endif
65
66//Default buffer size for transmission
67#ifndef TCP_DEFAULT_TX_BUFFER_SIZE
68 #define TCP_DEFAULT_TX_BUFFER_SIZE 2860
69#elif (TCP_DEFAULT_TX_BUFFER_SIZE < 536)
70 #error TCP_DEFAULT_TX_BUFFER_SIZE parameter is not valid
71#endif
72
73//Maximum acceptable size for the send buffer
74#ifndef TCP_MAX_TX_BUFFER_SIZE
75 #define TCP_MAX_TX_BUFFER_SIZE 22880
76#elif (TCP_MAX_TX_BUFFER_SIZE < 536)
77 #error TCP_MAX_TX_BUFFER_SIZE parameter is not valid
78#endif
79
80//Default buffer size for reception
81#ifndef TCP_DEFAULT_RX_BUFFER_SIZE
82 #define TCP_DEFAULT_RX_BUFFER_SIZE 2860
83#elif (TCP_DEFAULT_RX_BUFFER_SIZE < 536)
84 #error TCP_DEFAULT_RX_BUFFER_SIZE parameter is not valid
85#endif
86
87//Maximum acceptable size for the receive buffer
88#ifndef TCP_MAX_RX_BUFFER_SIZE
89 #define TCP_MAX_RX_BUFFER_SIZE 22880
90#elif (TCP_MAX_RX_BUFFER_SIZE < 536)
91 #error TCP_MAX_RX_BUFFER_SIZE parameter is not valid
92#endif
93
94//Default SYN queue size for listening sockets
95#ifndef TCP_DEFAULT_SYN_QUEUE_SIZE
96 #define TCP_DEFAULT_SYN_QUEUE_SIZE 4
97#elif (TCP_DEFAULT_SYN_QUEUE_SIZE < 1)
98 #error TCP_DEFAULT_SYN_QUEUE_SIZE parameter is not valid
99#endif
100
101//Maximum SYN queue size for listening sockets
102#ifndef TCP_MAX_SYN_QUEUE_SIZE
103 #define TCP_MAX_SYN_QUEUE_SIZE 16
104#elif (TCP_MAX_SYN_QUEUE_SIZE < 1)
105 #error TCP_MAX_SYN_QUEUE_SIZE parameter is not valid
106#endif
107
108//Maximum number of retransmissions
109#ifndef TCP_MAX_RETRIES
110 #define TCP_MAX_RETRIES 5
111#elif (TCP_MAX_RETRIES < 1)
112 #error TCP_MAX_RETRIES parameter is not valid
113#endif
114
115//Initial retransmission timeout
116#ifndef TCP_INITIAL_RTO
117 #define TCP_INITIAL_RTO 1000
118#elif (TCP_INITIAL_RTO < 100)
119 #error TCP_INITIAL_RTO parameter is not valid
120#endif
121
122//Minimum retransmission timeout
123#ifndef TCP_MIN_RTO
124 #define TCP_MIN_RTO 1000
125#elif (TCP_MIN_RTO < 100)
126 #error TCP_MIN_RTO parameter is not valid
127#endif
128
129//Maximum retransmission timeout
130#ifndef TCP_MAX_RTO
131 #define TCP_MAX_RTO 60000
132#elif (TCP_MAX_RTO < 1000)
133 #error TCP_MAX_RTO parameter is not valid
134#endif
135
136//Secure initial sequence number generation
137#ifndef TCP_SECURE_ISN_SUPPORT
138 #define TCP_SECURE_ISN_SUPPORT DISABLED
139#elif (TCP_SECURE_ISN_SUPPORT != ENABLED && TCP_SECURE_ISN_SUPPORT != DISABLED)
140 #error TCP_SECURE_ISN_SUPPORT parameter is not valid
141#endif
142
143//TCP congestion control
144#ifndef TCP_CONGEST_CONTROL_SUPPORT
145 #define TCP_CONGEST_CONTROL_SUPPORT ENABLED
146#elif (TCP_CONGEST_CONTROL_SUPPORT != ENABLED && TCP_CONGEST_CONTROL_SUPPORT != DISABLED)
147 #error TCP_CONGEST_CONTROL_SUPPORT parameter is not valid
148#endif
149
150//Number of duplicate ACKs that triggers fast retransmit algorithm
151#ifndef TCP_FAST_RETRANSMIT_THRES
152 #define TCP_FAST_RETRANSMIT_THRES 3
153#elif (TCP_FAST_RETRANSMIT_THRES < 1)
154 #error TCP_FAST_RETRANSMIT_THRES parameter is not valid
155#endif
156
157//Size of the congestion window after the three-way handshake is completed
158#ifndef TCP_INITIAL_WINDOW
159 #define TCP_INITIAL_WINDOW 3
160#elif (TCP_INITIAL_WINDOW < 1)
161 #error TCP_INITIAL_WINDOW parameter is not valid
162#endif
163
164//Size of the congestion window after TCP detects loss using its retransmission timer
165#ifndef TCP_LOSS_WINDOW
166 #define TCP_LOSS_WINDOW 1
167#elif (TCP_LOSS_WINDOW < 1)
168 #error TCP_LOSS_WINDOW parameter is not valid
169#endif
170
171//Default interval between successive window probes
172#ifndef TCP_DEFAULT_PROBE_INTERVAL
173 #define TCP_DEFAULT_PROBE_INTERVAL 1000
174#elif (TCP_DEFAULT_PROBE_INTERVAL < 100)
175 #error TCP_DEFAULT_PROBE_INTERVAL parameter is not valid
176#endif
177
178//Maximum interval between successive window probes
179#ifndef TCP_MAX_PROBE_INTERVAL
180 #define TCP_MAX_PROBE_INTERVAL 60000
181#elif (TCP_MAX_PROBE_INTERVAL < 1000)
182 #error TCP_MAX_PROBE_INTERVAL parameter is not valid
183#endif
184
185//Override timeout (should be in the range 0.1 to 1 seconds)
186#ifndef TCP_OVERRIDE_TIMEOUT
187 #define TCP_OVERRIDE_TIMEOUT 500
188#elif (TCP_OVERRIDE_TIMEOUT < 100)
189 #error TCP_OVERRIDE_TIMEOUT parameter is not valid
190#endif
191
192//FIN-WAIT-2 timer
193#ifndef TCP_FIN_WAIT_2_TIMER
194 #define TCP_FIN_WAIT_2_TIMER 4000
195#elif (TCP_FIN_WAIT_2_TIMER < 1000)
196 #error TCP_FIN_WAIT_2_TIMER parameter is not valid
197#endif
198
199//TIME-WAIT timer
200#ifndef TCP_2MSL_TIMER
201 #define TCP_2MSL_TIMER 4000
202#elif (TCP_2MSL_TIMER < 0)
203 #error TCP_2MSL_TIMER parameter is not valid
204#endif
205
206//TCP keep-alive support
207#ifndef TCP_KEEP_ALIVE_SUPPORT
208 #define TCP_KEEP_ALIVE_SUPPORT DISABLED
209#elif (TCP_KEEP_ALIVE_SUPPORT != ENABLED && TCP_KEEP_ALIVE_SUPPORT != DISABLED)
210 #error TCP_KEEP_ALIVE_SUPPORT parameter is not valid
211#endif
212
213//Default time interval between last data packet sent and first keep-alive probe
214#ifndef TCP_DEFAULT_KEEP_ALIVE_IDLE
215 #define TCP_DEFAULT_KEEP_ALIVE_IDLE 60000
216#elif (TCP_DEFAULT_KEEP_ALIVE_IDLE < 1000)
217 #error TCP_DEFAULT_KEEP_ALIVE_IDLE parameter is not valid
218#endif
219
220//Default time interval between subsequent keep-alive probes
221#ifndef TCP_DEFAULT_KEEP_ALIVE_INTERVAL
222 #define TCP_DEFAULT_KEEP_ALIVE_INTERVAL 15000
223#elif (TCP_DEFAULT_KEEP_ALIVE_INTERVAL < 1000)
224 #error TCP_DEFAULT_KEEP_ALIVE_INTERVAL parameter is not valid
225#endif
226
227//Number of keep-alive probes before considering the connection is dead
228#ifndef TCP_DEFAULT_KEEP_ALIVE_PROBES
229 #define TCP_DEFAULT_KEEP_ALIVE_PROBES 5
230#elif (TCP_DEFAULT_KEEP_ALIVE_PROBES < 1)
231 #error TCP_DEFAULT_KEEP_ALIVE_PROBES parameter is not valid
232#endif
233
234//Selective acknowledgment support
235#ifndef TCP_SACK_SUPPORT
236 #define TCP_SACK_SUPPORT DISABLED
237#elif (TCP_SACK_SUPPORT != ENABLED && TCP_SACK_SUPPORT != DISABLED)
238 #error TCP_SACK_SUPPORT parameter is not valid
239#endif
240
241//Number of SACK blocks
242#ifndef TCP_MAX_SACK_BLOCKS
243 #define TCP_MAX_SACK_BLOCKS 4
244#elif (TCP_MAX_SACK_BLOCKS < 1)
245 #error TCP_MAX_SACK_BLOCKS parameter is not valid
246#endif
247
248//Maximum TCP header length
249#define TCP_MAX_HEADER_LENGTH 60
250//Default maximum segment size
251#define TCP_DEFAULT_MSS 536
252
253//Sequence number comparison macro
254#define TCP_CMP_SEQ(a, b) ((int32_t) ((a) - (b)))
255
256//C++ guard
257#ifdef __cplusplus
258extern "C" {
259#endif
260
261
266typedef enum
267{
268 TCP_STATE_CLOSED = 0,
269 TCP_STATE_LISTEN = 1,
270 TCP_STATE_SYN_SENT = 2,
271 TCP_STATE_SYN_RECEIVED = 3,
272 TCP_STATE_ESTABLISHED = 4,
273 TCP_STATE_CLOSE_WAIT = 5,
274 TCP_STATE_LAST_ACK = 6,
275 TCP_STATE_FIN_WAIT_1 = 7,
276 TCP_STATE_FIN_WAIT_2 = 8,
277 TCP_STATE_CLOSING = 9,
278 TCP_STATE_TIME_WAIT = 10
279} TcpState;
280
281
286typedef enum
287{
288 TCP_CONGEST_STATE_IDLE = 0,
289 TCP_CONGEST_STATE_RECOVERY = 1,
290 TCP_CONGEST_STATE_LOSS_RECOVERY = 2
292
293
298typedef enum
299{
300 TCP_FLAG_FIN = 0x01,
301 TCP_FLAG_SYN = 0x02,
302 TCP_FLAG_RST = 0x04,
303 TCP_FLAG_PSH = 0x08,
304 TCP_FLAG_ACK = 0x10,
305 TCP_FLAG_URG = 0x20
306} TcpFlags;
307
308
313typedef enum
314{
315 TCP_OPTION_END = 0,
316 TCP_OPTION_NOP = 1,
317 TCP_OPTION_MAX_SEGMENT_SIZE = 2,
318 TCP_OPTION_WINDOW_SCALE_FACTOR = 3,
319 TCP_OPTION_SACK_PERMITTED = 4,
320 TCP_OPTION_SACK = 5,
321 TCP_OPTION_TIMESTAMP = 8
323
324
325//CodeWarrior or Win32 compiler?
326#if defined(__CWCC__) || defined(_WIN32)
327 #pragma pack(push, 1)
328#endif
329
330
336{
337 uint16_t srcPort; //0-1
338 uint16_t destPort; //2-3
339 uint32_t seqNum; //4-7
340 uint32_t ackNum; //8-11
341#if defined(_CPU_BIG_ENDIAN) && !defined(__ICCRX__)
342 uint8_t dataOffset : 4; //12
343 uint8_t reserved1 : 4;
344 uint8_t reserved2 : 2; //13
345 uint8_t flags : 6;
346#else
347 uint8_t reserved1 : 4; //12
348 uint8_t dataOffset : 4;
349 uint8_t flags : 6; //13
350 uint8_t reserved2 : 2;
351#endif
352 uint16_t window; //14-15
353 uint16_t checksum; //16-17
354 uint16_t urgentPointer; //18-19
355 uint8_t options[]; //20
356} TcpHeader;
357
358
363typedef __packed_struct
364{
365 uint8_t kind;
366 uint8_t length;
367 uint8_t value[];
368} TcpOption;
369
370
371//CodeWarrior or Win32 compiler?
372#if defined(__CWCC__) || defined(_WIN32)
373 #pragma pack(pop)
374#endif
375
376
381typedef struct _TcpQueueItem
382{
383 struct _TcpQueueItem *next;
384 uint_t length;
385 uint_t sacked;
386 IpPseudoHeader pseudoHeader;
387 uint8_t header[TCP_MAX_HEADER_LENGTH];
389
390
395typedef struct _TcpSynQueueItem
396{
397 struct _TcpSynQueueItem *next;
398 NetInterface *interface;
399 IpAddr srcAddr;
400 uint16_t srcPort;
401 IpAddr destAddr;
402 uint32_t isn;
403 uint16_t mss;
404#if (TCP_SACK_SUPPORT == ENABLED)
405 bool_t sackPermitted;
406#endif
408
409
414typedef struct
415{
416 uint32_t leftEdge;
417 uint32_t rightEdge;
419
420
425typedef struct
426{
427 uint_t chunkCount;
428 uint_t maxChunkCount;
429 ChunkDesc chunk[N(TCP_MAX_TX_BUFFER_SIZE)];
431
432
437typedef struct
438{
439 uint_t chunkCount;
440 uint_t maxChunkCount;
441 ChunkDesc chunk[N(TCP_MAX_RX_BUFFER_SIZE)];
443
444
445//Tick counter to handle periodic operations
446extern systime_t tcpTickCounter;
447
448//TCP related functions
449error_t tcpInit(void);
450
451error_t tcpSetInitialRto(NetInterface *interface, systime_t initialRto);
452
453uint16_t tcpGetDynamicPort(void);
454
455error_t tcpConnect(Socket *socket, const IpAddr *remoteIpAddr,
456 uint16_t remotePort);
457
458error_t tcpListen(Socket *socket, uint_t backlog);
459Socket *tcpAccept(Socket *socket, IpAddr *clientIpAddr, uint16_t *clientPort);
460
461error_t tcpSend(Socket *socket, const uint8_t *data, size_t length,
462 size_t *written, uint_t flags);
463
464error_t tcpReceive(Socket *socket, uint8_t *data, size_t size,
465 size_t *received, uint_t flags);
466
467error_t tcpShutdown(Socket *socket, uint_t how);
468error_t tcpAbort(Socket *socket);
469
470TcpState tcpGetState(Socket *socket);
471
472Socket *tcpKillOldestConnection(void);
473
474//C++ guard
475#ifdef __cplusplus
476}
477#endif
478
479#endif
error_t
Error codes.
Definition error.h:43
IPv4 and IPv6 common routines.
CycloneTCP configuration file.
uint32_t systime_t
System time.
Definition os_port_none.h:90
Structure describing a chunk of data.
Definition net_mem.h:77
IP network address.
Definition ip.h:72
IP pseudo header.
Definition ip.h:91
Receive buffer.
Definition tcp.h:438
SACK block.
Definition tcp.h:415
Transmit buffer.
Definition tcp.h:426
Retransmission queue item.
Definition tcp.h:382
SYN queue item.
Definition tcp.h:396
TcpOptionKind
TCP option types.
Definition tcp.h:314
TcpState
TCP FSM states.
Definition tcp.h:267
TcpFlags
TCP control flags.
Definition tcp.h:299
struct _TcpQueueItem TcpQueueItem
Retransmission queue item.
struct _TcpSynQueueItem TcpSynQueueItem
SYN queue item.
TcpCongestState
TCP congestion states.
Definition tcp.h:287
typedef __packed_struct
TCP header.
Definition tcp.h:336