mirror of
				https://github.com/cuberite/polarssl.git
				synced 2025-11-04 04:32:24 -05:00 
			
		
		
		
	Add polling function for network contexts
This commit adds a function `mbedtls_net_poll` to the network module allowing to check if a network context is available for read or write.
This commit is contained in:
		
							parent
							
								
									e65ce7862a
								
							
						
					
					
						commit
						e09ca3d9b6
					
				@ -45,12 +45,17 @@
 | 
				
			|||||||
#define MBEDTLS_ERR_NET_UNKNOWN_HOST                      -0x0052  /**< Failed to get an IP address for the given hostname. */
 | 
					#define MBEDTLS_ERR_NET_UNKNOWN_HOST                      -0x0052  /**< Failed to get an IP address for the given hostname. */
 | 
				
			||||||
#define MBEDTLS_ERR_NET_BUFFER_TOO_SMALL                  -0x0043  /**< Buffer is too small to hold the data. */
 | 
					#define MBEDTLS_ERR_NET_BUFFER_TOO_SMALL                  -0x0043  /**< Buffer is too small to hold the data. */
 | 
				
			||||||
#define MBEDTLS_ERR_NET_INVALID_CONTEXT                   -0x0045  /**< The context is invalid, eg because it was free()ed. */
 | 
					#define MBEDTLS_ERR_NET_INVALID_CONTEXT                   -0x0045  /**< The context is invalid, eg because it was free()ed. */
 | 
				
			||||||
 | 
					#define MBEDTLS_ERR_NET_POLL_FAILED                       -0x0047  /**< Polling the net context failed. */
 | 
				
			||||||
 | 
					#define MBEDTLS_ERR_NET_BAD_INPUT_DATA                    -0x0049  /**< Input invalid. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MBEDTLS_NET_LISTEN_BACKLOG         10 /**< The backlog that listen() should use. */
 | 
					#define MBEDTLS_NET_LISTEN_BACKLOG         10 /**< The backlog that listen() should use. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MBEDTLS_NET_PROTO_TCP 0 /**< The TCP transport protocol */
 | 
					#define MBEDTLS_NET_PROTO_TCP 0 /**< The TCP transport protocol */
 | 
				
			||||||
#define MBEDTLS_NET_PROTO_UDP 1 /**< The UDP transport protocol */
 | 
					#define MBEDTLS_NET_PROTO_UDP 1 /**< The UDP transport protocol */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MBEDTLS_NET_POLL_READ  1 /**< Used in \c mbedtls_net_poll to check for pending data  */
 | 
				
			||||||
 | 
					#define MBEDTLS_NET_POLL_WRITE 2 /**< Used in \c mbedtls_net_poll to check if write possible */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -131,6 +136,29 @@ int mbedtls_net_accept( mbedtls_net_context *bind_ctx,
 | 
				
			|||||||
                        mbedtls_net_context *client_ctx,
 | 
					                        mbedtls_net_context *client_ctx,
 | 
				
			||||||
                        void *client_ip, size_t buf_size, size_t *ip_len );
 | 
					                        void *client_ip, size_t buf_size, size_t *ip_len );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * \brief          Check and wait for the context to be ready for read/write
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * \param ctx      Socket to check
 | 
				
			||||||
 | 
					 * \param rw       Bitflag composed of MBEDTLS_NET_POLL_READ and
 | 
				
			||||||
 | 
					 *                 MBEDTLS_NET_POLL_WRITE specifying the events
 | 
				
			||||||
 | 
					 *                 to wait for:
 | 
				
			||||||
 | 
					 *                 - If MBEDTLS_NET_POLL_READ is set, the function
 | 
				
			||||||
 | 
					 *                   will return as soon as the net context is available
 | 
				
			||||||
 | 
					 *                   for reading.
 | 
				
			||||||
 | 
					 *                 - If MBEDTLS_NET_POLL_WRITE is set, the function
 | 
				
			||||||
 | 
					 *                   will return as soon as the net context is available
 | 
				
			||||||
 | 
					 *                   for writing.
 | 
				
			||||||
 | 
					 * \param timeout  Maximal amount of time to wait before returning,
 | 
				
			||||||
 | 
					 *                 in milliseconds. If \c timeout is zero, the
 | 
				
			||||||
 | 
					 *                 function returns immediately. If \c timeout is
 | 
				
			||||||
 | 
					 *                 -1u, the function blocks potentially indefinitely.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * \return         Bitmask composed of MBEDTLS_NET_POLL_READ/WRITE
 | 
				
			||||||
 | 
					 *                 on success or timeout, or a negative return code otherwise.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int mbedtls_net_poll( mbedtls_net_context *ctx, uint32_t rw, uint32_t timeout );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \brief          Set the socket blocking
 | 
					 * \brief          Set the socket blocking
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
				
			|||||||
