2022-02-24 05:39:56 -05:00
/*
* SPDX - FileCopyrightText : 2015 - 2022 Espressif Systems ( Shanghai ) CO LTD
*
* SPDX - License - Identifier : Apache - 2.0
*/
2017-11-13 22:16:20 -05:00
2018-09-26 05:56:47 -04:00
# ifndef _ESP_TRANSPORT_H_
# define _ESP_TRANSPORT_H_
2017-11-13 22:16:20 -05:00
# include <esp_err.h>
2021-01-06 03:58:39 -05:00
# include <stdbool.h>
2017-11-13 22:16:20 -05:00
# ifdef __cplusplus
extern " C " {
# endif
2021-01-06 03:58:39 -05:00
/**
* @ brief Keep alive parameters structure
*/
typedef struct esp_transport_keepalive {
bool keep_alive_enable ; /*!< Enable keep-alive timeout */
int keep_alive_idle ; /*!< Keep-alive idle time (second) */
int keep_alive_interval ; /*!< Keep-alive interval time (second) */
int keep_alive_count ; /*!< Keep-alive packet retry send count */
} esp_transport_keep_alive_t ;
2017-11-13 22:16:20 -05:00
2022-04-21 11:41:58 -04:00
typedef struct esp_transport_list_t * esp_transport_list_handle_t ;
2018-09-26 05:56:47 -04:00
typedef struct esp_transport_item_t * esp_transport_handle_t ;
2017-11-13 22:16:20 -05:00
2018-09-26 05:56:47 -04:00
typedef int ( * connect_func ) ( esp_transport_handle_t t , const char * host , int port , int timeout_ms ) ;
typedef int ( * io_func ) ( esp_transport_handle_t t , const char * buffer , int len , int timeout_ms ) ;
typedef int ( * io_read_func ) ( esp_transport_handle_t t , char * buffer , int len , int timeout_ms ) ;
typedef int ( * trans_func ) ( esp_transport_handle_t t ) ;
typedef int ( * poll_func ) ( esp_transport_handle_t t , int timeout_ms ) ;
typedef int ( * connect_async_func ) ( esp_transport_handle_t t , const char * host , int port , int timeout_ms ) ;
typedef esp_transport_handle_t ( * payload_transfer_func ) ( esp_transport_handle_t ) ;
2017-11-13 22:16:20 -05:00
2019-04-16 05:58:38 -04:00
typedef struct esp_tls_last_error * esp_tls_error_handle_t ;
2022-03-07 00:29:54 -05:00
/**
* @ brief Error types for TCP connection issues not covered in socket ' s errno
*/
enum esp_tcp_transport_err_t {
ERR_TCP_TRANSPORT_NO_MEM = - 3 ,
ERR_TCP_TRANSPORT_CONNECTION_FAILED = - 2 ,
ERR_TCP_TRANSPORT_CONNECTION_CLOSED_BY_FIN = - 1 ,
ERR_TCP_TRANSPORT_CONNECTION_TIMEOUT = 0 ,
} ;
# define ESP_ERR_TCP_TRANSPORT_BASE (0xe000) /*!< Starting number of TCP Transport error codes */
# define ESP_ERR_TCP_TRANSPORT_CONNECTION_TIMEOUT (ESP_ERR_TCP_TRANSPORT_BASE + 1) /*!< Connection has timed out */
# define ESP_ERR_TCP_TRANSPORT_CONNECTION_CLOSED_BY_FIN (ESP_ERR_TCP_TRANSPORT_BASE + 2) /*!< Read FIN from peer and the connection has closed (in a clean way) */
# define ESP_ERR_TCP_TRANSPORT_CONNECTION_FAILED (ESP_ERR_TCP_TRANSPORT_BASE + 3) /*!< Failed to connect to the peer */
# define ESP_ERR_TCP_TRANSPORT_NO_MEM (ESP_ERR_TCP_TRANSPORT_BASE + 4) /*!< Memory allocation failed */
2017-11-13 22:16:20 -05:00
/**
* @ brief Create transport list
*
* @ return A handle can hold all transports
*/
2019-07-16 05:33:30 -04:00
esp_transport_list_handle_t esp_transport_list_init ( void ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Cleanup and free all transports , include itself ,
2018-09-26 05:56:47 -04:00
* this function will invoke esp_transport_destroy of every transport have added this the list
2017-11-13 22:16:20 -05:00
*
* @ param [ in ] list The list
*
* @ return
* - ESP_OK
* - ESP_FAIL
*/
2018-09-26 05:56:47 -04:00
esp_err_t esp_transport_list_destroy ( esp_transport_list_handle_t list ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Add a transport to the list , and define a scheme to indentify this transport in the list
*
* @ param [ in ] list The list
* @ param [ in ] t The Transport
* @ param [ in ] scheme The scheme
*
* @ return
* - ESP_OK
*/
2018-09-26 05:56:47 -04:00
esp_err_t esp_transport_list_add ( esp_transport_list_handle_t list , esp_transport_handle_t t , const char * scheme ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief This function will remove all transport from the list ,
2018-09-26 05:56:47 -04:00
* invoke esp_transport_destroy of every transport have added this the list
2017-11-13 22:16:20 -05:00
*
* @ param [ in ] list The list
*
* @ return
* - ESP_OK
* - ESP_ERR_INVALID_ARG
*/
2018-09-26 05:56:47 -04:00
esp_err_t esp_transport_list_clean ( esp_transport_list_handle_t list ) ;
2017-11-13 22:16:20 -05:00
/**
2018-09-26 05:56:47 -04:00
* @ brief Get the transport by scheme , which has been defined when calling function ` esp_transport_list_add `
2017-11-13 22:16:20 -05:00
*
* @ param [ in ] list The list
* @ param [ in ] tag The tag
*
* @ return The transport handle
*/
2018-09-26 05:56:47 -04:00
esp_transport_handle_t esp_transport_list_get_transport ( esp_transport_list_handle_t list , const char * scheme ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Initialize a transport handle object
*
* @ return The transport handle
*/
2019-07-16 05:33:30 -04:00
esp_transport_handle_t esp_transport_init ( void ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Cleanup and free memory the transport
*
* @ param [ in ] t The transport handle
*
* @ return
* - ESP_OK
* - ESP_FAIL
*/
2018-09-26 05:56:47 -04:00
esp_err_t esp_transport_destroy ( esp_transport_handle_t t ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Get default port number used by this transport
*
* @ param [ in ] t The transport handle
*
* @ return the port number
*/
2018-09-26 05:56:47 -04:00
int esp_transport_get_default_port ( esp_transport_handle_t t ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Set default port number that can be used by this transport
*
* @ param [ in ] t The transport handle
* @ param [ in ] port The port number
*
* @ return
* - ESP_OK
* - ESP_FAIL
*/
2018-09-26 05:56:47 -04:00
esp_err_t esp_transport_set_default_port ( esp_transport_handle_t t , int port ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Transport connection function , to make a connection to server
*
* @ param t The transport handle
* @ param [ in ] host Hostname
* @ param [ in ] port Port
2019-11-12 11:42:51 -05:00
* @ param [ in ] timeout_ms The timeout milliseconds ( - 1 indicates wait forever )
2017-11-13 22:16:20 -05:00
*
* @ return
2022-02-24 05:39:56 -05:00
* - 0 in case of successful connection
2017-11-13 22:16:20 -05:00
* - ( - 1 ) if there are any errors , should check errno
*/
2018-09-26 05:56:47 -04:00
int esp_transport_connect ( esp_transport_handle_t t , const char * host , int port , int timeout_ms ) ;
2017-11-13 22:16:20 -05:00
2018-08-07 13:56:59 -04:00
/**
* @ brief Non - blocking transport connection function , to make a connection to server
*
* @ param t The transport handle
* @ param [ in ] host Hostname
* @ param [ in ] port Port
2019-11-12 11:42:51 -05:00
* @ param [ in ] timeout_ms The timeout milliseconds ( - 1 indicates wait forever )
2018-08-07 13:56:59 -04:00
*
* @ return
2022-02-24 05:39:56 -05:00
* - - 1 If connection establishment fails .
* - 0 If connection establishment is in progress .
* - 1 If connection establishment is successful .
*
2018-08-07 13:56:59 -04:00
*/
2018-09-26 05:56:47 -04:00
int esp_transport_connect_async ( esp_transport_handle_t t , const char * host , int port , int timeout_ms ) ;
2018-08-07 13:56:59 -04:00
2017-11-13 22:16:20 -05:00
/**
* @ brief Transport read function
*
* @ param t The transport handle
* @ param buffer The buffer
* @ param [ in ] len The length
2019-11-12 11:42:51 -05:00
* @ param [ in ] timeout_ms The timeout milliseconds ( - 1 indicates wait forever )
2017-11-13 22:16:20 -05:00
*
* @ return
* - Number of bytes was read
2022-03-07 00:29:54 -05:00
* - 0 Read timed - out
* - ( < 0 ) For other errors
*
* @ note : Please refer to the enum ` esp_tcp_transport_err_t ` for all the possible return values
*
2017-11-13 22:16:20 -05:00
*/
2018-09-26 05:56:47 -04:00
int esp_transport_read ( esp_transport_handle_t t , char * buffer , int len , int timeout_ms ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Poll the transport until readable or timeout
*
* @ param [ in ] t The transport handle
2019-11-12 11:42:51 -05:00
* @ param [ in ] timeout_ms The timeout milliseconds ( - 1 indicates wait forever )
2017-11-13 22:16:20 -05:00
*
* @ return
* - 0 Timeout
* - ( - 1 ) If there are any errors , should check errno
* - other The transport can read
*/
2018-09-26 05:56:47 -04:00
int esp_transport_poll_read ( esp_transport_handle_t t , int timeout_ms ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Transport write function
*
* @ param t The transport handle
* @ param buffer The buffer
* @ param [ in ] len The length
2019-11-12 11:42:51 -05:00
* @ param [ in ] timeout_ms The timeout milliseconds ( - 1 indicates wait forever )
2017-11-13 22:16:20 -05:00
*
* @ return
* - Number of bytes was written
* - ( - 1 ) if there are any errors , should check errno
*/
2018-09-26 05:56:47 -04:00
int esp_transport_write ( esp_transport_handle_t t , const char * buffer , int len , int timeout_ms ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Poll the transport until writeable or timeout
*
* @ param [ in ] t The transport handle
2019-11-12 11:42:51 -05:00
* @ param [ in ] timeout_ms The timeout milliseconds ( - 1 indicates wait forever )
2017-11-13 22:16:20 -05:00
*
* @ return
* - 0 Timeout
* - ( - 1 ) If there are any errors , should check errno
* - other The transport can write
*/
2018-09-26 05:56:47 -04:00
int esp_transport_poll_write ( esp_transport_handle_t t , int timeout_ms ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Transport close
*
* @ param t The transport handle
*
* @ return
* - 0 if ok
* - ( - 1 ) if there are any errors , should check errno
*/
2018-09-26 05:56:47 -04:00
int esp_transport_close ( esp_transport_handle_t t ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Get user data context of this transport
*
* @ param [ in ] t The transport handle
*
* @ return The user data context
*/
2018-09-26 05:56:47 -04:00
void * esp_transport_get_context_data ( esp_transport_handle_t t ) ;
2017-11-13 22:16:20 -05:00
2018-07-24 10:59:03 -04:00
/**
* @ brief Get transport handle of underlying protocol
* which can access this protocol payload directly
* ( used for receiving longer msg multiple times )
*
* @ param [ in ] t The transport handle
*
* @ return Payload transport handle
*/
2018-09-26 05:56:47 -04:00
esp_transport_handle_t esp_transport_get_payload_transport_handle ( esp_transport_handle_t t ) ;
2018-07-24 10:59:03 -04:00
2017-11-13 22:16:20 -05:00
/**
* @ brief Set the user context data for this transport
*
* @ param [ in ] t The transport handle
* @ param data The user data context
*
* @ return
* - ESP_OK
*/
2018-09-26 05:56:47 -04:00
esp_err_t esp_transport_set_context_data ( esp_transport_handle_t t , void * data ) ;
2017-11-13 22:16:20 -05:00
/**
* @ brief Set transport functions for the transport handle
*
* @ param [ in ] t The transport handle
* @ param [ in ] _connect The connect function pointer
* @ param [ in ] _read The read function pointer
* @ param [ in ] _write The write function pointer
* @ param [ in ] _close The close function pointer
* @ param [ in ] _poll_read The poll read function pointer
* @ param [ in ] _poll_write The poll write function pointer
* @ param [ in ] _destroy The destroy function pointer
*
* @ return
* - ESP_OK
*/
2018-09-26 05:56:47 -04:00
esp_err_t esp_transport_set_func ( esp_transport_handle_t t ,
2017-11-13 22:16:20 -05:00
connect_func _connect ,
io_read_func _read ,
io_func _write ,
trans_func _close ,
poll_func _poll_read ,
poll_func _poll_write ,
2018-10-02 09:19:46 -04:00
trans_func _destroy ) ;
2018-08-07 13:56:59 -04:00
/**
* @ brief Set transport functions for the transport handle
*
* @ param [ in ] t The transport handle
* @ param [ in ] _connect_async_func The connect_async function pointer
*
* @ return
* - ESP_OK
* - ESP_FAIL
*/
2018-09-26 05:56:47 -04:00
esp_err_t esp_transport_set_async_connect_func ( esp_transport_handle_t t , connect_async_func _connect_async_func ) ;
2018-08-07 13:56:59 -04:00
2018-10-02 09:19:46 -04:00
/**
* @ brief Set parent transport function to the handle
*
* @ param [ in ] t The transport handle
* @ param [ in ] _parent_transport The underlying transport getter pointer
*
* @ return
* - ESP_OK
* - ESP_FAIL
*/
esp_err_t esp_transport_set_parent_transport_func ( esp_transport_handle_t t , payload_transfer_func _parent_transport ) ;
2019-04-09 10:08:05 -04:00
/**
2019-04-16 05:58:38 -04:00
* @ brief Returns esp_tls error handle .
* Warning : The returned pointer is valid only as long as esp_transport_handle_t exists . Once transport
* handle gets destroyed , this value ( esp_tls_error_handle_t ) is freed automatically .
2019-04-09 10:08:05 -04:00
*
* @ param [ in ] A transport handle
*
* @ return
2019-04-16 05:58:38 -04:00
* - valid pointer of esp_error_handle_t
* - NULL if invalid transport handle
2020-07-17 11:59:05 -04:00
*/
2019-04-16 05:58:38 -04:00
esp_tls_error_handle_t esp_transport_get_error_handle ( esp_transport_handle_t t ) ;
2020-04-08 14:04:33 -04:00
/**
* @ brief Get and clear last captured socket errno
*
* Socket errno is internally stored whenever any of public facing API
* for reading , writing , polling or connection fails returning negative return code .
* The error code corresponds to the ` SO_ERROR ` value retrieved from the underlying
* transport socket using ` getsockopt ( ) ` API . After reading the captured errno ,
* the internal value is cleared to 0.
*
* @ param [ in ] t The transport handle
*
* @ return
* - > = 0 Last captured socket errno
* - - 1 Invalid transport handle or invalid transport ' s internal error storage
*/
int esp_transport_get_errno ( esp_transport_handle_t t ) ;
2019-04-09 10:08:05 -04:00
2022-03-07 00:29:54 -05:00
/**
* @ brief Translates the TCP transport error codes to esp_err_t error codes
*
* @ param [ in ] error TCP Transport specific error code
*
* @ return Corresponding esp_err_t based error code
*/
esp_err_t esp_transport_translate_error ( enum esp_tcp_transport_err_t error ) ;
2017-11-13 22:16:20 -05:00
# ifdef __cplusplus
}
# endif
2018-09-26 05:56:47 -04:00
# endif /* _ESP_TRANSPORT_ */