Webserver+3d print
Embed:
(wiki syntax)
Show/hide line numbers
tcp.h
Go to the documentation of this file.
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
