mirror of
https://github.com/FreeRTOS/FreeRTOS-Plus-TCP
synced 2025-10-24 03:32:36 +08:00

* Fix Coverity issues * Fix Misra 4.4 violation:The comment resembles a code snippet * Misra: Rule 10.4 violations * Misra: Rule 11.8 violations * Misra: Rule 12.1 violations * Misra: Rule 8.2, 8.4, 8.5, and 8.9 violations * Misra: Rule 5.3, 5.8, 21.1 and 21.2 violations * Misra: Rule 5.7 violations * Misra: Rule 8.3 violations * Misra: Rule Reverse NULL violations * Misra: Rule 10.3, 10.8 and 8.13 violations * Fix 11.3 and suppress 11.4 * Misra: Rule 14.3, 15.7, 17.2 and 17.7 violations * Misra: Rule 2.2 and 2.7 violation * Misra: Rule 21.6, 8.5 and 8.13 violation * Fix UT compilation * Update comments * Fix Spell checker * Update snprintf
200 lines
9.0 KiB
C
200 lines
9.0 KiB
C
/*
|
|
* FreeRTOS+TCP <DEVELOPMENT BRANCH>
|
|
* Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
* this software and associated documentation files (the "Software"), to deal in
|
|
* the Software without restriction, including without limitation the rights to
|
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
|
* subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* http://aws.amazon.com/freertos
|
|
* http://www.FreeRTOS.org
|
|
*/
|
|
|
|
#ifndef FREERTOS_TCP_IP_H
|
|
#define FREERTOS_TCP_IP_H
|
|
|
|
/* *INDENT-OFF* */
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
/* *INDENT-ON* */
|
|
|
|
/**
|
|
* @brief Process the received TCP packet.
|
|
*
|
|
*/
|
|
BaseType_t xProcessReceivedTCPPacket( NetworkBufferDescriptor_t * pxDescriptor );
|
|
|
|
/**
|
|
* @brief Process the received TCP packet.
|
|
*/
|
|
BaseType_t xProcessReceivedTCPPacket_IPV4( NetworkBufferDescriptor_t * pxDescriptor );
|
|
|
|
/**
|
|
* @brief Process the received TCP packet.
|
|
*/
|
|
BaseType_t xProcessReceivedTCPPacket_IPV6( NetworkBufferDescriptor_t * pxDescriptor );
|
|
|
|
typedef enum eTCP_STATE
|
|
{
|
|
/* Comments about the TCP states are borrowed from the very useful
|
|
* Wiki page:
|
|
* http://en.wikipedia.org/wiki/Transmission_Control_Protocol */
|
|
eCLOSED = 0U, /* 0 (server + client) no connection state at all. */
|
|
eTCP_LISTEN, /* 1 (server) waiting for a connection request
|
|
* from any remote TCP and port. */
|
|
eCONNECT_SYN, /* 2 (client) internal state: socket wants to send
|
|
* a connect */
|
|
eSYN_FIRST, /* 3 (server) Just created, must ACK the SYN request. */
|
|
eSYN_RECEIVED, /* 4 (server) waiting for a confirming connection request
|
|
* acknowledgement after having both received and sent a connection request. */
|
|
eESTABLISHED, /* 5 (server + client) an open connection, data received can be
|
|
* delivered to the user. The normal state for the data transfer phase of the connection. */
|
|
eFIN_WAIT_1, /* 6 (server + client) waiting for a connection termination request from the remote TCP,
|
|
* or an acknowledgement of the connection termination request previously sent. */
|
|
eFIN_WAIT_2, /* 7 (server + client) waiting for a connection termination request from the remote TCP. */
|
|
eCLOSE_WAIT, /* 8 (server + client) waiting for a connection termination request from the local user. */
|
|
eCLOSING, /* 9 (server + client) waiting for a connection termination request acknowledgement from the remote TCP. */
|
|
eLAST_ACK, /*10 (server + client) waiting for an acknowledgement of the connection termination request
|
|
* previously sent to the remote TCP
|
|
* (which includes an acknowledgement of its connection termination request). */
|
|
eTIME_WAIT, /*11 (either server or client) waiting for enough time to pass to be sure the remote TCP received the
|
|
* acknowledgement of its connection termination request. [According to RFC 793 a connection can
|
|
* stay in TIME-WAIT for a maximum of four minutes known as a MSL (maximum segment lifetime).] */
|
|
} eIPTCPState_t;
|
|
|
|
/*
|
|
* The meaning of the TCP flags:
|
|
*/
|
|
#define tcpTCP_FLAG_FIN ( ( uint8_t ) 0x01U ) /**< No more data from sender. */
|
|
#define tcpTCP_FLAG_SYN ( ( uint8_t ) 0x02U ) /**< Synchronize sequence numbers. */
|
|
#define tcpTCP_FLAG_RST ( ( uint8_t ) 0x04U ) /**< Reset the connection. */
|
|
#define tcpTCP_FLAG_PSH ( ( uint8_t ) 0x08U ) /**< Push function: please push buffered data to the recv application. */
|
|
#define tcpTCP_FLAG_ACK ( ( uint8_t ) 0x10U ) /**< Acknowledgment field is significant. */
|
|
#define tcpTCP_FLAG_URG ( ( uint8_t ) 0x20U ) /**< Urgent pointer field is significant. */
|
|
#define tcpTCP_FLAG_ECN ( ( uint8_t ) 0x40U ) /**< ECN-Echo. */
|
|
#define tcpTCP_FLAG_CWR ( ( uint8_t ) 0x80U ) /**< Congestion Window Reduced. */
|
|
|
|
#define tcpTCP_FLAG_CTRL ( ( uint8_t ) 0x1FU ) /**< A mask to filter all protocol flags. */
|
|
|
|
|
|
/*
|
|
* A few values of the TCP options:
|
|
*/
|
|
#define tcpTCP_OPT_END 0U /**< End of TCP options list. */
|
|
#define tcpTCP_OPT_NOOP 1U /**< "No-operation" TCP option. */
|
|
#define tcpTCP_OPT_MSS 2U /**< Maximum segment size TCP option. */
|
|
#define tcpTCP_OPT_WSOPT 3U /**< TCP Window Scale Option (3-byte long). */
|
|
#define tcpTCP_OPT_SACK_P 4U /**< Advertise that SACK is permitted. */
|
|
#define tcpTCP_OPT_SACK_A 5U /**< SACK option with first/last. */
|
|
#define tcpTCP_OPT_TIMESTAMP 8U /**< Time-stamp option. */
|
|
|
|
|
|
#define tcpTCP_OPT_MSS_LEN 4U /**< Length of TCP MSS option. */
|
|
#define tcpTCP_OPT_WSOPT_LEN 3U /**< Length of TCP WSOPT option. */
|
|
|
|
#define tcpTCP_OPT_TIMESTAMP_LEN 10 /**< fixed length of the time-stamp option. */
|
|
|
|
/** @brief
|
|
* Minimum segment length as outlined by RFC 791 section 3.1.
|
|
* Minimum segment length ( 536 ) = Minimum MTU ( 576 ) - IP Header ( 20 ) - TCP Header ( 20 ).
|
|
*/
|
|
#define tcpMINIMUM_SEGMENT_LENGTH 536U
|
|
|
|
/** @brief
|
|
* The macro tcpNOW_CONNECTED() is use to determine if the connection makes a
|
|
* transition from connected to non-connected and vice versa.
|
|
* tcpNOW_CONNECTED() returns true when the status has one of these values:
|
|
* eESTABLISHED, eFIN_WAIT_1, eFIN_WAIT_2, eCLOSING, eLAST_ACK, eTIME_WAIT
|
|
* Technically the connection status is closed earlier, but the library wants
|
|
* to prevent that the socket will be deleted before the last ACK has been
|
|
* and thus causing a 'RST' packet on either side.
|
|
*/
|
|
#define tcpNOW_CONNECTED( status ) \
|
|
( ( ( ( status ) >= ( BaseType_t ) eESTABLISHED ) && ( ( status ) != ( BaseType_t ) eCLOSE_WAIT ) ) ? 1 : 0 )
|
|
|
|
/** @brief
|
|
* The highest 4 bits in the TCP offset byte indicate the total length of the
|
|
* TCP header, divided by 4.
|
|
*/
|
|
#define tcpVALID_BITS_IN_TCP_OFFSET_BYTE ( 0xF0U )
|
|
|
|
/*
|
|
* Acknowledgements to TCP data packets may be delayed as long as more is being expected.
|
|
* A normal delay would be 200ms. Here a much shorter delay of 20 ms is being used to
|
|
* gain performance.
|
|
*/
|
|
#define tcpDELAYED_ACK_SHORT_DELAY_MS ( 2 ) /**< Should not become smaller than 1. */
|
|
#define tcpDELAYED_ACK_LONGER_DELAY_MS ( 20 ) /**< Longer delay for ACK. */
|
|
|
|
|
|
/** @brief
|
|
* The MSS (Maximum Segment Size) will be taken as large as possible. However, packets with
|
|
* an MSS of 1460 bytes won't be transported through the internet. The MSS will be reduced
|
|
* to 1400 bytes.
|
|
*/
|
|
#define tcpREDUCED_MSS_THROUGH_INTERNET ( 1400 )
|
|
|
|
/** @brief
|
|
* When there are no TCP options, the TCP offset equals 20 bytes, which is stored as
|
|
* the number 5 (words) in the higher nibble of the TCP-offset byte.
|
|
*/
|
|
#define tcpTCP_OFFSET_LENGTH_BITS ( 0xf0U )
|
|
#define tcpTCP_OFFSET_STANDARD_LENGTH ( 0x50U ) /**< Standard TCP packet offset. */
|
|
|
|
|
|
/** @brief
|
|
* Each TCP socket is checked regularly to see if it can send data packets.
|
|
* By default, the maximum number of packets sent during one check is limited to 8.
|
|
* This amount may be further limited by setting the socket's TX window size.
|
|
*/
|
|
#if ( !defined( SEND_REPEATED_COUNT ) )
|
|
#define SEND_REPEATED_COUNT ( 8 )
|
|
#endif /* !defined( SEND_REPEATED_COUNT ) */
|
|
|
|
/** @brief
|
|
* Define a maximum period of time (ms) to leave a TCP-socket unattended.
|
|
* When a TCP timer expires, retries and keep-alive messages will be checked.
|
|
*/
|
|
#ifndef tcpMAXIMUM_TCP_WAKEUP_TIME_MS
|
|
#define tcpMAXIMUM_TCP_WAKEUP_TIME_MS 20000U
|
|
#endif
|
|
|
|
struct xSOCKET;
|
|
|
|
/*
|
|
* For anti-hang protection and TCP keep-alive messages. Called in two places:
|
|
* after receiving a packet and after a state change. The socket's alive timer
|
|
* may be reset.
|
|
*/
|
|
void prvTCPTouchSocket( struct xSOCKET * pxSocket );
|
|
|
|
/*
|
|
* Calculate when this socket needs to be checked to do (re-)transmissions.
|
|
*/
|
|
TickType_t prvTCPNextTimeout( struct xSOCKET * pxSocket );
|
|
|
|
|
|
/* *INDENT-OFF* */
|
|
#ifdef __cplusplus
|
|
} /* extern "C" */
|
|
#endif
|
|
/* *INDENT-ON* */
|
|
|
|
#endif /* FREERTOS_TCP_IP_H */
|