mbed-os/features/nanostack/sal-stack-nanostack/source/Common_Protocols/tcp.h

158 lines
5.6 KiB
C

/*
* Copyright (c) 2013-2017, Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef TCP_H_
#define TCP_H_
#define TCP_UNACK_MAX 3
#define TCP_WINDOW_SIZE 300
#define TCP_ETHERNET_WINDOW_SIZE 1440
#define TCP_TIMER_PERIOD 150 // milliseconds
#define TCP_LOWPAN_MSS_LIMIT 300
#define TCP_MAX_RX_QLEN 1024
// Times in TCP_TIMER_PERIOD units
#define TCP_TIME_WAIT_TO_CLOSE 1600 // 4 minutes
#define TCP_FIN_WAIT_2_TIMEOUT 500 // 75s
#define TCP_MINIMUM_RTO 8 // 1.05s + 1 tick round-up
#define TCP_INITIAL_RTO 8 // 1.05s (RFC6298) + 1 tick round-up
#define TCP_INITIAL_CONSERVATIVE_RTO 21 // 3s + 1 tick round-up
#define TCP_MAXIMUM_RTO 400 // 1 minute
#define TCP_MAX_RETRIES 6 // if min RTO, 1s+2s+4s+8s+16s+32s(+60s wait) = 123s - RFC1122 says at least 100 seconds
#define TCP_SYN_RETRIES 7 // retry at 1s+2s+4s+8s+16s+32s+60s(+60s wait) = 3 min 3s - RFC1122 says at least 3 minutes
#define TCP_PROBLEM_RETRIES 3 // report connection difficulties - RFC1122 says at least 3 retries
// maximum RTO should be kept below 4000 to avoid 16-bit calculation overflow
#define TCP_FLAG_FIN 1
#define TCP_FLAG_SYN 2
#define TCP_FLAG_RST 4
#define TCP_FLAG_PSH 8
#define TCP_FLAG_ACK 16
#define TCP_FLAG_URG 32
#define TCP_FLAG_ECE 64
#define TCP_FLAG_CWR 128
#define TCP_OPTION_END 0
#define TCP_OPTION_NOP 1
#define TCP_OPTION_MSS 2
// State numbering must remain fixed, as TCP test API uses it,
// and we don't expose it in public headers. The chosen
// numbering is from the SNMP MIB - RFC 4022.
#define TCP_STATE_CLOSED 1
#define TCP_STATE_LISTEN 2
#define TCP_STATE_SYN_SENT 3
#define TCP_STATE_SYN_RECEIVED 4
#define TCP_STATE_ESTABLISHED 5
#define TCP_STATE_FIN_WAIT_1 6
#define TCP_STATE_FIN_WAIT_2 7
#define TCP_STATE_CLOSE_WAIT 8
#define TCP_STATE_LAST_ACK 9
#define TCP_STATE_CLOSING 10
#define TCP_STATE_TIME_WAIT 11
#define TCP_STATES 12
struct inet_pcb_s;
typedef enum tcp_error_ {
TCP_ERROR_NO_ERROR,
TCP_ERROR_BUFFER_ALLOCATION_ERROR,
TCP_ERROR_SOCKET_ALLOCATION_ERROR,
TCP_ERROR_SOCKET_NOT_FOUND,
TCP_ERROR_SECURE_ALLOCATION_ERROR,
TCP_ERROR_WRONG_STATE,
TCP_ERROR_ADDR_SELECTION,
TCP_SESSION_REMOVED
} tcp_error;
typedef struct tcp_session_t {
struct inet_pcb_s *inet_pcb;
protocol_interface_info_entry_t *interface;
uint32_t send_unacknowledged;
uint32_t send_next;
uint32_t send_wl1; // segment seq number at last window update
uint32_t send_wl2; // segment ack number at last window update
uint16_t send_window;
uint16_t send_mss_peer; // peer's advertised mss (RFC 5681 RMSS)
uint16_t send_mss_eff; // effective send MSS (RFC 1122 Eff.snd.MSS, RFC 5681 SMSS)
uint16_t receive_mss;
uint32_t receive_next; // sequence number
uint32_t receive_adv; // advertised window right edge
uint16_t timer;
uint8_t retry;
bool passive_open : 1;
uint8_t state;
bool busy : 1;
bool persist : 1;
bool sent_fin : 1;
uint16_t rto;
int16_t srtt8; // these should go into destination cache
int16_t srttvar4;
} tcp_session_t;
#ifdef NO_TCP
NS_DUMMY_DEFINITIONS_OK
#undef TCP_TEST
#define tcp_info(pcb) ((struct tcp_session_t *)NULL)
#define tcp_buf_save(buf) (buf)
#define tcp_up(buf) buffer_free(buf)
#define tcp_session_ptr_allocate(socket_id) ((tcp_session_t*) NULL)
#define tcp_socket_released(tcp_info) ((void) 0)
#define tcp_state_name(tcp_session) "NO_TCP"
#define tcp_handle_time_event(tickUpdate) ((void) 0)
#define tcp_session_data_received(tcp_info) ((void) 0)
#define tcp_session_close(tcp_info) TCP_ERROR_SOCKET_NOT_FOUND
#define tcp_session_shutdown_read(tcp_info) TCP_ERROR_SOCKET_NOT_FOUND
#else
#define tcp_info(pcb) ((struct tcp_session_t *)((pcb)->session))
extern tcp_error tcp_session_open(tcp_session_t *tcp_session);
extern tcp_error tcp_session_close(tcp_session_t *tcp_session);
extern tcp_error tcp_session_shutdown_read(tcp_session_t *tcp_session);
extern tcp_error tcp_session_abort(tcp_session_t *tcp_session);
extern tcp_error tcp_session_send(tcp_session_t *tcp_info, buffer_t *buf);
extern void tcp_session_data_received(tcp_session_t *tcp_info);
extern buffer_t *tcp_up(buffer_t *buf);
extern tcp_session_t *tcp_session_ptr_allocate(struct inet_pcb_s *inet_pcb, tcp_session_t *from_time_wait);
extern tcp_session_t *tcp_session_ptr_free(tcp_session_t *tcp_info);
extern void tcp_socket_released(tcp_session_t *tcp_info);
const char *tcp_state_name(const tcp_session_t *tcp_info);
/**
* \brief Function used for handling time events.
*/
extern void tcp_handle_time_event(uint16_t tickUpdate);
#endif // NO_TCP
#ifdef TCP_TEST
extern int8_t tcp_test_drop_tx(int state, uint8_t count);
extern int8_t tcp_test_drop_rx(int state, uint8_t count);
extern void tcp_test_drop_reset(void);
#else
#define tcp_test_drop_tx(state, count) ((int8_t) -1)
#define tcp_test_drop_rx(state, codunt) ((int8_t) -1)
#define tcp_test_drop_reset() ((void) 0)
#endif
#endif /* TCP_H_ */