source/interface/azure_iot_transport_interface.h (18 lines of code) (raw):

/* Copyright (c) Microsoft Corporation. * Licensed under the MIT License. */ /** * @file azure_iot_transport_interface.h * @brief Transport interface definition to send and receive data over the * network. */ #ifndef AZURE_IOT_TRANSPORT_INTERFACE_H #define AZURE_IOT_TRANSPORT_INTERFACE_H #include <stdint.h> #include <stddef.h> /** * @brief The transport interface definition. * * The transport interface is a set of APIs that must be implemented using an * external transport layer protocol. The transport interface is defined in * @ref transport_interface.h. This interface allows protocols like MQTT * to send and receive data over the transport layer. This * interface does not handle connection and disconnection to the server of * interest. The connection, disconnection, and other transport settings, like * timeout and TLS setup, must be handled in the user application. * <br> * * The functions that must be implemented are:<br> * - [Transport Receive](@ref AzureIoTTransportRecv_t) * - [Transport Send](@ref AzureIoTTransportSend_t) * * Each of the functions above take in an opaque context @ref struct NetworkContext. * The functions above and the context are also grouped together in the * @ref AzureIoTTransportInterface_t structure:<br><br> * @snippet this define_transportinterface * <br> * * The following steps give guidance on implementing the transport interface: * * -# Implementing @ref struct NetworkContext<br><br> * @snippet this define_networkcontext * <br> * The implemented struct NetworkContext must contain all of the information * that is needed to receive and send data with the @ref AzureIoTTransportRecv_t * and the @ref AzureIoTTransportSend_t implementations.<br> * In the case of TLS over TCP, struct NetworkContext is typically implemented * with the TCP socket context and a TLS context.<br><br> * <b>Example code:</b> * @code{c} * struct NetworkContext * { * struct MyTCPSocketContext tcpSocketContext; * struct MyTLSContext tlsContext; * }; * @endcode * <br> * -# Implementing @ref AzureIoTTransportRecv_t<br><br> * @snippet this define_transportrecv * <br> * This function is expected to populate a buffer, with bytes received from the * transport, and return the number of bytes placed in the buffer. * In the case of TLS over TCP, @ref AzureIoTTransportRecv_t is typically implemented by * calling the TLS layer function to receive data. In case of plaintext TCP * without TLS, it is typically implemented by calling the TCP layer receive * function. @ref AzureIoTTransportRecv_t may be invoked multiple times by the protocol * library, if fewer bytes than were requested to receive are returned. * <br><br> * <b>Example code:</b> * @code{c} * int32_t myNetworkRecvImplementation( struct NetworkContext * pNetworkContext, * void * pBuffer, * size_t bytesToRecv ) * { * int32_t bytesReceived = 0; * bytesReceived = TLSRecv( pNetworkContext->tlsContext, * pBuffer, * bytesToRecv, * MY_SOCKET_TIMEOUT ); * if( bytesReceived < 0 ) * { * // Handle socket error. * } * // Handle other cases. * * return bytesReceived; * } * @endcode * <br> * -# Implementing @ref AzureIoTTransportSend_t<br><br> * @snippet this define_transportsend * <br> * This function is expected to send the bytes, in the given buffer over the * transport, and return the number of bytes sent. * In the case of TLS over TCP, @ref AzureIoTTransportSend_t is typically implemented by * calling the TLS layer function to send data. In case of plaintext TCP * without TLS, it is typically implemented by calling the TCP layer send * function. @ref AzureIoTTransportSend_t may be invoked multiple times by the protocol * library, if fewer bytes than were requested to send are returned. * <br><br> * <b>Example code:</b> * @code{c} * int32_t myNetworkSendImplementation( struct NetworkContext * pNetworkContext, * const void * pBuffer, * size_t bytesToSend ) * { * int32_t bytesSent = 0; * bytesSent = TLSSend( pNetworkContext->tlsContext, * pBuffer, * bytesToSend, * MY_SOCKET_TIMEOUT ); * if( bytesSent < 0 ) * { * // Handle socket error. * } * // Handle other cases. * * return bytesSent; * } * @endcode */ /** * @brief The NetworkContext is an incomplete type. An implementation of this * interface must define struct NetworkContext for the system requirements. * This context is passed into the network interface functions. */ struct NetworkContext; /** * @brief User defined function for receiving data on the network. * * @param[in] pxNetworkContext Implementation-defined network context. * @param[in] pvBuffer Buffer to receive the data into. * @param[in] xBytesToRecv Number of bytes requested from the network. * * @return The number of bytes received or a negative error code. */ typedef int32_t ( * AzureIoTTransportRecv_t )( struct NetworkContext * pxNetworkContext, void * pvBuffer, size_t xBytesToRecv ); /** * @brief User defined function for sending data on the network. * * @param[in] pxNetworkContext Implementation-defined network context. * @param[in] pvBuffer Buffer containing the bytes to send over the network stack. * @param[in] xBytesToSend Number of bytes to send over the network. * * @return The number of bytes sent or a negative error code. */ typedef int32_t ( * AzureIoTTransportSend_t )( struct NetworkContext * pxNetworkContext, const void * pvBuffer, size_t xBytesToSend ); /** * @brief The transport layer interface. */ typedef struct AzureIoTTransportInterface { AzureIoTTransportRecv_t xRecv; /**< Transport receive interface. */ AzureIoTTransportSend_t xSend; /**< Transport send interface. */ struct NetworkContext * pxNetworkContext; /**< Implementation-defined network context. */ } AzureIoTTransportInterface_t; #endif /* AZURE_IOT_TRANSPORT_INTERFACE_H */