You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
470 lines
10 KiB
470 lines
10 KiB
/** @file |
|
@brief TCP data handler |
|
|
|
This is not to be included by the application. |
|
*/ |
|
|
|
/* |
|
* Copyright (c) 2016 Intel Corporation |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#ifndef __TCP_INTERNAL_H |
|
#define __TCP_INTERNAL_H |
|
|
|
#include <zephyr/types.h> |
|
#include <zephyr/random/random.h> |
|
|
|
#include <zephyr/net/net_core.h> |
|
#include <zephyr/net/net_ip.h> |
|
#include <zephyr/net/net_pkt.h> |
|
#include <zephyr/net/net_context.h> |
|
|
|
#include "connection.h" |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
|
|
#include "tcp_private.h" |
|
|
|
enum tcp_conn_option { |
|
TCP_OPT_NODELAY = 1, |
|
TCP_OPT_KEEPALIVE = 2, |
|
TCP_OPT_KEEPIDLE = 3, |
|
TCP_OPT_KEEPINTVL = 4, |
|
TCP_OPT_KEEPCNT = 5, |
|
}; |
|
|
|
/** |
|
* @brief Calculates and returns the MSS for a given TCP context |
|
* |
|
* @param tcp TCP context |
|
* |
|
* @return Maximum Segment Size |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
uint16_t net_tcp_get_supported_mss(const struct tcp *conn); |
|
#else |
|
static inline uint16_t net_tcp_get_supported_mss(const struct tcp *conn) |
|
{ |
|
ARG_UNUSED(conn); |
|
return 0; |
|
} |
|
#endif |
|
|
|
const char *net_tcp_state_str(enum tcp_state state); |
|
|
|
/** |
|
* @brief Obtains the state for a TCP context |
|
* |
|
* @param tcp TCP context |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
static inline enum tcp_state net_tcp_get_state(const struct tcp *conn) |
|
{ |
|
return conn->state; |
|
} |
|
#else |
|
static inline enum tcp_state net_tcp_get_state(const struct tcp *conn) |
|
{ |
|
ARG_UNUSED(conn); |
|
return TCP_CLOSED; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Go through all the TCP connections and call callback |
|
* for each of them. |
|
* |
|
* @param cb User supplied callback function to call. |
|
* @param user_data User specified data. |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
void net_tcp_foreach(net_tcp_cb_t cb, void *user_data); |
|
#else |
|
static inline void net_tcp_foreach(net_tcp_cb_t cb, void *user_data) |
|
{ |
|
ARG_UNUSED(cb); |
|
ARG_UNUSED(user_data); |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Initialize TCP parts of a context |
|
* |
|
* @param context Network context |
|
* |
|
* @return 0 if successful, < 0 on error |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_get(struct net_context *context); |
|
#else |
|
static inline int net_tcp_get(struct net_context *context) |
|
{ |
|
ARG_UNUSED(context); |
|
|
|
return -EPROTONOSUPPORT; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Connect TCP connection |
|
* |
|
* @param context Network context |
|
* @param addr Remote address |
|
* @param laddr Local address |
|
* @param rport Remote port |
|
* @param lport Local port |
|
* @param timeout Connect timeout |
|
* @param cb Connect callback |
|
* @param user_data Connect callback user data |
|
* |
|
* @return 0 on success, < 0 on error |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_connect(struct net_context *context, |
|
const struct sockaddr *addr, |
|
struct sockaddr *laddr, |
|
uint16_t rport, |
|
uint16_t lport, |
|
k_timeout_t timeout, |
|
net_context_connect_cb_t cb, |
|
void *user_data); |
|
#else |
|
static inline int net_tcp_connect(struct net_context *context, |
|
const struct sockaddr *addr, |
|
struct sockaddr *laddr, |
|
uint16_t rport, uint16_t lport, |
|
k_timeout_t timeout, |
|
net_context_connect_cb_t cb, void *user_data) |
|
{ |
|
ARG_UNUSED(context); |
|
ARG_UNUSED(addr); |
|
ARG_UNUSED(laddr); |
|
ARG_UNUSED(rport); |
|
ARG_UNUSED(lport); |
|
ARG_UNUSED(cb); |
|
ARG_UNUSED(user_data); |
|
|
|
return -EPROTONOSUPPORT; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Set TCP socket into listening state |
|
* |
|
* @param context Network context |
|
* |
|
* @return 0 if successful, -EOPNOTSUPP if the context was not for TCP, |
|
* -EPROTONOSUPPORT if TCP is not supported |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_listen(struct net_context *context); |
|
#else |
|
static inline int net_tcp_listen(struct net_context *context) |
|
{ |
|
ARG_UNUSED(context); |
|
|
|
return -EPROTONOSUPPORT; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Accept TCP connection |
|
* |
|
* @param context Network context |
|
* @param cb Accept callback |
|
* @param user_data Accept callback user data |
|
* |
|
* @return 0 on success, < 0 on error |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_accept(struct net_context *context, net_tcp_accept_cb_t cb, |
|
void *user_data); |
|
#else |
|
static inline int net_tcp_accept(struct net_context *context, |
|
net_tcp_accept_cb_t cb, void *user_data) |
|
{ |
|
ARG_UNUSED(context); |
|
ARG_UNUSED(cb); |
|
ARG_UNUSED(user_data); |
|
|
|
return -EPROTONOSUPPORT; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Send available queued data over TCP connection |
|
* |
|
* @param context TCP context |
|
* @param cb TCP callback function |
|
* @param user_data User specified data |
|
* |
|
* @return 0 if ok, < 0 if error |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_send_data(struct net_context *context, net_context_send_cb_t cb, |
|
void *user_data); |
|
#else |
|
static inline int net_tcp_send_data(struct net_context *context, |
|
net_context_send_cb_t cb, |
|
void *user_data) |
|
{ |
|
ARG_UNUSED(context); |
|
ARG_UNUSED(cb); |
|
ARG_UNUSED(user_data); |
|
|
|
return 0; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief TCP receive function |
|
* |
|
* @param context Network context |
|
* @param cb TCP receive callback function |
|
* @param user_data TCP receive callback user data |
|
* |
|
* @return 0 if no error, < 0 in case of error |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_recv(struct net_context *context, net_context_recv_cb_t cb, |
|
void *user_data); |
|
#else |
|
static inline int net_tcp_recv(struct net_context *context, |
|
net_context_recv_cb_t cb, void *user_data) |
|
{ |
|
ARG_UNUSED(context); |
|
ARG_UNUSED(cb); |
|
ARG_UNUSED(user_data); |
|
|
|
return -EPROTOTYPE; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Finalize TCP packet |
|
* |
|
* @param pkt Network packet |
|
* |
|
* @return 0 on success, negative errno otherwise. |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_finalize(struct net_pkt *pkt, bool force_chksum); |
|
#else |
|
static inline int net_tcp_finalize(struct net_pkt *pkt, bool force_chksum) |
|
{ |
|
ARG_UNUSED(pkt); |
|
ARG_UNUSED(force_chksum); |
|
return 0; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Get pointer to TCP header in net_pkt |
|
* |
|
* @param pkt Network packet |
|
* @param tcp_access Helper variable for accessing TCP header |
|
* |
|
* @return TCP header on success, NULL on error |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
struct net_tcp_hdr *net_tcp_input(struct net_pkt *pkt, |
|
struct net_pkt_data_access *tcp_access); |
|
#else |
|
static inline |
|
struct net_tcp_hdr *net_tcp_input(struct net_pkt *pkt, |
|
struct net_pkt_data_access *tcp_access) |
|
{ |
|
ARG_UNUSED(pkt); |
|
ARG_UNUSED(tcp_access); |
|
|
|
return NULL; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Enqueue data for transmission |
|
* |
|
* @param context Network context |
|
* @param data Pointer to the data |
|
* @param len Number of bytes |
|
* @param msg Data for a vector array operation |
|
* |
|
* @return 0 if ok, < 0 if error |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_queue(struct net_context *context, const void *data, size_t len, |
|
const struct msghdr *msg); |
|
#else |
|
static inline int net_tcp_queue(struct net_context *context, const void *data, |
|
size_t len, const struct msghdr *msg) |
|
{ |
|
ARG_UNUSED(context); |
|
ARG_UNUSED(data); |
|
ARG_UNUSED(len); |
|
ARG_UNUSED(msg); |
|
|
|
return -EPROTONOSUPPORT; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Update TCP receive window |
|
* |
|
* @param context Network context |
|
* @param delta Receive window delta |
|
* |
|
* @return 0 on success, -EPROTOTYPE if there is no TCP context, -EINVAL |
|
* if the receive window delta is out of bounds, -EPROTONOSUPPORT |
|
* if TCP is not supported |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_update_recv_wnd(struct net_context *context, int32_t delta); |
|
#else |
|
static inline int net_tcp_update_recv_wnd(struct net_context *context, |
|
int32_t delta) |
|
{ |
|
ARG_UNUSED(context); |
|
ARG_UNUSED(delta); |
|
|
|
return -EPROTONOSUPPORT; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Queue a TCP FIN packet if needed to close the socket |
|
* |
|
* @param context Network context |
|
* |
|
* @return 0 on success where a TCP FIN packet has been queued, -ENOTCONN |
|
* in case the socket was not connected or listening, -EOPNOTSUPP |
|
* in case it was not a TCP socket or -EPROTONOSUPPORT if TCP is not |
|
* supported |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_put(struct net_context *context); |
|
#else |
|
static inline int net_tcp_put(struct net_context *context) |
|
{ |
|
ARG_UNUSED(context); |
|
|
|
return -EPROTONOSUPPORT; |
|
} |
|
#endif |
|
|
|
#define NET_TCP_MAX_OPT_SIZE 8 |
|
|
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
void net_tcp_init(void); |
|
#else |
|
#define net_tcp_init(...) |
|
#endif |
|
|
|
/** |
|
* @brief Set tcp specific options of a socket |
|
* |
|
* @param context Network context |
|
* |
|
* @return 0 on success, -EINVAL if the value is not allowed |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_set_option(struct net_context *context, |
|
enum tcp_conn_option option, |
|
const void *value, size_t len); |
|
#else |
|
static inline int net_tcp_set_option(struct net_context *context, |
|
enum tcp_conn_option option, |
|
const void *value, size_t len) |
|
{ |
|
ARG_UNUSED(context); |
|
ARG_UNUSED(option); |
|
ARG_UNUSED(value); |
|
ARG_UNUSED(len); |
|
|
|
return -EPROTONOSUPPORT; |
|
} |
|
#endif |
|
|
|
|
|
/** |
|
* @brief Obtain tcp specific options of a socket |
|
* |
|
* @param context Network context |
|
* |
|
* @return 0 on success |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
int net_tcp_get_option(struct net_context *context, |
|
enum tcp_conn_option option, |
|
void *value, size_t *len); |
|
#else |
|
static inline int net_tcp_get_option(struct net_context *context, |
|
enum tcp_conn_option option, |
|
void *value, size_t *len) |
|
{ |
|
ARG_UNUSED(context); |
|
ARG_UNUSED(option); |
|
ARG_UNUSED(value); |
|
ARG_UNUSED(len); |
|
|
|
return -EPROTONOSUPPORT; |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Obtain a semaphore indicating if transfers are blocked (either due to |
|
* filling TX window or entering retransmission mode). |
|
* |
|
* @param context Network context |
|
* |
|
* @return semaphore indicating if transfers are blocked |
|
*/ |
|
struct k_sem *net_tcp_tx_sem_get(struct net_context *context); |
|
|
|
/** |
|
* @brief Obtain a semaphore indicating if connection is connected. |
|
* |
|
* @param context Network context |
|
* |
|
* @return semaphore indicating if connection is connected |
|
*/ |
|
struct k_sem *net_tcp_conn_sem_get(struct net_context *context); |
|
|
|
/** |
|
* @brief Send a TCP RST reply for the received packet w/o associated connection. |
|
* |
|
* @param pkt TCP packet to reply for. |
|
*/ |
|
#if defined(CONFIG_NET_NATIVE_TCP) |
|
void net_tcp_reply_rst(struct net_pkt *pkt); |
|
#else |
|
static inline void net_tcp_reply_rst(struct net_pkt *pkt) |
|
{ |
|
ARG_UNUSED(pkt); |
|
} |
|
#endif |
|
|
|
/** |
|
* @brief Get the TCP connection endpoint information. |
|
* |
|
* @param context Network context |
|
* @param local TCP connection local socket information is copied here |
|
* @param peer TCP connection peer socket information is copied here |
|
* @param addrlen Size of the sockaddr struct. Copied size is returned. |
|
* |
|
* @return <0 if there was an error, 0 if ok |
|
*/ |
|
int net_tcp_endpoint_copy(struct net_context *ctx, |
|
struct sockaddr *local, |
|
struct sockaddr *peer, |
|
socklen_t *addrlen); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /* __TCP_INTERNAL_H */
|
|
|