blob: 56c7d52d46832102f69c24e4d6600b350e750c0a [file] [log] [blame]
/*
* Copyright (c) 2018-2019 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @brief Transmission Control Protocol (TCP)
*
* - net_tcp_get() is called by net_context_get(AF_INET, SOCK_STREAM,
IPPROTO_TCP, ...) and creates struct tcp for the net_context
* - net_tcp_listen()/net_tcp_accept() listen/accept
* - At the reception of SYN on the listening net_context, a new pair
* of net_context/struct tcp registers a new net_conn handle
* with the tcp_recv() as a callback
* - net_tcp_queue() queues the data for the transmission
* - The incoming data is delivered up through the context->recv_cb
* - net_tcp_put() closes the connection
*
* NOTE: The present API is provided in order to make the integration
* into the ip stack and the socket layer less intrusive.
*
* Semantically cleaner use is possible (and might be exposed),
* look into the unit test tests/net/tcp for insights.
*/
#ifndef TCP_H
#define TCP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
/**
* @brief Allocate a TCP connection for the net_context
* and mutually link the net_context and TCP connection.
*
* @param context Network context
*
* @return 0 on success, < 0 on error
*/
int net_tcp_get(struct net_context *context);
/**
* @brief Close and delete the TCP connection for the net_context
*
* @param context Network context
*
* @return 0 on success, < 0 on error
*/
int net_tcp_put(struct net_context *context);
/* TODO: Clarify what happens if the ref count goes to 0 */
/**
* @brief Unref a TCP connection
*
* @param context Network context
*
* @return 0 if successful, < 0 on error
*/
int net_tcp_unref(struct net_context *context);
/* TODO: Merge net_tcp_unref() and net_tcp_put() */
/**
* @brief Listen for an incoming TCP connection
*
* @param context Network context
*
* @return 0 if successful, < 0 on error
*/
int net_tcp_listen(struct net_context *context);
/**
* @brief Register an accept callback
*
* @param context Network context
* @param cb net_tcp_accept_cb_t callback
* @param user_data User data passed as an argument in the callback
*
* @return 0 if successful, < 0 on error
*/
int net_tcp_accept(struct net_context *context, net_tcp_accept_cb_t cb,
void *user_data);
/**
* @brief Enqueue data for transmission
*
* @param context Network context
* @param buf Pointer to the data
* @param len Number of bytes
* @param msghdr Data for a vector array operation
*
* @return 0 if ok, < 0 if error
*/
int net_tcp_queue(struct net_context *context, const void *buf, size_t len,
const struct msghdr *msghdr);
/* TODO: split into 2 functions, conn -> context, queue -> send? */
/* The following functions are provided solely for the compatibility
* with the old TCP
*/
/**
* @brief Return struct net_tcp_hdr pointer
*
* @param pkt Network packet
* @param tcp_access Helper variable for accessing TCP header
*
* @return Pointer to the TCP header on success, NULL on error
*/
struct net_tcp_hdr *net_tcp_input(struct net_pkt *pkt,
struct net_pkt_data_access *tcp_access);
/* TODO: net_tcp_input() isn't used by TCP and might be dropped with little
* re-factoring
*/
/* No ops, provided for compatibility with the old TCP */
#if defined(CONFIG_NET_NATIVE_TCP)
void net_tcp_init(void);
#else
#define net_tcp_init(...)
#endif
int net_tcp_update_recv_wnd(struct net_context *context, int32_t delta);
int net_tcp_queue_data(struct net_context *context, struct net_pkt *pkt);
int net_tcp_finalize(struct net_pkt *pkt);
#if defined(CONFIG_NET_TEST_PROTOCOL)
/**
* @brief Handle an incoming TCP packet
*
* This function is provided for the TCP sanity check and will be eventually
* dropped.
*
* @param pkt Network packet
*/
void tcp_input(struct net_pkt *pkt);
#endif
#ifdef __cplusplus
}
#endif
#endif /* TCP_H */