FreeRTOS
aws_secure_sockets.h
Go to the documentation of this file.
1 /*
2  * FreeRTOS
3  * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of
6  * this software and associated documentation files (the "Software"), to deal in
7  * the Software without restriction, including without limitation the rights to
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9  * the Software, and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in all
13  * copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * http://aws.amazon.com/freertos
23  * http://www.FreeRTOS.org
24  */
25 
43 #ifndef _AWS_SECURE_SOCKETS_H_
44 #define _AWS_SECURE_SOCKETS_H_
45 
46 /*
47  #ifdef __cplusplus
48  * extern "C" {
49  #endif
50  */
51 #include <stdint.h>
52 #include <stddef.h>
53 #include "aws_secure_sockets_config.h"
54 #include "aws_secure_sockets_config_defaults.h"
55 #include "aws_lib_init.h"
56 
62 typedef void * Socket_t;
63 
70 #define Socklen_t uint32_t
71 
83 #define SOCKETS_ERROR_NONE ( 0 )
84 #define SOCKETS_SOCKET_ERROR ( -1 )
85 #define SOCKETS_EWOULDBLOCK ( -11 )
86 #define SOCKETS_ENOMEM ( -12 )
87 #define SOCKETS_EINVAL ( -22 )
88 #define SOCKETS_ENOPROTOOPT ( -109 )
89 #define SOCKETS_ENOTCONN ( -126 )
90 #define SOCKETS_EISCONN ( -127 )
91 #define SOCKETS_ECLOSED ( -128 )
92 #define SOCKETS_TLS_INIT_ERROR ( -1001 )
93 #define SOCKETS_TLS_HANDSHAKE_ERROR ( -1002 )
94 #define SOCKETS_TLS_SERVER_UNVERIFIED ( -1003 )
95 #define SOCKETS_TLS_RECV_ERROR ( -1004 )
96 #define SOCKETS_TLS_SEND_ERROR ( -1005 )
97 #define SOCKETS_PERIPHERAL_RESET ( -1006 )
103 #define SOCKETS_INVALID_SOCKET ( ( Socket_t ) ~0U )
104 
114 #define SOCKETS_AF_INET ( 2 )
115 #define SOCKETS_PF_INET SOCKETS_AF_INET
116 #define SOCKETS_AF_INET6 ( 10 )
128 #define SOCKETS_SOCK_DGRAM ( 2 )
129 #define SOCKETS_SOCK_STREAM ( 1 )
139 #define SOCKETS_IPPROTO_UDP ( 17 )
140 #define SOCKETS_IPPROTO_TCP ( 6 )
150 #define SOCKETS_SO_RCVTIMEO ( 0 )
151 #define SOCKETS_SO_SNDTIMEO ( 1 )
152 #define SOCKETS_SO_SNDBUF ( 4 )
153 #define SOCKETS_SO_RCVBUF ( 5 )
154 #define SOCKETS_SO_SERVER_NAME_INDICATION ( 6 )
155 #define SOCKETS_SO_TRUSTED_SERVER_CERTIFICATE ( 7 )
156 #define SOCKETS_SO_REQUIRE_TLS ( 8 )
157 #define SOCKETS_SO_NONBLOCK ( 9 )
158 #define SOCKETS_SO_ALPN_PROTOCOLS ( 10 )
159 #define SOCKETS_SO_WAKEUP_CALLBACK ( 17 )
169 #define SOCKETS_SHUT_RD ( 0 )
170 #define SOCKETS_SHUT_WR ( 1 )
171 #define SOCKETS_SHUT_RDWR ( 2 )
177 #define securesocketsMAX_DNS_NAME_LENGTH ( 253 )
178 
184 typedef struct SocketsSockaddr
185 {
186  uint8_t ucLength;
187  uint8_t ucSocketDomain;
188  uint16_t usPort;
189  uint32_t ulAddress;
191 
195 #define securesocketsDEFAULT_TLS_DESTINATION_PORT 443
196 
207 lib_initDECLARE_LIB_INIT( SOCKETS_Init );
208 
227 Socket_t SOCKETS_Socket( int32_t lDomain,
228  int32_t lType,
229  int32_t lProtocol );
230 
231 
255 int32_t SOCKETS_Connect( Socket_t xSocket,
256  SocketsSockaddr_t * pxAddress,
257  Socklen_t xAddressLength );
258 
278 int32_t SOCKETS_Recv( Socket_t xSocket,
279  void * pvBuffer,
280  size_t xBufferLength,
281  uint32_t ulFlags );
282 
298 int32_t SOCKETS_Send( Socket_t xSocket,
299  const void * pvBuffer,
300  size_t xDataLength,
301  uint32_t ulFlags );
302 
318 int32_t SOCKETS_Shutdown( Socket_t xSocket,
319  uint32_t ulHow );
320 
334 int32_t SOCKETS_Close( Socket_t xSocket );
335 
339 #define socketsAWS_IOT_ALPN_MQTT "x-amzn-mqtt-ca"
340 
410 int32_t SOCKETS_SetSockOpt( Socket_t xSocket,
411  int32_t lLevel,
412  int32_t lOptionName,
413  const void * pvOptionValue,
414  size_t xOptionLength );
415 
424 uint32_t SOCKETS_GetHostByName( const char * pcHostName );
425 
426 
427 
434 #if defined( socketsconfigBYTE_ORDER ) && ( socketsconfigBYTE_ORDER == pdLITTLE_ENDIAN )
435  #define SOCKETS_htonl( ulIn ) ( ( uint32_t ) ( ( ( ulIn & 0xFF ) << 24 ) | ( ( ulIn & 0xFF00 ) << 8 ) | ( ( ulIn & 0xFF0000 ) >> 8 ) | ( ( ulIn & 0xFF000000 ) >> 24 ) ) )
436 #else
437  #define SOCKETS_htonl( usIn ) ( ( uint32_t ) ( usIn ) )
438 #endif
439 
446 #define SOCKETS_ntohl( usIn ) SOCKETS_htonl( usIn )
447 
448 
456 #if defined( socketsconfigBYTE_ORDER ) && ( socketsconfigBYTE_ORDER == pdLITTLE_ENDIAN )
457  #define SOCKETS_htons( usIn ) ( ( uint16_t ) ( ( ( usIn ) << 8U ) | ( ( usIn ) >> 8U ) ) )
458 #else
459  #define SOCKETS_htons( usIn ) ( ( uint16_t ) ( usIn ) )
460 #endif
461 
462 
469 #define SOCKETS_ntohs( usIn ) SOCKETS_htons( usIn )
470 
471 #if defined( socketsconfigBYTE_ORDER ) && ( socketsconfigBYTE_ORDER == pdLITTLE_ENDIAN )
472 
473  #define SOCKETS_inet_addr_quick( ucOctet0, ucOctet1, ucOctet2, ucOctet3 ) \
474  ( ( ( ( uint32_t ) ( ucOctet3 ) ) << 24UL ) | \
475  ( ( ( uint32_t ) ( ucOctet2 ) ) << 16UL ) | \
476  ( ( ( uint32_t ) ( ucOctet1 ) ) << 8UL ) | \
477  ( ( uint32_t ) ( ucOctet0 ) ) )
478 
479  #define SOCKETS_inet_ntoa( ulIPAddress, pucBuffer ) \
480  sprintf( ( char * ) ( pucBuffer ), "%u.%u.%u.%u", \
481  ( ( unsigned ) ( ( ulIPAddress ) & 0xffUL ) ), \
482  ( ( unsigned ) ( ( ( ulIPAddress ) >> 8 ) & 0xffUL ) ), \
483  ( ( unsigned ) ( ( ( ulIPAddress ) >> 16 ) & 0xffUL ) ), \
484  ( ( unsigned ) ( ( ulIPAddress ) >> 24 ) ) )
485 
486 #else /* socketsconfigBYTE_ORDER. */
487 
488  #define SOCKETS_inet_addr_quick( ucOctet0, ucOctet1, ucOctet2, ucOctet3 ) \
489  ( ( ( ( uint32_t ) ( ucOctet0 ) ) << 24UL ) | \
490  ( ( ( uint32_t ) ( ucOctet1 ) ) << 16UL ) | \
491  ( ( ( uint32_t ) ( ucOctet2 ) ) << 8UL ) | \
492  ( ( uint32_t ) ( ucOctet3 ) ) )
493 
494  #define SOCKETS_inet_ntoa( ulIPAddress, pucBuffer ) \
495  sprintf( ( char * ) ( pucBuffer ), "%u.%u.%u.%u", \
496  ( ( unsigned ) ( ( ulIPAddress ) >> 24 ) ), \
497  ( ( unsigned ) ( ( ( ulIPAddress ) >> 16 ) & 0xffUL ) ), \
498  ( ( unsigned ) ( ( ( ulIPAddress ) >> 8 ) & 0xffUL ) ), \
499  ( ( unsigned ) ( ( ulIPAddress ) & 0xffUL ) ) )
500 
501 #endif /* socketsconfigBYTE_ORDER. */
502 
503 /*
504  #ifdef __cplusplus
505  * }
506  #endif
507  */
508 
509 #endif /* _AWS_SECURE_SOCKETS_H_ */
int32_t SOCKETS_SetSockOpt(Socket_t xSocket, int32_t lLevel, int32_t lOptionName, const void *pvOptionValue, size_t xOptionLength)
Manipulates the options for the socket.
Socket_t SOCKETS_Socket(int32_t lDomain, int32_t lType, int32_t lProtocol)
Creates a TCP socket.
Socket address.
int32_t SOCKETS_Shutdown(Socket_t xSocket, uint32_t ulHow)
Closes all or part of a full-duplex connection on the socket.
int32_t SOCKETS_Send(Socket_t xSocket, const void *pvBuffer, size_t xDataLength, uint32_t ulFlags)
Transmit data to the remote socket.
lib_initDECLARE_LIB_INIT(SOCKETS_Init)
Secure Sockets library initialization function.
#define Socklen_t
The "size_t" of secure sockets.
struct SocketsSockaddr SocketsSockaddr_t
Socket address.
uint32_t SOCKETS_GetHostByName(const char *pcHostName)
Resolve a host name using Domain Name Service.
int32_t SOCKETS_Close(Socket_t xSocket)
Closes the socket and frees the related resources.
int32_t SOCKETS_Connect(Socket_t xSocket, SocketsSockaddr_t *pxAddress, Socklen_t xAddressLength)
Connects the socket to the specified IP address and port.
int32_t SOCKETS_Recv(Socket_t xSocket, void *pvBuffer, size_t xBufferLength, uint32_t ulFlags)
Receive data from a TCP socket.
void * Socket_t
The socket type.