Webserver+3d print

Dependents:   Nucleo

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers tcp.h Source File

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