mirror of
https://github.com/espressif/openthread.git
synced 2026-09-22 17:07:37 +00:00
This commit changes the virtual UART to be configured at runtime, which eliminates a build variants, which causes code coverage process problem.
150 lines
5.8 KiB
C
150 lines
5.8 KiB
C
/*
|
|
* Copyright (c) 2024, The OpenThread Authors.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of the copyright holder nor the
|
|
* names of its contributors may be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef PLATFORM_SIMULATION_SOCKET_UTILS_H_
|
|
#define PLATFORM_SIMULATION_SOCKET_UTILS_H_
|
|
|
|
#include "platform-simulation.h"
|
|
|
|
/**
|
|
* Represents a socket for communication with other simulation node.
|
|
*
|
|
* This is used for emulation of 15.4 radio or other interfaces.
|
|
*/
|
|
typedef struct utilsSocket
|
|
{
|
|
bool mInitialized; ///< Whether or not initialized.
|
|
bool mUseIp6; ///< Whether IPv6 or IPv4.
|
|
int mTxFd; ///< RX file descriptor.
|
|
int mRxFd; ///< TX file descriptor.
|
|
uint16_t mPortBase; ///< Base port number value.
|
|
uint16_t mPort; ///< The port number used by this node
|
|
union
|
|
{
|
|
struct sockaddr_in mSockAddr4; ///< The IPv4 group sock address.
|
|
struct sockaddr_in6 mSockAddr6; ///< The IPv6 group sock address.
|
|
} mGroupAddr; ///< The group sock address for simulating radio.
|
|
} utilsSocket;
|
|
|
|
extern const char *gLocalInterface; ///< Local interface name or address to use for sockets
|
|
|
|
extern bool gVirtualUart; ///< Whether to use Virtual UART or not.
|
|
|
|
/**
|
|
* Adds a file descriptor (FD) to a given FD set.
|
|
*
|
|
* @param[in] aFd The FD to add.
|
|
* @param[in] aFdSet The FD set to add to.
|
|
* @param[in] aMaxFd A pointer to track maximum FD in @p aFdSet (can be NULL).
|
|
*/
|
|
void utilsAddFdToFdSet(int aFd, fd_set *aFdSet, int *aMaxFd);
|
|
|
|
/**
|
|
* Initializes the socket.
|
|
*
|
|
* @param[in] aSocket The socket to initialize.
|
|
* @param[in] aPortBase The base port number value. Nodes will determine their port as `aPortBased + gNodeId`.
|
|
*/
|
|
void utilsInitSocket(utilsSocket *aSocket, uint16_t aPortBase);
|
|
|
|
/**
|
|
* De-initializes the socket.
|
|
*
|
|
* @param[in] aSocket The socket to de-initialize.
|
|
*/
|
|
void utilsDeinitSocket(utilsSocket *aSocket);
|
|
|
|
/**
|
|
* Adds sockets RX FD to a given FD set.
|
|
*
|
|
* @param[in] aSocket The socket.
|
|
* @param[in] aFdSet The (read) FD set to add to.
|
|
* @param[in] aMaxFd A pointer to track maximum FD in @p aFdSet (can be NULL).
|
|
*/
|
|
void utilsAddSocketRxFd(const utilsSocket *aSocket, fd_set *aFdSet, int *aMaxFd);
|
|
|
|
/**
|
|
* Adds sockets TX FD to a given FD set.
|
|
*
|
|
* @param[in] aSocket The socket.
|
|
* @param[in] aFdSet The (write) FD set to add to.
|
|
* @param[in] aMaxFd A pointer to track maximum FD in @p aFdSet (can be NULL).
|
|
*/
|
|
void utilsAddSocketTxFd(const utilsSocket *aSocket, fd_set *aFdSet, int *aMaxFd);
|
|
|
|
/**
|
|
* Indicates whether the socket can receive.
|
|
*
|
|
* @param[in] aSocket The socket.
|
|
* @param[in] aReadFdSet The read FD set.
|
|
*
|
|
* @retval TRUE The socket RX FD is in @p aReadFdSet, and socket can receive.
|
|
* @retval FALSE The socket RX FD is not in @p aReadFdSet. Socket is not ready to receive.
|
|
*/
|
|
bool utilsCanSocketReceive(const utilsSocket *aSocket, const fd_set *aReadFdSet);
|
|
|
|
/**
|
|
* Indicates whether the socket can send.
|
|
*
|
|
* @param[in] aSocket The socket.
|
|
* @param[in] aFdSet The write FD set.
|
|
*
|
|
* @retval TRUE The socket TX FD is in @p aWriteFdSet, and socket can send.
|
|
* @retval FALSE The socket TX FD is not in @p aWriteFdSet. Socket is not ready to send.
|
|
*/
|
|
bool utilsCanSocketSend(const utilsSocket *aSocket, const fd_set *aWriteFdSet);
|
|
|
|
/**
|
|
* Receives data from socket.
|
|
*
|
|
* MUST be used when `utilsCanSocketReceive()` returns `TRUE.
|
|
*
|
|
* @param[in] aSocket The socket.
|
|
* @param[out] aBuffer The buffer to output the read content.
|
|
* @param[in] aBufferSize Maximum size of buffer in bytes.
|
|
* @param[out] aSenderNodeId A pointer to return the Node ID of the sender (derived from the port number).
|
|
* Can be NULL if not needed.
|
|
*
|
|
* @returns The number of received bytes written into @p aBuffer.
|
|
*/
|
|
uint16_t utilsReceiveFromSocket(const utilsSocket *aSocket,
|
|
void *aBuffer,
|
|
uint16_t aBufferSize,
|
|
uint16_t *aSenderNodeId);
|
|
|
|
/**
|
|
* Sends data over the socket.
|
|
*
|
|
* @param[in] aSocket The socket.
|
|
* @param[in] aBuffer The buffer containing the bytes to sent.
|
|
* @param[in] aBufferSize Size of data in @p buffer in bytes.
|
|
*/
|
|
void utilsSendOverSocket(const utilsSocket *aSocket, const void *aBuffer, uint16_t aBufferLength);
|
|
|
|
#endif // PLATFORM_SIMULATION_SOCKET_UTILS_H_
|