Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
tcp.h
00001 /** 00002 * @file tcp.h 00003 * @brief TCP (Transmission Control Protocol) 00004 * 00005 * @section License 00006 * 00007 * Copyright (C) 2010-2017 Oryx Embedded SARL. All rights reserved. 00008 * 00009 * This file is part of CycloneTCP Open. 00010 * 00011 * This program is free software; you can redistribute it and/or 00012 * modify it under the terms of the GNU General Public License 00013 * as published by the Free Software Foundation; either version 2 00014 * of the License, or (at your option) any later version. 00015 * 00016 * This program is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 * GNU General Public License for more details. 00020 * 00021 * You should have received a copy of the GNU General Public License 00022 * along with this program; if not, write to the Free Software Foundation, 00023 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00024 * 00025 * @author Oryx Embedded SARL (www.oryx-embedded.com) 00026 * @version 1.7.6 00027 **/ 00028 00029 #ifndef _TCP_H 00030 #define _TCP_H 00031 00032 //Dependencies 00033 #include "net_config.h" 00034 #include "core/ip.h" 00035 00036 //TCP support 00037 #ifndef TCP_SUPPORT 00038 #define TCP_SUPPORT ENABLED 00039 #elif (TCP_SUPPORT != ENABLED && TCP_SUPPORT != DISABLED) 00040 #error TCP_SUPPORT parameter is not valid 00041 #endif 00042 00043 //TCP tick interval 00044 #ifndef TCP_TICK_INTERVAL 00045 #define TCP_TICK_INTERVAL 100 00046 #elif (TCP_TICK_INTERVAL < 10) 00047 #error TCP_TICK_INTERVAL parameter is not valid 00048 #endif 00049 00050 //Maximum segment size 00051 #ifndef TCP_MAX_MSS 00052 #define TCP_MAX_MSS 1430 00053 #elif (TCP_MAX_MSS < 536) 00054 #error TCP_MAX_MSS parameter is not valid 00055 #endif 00056 00057 //Mimimum acceptable segment size 00058 #ifndef TCP_MIN_MSS 00059 #define TCP_MIN_MSS 64 00060 #elif (TCP_MIN_MSS < 1) 00061 #error TCP_MIN_MSS parameter is not valid 00062 #endif 00063 00064 //Default buffer size for transmission 00065 #ifndef TCP_DEFAULT_TX_BUFFER_SIZE 00066 #define TCP_DEFAULT_TX_BUFFER_SIZE 2860 00067 #elif (TCP_DEFAULT_TX_BUFFER_SIZE < 536) 00068 #error TCP_DEFAULT_TX_BUFFER_SIZE parameter is not valid 00069 #endif 00070 00071 //Maximum acceptable size for the send buffer 00072 #ifndef TCP_MAX_TX_BUFFER_SIZE 00073 #define TCP_MAX_TX_BUFFER_SIZE 22880 00074 #elif (TCP_MAX_TX_BUFFER_SIZE < 536) 00075 #error TCP_MAX_TX_BUFFER_SIZE parameter is not valid 00076 #endif 00077 00078 //Default buffer size for reception 00079 #ifndef TCP_DEFAULT_RX_BUFFER_SIZE 00080 #define TCP_DEFAULT_RX_BUFFER_SIZE 2860 00081 #elif (TCP_DEFAULT_RX_BUFFER_SIZE < 536) 00082 #error TCP_DEFAULT_RX_BUFFER_SIZE parameter is not valid 00083 #endif 00084 00085 //Maximum acceptable size for the receive buffer 00086 #ifndef TCP_MAX_RX_BUFFER_SIZE 00087 #define TCP_MAX_RX_BUFFER_SIZE 22880 00088 #elif (TCP_MAX_RX_BUFFER_SIZE < 536) 00089 #error TCP_MAX_RX_BUFFER_SIZE parameter is not valid 00090 #endif 00091 00092 //Default SYN queue size for listening sockets 00093 #ifndef TCP_DEFAULT_SYN_QUEUE_SIZE 00094 #define TCP_DEFAULT_SYN_QUEUE_SIZE 4 00095 #elif (TCP_DEFAULT_SYN_QUEUE_SIZE < 1) 00096 #error TCP_DEFAULT_SYN_QUEUE_SIZE parameter is not valid 00097 #endif 00098 00099 //Maximum SYN queue size for listening sockets 00100 #ifndef TCP_MAX_SYN_QUEUE_SIZE 00101 #define TCP_MAX_SYN_QUEUE_SIZE 16 00102 #elif (TCP_MAX_SYN_QUEUE_SIZE < 1) 00103 #error TCP_MAX_SYN_QUEUE_SIZE parameter is not valid 00104 #endif 00105 00106 //Maximum number of retransmissions 00107 #ifndef TCP_MAX_RETRIES 00108 #define TCP_MAX_RETRIES 5 00109 #elif (TCP_MAX_RETRIES < 1) 00110 #error TCP_MAX_RETRIES parameter is not valid 00111 #endif 00112 00113 //Initial retransmission timeout 00114 #ifndef TCP_INITIAL_RTO 00115 #define TCP_INITIAL_RTO 1000 00116 #elif (TCP_INITIAL_RTO < 100) 00117 #error TCP_INITIAL_RTO parameter is not valid 00118 #endif 00119 00120 //Minimum retransmission timeout 00121 #ifndef TCP_MIN_RTO 00122 #define TCP_MIN_RTO 1000 00123 #elif (TCP_MIN_RTO < 100) 00124 #error TCP_MIN_RTO parameter is not valid 00125 #endif 00126 00127 //Maximum retransmission timeout 00128 #ifndef TCP_MAX_RTO 00129 #define TCP_MAX_RTO 60000 00130 #elif (TCP_MAX_RTO < 1000) 00131 #error TCP_MAX_RTO parameter is not valid 00132 #endif 00133 00134 //TCP congestion control 00135 #ifndef TCP_CONGEST_CONTROL_SUPPORT 00136 #define TCP_CONGEST_CONTROL_SUPPORT ENABLED 00137 #elif (TCP_CONGEST_CONTROL_SUPPORT != ENABLED && TCP_CONGEST_CONTROL_SUPPORT != DISABLED) 00138 #error TCP_CONGEST_CONTROL_SUPPORT parameter is not valid 00139 #endif 00140 00141 //Number of duplicate ACKs that triggers fast retransmit algorithm 00142 #ifndef TCP_FAST_RETRANSMIT_THRES 00143 #define TCP_FAST_RETRANSMIT_THRES 3 00144 #elif (TCP_FAST_RETRANSMIT_THRES < 1) 00145 #error TCP_FAST_RETRANSMIT_THRES parameter is not valid 00146 #endif 00147 00148 //Size of the congestion window after the three-way handshake is completed 00149 #ifndef TCP_INITIAL_WINDOW 00150 #define TCP_INITIAL_WINDOW 3 00151 #elif (TCP_INITIAL_WINDOW < 1) 00152 #error TCP_INITIAL_WINDOW parameter is not valid 00153 #endif 00154 00155 //Size of the congestion window after TCP detects loss using its retransmission timer 00156 #ifndef TCP_LOSS_WINDOW 00157 #define TCP_LOSS_WINDOW 1 00158 #elif (TCP_LOSS_WINDOW < 1) 00159 #error TCP_LOSS_WINDOW parameter is not valid 00160 #endif 00161 00162 //Default interval between successive window probes 00163 #ifndef TCP_DEFAULT_PROBE_INTERVAL 00164 #define TCP_DEFAULT_PROBE_INTERVAL 1000 00165 #elif (TCP_DEFAULT_PROBE_INTERVAL < 100) 00166 #error TCP_DEFAULT_PROBE_INTERVAL parameter is not valid 00167 #endif 00168 00169 //Maximum interval between successive window probes 00170 #ifndef TCP_MAX_PROBE_INTERVAL 00171 #define TCP_MAX_PROBE_INTERVAL 60000 00172 #elif (TCP_MAX_PROBE_INTERVAL < 1000) 00173 #error TCP_MAX_PROBE_INTERVAL parameter is not valid 00174 #endif 00175 00176 //Override timeout (should be in the range 0.1 to 1 seconds) 00177 #ifndef TCP_OVERRIDE_TIMEOUT 00178 #define TCP_OVERRIDE_TIMEOUT 500 00179 #elif (TCP_OVERRIDE_TIMEOUT < 100) 00180 #error TCP_OVERRIDE_TIMEOUT parameter is not valid 00181 #endif 00182 00183 //FIN-WAIT-2 timer 00184 #ifndef TCP_FIN_WAIT_2_TIMER 00185 #define TCP_FIN_WAIT_2_TIMER 4000 00186 #elif (TCP_FIN_WAIT_2_TIMER < 1000) 00187 #error TCP_FIN_WAIT_2_TIMER parameter is not valid 00188 #endif 00189 00190 //TIME-WAIT timer 00191 #ifndef TCP_2MSL_TIMER 00192 #define TCP_2MSL_TIMER 4000 00193 #elif (TCP_2MSL_TIMER < 0) 00194 #error TCP_2MSL_TIMER parameter is not valid 00195 #endif 00196 00197 //Selective acknowledgment support 00198 #ifndef TCP_SACK_SUPPORT 00199 #define TCP_SACK_SUPPORT DISABLED 00200 #elif (TCP_SACK_SUPPORT != ENABLED && TCP_SACK_SUPPORT != DISABLED) 00201 #error TCP_SACK_SUPPORT parameter is not valid 00202 #endif 00203 00204 //Number of SACK blocks 00205 #ifndef TCP_MAX_SACK_BLOCKS 00206 #define TCP_MAX_SACK_BLOCKS 4 00207 #elif (TCP_MAX_SACK_BLOCKS < 1) 00208 #error TCP_MAX_SACK_BLOCKS parameter is not valid 00209 #endif 00210 00211 //Maximum TCP header length 00212 #define TCP_MAX_HEADER_LENGTH 60 00213 //Default maximum segment size 00214 #define TCP_DEFAULT_MSS 536 00215 00216 //Sequence number comparison macro 00217 #define TCP_CMP_SEQ(a, b) ((int32_t) ((a) - (b))) 00218 00219 00220 /** 00221 * @brief TCP FSM states 00222 **/ 00223 00224 typedef enum 00225 { 00226 TCP_STATE_CLOSED = 0, 00227 TCP_STATE_LISTEN = 1, 00228 TCP_STATE_SYN_SENT = 2, 00229 TCP_STATE_SYN_RECEIVED = 3, 00230 TCP_STATE_ESTABLISHED = 4, 00231 TCP_STATE_CLOSE_WAIT = 5, 00232 TCP_STATE_LAST_ACK = 6, 00233 TCP_STATE_FIN_WAIT_1 = 7, 00234 TCP_STATE_FIN_WAIT_2 = 8, 00235 TCP_STATE_CLOSING = 9, 00236 TCP_STATE_TIME_WAIT = 10 00237 } TcpState; 00238 00239 00240 /** 00241 * @brief TCP congestion states 00242 **/ 00243 00244 typedef enum 00245 { 00246 TCP_CONGEST_STATE_IDLE = 0, 00247 TCP_CONGEST_STATE_RECOVERY = 1, 00248 TCP_CONGEST_STATE_LOSS_RECOVERY = 2 00249 } TcpCongestState; 00250 00251 00252 /** 00253 * @brief TCP control flags 00254 **/ 00255 00256 typedef enum 00257 { 00258 TCP_FLAG_FIN = 0x01, 00259 TCP_FLAG_SYN = 0x02, 00260 TCP_FLAG_RST = 0x04, 00261 TCP_FLAG_PSH = 0x08, 00262 TCP_FLAG_ACK = 0x10, 00263 TCP_FLAG_URG = 0x20 00264 } TcpFlags; 00265 00266 00267 /** 00268 * @brief TCP option types 00269 **/ 00270 00271 typedef enum 00272 { 00273 TCP_OPTION_END = 0, 00274 TCP_OPTION_NOP = 1, 00275 TCP_OPTION_MAX_SEGMENT_SIZE = 2, 00276 TCP_OPTION_WINDOW_SCALE_FACTOR = 3, 00277 TCP_OPTION_SACK_PERMITTED = 4, 00278 TCP_OPTION_SACK = 5, 00279 TCP_OPTION_TIMESTAMP = 8 00280 } TcpOptionKind; 00281 00282 00283 //CodeWarrior or Win32 compiler? 00284 #if defined(__CWCC__) || defined(_WIN32) 00285 #pragma pack(push, 1) 00286 #endif 00287 00288 00289 /** 00290 * @brief TCP header 00291 **/ 00292 00293 typedef __start_packed struct 00294 { 00295 uint16_t srcPort; //0-1 00296 uint16_t destPort; //2-3 00297 uint32_t seqNum; //4-7 00298 uint32_t ackNum; //8-11 00299 #ifdef _CPU_BIG_ENDIAN 00300 uint8_t dataOffset : 4; //12 00301 uint8_t reserved1 : 4; 00302 uint8_t reserved2 : 2; //13 00303 uint8_t flags : 6; 00304 #else 00305 uint8_t reserved1 : 4; //12 00306 uint8_t dataOffset : 4; 00307 uint8_t flags : 6; //13 00308 uint8_t reserved2 : 2; 00309 #endif 00310 uint16_t window; //14-15 00311 uint16_t checksum; //16-17 00312 uint16_t urgentPointer; //18-19 00313 uint8_t options[]; //20 00314 } __end_packed TcpHeader; 00315 00316 00317 /** 00318 * @brief TCP option 00319 **/ 00320 00321 typedef __start_packed struct 00322 { 00323 uint8_t kind; 00324 uint8_t length; 00325 uint8_t value[]; 00326 } __end_packed TcpOption; 00327 00328 00329 //CodeWarrior or Win32 compiler? 00330 #if defined(__CWCC__) || defined(_WIN32) 00331 #pragma pack(pop) 00332 #endif 00333 00334 00335 /** 00336 * @brief TCP timer 00337 **/ 00338 00339 typedef struct 00340 { 00341 bool_t running; 00342 systime_t startTime; 00343 systime_t interval; 00344 } TcpTimer; 00345 00346 00347 /** 00348 * @brief Retransmission queue item 00349 **/ 00350 00351 typedef struct _TcpQueueItem 00352 { 00353 struct _TcpQueueItem *next; 00354 uint_t length; 00355 uint_t sacked; 00356 IpPseudoHeader pseudoHeader; 00357 uint8_t header[TCP_MAX_HEADER_LENGTH]; 00358 } TcpQueueItem; 00359 00360 00361 /** 00362 * @brief SYN queue item 00363 **/ 00364 00365 typedef struct _TcpSynQueueItem 00366 { 00367 struct _TcpSynQueueItem *next; 00368 NetInterface *interface; 00369 IpAddr srcAddr; 00370 uint16_t srcPort; 00371 IpAddr destAddr; 00372 uint32_t isn; 00373 uint16_t mss; 00374 } TcpSynQueueItem; 00375 00376 00377 /** 00378 * @brief SACK block 00379 **/ 00380 00381 typedef struct 00382 { 00383 uint32_t leftEdge; 00384 uint32_t rightEdge; 00385 } TcpSackBlock; 00386 00387 00388 /** 00389 * @brief Transmit buffer 00390 **/ 00391 00392 typedef struct 00393 { 00394 uint_t chunkCount; 00395 uint_t maxChunkCount; 00396 ChunkDesc chunk[N(TCP_MAX_TX_BUFFER_SIZE)]; 00397 } TcpTxBuffer; 00398 00399 00400 /** 00401 * @brief Receive buffer 00402 **/ 00403 00404 typedef struct 00405 { 00406 uint_t chunkCount; 00407 uint_t maxChunkCount; 00408 ChunkDesc chunk[N(TCP_MAX_RX_BUFFER_SIZE)]; 00409 } TcpRxBuffer; 00410 00411 00412 //Tick counter to handle periodic operations 00413 extern systime_t tcpTickCounter; 00414 00415 //TCP related functions 00416 error_t tcpInit(void); 00417 uint16_t tcpGetDynamicPort(void); 00418 00419 error_t tcpConnect(Socket *socket, const IpAddr *remoteIpAddr, uint16_t remotePort); 00420 error_t tcpListen(Socket *socket, uint_t backlog); 00421 Socket *tcpAccept(Socket *socket, IpAddr *clientIpAddr, uint16_t *clientPort); 00422 00423 error_t tcpSend(Socket *socket, const uint8_t *data, 00424 size_t length, size_t *written, uint_t flags); 00425 00426 error_t tcpReceive(Socket *socket, uint8_t *data, 00427 size_t size, size_t *received, uint_t flags); 00428 00429 error_t tcpShutdown(Socket *socket, uint_t how); 00430 error_t tcpAbort(Socket *socket); 00431 00432 TcpState tcpGetState(Socket *socket); 00433 00434 Socket *tcpKillOldestConnection(void); 00435 00436 #endif 00437
Generated on Tue Jul 12 2022 17:10:17 by
1.7.2