@ -654,6 +654,10 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
				
			|||||||
        mbedtls_snprintf( buf, buflen, "NET - Buffer is too small to hold the data" );
 | 
					        mbedtls_snprintf( buf, buflen, "NET - Buffer is too small to hold the data" );
 | 
				
			||||||
    if( use_ret == -(MBEDTLS_ERR_NET_INVALID_CONTEXT) )
 | 
					    if( use_ret == -(MBEDTLS_ERR_NET_INVALID_CONTEXT) )
 | 
				
			||||||
        mbedtls_snprintf( buf, buflen, "NET - The context is invalid, eg because it was free()ed" );
 | 
					        mbedtls_snprintf( buf, buflen, "NET - The context is invalid, eg because it was free()ed" );
 | 
				
			||||||
 | 
					    if( use_ret == -(MBEDTLS_ERR_NET_POLL_FAILED) )
 | 
				
			||||||
 | 
					        mbedtls_snprintf( buf, buflen, "NET - Polling the net context failed" );
 | 
				
			||||||
 | 
					    if( use_ret == -(MBEDTLS_ERR_NET_BAD_INPUT_DATA) )
 | 
				
			||||||
 | 
					        mbedtls_snprintf( buf, buflen, "NET - Input invalid" );
 | 
				
			||||||
#endif /* MBEDTLS_NET_C */
 | 
					#endif /* MBEDTLS_NET_C */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(MBEDTLS_OID_C)
 | 
					#if defined(MBEDTLS_OID_C)
 | 
				
			||||||
 | 
				
			|||||||
@ -433,6 +433,58 @@ int mbedtls_net_set_nonblock( mbedtls_net_context *ctx )
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Check if data is available on the socket
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int mbedtls_net_poll( mbedtls_net_context *ctx, uint32_t rw, uint32_t timeout )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int ret;
 | 
				
			||||||
 | 
					    struct timeval tv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fd_set read_fds;
 | 
				
			||||||
 | 
					    fd_set write_fds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int fd = ctx->fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if( fd < 0 )
 | 
				
			||||||
 | 
					        return( MBEDTLS_ERR_NET_INVALID_CONTEXT );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    FD_ZERO( &read_fds );
 | 
				
			||||||
 | 
					    if( rw & MBEDTLS_NET_POLL_READ )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        rw &= ~MBEDTLS_NET_POLL_READ;
 | 
				
			||||||
 | 
					        FD_SET( fd, &read_fds );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    FD_ZERO( &write_fds );
 | 
				
			||||||
 | 
					    if( rw & MBEDTLS_NET_POLL_WRITE )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        rw &= ~MBEDTLS_NET_POLL_WRITE;
 | 
				
			||||||
 | 
					        FD_SET( fd, &write_fds );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if( rw != 0 )
 | 
				
			||||||
 | 
					        return( MBEDTLS_ERR_NET_BAD_INPUT_DATA );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    tv.tv_sec  = timeout / 1000;
 | 
				
			||||||
 | 
					    tv.tv_usec = ( timeout % 1000 ) * 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = select( fd + 1, &read_fds, &write_fds, NULL,
 | 
				
			||||||
 | 
					                  timeout == (uint32_t) -1u ? NULL : &tv );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if( ret < 0 )
 | 
				
			||||||
 | 
					        return( MBEDTLS_ERR_NET_POLL_FAILED );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = 0;
 | 
				
			||||||
 | 
					    if( FD_ISSET( fd, &read_fds ) )
 | 
				
			||||||
 | 
					        ret |= MBEDTLS_NET_POLL_READ;
 | 
				
			||||||
 | 
					    if( FD_ISSET( fd, &write_fds ) )
 | 
				
			||||||
 | 
					        ret |= MBEDTLS_NET_POLL_WRITE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return( ret );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Portable usleep helper
 | 
					 * Portable usleep helper
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@ -492,8 +544,8 @@ int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len )
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Read at most 'len' characters, blocking for at most 'timeout' ms
 | 
					 * Read at most 'len' characters, blocking for at most 'timeout' ms
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len,
 | 
					int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf,
 | 
				
			||||||
                      uint32_t timeout )
 | 
					                              size_t len, uint32_t timeout )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
    struct timeval tv;
 | 
					    struct timeval tv;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user