TI's CC3100 websocket camera demo with Arducam mini ov5642 and freertos. Should work with other M3's. Work in progress test demo.

Dependencies:   mbed

Committer:
dflet
Date:
Fri Sep 11 15:38:33 2015 +0000
Revision:
1:e448e81c416f
Parent:
0:400d8e75a8d0
Removed some debud.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:400d8e75a8d0 1 /*
dflet 0:400d8e75a8d0 2 * socket.h - CC31xx/CC32xx Host Driver Implementation
dflet 0:400d8e75a8d0 3 *
dflet 0:400d8e75a8d0 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:400d8e75a8d0 5 *
dflet 0:400d8e75a8d0 6 *
dflet 0:400d8e75a8d0 7 * Redistribution and use in source and binary forms, with or without
dflet 0:400d8e75a8d0 8 * modification, are permitted provided that the following conditions
dflet 0:400d8e75a8d0 9 * are met:
dflet 0:400d8e75a8d0 10 *
dflet 0:400d8e75a8d0 11 * Redistributions of source code must retain the above copyright
dflet 0:400d8e75a8d0 12 * notice, this list of conditions and the following disclaimer.
dflet 0:400d8e75a8d0 13 *
dflet 0:400d8e75a8d0 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:400d8e75a8d0 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:400d8e75a8d0 16 * documentation and/or other materials provided with the
dflet 0:400d8e75a8d0 17 * distribution.
dflet 0:400d8e75a8d0 18 *
dflet 0:400d8e75a8d0 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:400d8e75a8d0 20 * its contributors may be used to endorse or promote products derived
dflet 0:400d8e75a8d0 21 * from this software without specific prior written permission.
dflet 0:400d8e75a8d0 22 *
dflet 0:400d8e75a8d0 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:400d8e75a8d0 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:400d8e75a8d0 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:400d8e75a8d0 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:400d8e75a8d0 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:400d8e75a8d0 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:400d8e75a8d0 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:400d8e75a8d0 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:400d8e75a8d0 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:400d8e75a8d0 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:400d8e75a8d0 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:400d8e75a8d0 34 *
dflet 0:400d8e75a8d0 35 */
dflet 0:400d8e75a8d0 36
dflet 0:400d8e75a8d0 37 /*****************************************************************************/
dflet 0:400d8e75a8d0 38 /* Include files */
dflet 0:400d8e75a8d0 39 /*****************************************************************************/
dflet 0:400d8e75a8d0 40 #include "cc3100_simplelink.h"
dflet 0:400d8e75a8d0 41
dflet 0:400d8e75a8d0 42 #ifndef SL_SOCKET_H_
dflet 0:400d8e75a8d0 43 #define SL_SOCKET_H_
dflet 0:400d8e75a8d0 44
dflet 0:400d8e75a8d0 45 #include "cc3100_protocol.h"
dflet 0:400d8e75a8d0 46
dflet 0:400d8e75a8d0 47 namespace mbed_cc3100 {
dflet 0:400d8e75a8d0 48
dflet 0:400d8e75a8d0 49 //#include "cc3100_driver.h"
dflet 0:400d8e75a8d0 50
dflet 0:400d8e75a8d0 51 /*!
dflet 0:400d8e75a8d0 52
dflet 0:400d8e75a8d0 53 \addtogroup socket
dflet 0:400d8e75a8d0 54 @{
dflet 0:400d8e75a8d0 55
dflet 0:400d8e75a8d0 56 */
dflet 0:400d8e75a8d0 57
dflet 0:400d8e75a8d0 58 /*****************************************************************************/
dflet 0:400d8e75a8d0 59 /* Macro declarations */
dflet 0:400d8e75a8d0 60 /*****************************************************************************/
dflet 0:400d8e75a8d0 61
dflet 0:400d8e75a8d0 62 const uint8_t SL_FD_SETSIZE = SL_MAX_SOCKETS; /* Number of sockets to select on - same is max sockets! */
dflet 0:400d8e75a8d0 63 const uint8_t BSD_SOCKET_ID_MASK = (0x0F); /* Index using the LBS 4 bits for socket id 0-7 */
dflet 0:400d8e75a8d0 64 /* Define some BSD protocol constants. */
dflet 0:400d8e75a8d0 65 const uint8_t SL_SOCK_STREAM = (1); /* TCP Socket */
dflet 0:400d8e75a8d0 66 const uint8_t SL_SOCK_DGRAM = (2); /* UDP Socket */
dflet 0:400d8e75a8d0 67 const uint8_t SL_SOCK_RAW = (3); /* Raw socket */
dflet 0:400d8e75a8d0 68 const uint8_t SL_IPPROTO_TCP = (6); /* TCP Raw Socket */
dflet 0:400d8e75a8d0 69 const uint8_t SL_IPPROTO_UDP = (17); /* UDP Raw Socket */
dflet 0:400d8e75a8d0 70 const uint8_t SL_IPPROTO_RAW = (255); /* Raw Socket */
dflet 0:400d8e75a8d0 71 const uint8_t SL_SEC_SOCKET = (100); /* Secured Socket Layer (SSL,TLS) */
dflet 0:400d8e75a8d0 72
dflet 0:400d8e75a8d0 73 /* Address families. */
dflet 0:400d8e75a8d0 74 const uint8_t SL_AF_INET = (2); /* IPv4 socket (UDP, TCP, etc) */
dflet 0:400d8e75a8d0 75 const uint8_t SL_AF_INET6 = (3); /* IPv6 socket (UDP, TCP, etc) */
dflet 0:400d8e75a8d0 76 const uint8_t SL_AF_INET6_EUI_48 = (9);
dflet 0:400d8e75a8d0 77 const uint8_t AF_INET = SL_AF_INET;
dflet 0:400d8e75a8d0 78 const uint8_t AF_INET6 = SL_AF_INET6;
dflet 0:400d8e75a8d0 79 const uint8_t SL_AF_RF = (6); /* data include RF parameter, All layer by user (Wifi could be disconnected) */
dflet 0:400d8e75a8d0 80 const uint8_t SL_AF_PACKET = (17);
dflet 0:400d8e75a8d0 81 /* Protocol families, same as address families. */
dflet 0:400d8e75a8d0 82 const uint8_t SL_PF_INET = AF_INET;
dflet 0:400d8e75a8d0 83 const uint8_t SL_PF_INET6 = AF_INET6;
dflet 0:400d8e75a8d0 84 const uint8_t SL_INADDR_ANY = (0); /* bind any address */
dflet 0:400d8e75a8d0 85
dflet 0:400d8e75a8d0 86 /* error codes */
dflet 0:400d8e75a8d0 87 const int8_t SL_SOC_ERROR = (-1); /* Failure. */
dflet 0:400d8e75a8d0 88 const int8_t SL_SOC_OK = ( 0); /* Success. */
dflet 0:400d8e75a8d0 89 const int8_t SL_INEXE = (-8); /* socket command in execution */
dflet 0:400d8e75a8d0 90 const int8_t SL_EBADF = (-9); /* Bad file number */
dflet 0:400d8e75a8d0 91 const int8_t SL_ENSOCK = (-10); /* The system limit on the total number of open socket, has been reached */
dflet 0:400d8e75a8d0 92 const int8_t SL_EAGAIN = (-11); /* Try again */
dflet 0:400d8e75a8d0 93 const int8_t SL_EWOULDBLOCK = SL_EAGAIN;
dflet 0:400d8e75a8d0 94 const int8_t SL_ENOMEM = (-12); /* Out of memory */
dflet 0:400d8e75a8d0 95 const int8_t SL_EACCES = (-13); /* Permission denied */
dflet 0:400d8e75a8d0 96 const int8_t SL_EFAULT = (-14); /* Bad address */
dflet 0:400d8e75a8d0 97 const int8_t SL_ECLOSE = (-15); /* close socket operation failed to transmit all queued packets */
dflet 0:400d8e75a8d0 98 const int8_t SL_EALREADY_ENABLED = (-21); /* Transceiver - Transceiver already ON. there could be only one */
dflet 0:400d8e75a8d0 99 const int8_t SL_EINVAL = (-22); /* Invalid argument */
dflet 0:400d8e75a8d0 100 const int8_t SL_EAUTO_CONNECT_OR_CONNECTING = (-69); /* Transceiver - During connection, connected or auto mode started */
dflet 0:400d8e75a8d0 101 const int8_t SL_CONNECTION_PENDING = (-72); /* Transceiver - Device is connected, disconnect first to open transceiver */
dflet 0:400d8e75a8d0 102 const int8_t SL_EUNSUPPORTED_ROLE = (-86); /* Transceiver - Trying to start when WLAN role is AP or P2P GO */
dflet 0:400d8e75a8d0 103 const int8_t SL_EDESTADDRREQ = (-89); /* Destination address required */
dflet 0:400d8e75a8d0 104 const int8_t SL_EPROTOTYPE = (-91); /* Protocol wrong type for socket */
dflet 0:400d8e75a8d0 105 const int8_t SL_ENOPROTOOPT = (-92); /* Protocol not available */
dflet 0:400d8e75a8d0 106 const int8_t SL_EPROTONOSUPPORT = (-93); /* Protocol not supported */
dflet 0:400d8e75a8d0 107 const int8_t SL_ESOCKTNOSUPPORT = (-94); /* Socket type not supported */
dflet 0:400d8e75a8d0 108 const int8_t SL_EOPNOTSUPP = (-95); /* Operation not supported on transport endpoint */
dflet 0:400d8e75a8d0 109 const int8_t SL_EAFNOSUPPORT = (-97); /* Address family not supported by protocol */
dflet 0:400d8e75a8d0 110 const int8_t SL_EADDRINUSE = (-98); /* Address already in use */
dflet 0:400d8e75a8d0 111 const int8_t SL_EADDRNOTAVAIL = (-99); /* Cannot assign requested address */
dflet 0:400d8e75a8d0 112 const int8_t SL_ENETUNREACH = (-101); /* Network is unreachable */
dflet 0:400d8e75a8d0 113 const int8_t SL_ENOBUFS = (-105); /* No buffer space available */
dflet 0:400d8e75a8d0 114 const int8_t SL_EOBUFF = SL_ENOBUFS;
dflet 0:400d8e75a8d0 115 const int8_t SL_EISCONN = (-106); /* Transport endpoint is already connected */
dflet 0:400d8e75a8d0 116 const int8_t SL_ENOTCONN = (-107); /* Transport endpoint is not connected */
dflet 0:400d8e75a8d0 117 const int8_t SL_ETIMEDOUT = (-110); /* Connection timed out */
dflet 0:400d8e75a8d0 118 const int8_t SL_ECONNREFUSED = (-111); /* Connection refused */
dflet 0:400d8e75a8d0 119 const int8_t SL_EALREADY = (-114); /* Non blocking connect in progress, try again */
dflet 0:400d8e75a8d0 120
dflet 0:400d8e75a8d0 121 const int16_t SL_ESEC_RSA_WRONG_TYPE_E = (-130); /* RSA wrong block type for RSA function */
dflet 0:400d8e75a8d0 122 const int16_t SL_ESEC_RSA_BUFFER_E = (-131); /* RSA buffer error, output too small or */
dflet 0:400d8e75a8d0 123 const int16_t SL_ESEC_BUFFER_E = (-132); /* output buffer too small or input too large */
dflet 0:400d8e75a8d0 124 const int16_t SL_ESEC_ALGO_ID_E = (-133); /* setting algo id error */
dflet 0:400d8e75a8d0 125 const int16_t SL_ESEC_PUBLIC_KEY_E = (-134); /* setting public key error */
dflet 0:400d8e75a8d0 126 const int16_t SL_ESEC_DATE_E = (-135); /* setting date validity error */
dflet 0:400d8e75a8d0 127 const int16_t SL_ESEC_SUBJECT_E = (-136); /* setting subject name error */
dflet 0:400d8e75a8d0 128 const int16_t SL_ESEC_ISSUER_E = (-137); /* setting issuer name error */
dflet 0:400d8e75a8d0 129 const int16_t SL_ESEC_CA_TRUE_E = (-138); /* setting CA basic constraint true error */
dflet 0:400d8e75a8d0 130 const int16_t SL_ESEC_EXTENSIONS_E = (-139); /* setting extensions error */
dflet 0:400d8e75a8d0 131 const int16_t SL_ESEC_ASN_PARSE_E = (-140); /* ASN parsing error, invalid input */
dflet 0:400d8e75a8d0 132 const int16_t SL_ESEC_ASN_VERSION_E = (-141); /* ASN version error, invalid number */
dflet 0:400d8e75a8d0 133 const int16_t SL_ESEC_ASN_GETINT_E = (-142); /* ASN get big int16_t error, invalid data */
dflet 0:400d8e75a8d0 134 const int16_t SL_ESEC_ASN_RSA_KEY_E = (-143); /* ASN key init error, invalid input */
dflet 0:400d8e75a8d0 135 const int16_t SL_ESEC_ASN_OBJECT_ID_E = (-144); /* ASN object id error, invalid id */
dflet 0:400d8e75a8d0 136 const int16_t SL_ESEC_ASN_TAG_NULL_E = (-145); /* ASN tag error, not null */
dflet 0:400d8e75a8d0 137 const int16_t SL_ESEC_ASN_EXPECT_0_E = (-146); /* ASN expect error, not zero */
dflet 0:400d8e75a8d0 138 const int16_t SL_ESEC_ASN_BITSTR_E = (-147); /* ASN bit string error, wrong id */
dflet 0:400d8e75a8d0 139 const int16_t SL_ESEC_ASN_UNKNOWN_OID_E = (-148); /* ASN oid error, unknown sum id */
dflet 0:400d8e75a8d0 140 const int16_t SL_ESEC_ASN_DATE_SZ_E = (-149); /* ASN date error, bad size */
dflet 0:400d8e75a8d0 141 const int16_t SL_ESEC_ASN_BEFORE_DATE_E = (-150); /* ASN date error, current date before */
dflet 0:400d8e75a8d0 142 const int16_t SL_ESEC_ASN_AFTER_DATE_E = (-151); /* ASN date error, current date after */
dflet 0:400d8e75a8d0 143 const int16_t SL_ESEC_ASN_SIG_OID_E = (-152); /* ASN signature error, mismatched oid */
dflet 0:400d8e75a8d0 144 const int16_t SL_ESEC_ASN_TIME_E = (-153); /* ASN time error, unknown time type */
dflet 0:400d8e75a8d0 145 const int16_t SL_ESEC_ASN_INPUT_E = (-154); /* ASN input error, not enough data */
dflet 0:400d8e75a8d0 146 const int16_t SL_ESEC_ASN_SIG_CONFIRM_E = (-155); /* ASN sig error, confirm failure */
dflet 0:400d8e75a8d0 147 const int16_t SL_ESEC_ASN_SIG_HASH_E = (-156); /* ASN sig error, unsupported hash type */
dflet 0:400d8e75a8d0 148 const int16_t SL_ESEC_ASN_SIG_KEY_E = (-157); /* ASN sig error, unsupported key type */
dflet 0:400d8e75a8d0 149 const int16_t SL_ESEC_ASN_DH_KEY_E = (-158); /* ASN key init error, invalid input */
dflet 0:400d8e75a8d0 150 const int16_t SL_ESEC_ASN_NTRU_KEY_E = (-159); /* ASN ntru key decode error, invalid input */
dflet 0:400d8e75a8d0 151 const int16_t SL_ESEC_ECC_BAD_ARG_E = (-170); /* ECC input argument of wrong type */
dflet 0:400d8e75a8d0 152 const int16_t SL_ESEC_ASN_ECC_KEY_E = (-171); /* ASN ECC bad input */
dflet 0:400d8e75a8d0 153 const int16_t SL_ESEC_ECC_CURVE_OID_E = (-172); /* Unsupported ECC OID curve type */
dflet 0:400d8e75a8d0 154 const int16_t SL_ESEC_BAD_FUNC_ARG = (-173); /* Bad function argument provided */
dflet 0:400d8e75a8d0 155 const int16_t SL_ESEC_NOT_COMPILED_IN = (-174); /* Feature not compiled in */
dflet 0:400d8e75a8d0 156 const int16_t SL_ESEC_UNICODE_SIZE_E = (-175); /* Unicode password too big */
dflet 0:400d8e75a8d0 157 const int16_t SL_ESEC_NO_PASSWORD = (-176); /* no password provided by user */
dflet 0:400d8e75a8d0 158 const int16_t SL_ESEC_ALT_NAME_E = (-177); /* alt name size problem, too big */
dflet 0:400d8e75a8d0 159 const int16_t SL_ESEC_AES_GCM_AUTH_E = (-180); /* AES-GCM Authentication check failure */
dflet 0:400d8e75a8d0 160 const int16_t SL_ESEC_AES_CCM_AUTH_E = (-181); /* AES-CCM Authentication check failure */
dflet 0:400d8e75a8d0 161 #define SL_SOCKET_ERROR_E (-208) /* Error state on socket */
dflet 0:400d8e75a8d0 162
dflet 0:400d8e75a8d0 163 #define SL_ESEC_MEMORY_ERROR (-203) /* out of memory */
dflet 0:400d8e75a8d0 164 #define SL_ESEC_VERIFY_FINISHED_ERROR (-204) /* verify problem on finished */
dflet 0:400d8e75a8d0 165 #define SL_ESEC_VERIFY_MAC_ERROR (-205) /* verify mac problem */
dflet 0:400d8e75a8d0 166 #define SL_ESEC_UNKNOWN_HANDSHAKE_TYPE (-207) /* weird handshake type */
dflet 0:400d8e75a8d0 167 #define SL_ESEC_SOCKET_ERROR_E (-208) /* error state on socket */
dflet 0:400d8e75a8d0 168 #define SL_ESEC_SOCKET_NODATA (-209) /* expected data, not there */
dflet 0:400d8e75a8d0 169 #define SL_ESEC_INCOMPLETE_DATA (-210) /* don't have enough data to complete task */
dflet 0:400d8e75a8d0 170 #define SL_ESEC_UNKNOWN_RECORD_TYPE (-211) /* unknown type in record hdr */
dflet 0:400d8e75a8d0 171 #define SL_ESEC_FATAL_ERROR (-213) /* recvd alert fatal error */
dflet 0:400d8e75a8d0 172 #define SL_ESEC_ENCRYPT_ERROR (-214) /* error during encryption */
dflet 0:400d8e75a8d0 173 #define SL_ESEC_NO_PEER_KEY (-216) /* need peer's key */
dflet 0:400d8e75a8d0 174 #define SL_ESEC_NO_PRIVATE_KEY (-217) /* need the private key */
dflet 0:400d8e75a8d0 175 #define SL_ESEC_RSA_PRIVATE_ERROR (-218) /* error during rsa priv op */
dflet 0:400d8e75a8d0 176 #define SL_ESEC_NO_DH_PARAMS (-219) /* server missing DH params */
dflet 0:400d8e75a8d0 177 #define SL_ESEC_BUILD_MSG_ERROR (-220) /* build message failure */
dflet 0:400d8e75a8d0 178 #define SL_ESEC_BAD_HELLO (-221) /* client hello malformed */
dflet 0:400d8e75a8d0 179 #define SL_ESEC_DOMAIN_NAME_MISMATCH (-222) /* peer subject name mismatch */
dflet 0:400d8e75a8d0 180 #define SL_ESEC_WANT_READ (-223) /* want read, call again */
dflet 0:400d8e75a8d0 181 #define SL_ESEC_NOT_READY_ERROR (-224) /* handshake layer not ready */
dflet 0:400d8e75a8d0 182 #define SL_ESEC_PMS_VERSION_ERROR (-225) /* pre m secret version error */
dflet 0:400d8e75a8d0 183 #define SL_ESEC_VERSION_ERROR (-226) /* record layer version error */
dflet 0:400d8e75a8d0 184 #define SL_ESEC_WANT_WRITE (-227) /* want write, call again */
dflet 0:400d8e75a8d0 185 #define SL_ESEC_BUFFER_ERROR (-228) /* malformed buffer input */
dflet 0:400d8e75a8d0 186 #define SL_ESEC_VERIFY_CERT_ERROR (-229) /* verify cert error */
dflet 0:400d8e75a8d0 187 #define SL_ESEC_VERIFY_SIGN_ERROR (-230) /* verify sign error */
dflet 0:400d8e75a8d0 188
dflet 0:400d8e75a8d0 189 #define SL_ESEC_LENGTH_ERROR (-241) /* record layer length error */
dflet 0:400d8e75a8d0 190 #define SL_ESEC_PEER_KEY_ERROR (-242) /* can't decode peer key */
dflet 0:400d8e75a8d0 191 #define SL_ESEC_ZERO_RETURN (-243) /* peer sent close notify */
dflet 0:400d8e75a8d0 192 #define SL_ESEC_SIDE_ERROR (-244) /* wrong client/server type */
dflet 0:400d8e75a8d0 193 #define SL_ESEC_NO_PEER_CERT (-245) /* peer didn't send key */
dflet 0:400d8e75a8d0 194 #define SL_ESEC_ECC_CURVETYPE_ERROR (-250) /* Bad ECC Curve Type */
dflet 0:400d8e75a8d0 195 #define SL_ESEC_ECC_CURVE_ERROR (-251) /* Bad ECC Curve */
dflet 0:400d8e75a8d0 196 #define SL_ESEC_ECC_PEERKEY_ERROR (-252) /* Bad Peer ECC Key */
dflet 0:400d8e75a8d0 197 #define SL_ESEC_ECC_MAKEKEY_ERROR (-253) /* Bad Make ECC Key */
dflet 0:400d8e75a8d0 198 #define SL_ESEC_ECC_EXPORT_ERROR (-254) /* Bad ECC Export Key */
dflet 0:400d8e75a8d0 199 #define SL_ESEC_ECC_SHARED_ERROR (-255) /* Bad ECC Shared Secret */
dflet 0:400d8e75a8d0 200 #define SL_ESEC_NOT_CA_ERROR (-257) /* Not a CA cert error */
dflet 0:400d8e75a8d0 201 #define SL_ESEC_BAD_PATH_ERROR (-258) /* Bad path for opendir */
dflet 0:400d8e75a8d0 202 #define SL_ESEC_BAD_CERT_MANAGER_ERROR (-259) /* Bad Cert Manager */
dflet 0:400d8e75a8d0 203 #define SL_ESEC_MAX_CHAIN_ERROR (-268) /* max chain depth exceeded */
dflet 0:400d8e75a8d0 204 #define SL_ESEC_SUITES_ERROR (-271) /* suites pointer error */
dflet 0:400d8e75a8d0 205 #define SL_ESEC_SSL_NO_PEM_HEADER (-272) /* no PEM header found */
dflet 0:400d8e75a8d0 206 #define SL_ESEC_OUT_OF_ORDER_E (-273) /* out of order message */
dflet 0:400d8e75a8d0 207 #define SL_ESEC_SANITY_CIPHER_E (-275) /* sanity check on cipher error */
dflet 0:400d8e75a8d0 208 #define SL_ESEC_GEN_COOKIE_E (-277) /* Generate Cookie Error */
dflet 0:400d8e75a8d0 209 #define SL_ESEC_NO_PEER_VERIFY (-278) /* Need peer cert verify Error */
dflet 0:400d8e75a8d0 210 #define SL_ESEC_UNKNOWN_SNI_HOST_NAME_E (-281) /* Unrecognized host name Error */
dflet 0:400d8e75a8d0 211 /* begin negotiation parameter errors */
dflet 0:400d8e75a8d0 212 #define SL_ESEC_UNSUPPORTED_SUITE (-290) /* unsupported cipher suite */
dflet 0:400d8e75a8d0 213 #define SL_ESEC_MATCH_SUITE_ERROR (-291 ) /* can't match cipher suite */
dflet 0:400d8e75a8d0 214
dflet 0:400d8e75a8d0 215 /* ssl tls security start with -300 offset */
dflet 0:400d8e75a8d0 216 const int16_t SL_ESEC_CLOSE_NOTIFY = (-300); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 217 const int16_t SL_ESEC_UNEXPECTED_MESSAGE = (-310); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 218 const int16_t SL_ESEC_BAD_RECORD_MAC = (-320); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 219 const int16_t SL_ESEC_DECRYPTION_FAILED = (-321); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 220 const int16_t SL_ESEC_RECORD_OVERFLOW = (-322); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 221 const int16_t SL_ESEC_DECOMPRESSION_FAILURE = (-330); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 222 const int16_t SL_ESEC_HANDSHAKE_FAILURE = (-340); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 223 const int16_t SL_ESEC_NO_CERTIFICATE = (-341); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 224 const int16_t SL_ESEC_BAD_CERTIFICATE = (-342); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 225 const int16_t SL_ESEC_UNSUPPORTED_CERTIFICATE = (-343); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 226 const int16_t SL_ESEC_CERTIFICATE_REVOKED = (-344); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 227 const int16_t SL_ESEC_CERTIFICATE_EXPIRED = (-345); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 228 const int16_t SL_ESEC_CERTIFICATE_UNKNOWN = (-346); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 229 const int16_t SL_ESEC_ILLEGAL_PARAMETER = (-347); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 230 const int16_t SL_ESEC_UNKNOWN_CA = (-348); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 231 const int16_t SL_ESEC_ACCESS_DENIED = (-349); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 232 const int16_t SL_ESEC_DECODE_ERROR = (-350); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 233 const int16_t SL_ESEC_DECRYPT_ERROR = (-351); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 234 const int16_t SL_ESEC_EXPORT_RESTRICTION = (-360); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 235 const int16_t SL_ESEC_PROTOCOL_VERSION = (-370); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 236 const int16_t SL_ESEC_INSUFFICIENT_SECURITY = (-371); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 237 const int16_t SL_ESEC_INTERNAL_ERROR = (-380); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 238 const int16_t SL_ESEC_USER_CANCELLED = (-390); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 239 const int16_t SL_ESEC_NO_RENEGOTIATION = (-400); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 240 const int16_t SL_ESEC_UNSUPPORTED_EXTENSION = (-410); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 241 const int16_t SL_ESEC_CERTIFICATE_UNOBTAINABLE = (-411); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 242 const int16_t SL_ESEC_UNRECOGNIZED_NAME = (-412); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 243 const int16_t SL_ESEC_BAD_CERTIFICATE_STATUS_RESPONSE = (-413); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 244 const int16_t SL_ESEC_BAD_CERTIFICATE_HASH_VALUE = (-414); /* ssl/tls alerts */
dflet 0:400d8e75a8d0 245 /* propierty secure */
dflet 0:400d8e75a8d0 246 const int16_t SL_ESECGENERAL = (-450); /* error secure level general error */
dflet 0:400d8e75a8d0 247 const int16_t SL_ESECDECRYPT = (-451); /* error secure level, decrypt recv packet fail */
dflet 0:400d8e75a8d0 248 const int16_t SL_ESECCLOSED = (-452); /* secure layrer is closed by other size , tcp is still connected */
dflet 0:400d8e75a8d0 249 const int16_t SL_ESECSNOVERIFY = (-453); /* Connected without server verification */
dflet 0:400d8e75a8d0 250 const int16_t SL_ESECNOCAFILE = (-454); /* error secure level CA file not found*/
dflet 0:400d8e75a8d0 251 const int16_t SL_ESECMEMORY = (-455); /* error secure level No memory space available */
dflet 0:400d8e75a8d0 252 const int16_t SL_ESECBADCAFILE = (-456); /* error secure level bad CA file */
dflet 0:400d8e75a8d0 253 const int16_t SL_ESECBADCERTFILE = (-457); /* error secure level bad Certificate file */
dflet 0:400d8e75a8d0 254 const int16_t SL_ESECBADPRIVATEFILE = (-458); /* error secure level bad private file */
dflet 0:400d8e75a8d0 255 const int16_t SL_ESECBADDHFILE = (-459); /* error secure level bad DH file */
dflet 0:400d8e75a8d0 256 const int16_t SL_ESECT00MANYSSLOPENED = (-460); /* MAX SSL Sockets are opened */
dflet 0:400d8e75a8d0 257 const int16_t SL_ESECDATEERROR = (-461); /* connected with certificate date verification error */
dflet 0:400d8e75a8d0 258 const int16_t SL_ESECHANDSHAKETIMEDOUT = (-462); /* connection timed out due to handshake time */
dflet 0:400d8e75a8d0 259
dflet 0:400d8e75a8d0 260 /* end error codes */
dflet 0:400d8e75a8d0 261
dflet 0:400d8e75a8d0 262 /* Max payload size by protocol */
dflet 0:400d8e75a8d0 263 const uint8_t SL_SOCKET_PAYLOAD_TYPE_MASK = (0xF0); /*4 bits type, 4 bits sockets id */
dflet 0:400d8e75a8d0 264 const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV4 = (0x00); /* 1472 bytes */
dflet 0:400d8e75a8d0 265 const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV4 = (0x10); /* 1460 bytes */
dflet 0:400d8e75a8d0 266 const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV6 = (0x20); /* 1452 bytes */
dflet 0:400d8e75a8d0 267 const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV6 = (0x30); /* 1440 bytes */
dflet 0:400d8e75a8d0 268 const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV4_SECURE =(0x40); /* */
dflet 0:400d8e75a8d0 269 const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV4_SECURE =(0x50); /* */
dflet 0:400d8e75a8d0 270 const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV6_SECURE =(0x60); /* */
dflet 0:400d8e75a8d0 271 const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV6_SECURE =(0x70); /* */
dflet 0:400d8e75a8d0 272 const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_TRANCEIVER =(0x80); /* 1536 bytes */
dflet 0:400d8e75a8d0 273 const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_PACKET = (0x90); /* 1536 bytes */
dflet 0:400d8e75a8d0 274 const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_IP4 = (0xa0);
dflet 0:400d8e75a8d0 275 const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_IP6 = (SL_SOCKET_PAYLOAD_TYPE_RAW_IP4 );
dflet 0:400d8e75a8d0 276
dflet 0:400d8e75a8d0 277
dflet 0:400d8e75a8d0 278
dflet 0:400d8e75a8d0 279 const uint8_t SL_SOL_SOCKET = (1); /* Define the socket option category. */
dflet 0:400d8e75a8d0 280 const uint8_t SL_IPPROTO_IP = (2); /* Define the IP option category. */
dflet 0:400d8e75a8d0 281 const uint8_t SL_SOL_PHY_OPT = (3); /* Define the PHY option category. */
dflet 0:400d8e75a8d0 282
dflet 0:400d8e75a8d0 283 const uint8_t SL_SO_RCVBUF = (8); /* Setting TCP receive buffer size */
dflet 0:400d8e75a8d0 284 const uint8_t SL_SO_KEEPALIVE = (9); /* Connections are kept alive with periodic messages */
dflet 0:400d8e75a8d0 285 const uint8_t SL_SO_RCVTIMEO = (20); /* Enable receive timeout */
dflet 0:400d8e75a8d0 286 const uint8_t SL_SO_NONBLOCKING = (24); /* Enable . disable nonblocking mode */
dflet 0:400d8e75a8d0 287 const uint8_t SL_SO_SECMETHOD = (25); /* security metohd */
dflet 0:400d8e75a8d0 288 const uint8_t SL_SO_SECURE_MASK = (26); /* security mask */
dflet 0:400d8e75a8d0 289 const uint8_t SL_SO_SECURE_FILES = (27); /* security files */
dflet 0:400d8e75a8d0 290 const uint8_t SL_SO_CHANGE_CHANNEL = (28); /* This option is available only when transceiver started */
dflet 0:400d8e75a8d0 291 const uint8_t SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME =(30); /* This option used to configue secure file */
dflet 0:400d8e75a8d0 292 const uint8_t SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME =(31); /* This option used to configue secure file */
dflet 0:400d8e75a8d0 293 const uint8_t SL_SO_SECURE_FILES_CA_FILE_NAME = (32); /* This option used to configue secure file */
dflet 0:400d8e75a8d0 294 const uint8_t SL_SO_SECURE_FILES_DH_KEY_FILE_NAME = (33); /* This option used to configue secure file */
dflet 0:400d8e75a8d0 295
dflet 0:400d8e75a8d0 296 const uint8_t SL_IP_MULTICAST_IF = (60); /* Specify outgoing multicast interface */
dflet 0:400d8e75a8d0 297 const uint8_t SL_IP_MULTICAST_TTL = (61); /* Specify the TTL value to use for outgoing multicast packet. */
dflet 0:400d8e75a8d0 298 const uint8_t SL_IP_ADD_MEMBERSHIP = (65); /* Join IPv4 multicast membership */
dflet 0:400d8e75a8d0 299 const uint8_t SL_IP_DROP_MEMBERSHIP= (66); /* Leave IPv4 multicast membership */
dflet 0:400d8e75a8d0 300 const uint8_t SL_IP_HDRINCL = (67); /* Raw socket IPv4 header included. */
dflet 0:400d8e75a8d0 301 const uint8_t SL_IP_RAW_RX_NO_HEADER =(68); /* Proprietary socket option that does not includeIPv4/IPv6 header (and extension headers) on received raw sockets*/
dflet 0:400d8e75a8d0 302 const uint8_t SL_IP_RAW_IPV6_HDRINCL =(69); /* Transmitted buffer over IPv6 socket contains IPv6 header. */
dflet 0:400d8e75a8d0 303
dflet 0:400d8e75a8d0 304 const uint8_t SL_SO_PHY_RATE = (100); /* WLAN Transmit rate */
dflet 0:400d8e75a8d0 305 const uint8_t SL_SO_PHY_TX_POWER = (101); /* TX Power level */
dflet 0:400d8e75a8d0 306 const uint8_t SL_SO_PHY_NUM_FRAMES_TO_TX = (102); /* Number of frames to transmit */
dflet 0:400d8e75a8d0 307 const uint8_t SL_SO_PHY_PREAMBLE = (103); /* Preamble for transmission */
dflet 0:400d8e75a8d0 308
dflet 0:400d8e75a8d0 309 const uint8_t SL_SO_SEC_METHOD_SSLV3 = (0); /* security metohd SSL v3*/
dflet 0:400d8e75a8d0 310 const uint8_t SL_SO_SEC_METHOD_TLSV1 = (1); /* security metohd TLS v1*/
dflet 0:400d8e75a8d0 311 const uint8_t SL_SO_SEC_METHOD_TLSV1_1 = (2); /* security metohd TLS v1_1*/
dflet 0:400d8e75a8d0 312 const uint8_t SL_SO_SEC_METHOD_TLSV1_2 = (3); /* security metohd TLS v1_2*/
dflet 0:400d8e75a8d0 313 const uint8_t SL_SO_SEC_METHOD_SSLv3_TLSV1_2 = (4); /* use highest possible version from SSLv3 - TLS 1.2*/
dflet 0:400d8e75a8d0 314 const uint8_t SL_SO_SEC_METHOD_DLSV1 = (5); /* security metohd DTL v1 */
dflet 0:400d8e75a8d0 315
dflet 0:400d8e75a8d0 316 #define SL_SEC_MASK_SSL_RSA_WITH_RC4_128_SHA (1 << 0)
dflet 0:400d8e75a8d0 317 #define SL_SEC_MASK_SSL_RSA_WITH_RC4_128_MD5 (1 << 1)
dflet 0:400d8e75a8d0 318 #define SL_SEC_MASK_TLS_RSA_WITH_AES_256_CBC_SHA (1 << 2)
dflet 0:400d8e75a8d0 319 #define SL_SEC_MASK_TLS_DHE_RSA_WITH_AES_256_CBC_SHA (1 << 3)
dflet 0:400d8e75a8d0 320 #define SL_SEC_MASK_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (1 << 4)
dflet 0:400d8e75a8d0 321 #define SL_SEC_MASK_TLS_ECDHE_RSA_WITH_RC4_128_SHA (1 << 5)
dflet 0:400d8e75a8d0 322 #define SL_SEC_MASK_TLS_RSA_WITH_AES_128_CBC_SHA256 (1 << 6)
dflet 0:400d8e75a8d0 323 #define SL_SEC_MASK_TLS_RSA_WITH_AES_256_CBC_SHA256 (1 << 7)
dflet 0:400d8e75a8d0 324 #define SL_SEC_MASK_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (1 << 8)
dflet 0:400d8e75a8d0 325 #define SL_SEC_MASK_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (1 << 9)
dflet 0:400d8e75a8d0 326
dflet 0:400d8e75a8d0 327 #define SL_SEC_MASK_SECURE_DEFAULT ((SL_SEC_MASK_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 << 1) - 1)
dflet 0:400d8e75a8d0 328
dflet 0:400d8e75a8d0 329 const uint32_t SL_MSG_DONTWAIT = (0x00000008); /* Nonblocking IO */
dflet 0:400d8e75a8d0 330
dflet 0:400d8e75a8d0 331 /* AP DHCP Server - IP Release reason code */
dflet 0:400d8e75a8d0 332 const uint8_t SL_IP_LEASE_PEER_RELEASE = (0);
dflet 0:400d8e75a8d0 333 const uint8_t SL_IP_LEASE_PEER_DECLINE = (1);
dflet 0:400d8e75a8d0 334 const uint8_t SL_IP_LEASE_EXPIRED = (2);
dflet 0:400d8e75a8d0 335
dflet 0:400d8e75a8d0 336 /* possible types when receiving SL_SOCKET_ASYNC_EVENT*/
dflet 0:400d8e75a8d0 337 const uint8_t SSL_ACCEPT = (1); /* accept failed due to ssl issue ( tcp pass) */
dflet 0:400d8e75a8d0 338 const uint8_t RX_FRAGMENTATION_TOO_BIG = (2); /* connection less mode, rx packet fragmentation > 16K, packet is being released */
dflet 0:400d8e75a8d0 339 const uint8_t OTHER_SIDE_CLOSE_SSL_DATA_NOT_ENCRYPTED = (3); /* remote side down from secure to unsecure */
dflet 0:400d8e75a8d0 340
dflet 0:400d8e75a8d0 341
dflet 0:400d8e75a8d0 342
dflet 0:400d8e75a8d0 343 #ifdef SL_INC_STD_BSD_API_NAMING
dflet 0:400d8e75a8d0 344
dflet 0:400d8e75a8d0 345 #define FD_SETSIZE SL_FD_SETSIZE
dflet 0:400d8e75a8d0 346
dflet 0:400d8e75a8d0 347 #define SOCK_STREAM SL_SOCK_STREAM
dflet 0:400d8e75a8d0 348 #define SOCK_DGRAM SL_SOCK_DGRAM
dflet 0:400d8e75a8d0 349 #define SOCK_RAW SL_SOCK_RAW
dflet 0:400d8e75a8d0 350 #define IPPROTO_TCP SL_IPPROTO_TCP
dflet 0:400d8e75a8d0 351 #define IPPROTO_UDP SL_IPPROTO_UDP
dflet 0:400d8e75a8d0 352 #define IPPROTO_RAW SL_IPPROTO_RAW
dflet 0:400d8e75a8d0 353
dflet 0:400d8e75a8d0 354 #define AF_INET6_EUI_48 SL_AF_INET6_EUI_48
dflet 0:400d8e75a8d0 355 #define AF_RF SL_AF_RF
dflet 0:400d8e75a8d0 356 #define AF_PACKET SL_AF_PACKET
dflet 0:400d8e75a8d0 357
dflet 0:400d8e75a8d0 358 #define PF_INET SL_PF_INET
dflet 0:400d8e75a8d0 359 #define PF_INET6 SL_PF_INET6
dflet 0:400d8e75a8d0 360
dflet 0:400d8e75a8d0 361 #define INADDR_ANY SL_INADDR_ANY
dflet 0:400d8e75a8d0 362 #define ERROR SL_SOC_ERROR
dflet 0:400d8e75a8d0 363 #define INEXE SL_INEXE
dflet 0:400d8e75a8d0 364 #define EBADF SL_EBADF
dflet 0:400d8e75a8d0 365 #define ENSOCK SL_ENSOCK
dflet 0:400d8e75a8d0 366 #define EAGAIN SL_EAGAIN
dflet 0:400d8e75a8d0 367 #define EWOULDBLOCK SL_EWOULDBLOCK
dflet 0:400d8e75a8d0 368 #define ENOMEM SL_ENOMEM
dflet 0:400d8e75a8d0 369 #define EACCES SL_EACCES
dflet 0:400d8e75a8d0 370 #define EFAULT SL_EFAULT
dflet 0:400d8e75a8d0 371 #define EINVAL SL_EINVAL
dflet 0:400d8e75a8d0 372 #define EDESTADDRREQ SL_EDESTADDRREQ
dflet 0:400d8e75a8d0 373 #define EPROTOTYPE SL_EPROTOTYPE
dflet 0:400d8e75a8d0 374 #define ENOPROTOOPT SL_ENOPROTOOPT
dflet 0:400d8e75a8d0 375 #define EPROTONOSUPPORT SL_EPROTONOSUPPORT
dflet 0:400d8e75a8d0 376 #define ESOCKTNOSUPPORT SL_ESOCKTNOSUPPORT
dflet 0:400d8e75a8d0 377 #define EOPNOTSUPP SL_EOPNOTSUPP
dflet 0:400d8e75a8d0 378 #define EAFNOSUPPORT SL_EAFNOSUPPORT
dflet 0:400d8e75a8d0 379 #define EADDRINUSE SL_EADDRINUSE
dflet 0:400d8e75a8d0 380 #define EADDRNOTAVAIL SL_EADDRNOTAVAIL
dflet 0:400d8e75a8d0 381 #define ENETUNREACH SL_ENETUNREACH
dflet 0:400d8e75a8d0 382 #define ENOBUFS SL_ENOBUFS
dflet 0:400d8e75a8d0 383 #define EOBUFF SL_EOBUFF
dflet 0:400d8e75a8d0 384 #define EISCONN SL_EISCONN
dflet 0:400d8e75a8d0 385 #define ENOTCONN SL_ENOTCONN
dflet 0:400d8e75a8d0 386 #define ETIMEDOUT SL_ETIMEDOUT
dflet 0:400d8e75a8d0 387 #define ECONNREFUSED SL_ECONNREFUSED
dflet 0:400d8e75a8d0 388
dflet 0:400d8e75a8d0 389 #define SOL_SOCKET SL_SOL_SOCKET
dflet 0:400d8e75a8d0 390 #define IPPROTO_IP SL_IPPROTO_IP
dflet 0:400d8e75a8d0 391 #define SO_KEEPALIVE SL_SO_KEEPALIVE
dflet 0:400d8e75a8d0 392
dflet 0:400d8e75a8d0 393 #define SO_RCVTIMEO SL_SO_RCVTIMEO
dflet 0:400d8e75a8d0 394 #define SO_NONBLOCKING SL_SO_NONBLOCKING
dflet 0:400d8e75a8d0 395
dflet 0:400d8e75a8d0 396 #define IP_MULTICAST_IF SL_IP_MULTICAST_IF
dflet 0:400d8e75a8d0 397 #define IP_MULTICAST_TTL SL_IP_MULTICAST_TTL
dflet 0:400d8e75a8d0 398 #define IP_ADD_MEMBERSHIP SL_IP_ADD_MEMBERSHIP
dflet 0:400d8e75a8d0 399 #define IP_DROP_MEMBERSHIP SL_IP_DROP_MEMBERSHIP
dflet 0:400d8e75a8d0 400
dflet 0:400d8e75a8d0 401 #define socklen_t SlSocklen_t
dflet 0:400d8e75a8d0 402 #define timeval SlTimeval_t
dflet 0:400d8e75a8d0 403 #define sockaddr SlSockAddr_t
dflet 0:400d8e75a8d0 404 #define in6_addr SlIn6Addr_t
dflet 0:400d8e75a8d0 405 #define sockaddr_in6 SlSockAddrIn6_t
dflet 0:400d8e75a8d0 406 #define in_addr SlInAddr_t
dflet 0:400d8e75a8d0 407 #define sockaddr_in SlSockAddrIn_t
dflet 0:400d8e75a8d0 408
dflet 0:400d8e75a8d0 409 #define MSG_DONTWAIT SL_MSG_DONTWAIT
dflet 0:400d8e75a8d0 410
dflet 0:400d8e75a8d0 411 #define FD_SET SL_FD_SET
dflet 0:400d8e75a8d0 412 #define FD_CLR SL_FD_CLR
dflet 0:400d8e75a8d0 413 #define FD_ISSET SL_FD_ISSET
dflet 0:400d8e75a8d0 414 #define FD_ZERO SL_FD_ZERO
dflet 0:400d8e75a8d0 415 #define fd_set SlFdSet_t
dflet 0:400d8e75a8d0 416
dflet 0:400d8e75a8d0 417 #define socket sl_Socket
dflet 0:400d8e75a8d0 418 #define close sl_Close
dflet 0:400d8e75a8d0 419 #define accept sl_Accept
dflet 0:400d8e75a8d0 420 #define bind sl_Bind
dflet 0:400d8e75a8d0 421 #define listen sl_Listen
dflet 0:400d8e75a8d0 422 #define connect sl_Connect
dflet 0:400d8e75a8d0 423 #define select sl_Select
dflet 0:400d8e75a8d0 424 #define setsockopt sl_SetSockOpt
dflet 0:400d8e75a8d0 425 #define getsockopt sl_GetSockOpt
dflet 0:400d8e75a8d0 426 #define recv sl_Recv
dflet 0:400d8e75a8d0 427 #define recvfrom sl_RecvFrom
dflet 0:400d8e75a8d0 428 #define write_ sl_Write
dflet 0:400d8e75a8d0 429 #define send sl_Send
dflet 0:400d8e75a8d0 430 #define sendto sl_SendTo
dflet 0:400d8e75a8d0 431 #define gethostbyname sl_NetAppDnsGetHostByName
dflet 0:400d8e75a8d0 432 #define htonl sl_Htonl
dflet 0:400d8e75a8d0 433 #define ntohl sl_Ntohl
dflet 0:400d8e75a8d0 434 #define htons sl_Htons
dflet 0:400d8e75a8d0 435 #define ntohs sl_Ntohs
dflet 0:400d8e75a8d0 436 #endif
dflet 0:400d8e75a8d0 437
dflet 0:400d8e75a8d0 438
dflet 0:400d8e75a8d0 439 /*****************************************************************************/
dflet 0:400d8e75a8d0 440 /* Structure/Enum declarations */
dflet 0:400d8e75a8d0 441 /*****************************************************************************/
dflet 0:400d8e75a8d0 442
dflet 0:400d8e75a8d0 443 /* Internet address */
dflet 0:400d8e75a8d0 444 typedef struct SlInAddr_t {
dflet 0:400d8e75a8d0 445 #ifndef s_addr
dflet 0:400d8e75a8d0 446 uint32_t s_addr; /* Internet address 32 bits */
dflet 0:400d8e75a8d0 447 #else
dflet 0:400d8e75a8d0 448 union S_un {
dflet 0:400d8e75a8d0 449 struct {
dflet 0:400d8e75a8d0 450 uint8_t s_b1,s_b2,s_b3,s_b4;
dflet 0:400d8e75a8d0 451 } S_un_b;
dflet 0:400d8e75a8d0 452 struct {
dflet 0:400d8e75a8d0 453 uint8_t s_w1,s_w2;
dflet 0:400d8e75a8d0 454 } S_un_w;
dflet 0:400d8e75a8d0 455 uint32_t S_addr;
dflet 0:400d8e75a8d0 456 } S_un;
dflet 0:400d8e75a8d0 457 #endif
dflet 0:400d8e75a8d0 458 } SlInAddr_t;
dflet 0:400d8e75a8d0 459
dflet 0:400d8e75a8d0 460
dflet 0:400d8e75a8d0 461 /* sockopt */
dflet 0:400d8e75a8d0 462 typedef struct {
dflet 0:400d8e75a8d0 463 uint32_t KeepaliveEnabled; /* 0 = disabled;1 = enabled; default = 1*/
dflet 0:400d8e75a8d0 464 } SlSockKeepalive_t;
dflet 0:400d8e75a8d0 465
dflet 0:400d8e75a8d0 466 typedef struct {
dflet 0:400d8e75a8d0 467 uint32_t ReuseaddrEnabled; /* 0 = disabled; 1 = enabled; default = 1*/
dflet 0:400d8e75a8d0 468 } SlSockReuseaddr_t;
dflet 0:400d8e75a8d0 469
dflet 0:400d8e75a8d0 470 typedef struct {
dflet 0:400d8e75a8d0 471 uint32_t Winsize; /* receive window size for tcp sockets */
dflet 0:400d8e75a8d0 472 } SlSockWinsize_t;
dflet 0:400d8e75a8d0 473
dflet 0:400d8e75a8d0 474 typedef struct {
dflet 0:400d8e75a8d0 475 uint32_t NonblockingEnabled;/* 0 = disabled;1 = enabled;default = 1*/
dflet 0:400d8e75a8d0 476 } SlSockNonblocking_t;
dflet 0:400d8e75a8d0 477
dflet 0:400d8e75a8d0 478 typedef struct {
dflet 0:400d8e75a8d0 479 uint8_t sd;
dflet 0:400d8e75a8d0 480 uint8_t type;
dflet 0:400d8e75a8d0 481 uint16_t val;
dflet 0:400d8e75a8d0 482 uint8_t* pExtraInfo;
dflet 0:400d8e75a8d0 483 } SlSocketAsyncEvent_t;
dflet 0:400d8e75a8d0 484
dflet 0:400d8e75a8d0 485 typedef struct {
dflet 0:400d8e75a8d0 486 int16_t status;
dflet 0:400d8e75a8d0 487 uint8_t sd;
dflet 0:400d8e75a8d0 488 uint8_t padding;
dflet 0:400d8e75a8d0 489 } SlSockTxFailEventData_t;
dflet 0:400d8e75a8d0 490
dflet 0:400d8e75a8d0 491
dflet 0:400d8e75a8d0 492 typedef union
dflet 0:400d8e75a8d0 493 {
dflet 0:400d8e75a8d0 494 SlSockTxFailEventData_t SockTxFailData;
dflet 0:400d8e75a8d0 495 SlSocketAsyncEvent_t SockAsyncData;
dflet 0:400d8e75a8d0 496 } SlSockEventData_u;
dflet 0:400d8e75a8d0 497
dflet 0:400d8e75a8d0 498
dflet 0:400d8e75a8d0 499 typedef struct {
dflet 0:400d8e75a8d0 500 uint32_t Event;
dflet 0:400d8e75a8d0 501 SlSockEventData_u socketAsyncEvent;
dflet 0:400d8e75a8d0 502 } SlSockEvent_t;
dflet 0:400d8e75a8d0 503
dflet 0:400d8e75a8d0 504
dflet 0:400d8e75a8d0 505 typedef struct {
dflet 0:400d8e75a8d0 506 uint32_t secureMask;
dflet 0:400d8e75a8d0 507 } SlSockSecureMask;
dflet 0:400d8e75a8d0 508
dflet 0:400d8e75a8d0 509 typedef struct {
dflet 0:400d8e75a8d0 510 uint8_t secureMethod;
dflet 0:400d8e75a8d0 511 } SlSockSecureMethod;
dflet 0:400d8e75a8d0 512
dflet 0:400d8e75a8d0 513 typedef enum {
dflet 0:400d8e75a8d0 514 SL_BSD_SECURED_PRIVATE_KEY_IDX = 0,
dflet 0:400d8e75a8d0 515 SL_BSD_SECURED_CERTIFICATE_IDX,
dflet 0:400d8e75a8d0 516 SL_BSD_SECURED_CA_IDX,
dflet 0:400d8e75a8d0 517 SL_BSD_SECURED_DH_IDX
dflet 0:400d8e75a8d0 518 } slBsd_secureSocketFilesIndex_e;
dflet 0:400d8e75a8d0 519
dflet 0:400d8e75a8d0 520 typedef struct {
dflet 0:400d8e75a8d0 521 SlInAddr_t imr_multiaddr; /* The IPv4 multicast address to join */
dflet 0:400d8e75a8d0 522 SlInAddr_t imr_interface; /* The interface to use for this group */
dflet 0:400d8e75a8d0 523 } SlSockIpMreq;
dflet 0:400d8e75a8d0 524
dflet 0:400d8e75a8d0 525
dflet 0:400d8e75a8d0 526 /* sockopt */
dflet 0:400d8e75a8d0 527 typedef uint32_t SlTime_t;
dflet 0:400d8e75a8d0 528 typedef uint32_t SlSuseconds_t;
dflet 0:400d8e75a8d0 529
dflet 0:400d8e75a8d0 530 typedef struct {
dflet 0:400d8e75a8d0 531 SlTime_t tv_sec; /* Seconds */
dflet 0:400d8e75a8d0 532 SlSuseconds_t tv_usec; /* Microseconds */
dflet 0:400d8e75a8d0 533 } SlTimeval_t;
dflet 0:400d8e75a8d0 534
dflet 0:400d8e75a8d0 535 typedef uint16_t SlSocklen_t;
dflet 0:400d8e75a8d0 536
dflet 0:400d8e75a8d0 537 /* IpV4 socket address */
dflet 0:400d8e75a8d0 538 typedef struct {
dflet 0:400d8e75a8d0 539 uint16_t sa_family; /* Address family (e.g. , AF_INET) */
dflet 0:400d8e75a8d0 540 uint8_t sa_data[14]; /* Protocol- specific address information*/
dflet 0:400d8e75a8d0 541 } SlSockAddr_t;
dflet 0:400d8e75a8d0 542
dflet 0:400d8e75a8d0 543
dflet 0:400d8e75a8d0 544 /* IpV6 or Ipv6 EUI64 */
dflet 0:400d8e75a8d0 545 typedef struct {
dflet 0:400d8e75a8d0 546 union {
dflet 0:400d8e75a8d0 547 uint8_t _S6_u8[16];
dflet 0:400d8e75a8d0 548 uint32_t _S6_u32[4];
dflet 0:400d8e75a8d0 549 } _S6_un;
dflet 0:400d8e75a8d0 550 } SlIn6Addr_t;
dflet 0:400d8e75a8d0 551
dflet 0:400d8e75a8d0 552 typedef struct {
dflet 0:400d8e75a8d0 553 uint16_t sin6_family; /* AF_INET6 || AF_INET6_EUI_48*/
dflet 0:400d8e75a8d0 554 uint16_t sin6_port; /* Transport layer port. */
dflet 0:400d8e75a8d0 555 uint32_t sin6_flowinfo; /* IPv6 flow information. */
dflet 0:400d8e75a8d0 556 SlIn6Addr_t sin6_addr; /* IPv6 address. */
dflet 0:400d8e75a8d0 557 uint32_t sin6_scope_id; /* set of interfaces for a scope. */
dflet 0:400d8e75a8d0 558 } SlSockAddrIn6_t;
dflet 0:400d8e75a8d0 559
dflet 0:400d8e75a8d0 560 /* Socket address, Internet style. */
dflet 0:400d8e75a8d0 561
dflet 0:400d8e75a8d0 562 typedef struct {
dflet 0:400d8e75a8d0 563 uint16_t sin_family; /* Internet Protocol (AF_INET). */
dflet 0:400d8e75a8d0 564 uint16_t sin_port; /* Address port (16 bits). */
dflet 0:400d8e75a8d0 565 SlInAddr_t sin_addr; /* Internet address (32 bits). */
dflet 0:400d8e75a8d0 566 int8_t sin_zero[8]; /* Not used. */
dflet 0:400d8e75a8d0 567 } SlSockAddrIn_t;
dflet 0:400d8e75a8d0 568
dflet 0:400d8e75a8d0 569 typedef struct {
dflet 0:400d8e75a8d0 570 uint32_t ip;
dflet 0:400d8e75a8d0 571 uint32_t gateway;
dflet 0:400d8e75a8d0 572 uint32_t dns;
dflet 0:400d8e75a8d0 573 } SlIpV4AcquiredAsync_t;
dflet 0:400d8e75a8d0 574
dflet 0:400d8e75a8d0 575 typedef struct {
dflet 0:400d8e75a8d0 576 uint32_t type;
dflet 0:400d8e75a8d0 577 uint32_t ip[4];
dflet 0:400d8e75a8d0 578 uint32_t gateway[4];
dflet 0:400d8e75a8d0 579 uint32_t dns[4];
dflet 0:400d8e75a8d0 580 } SlIpV6AcquiredAsync_t;
dflet 0:400d8e75a8d0 581
dflet 0:400d8e75a8d0 582 typedef struct {
dflet 0:400d8e75a8d0 583 uint32_t ip_address;
dflet 0:400d8e75a8d0 584 uint32_t lease_time;
dflet 0:400d8e75a8d0 585 uint8_t mac[6];
dflet 0:400d8e75a8d0 586 uint16_t padding;
dflet 0:400d8e75a8d0 587 } SlIpLeasedAsync_t;
dflet 0:400d8e75a8d0 588
dflet 0:400d8e75a8d0 589 typedef struct {
dflet 0:400d8e75a8d0 590 uint32_t ip_address;
dflet 0:400d8e75a8d0 591 uint8_t mac[6];
dflet 0:400d8e75a8d0 592 uint16_t reason;
dflet 0:400d8e75a8d0 593 } SlIpReleasedAsync_t;
dflet 0:400d8e75a8d0 594
dflet 0:400d8e75a8d0 595
dflet 0:400d8e75a8d0 596 typedef union {
dflet 0:400d8e75a8d0 597 SlIpV4AcquiredAsync_t ipAcquiredV4; /*SL_NETAPP_IPV4_IPACQUIRED_EVENT*/
dflet 0:400d8e75a8d0 598 SlIpV6AcquiredAsync_t ipAcquiredV6; /*SL_NETAPP_IPV6_IPACQUIRED_EVENT*/
dflet 0:400d8e75a8d0 599 uint32_t sd; /*SL_SOCKET_TX_FAILED_EVENT*/
dflet 0:400d8e75a8d0 600 SlIpLeasedAsync_t ipLeased; /* SL_NETAPP_IP_LEASED_EVENT */
dflet 0:400d8e75a8d0 601 SlIpReleasedAsync_t ipReleased; /* SL_NETAPP_IP_RELEASED_EVENT */
dflet 0:400d8e75a8d0 602 } SlNetAppEventData_u;
dflet 0:400d8e75a8d0 603
dflet 0:400d8e75a8d0 604 typedef struct {
dflet 0:400d8e75a8d0 605 uint32_t Event;
dflet 0:400d8e75a8d0 606 SlNetAppEventData_u EventData;
dflet 0:400d8e75a8d0 607 } SlNetAppEvent_t;
dflet 0:400d8e75a8d0 608
dflet 0:400d8e75a8d0 609
dflet 0:400d8e75a8d0 610 typedef struct sock_secureFiles {
dflet 0:400d8e75a8d0 611 uint8_t secureFiles[4];
dflet 0:400d8e75a8d0 612 } SlSockSecureFiles_t;
dflet 0:400d8e75a8d0 613
dflet 0:400d8e75a8d0 614
dflet 0:400d8e75a8d0 615 typedef struct SlFdSet_t { /* The select socket array manager */
dflet 0:400d8e75a8d0 616 uint32_t fd_array[(SL_FD_SETSIZE + 31)/32]; /* Bit map of SOCKET Descriptors */
dflet 0:400d8e75a8d0 617 } SlFdSet_t;
dflet 0:400d8e75a8d0 618
dflet 0:400d8e75a8d0 619 typedef struct {
dflet 0:400d8e75a8d0 620 uint8_t rate; /* Recevied Rate */
dflet 0:400d8e75a8d0 621 uint8_t channel; /* The received channel*/
dflet 0:400d8e75a8d0 622 int8_t rssi; /* The computed RSSI value in db of current frame */
dflet 0:400d8e75a8d0 623 uint8_t padding; /* pad to align to 32 bits */
dflet 0:400d8e75a8d0 624 uint32_t timestamp; /* Timestamp in microseconds, */
dflet 0:400d8e75a8d0 625 } SlTransceiverRxOverHead_t;
dflet 0:400d8e75a8d0 626
dflet 0:400d8e75a8d0 627 class cc3100_nonos;
dflet 0:400d8e75a8d0 628
dflet 0:400d8e75a8d0 629 class cc3100_socket
dflet 0:400d8e75a8d0 630 {
dflet 0:400d8e75a8d0 631
dflet 0:400d8e75a8d0 632 public:
dflet 0:400d8e75a8d0 633
dflet 0:400d8e75a8d0 634 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:400d8e75a8d0 635 cc3100_socket(cc3100_driver &driver, cc3100_nonos &nonos);
dflet 0:400d8e75a8d0 636 #else
dflet 0:400d8e75a8d0 637 cc3100_socket(cc3100_driver &driver);
dflet 0:400d8e75a8d0 638 #endif
dflet 0:400d8e75a8d0 639 ~cc3100_socket();
dflet 0:400d8e75a8d0 640
dflet 0:400d8e75a8d0 641 /*******************************************************************************/
dflet 0:400d8e75a8d0 642 /* Functions prototypes */
dflet 0:400d8e75a8d0 643 /*******************************************************************************/
dflet 0:400d8e75a8d0 644 void _sl_BuildAddress(const SlSockAddr_t *addr, _SocketAddrCommand_u *pCmd);
dflet 0:400d8e75a8d0 645 void _sl_ParseAddress(_SocketAddrResponse_u *pRsp, SlSockAddr_t *addr, SlSocklen_t *addrlen);
dflet 0:400d8e75a8d0 646 uint16_t _sl_TruncatePayloadByProtocol(const int16_t pSd,const uint16_t length);
dflet 0:400d8e75a8d0 647
dflet 0:400d8e75a8d0 648 /*****************************************************************************/
dflet 0:400d8e75a8d0 649 /* Function prototypes */
dflet 0:400d8e75a8d0 650 /*****************************************************************************/
dflet 0:400d8e75a8d0 651
dflet 0:400d8e75a8d0 652 /*!
dflet 0:400d8e75a8d0 653
dflet 0:400d8e75a8d0 654 \brief create an endpoint for communication
dflet 0:400d8e75a8d0 655
dflet 0:400d8e75a8d0 656 The socket function creates a new socket of a certain socket type, identified
dflet 0:400d8e75a8d0 657 by an integer number, and allocates system resources to it.
dflet 0:400d8e75a8d0 658 This function is called by the application layer to obtain a socket handle.
dflet 0:400d8e75a8d0 659
dflet 0:400d8e75a8d0 660 \param[in] domain specifies the protocol family of the created socket.
dflet 0:400d8e75a8d0 661 For example:
dflet 0:400d8e75a8d0 662 AF_INET for network protocol IPv4
dflet 0:400d8e75a8d0 663 AF_RF for starting transceiver mode. Notes:
dflet 0:400d8e75a8d0 664 - sending and receiving any packet overriding 802.11 header
dflet 0:400d8e75a8d0 665 - for optimized power consumption the socket will be started in TX
dflet 0:400d8e75a8d0 666 only mode until receive command is activated
dflet 0:400d8e75a8d0 667 AF_INET6 for IPv6
dflet 0:400d8e75a8d0 668
dflet 0:400d8e75a8d0 669
dflet 0:400d8e75a8d0 670 \param[in] type specifies the communication semantic, one of:
dflet 0:400d8e75a8d0 671 SOCK_STREAM (reliable stream-oriented service or Stream Sockets)
dflet 0:400d8e75a8d0 672 SOCK_DGRAM (datagram service or Datagram Sockets)
dflet 0:400d8e75a8d0 673 SOCK_RAW (raw protocols atop the network layer)
dflet 0:400d8e75a8d0 674 when used with AF_RF:
dflet 0:400d8e75a8d0 675 SOCK_DGRAM - L2 socket
dflet 0:400d8e75a8d0 676 SOCK_RAW - L1 socket - bypass WLAN CCA (Clear Channel Assessment)
dflet 0:400d8e75a8d0 677
dflet 0:400d8e75a8d0 678 \param[in] protocol specifies a particular transport to be used with
dflet 0:400d8e75a8d0 679 the socket.
dflet 0:400d8e75a8d0 680 The most common are IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP,
dflet 0:400d8e75a8d0 681 IPPROTO_DCCP.
dflet 0:400d8e75a8d0 682 The value 0 may be used to select a default
dflet 0:400d8e75a8d0 683 protocol from the selected domain and type
dflet 0:400d8e75a8d0 684
dflet 0:400d8e75a8d0 685
dflet 0:400d8e75a8d0 686 \return On success, socket handle that is used for consequent socket operations.
dflet 0:400d8e75a8d0 687 A successful return code should be a positive number (int16)
dflet 0:400d8e75a8d0 688 On error, a negative (int16) value will be returned specifying the error code.
dflet 0:400d8e75a8d0 689 SL_EAFNOSUPPORT - illegal domain parameter
dflet 0:400d8e75a8d0 690 SL_EPROTOTYPE - illegal type parameter
dflet 0:400d8e75a8d0 691 SL_EACCES - permission denied
dflet 0:400d8e75a8d0 692 SL_ENSOCK - exceeded maximal number of socket
dflet 0:400d8e75a8d0 693 SL_ENOMEM - memory allocation error
dflet 0:400d8e75a8d0 694 SL_EINVAL - error in socket configuration
dflet 0:400d8e75a8d0 695 SL_EPROTONOSUPPORT - illegal protocol parameter
dflet 0:400d8e75a8d0 696 SL_EOPNOTSUPP - illegal combination of protocol and type parameters
dflet 0:400d8e75a8d0 697
dflet 0:400d8e75a8d0 698
dflet 0:400d8e75a8d0 699 \sa sl_Close
dflet 0:400d8e75a8d0 700 \note belongs to \ref basic_api
dflet 0:400d8e75a8d0 701 \warning
dflet 0:400d8e75a8d0 702 */
dflet 0:400d8e75a8d0 703 #if _SL_INCLUDE_FUNC(sl_Socket)
dflet 0:400d8e75a8d0 704 int16_t sl_Socket(int16_t Domain, int16_t Type, int16_t Protocol);
dflet 0:400d8e75a8d0 705 #endif
dflet 0:400d8e75a8d0 706
dflet 0:400d8e75a8d0 707 /*!
dflet 0:400d8e75a8d0 708 \brief gracefully close socket
dflet 0:400d8e75a8d0 709
dflet 0:400d8e75a8d0 710 This function causes the system to release resources allocated to a socket. \n
dflet 0:400d8e75a8d0 711 In case of TCP, the connection is terminated.
dflet 0:400d8e75a8d0 712
dflet 0:400d8e75a8d0 713 \param[in] sd socket handle (received in sl_Socket)
dflet 0:400d8e75a8d0 714
dflet 0:400d8e75a8d0 715 \return On success, zero is returned.
dflet 0:400d8e75a8d0 716 On error, a negative number is returned.
dflet 0:400d8e75a8d0 717
dflet 0:400d8e75a8d0 718 \sa sl_Socket
dflet 0:400d8e75a8d0 719 \note belongs to \ref ext_api
dflet 0:400d8e75a8d0 720 \warning
dflet 0:400d8e75a8d0 721 */
dflet 0:400d8e75a8d0 722 #if _SL_INCLUDE_FUNC(sl_Close)
dflet 0:400d8e75a8d0 723 int16_t sl_Close(int16_t sd);
dflet 0:400d8e75a8d0 724 #endif
dflet 0:400d8e75a8d0 725
dflet 0:400d8e75a8d0 726 /*!
dflet 0:400d8e75a8d0 727 \brief Accept a connection on a socket
dflet 0:400d8e75a8d0 728
dflet 0:400d8e75a8d0 729 This function is used with connection-based socket types (SOCK_STREAM).
dflet 0:400d8e75a8d0 730 It extracts the first connection request on the queue of pending
dflet 0:400d8e75a8d0 731 connections, creates a new connected socket, and returns a new file
dflet 0:400d8e75a8d0 732 descriptor referring to that socket.
dflet 0:400d8e75a8d0 733 The newly created socket is not in the listening state. The
dflet 0:400d8e75a8d0 734 original socket sd is unaffected by this call.
dflet 0:400d8e75a8d0 735 The argument sd is a socket that has been created with
dflet 0:400d8e75a8d0 736 sl_Socket(), bound to a local address with sl_Bind(), and is
dflet 0:400d8e75a8d0 737 listening for connections after a sl_Listen(). The argument \b
dflet 0:400d8e75a8d0 738 \e addr is a pointer to a sockaddr structure. This structure
dflet 0:400d8e75a8d0 739 is filled in with the address of the peer socket, as known to
dflet 0:400d8e75a8d0 740 the communications layer. The exact format of the address
dflet 0:400d8e75a8d0 741 returned addr is determined by the socket's address family.
dflet 0:400d8e75a8d0 742 The \b \e addrlen argument is a value-result argument: it
dflet 0:400d8e75a8d0 743 should initially contain the size of the structure pointed to
dflet 0:400d8e75a8d0 744 by addr, on return it will contain the actual length (in
dflet 0:400d8e75a8d0 745 bytes) of the address returned.
dflet 0:400d8e75a8d0 746
dflet 0:400d8e75a8d0 747 \param[in] sd socket descriptor (handle)
dflet 0:400d8e75a8d0 748 \param[out] addr the argument addr is a pointer
dflet 0:400d8e75a8d0 749 to a sockaddr structure. This
dflet 0:400d8e75a8d0 750 structure is filled in with the
dflet 0:400d8e75a8d0 751 address of the peer socket, as
dflet 0:400d8e75a8d0 752 known to the communications
dflet 0:400d8e75a8d0 753 layer. The exact format of the
dflet 0:400d8e75a8d0 754 address returned addr is
dflet 0:400d8e75a8d0 755 determined by the socket's
dflet 0:400d8e75a8d0 756 address\n
dflet 0:400d8e75a8d0 757 sockaddr:\n - code for the
dflet 0:400d8e75a8d0 758 address format. On this version
dflet 0:400d8e75a8d0 759 only AF_INET is supported.\n -
dflet 0:400d8e75a8d0 760 socket address, the length
dflet 0:400d8e75a8d0 761 depends on the code format
dflet 0:400d8e75a8d0 762 \param[out] addrlen the addrlen argument is a value-result
dflet 0:400d8e75a8d0 763 argument: it should initially contain the
dflet 0:400d8e75a8d0 764 size of the structure pointed to by addr
dflet 0:400d8e75a8d0 765
dflet 0:400d8e75a8d0 766 \return On success, a socket handle.
dflet 0:400d8e75a8d0 767 On a non-blocking accept a possible negative value is SL_EAGAIN.
dflet 0:400d8e75a8d0 768 On failure, negative value.
dflet 0:400d8e75a8d0 769 SL_POOL_IS_EMPTY may be return in case there are no resources in the system
dflet 0:400d8e75a8d0 770 In this case try again later or increase MAX_CONCURRENT_ACTIONS
dflet 0:400d8e75a8d0 771
dflet 0:400d8e75a8d0 772 \sa sl_Socket sl_Bind sl_Listen
dflet 0:400d8e75a8d0 773 \note belongs to \ref server_side
dflet 0:400d8e75a8d0 774 \warning
dflet 0:400d8e75a8d0 775 */
dflet 0:400d8e75a8d0 776 #if _SL_INCLUDE_FUNC(sl_Accept)
dflet 0:400d8e75a8d0 777 int16_t sl_Accept(int16_t sd, SlSockAddr_t *addr, SlSocklen_t *addrlen);
dflet 0:400d8e75a8d0 778 #endif
dflet 0:400d8e75a8d0 779
dflet 0:400d8e75a8d0 780 /*!
dflet 0:400d8e75a8d0 781 \brief assign a name to a socket
dflet 0:400d8e75a8d0 782
dflet 0:400d8e75a8d0 783 This function gives the socket the local address addr.
dflet 0:400d8e75a8d0 784 addr is addrlen bytes long. Traditionally, this is called
dflet 0:400d8e75a8d0 785 When a socket is created with socket, it exists in a name
dflet 0:400d8e75a8d0 786 space (address family) but has no name assigned.
dflet 0:400d8e75a8d0 787 It is necessary to assign a local address before a SOCK_STREAM
dflet 0:400d8e75a8d0 788 socket may receive connections.
dflet 0:400d8e75a8d0 789
dflet 0:400d8e75a8d0 790 \param[in] sd socket descriptor (handle)
dflet 0:400d8e75a8d0 791 \param[in] addr specifies the destination
dflet 0:400d8e75a8d0 792 addrs\n sockaddr:\n - code for
dflet 0:400d8e75a8d0 793 the address format. On this
dflet 0:400d8e75a8d0 794 version only AF_INET is
dflet 0:400d8e75a8d0 795 supported.\n - socket address,
dflet 0:400d8e75a8d0 796 the length depends on the code
dflet 0:400d8e75a8d0 797 format
dflet 0:400d8e75a8d0 798 \param[in] addrlen contains the size of the structure pointed to by addr
dflet 0:400d8e75a8d0 799
dflet 0:400d8e75a8d0 800 \return On success, zero is returned. On error, a negative error code is returned.
dflet 0:400d8e75a8d0 801
dflet 0:400d8e75a8d0 802 \sa sl_Socket sl_Accept sl_Listen
dflet 0:400d8e75a8d0 803 \note belongs to \ref basic_api
dflet 0:400d8e75a8d0 804 \warning
dflet 0:400d8e75a8d0 805 */
dflet 0:400d8e75a8d0 806 #if _SL_INCLUDE_FUNC(sl_Bind)
dflet 0:400d8e75a8d0 807 int16_t sl_Bind(int16_t sd, const SlSockAddr_t *addr, int16_t addrlen);
dflet 0:400d8e75a8d0 808 #endif
dflet 0:400d8e75a8d0 809
dflet 0:400d8e75a8d0 810 /*!
dflet 0:400d8e75a8d0 811 \brief listen for connections on a socket
dflet 0:400d8e75a8d0 812
dflet 0:400d8e75a8d0 813 The willingness to accept incoming connections and a queue
dflet 0:400d8e75a8d0 814 limit for incoming connections are specified with listen(),
dflet 0:400d8e75a8d0 815 and then the connections are accepted with accept.
dflet 0:400d8e75a8d0 816 The listen() call applies only to sockets of type SOCK_STREAM
dflet 0:400d8e75a8d0 817 The backlog parameter defines the maximum length the queue of
dflet 0:400d8e75a8d0 818 pending connections may grow to.
dflet 0:400d8e75a8d0 819
dflet 0:400d8e75a8d0 820 \param[in] sd socket descriptor (handle)
dflet 0:400d8e75a8d0 821 \param[in] backlog specifies the listen queue depth.
dflet 0:400d8e75a8d0 822
dflet 0:400d8e75a8d0 823
dflet 0:400d8e75a8d0 824 \return On success, zero is returned. On error, a negative error code is returned.
dflet 0:400d8e75a8d0 825
dflet 0:400d8e75a8d0 826 \sa sl_Socket sl_Accept sl_Bind
dflet 0:400d8e75a8d0 827 \note belongs to \ref server_side
dflet 0:400d8e75a8d0 828 \warning
dflet 0:400d8e75a8d0 829 */
dflet 0:400d8e75a8d0 830 #if _SL_INCLUDE_FUNC(sl_Listen)
dflet 0:400d8e75a8d0 831 int16_t sl_Listen(int16_t sd, int16_t backlog);
dflet 0:400d8e75a8d0 832 #endif
dflet 0:400d8e75a8d0 833
dflet 0:400d8e75a8d0 834 /*!
dflet 0:400d8e75a8d0 835 \brief Initiate a connection on a socket
dflet 0:400d8e75a8d0 836
dflet 0:400d8e75a8d0 837 Function connects the socket referred to by the socket
dflet 0:400d8e75a8d0 838 descriptor sd, to the address specified by addr. The addrlen
dflet 0:400d8e75a8d0 839 argument specifies the size of addr. The format of the
dflet 0:400d8e75a8d0 840 address in addr is determined by the address space of the
dflet 0:400d8e75a8d0 841 socket. If it is of type SOCK_DGRAM, this call specifies the
dflet 0:400d8e75a8d0 842 peer with which the socket is to be associated; this address
dflet 0:400d8e75a8d0 843 is that to which datagrams are to be sent, and the only
dflet 0:400d8e75a8d0 844 address from which datagrams are to be received. If the
dflet 0:400d8e75a8d0 845 socket is of type SOCK_STREAM, this call attempts to make a
dflet 0:400d8e75a8d0 846 connection to another socket. The other socket is specified
dflet 0:400d8e75a8d0 847 by address, which is an address in the communications space
dflet 0:400d8e75a8d0 848 of the socket.
dflet 0:400d8e75a8d0 849
dflet 0:400d8e75a8d0 850
dflet 0:400d8e75a8d0 851 \param[in] sd socket descriptor (handle)
dflet 0:400d8e75a8d0 852 \param[in] addr specifies the destination addr\n
dflet 0:400d8e75a8d0 853 sockaddr:\n - code for the
dflet 0:400d8e75a8d0 854 address format. On this version
dflet 0:400d8e75a8d0 855 only AF_INET is supported.\n -
dflet 0:400d8e75a8d0 856 socket address, the length
dflet 0:400d8e75a8d0 857 depends on the code format
dflet 0:400d8e75a8d0 858
dflet 0:400d8e75a8d0 859 \param[in] addrlen contains the size of the structure pointed
dflet 0:400d8e75a8d0 860 to by addr
dflet 0:400d8e75a8d0 861
dflet 0:400d8e75a8d0 862 \return On success, a socket handle.
dflet 0:400d8e75a8d0 863 On a non-blocking connect a possible negative value is SL_EALREADY.
dflet 0:400d8e75a8d0 864 On failure, negative value.
dflet 0:400d8e75a8d0 865 SL_POOL_IS_EMPTY may be return in case there are no resources in the system
dflet 0:400d8e75a8d0 866 In this case try again later or increase MAX_CONCURRENT_ACTIONS
dflet 0:400d8e75a8d0 867
dflet 0:400d8e75a8d0 868 \sa sl_Socket
dflet 0:400d8e75a8d0 869 \note belongs to \ref client_side
dflet 0:400d8e75a8d0 870 \warning
dflet 0:400d8e75a8d0 871 */
dflet 0:400d8e75a8d0 872 #if _SL_INCLUDE_FUNC(sl_Connect)
dflet 0:400d8e75a8d0 873 int16_t sl_Connect(int16_t sd, const SlSockAddr_t *addr, int16_t addrlen);
dflet 0:400d8e75a8d0 874 #endif
dflet 0:400d8e75a8d0 875
dflet 0:400d8e75a8d0 876 /*!
dflet 0:400d8e75a8d0 877 \brief Monitor socket activity
dflet 0:400d8e75a8d0 878
dflet 0:400d8e75a8d0 879 Select allow a program to monitor multiple file descriptors,
dflet 0:400d8e75a8d0 880 waiting until one or more of the file descriptors become
dflet 0:400d8e75a8d0 881 "ready" for some class of I/O operation
dflet 0:400d8e75a8d0 882
dflet 0:400d8e75a8d0 883
dflet 0:400d8e75a8d0 884 \param[in] nfds the highest-numbered file descriptor in any of the
dflet 0:400d8e75a8d0 885 three sets, plus 1.
dflet 0:400d8e75a8d0 886 \param[out] readsds socket descriptors list for read monitoring and accept monitoring
dflet 0:400d8e75a8d0 887 \param[out] writesds socket descriptors list for connect monitoring only, write monitoring is not supported, non blocking connect is supported
dflet 0:400d8e75a8d0 888 \param[out] exceptsds socket descriptors list for exception monitoring, not supported.
dflet 0:400d8e75a8d0 889 \param[in] timeout is an upper bound on the amount of time elapsed
dflet 0:400d8e75a8d0 890 before select() returns. Null or above 0xffff seconds means
dflet 0:400d8e75a8d0 891 infinity timeout. The minimum timeout is 10 milliseconds,
dflet 0:400d8e75a8d0 892 less than 10 milliseconds will be set automatically to 10 milliseconds.
dflet 0:400d8e75a8d0 893 Max microseconds supported is 0xfffc00.
dflet 0:400d8e75a8d0 894
dflet 0:400d8e75a8d0 895 \return On success, select() returns the number of
dflet 0:400d8e75a8d0 896 file descriptors contained in the three returned
dflet 0:400d8e75a8d0 897 descriptor sets (that is, the total number of bits that
dflet 0:400d8e75a8d0 898 are set in readfds, writefds, exceptfds) which may be
dflet 0:400d8e75a8d0 899 zero if the timeout expires before anything interesting
dflet 0:400d8e75a8d0 900 happens. On error, a negative value is returned.
dflet 0:400d8e75a8d0 901 readsds - return the sockets on which Read request will
dflet 0:400d8e75a8d0 902 return without delay with valid data.
dflet 0:400d8e75a8d0 903 writesds - return the sockets on which Write request
dflet 0:400d8e75a8d0 904 will return without delay.
dflet 0:400d8e75a8d0 905 exceptsds - return the sockets closed recently.
dflet 0:400d8e75a8d0 906 SL_POOL_IS_EMPTY may be return in case there are no resources in the system
dflet 0:400d8e75a8d0 907 In this case try again later or increase MAX_CONCURRENT_ACTIONS
dflet 0:400d8e75a8d0 908
dflet 0:400d8e75a8d0 909 \sa sl_Socket
dflet 0:400d8e75a8d0 910 \note If the timeout value set to less than 5ms it will automatically set
dflet 0:400d8e75a8d0 911 to 5ms to prevent overload of the system
dflet 0:400d8e75a8d0 912 belongs to \ref basic_api
dflet 0:400d8e75a8d0 913
dflet 0:400d8e75a8d0 914 Only one sl_Select can be handled at a time.
dflet 0:400d8e75a8d0 915 Calling this API while the same command is called from another thread, may result
dflet 0:400d8e75a8d0 916 in one of the two scenarios:
dflet 0:400d8e75a8d0 917 1. The command will wait (internal) until the previous command finish, and then be executed.
dflet 0:400d8e75a8d0 918 2. There are not enough resources and SL_POOL_IS_EMPTY error will return.
dflet 0:400d8e75a8d0 919 In this case, MAX_CONCURRENT_ACTIONS can be increased (result in memory increase) or try
dflet 0:400d8e75a8d0 920 again later to issue the command.
dflet 0:400d8e75a8d0 921
dflet 0:400d8e75a8d0 922 \warning
dflet 0:400d8e75a8d0 923 */
dflet 0:400d8e75a8d0 924 #if _SL_INCLUDE_FUNC(sl_Select)
dflet 0:400d8e75a8d0 925 int16_t sl_Select(int16_t nfds, SlFdSet_t *readsds, SlFdSet_t *writesds, SlFdSet_t *exceptsds, SlTimeval_t *timeout);
dflet 0:400d8e75a8d0 926
dflet 0:400d8e75a8d0 927
dflet 0:400d8e75a8d0 928 /*!
dflet 0:400d8e75a8d0 929 \brief Select's SlFdSet_t SET function
dflet 0:400d8e75a8d0 930
dflet 0:400d8e75a8d0 931 Sets current socket descriptor on SlFdSet_t container
dflet 0:400d8e75a8d0 932 */
dflet 0:400d8e75a8d0 933 void SL_FD_SET(int16_t fd, SlFdSet_t *fdset);
dflet 0:400d8e75a8d0 934
dflet 0:400d8e75a8d0 935 /*!
dflet 0:400d8e75a8d0 936 \brief Select's SlFdSet_t CLR function
dflet 0:400d8e75a8d0 937
dflet 0:400d8e75a8d0 938 Clears current socket descriptor on SlFdSet_t container
dflet 0:400d8e75a8d0 939 */
dflet 0:400d8e75a8d0 940 void SL_FD_CLR(int16_t fd, SlFdSet_t *fdset);
dflet 0:400d8e75a8d0 941
dflet 0:400d8e75a8d0 942
dflet 0:400d8e75a8d0 943 /*!
dflet 0:400d8e75a8d0 944 \brief Select's SlFdSet_t ISSET function
dflet 0:400d8e75a8d0 945
dflet 0:400d8e75a8d0 946 Checks if current socket descriptor is set (TRUE/FALSE)
dflet 0:400d8e75a8d0 947
dflet 0:400d8e75a8d0 948 \return Returns TRUE if set, FALSE if unset
dflet 0:400d8e75a8d0 949
dflet 0:400d8e75a8d0 950 */
dflet 0:400d8e75a8d0 951 int16_t SL_FD_ISSET(int16_t fd, SlFdSet_t *fdset);
dflet 0:400d8e75a8d0 952
dflet 0:400d8e75a8d0 953 /*!
dflet 0:400d8e75a8d0 954 \brief Select's SlFdSet_t ZERO function
dflet 0:400d8e75a8d0 955
dflet 0:400d8e75a8d0 956 Clears all socket descriptors from SlFdSet_t
dflet 0:400d8e75a8d0 957 */
dflet 0:400d8e75a8d0 958 void SL_FD_ZERO(SlFdSet_t *fdset);
dflet 0:400d8e75a8d0 959
dflet 0:400d8e75a8d0 960
dflet 0:400d8e75a8d0 961
dflet 0:400d8e75a8d0 962 #endif
dflet 0:400d8e75a8d0 963
dflet 0:400d8e75a8d0 964 /*!
dflet 0:400d8e75a8d0 965 \brief set socket options
dflet 0:400d8e75a8d0 966
dflet 0:400d8e75a8d0 967 This function manipulate the options associated with a socket.
dflet 0:400d8e75a8d0 968 Options may exist at multiple protocol levels; they are always
dflet 0:400d8e75a8d0 969 present at the uppermost socket level.
dflet 0:400d8e75a8d0 970
dflet 0:400d8e75a8d0 971 When manipulating socket options the level at which the option resides
dflet 0:400d8e75a8d0 972 and the name of the option must be specified. To manipulate options at
dflet 0:400d8e75a8d0 973 the socket level, level is specified as SOL_SOCKET. To manipulate
dflet 0:400d8e75a8d0 974 options at any other level the protocol number of the appropriate proto-
dflet 0:400d8e75a8d0 975 col controlling the option is supplied. For example, to indicate that an
dflet 0:400d8e75a8d0 976 option is to be interpreted by the TCP protocol, level should be set to
dflet 0:400d8e75a8d0 977 the protocol number of TCP;
dflet 0:400d8e75a8d0 978
dflet 0:400d8e75a8d0 979 The parameters optval and optlen are used to access optval -
dflet 0:400d8e75a8d0 980 ues for setsockopt(). For getsockopt() they identify a
dflet 0:400d8e75a8d0 981 buffer in which the value for the requested option(s) are to
dflet 0:400d8e75a8d0 982 be returned. For getsockopt(), optlen is a value-result
dflet 0:400d8e75a8d0 983 parameter, initially containing the size of the buffer
dflet 0:400d8e75a8d0 984 pointed to by option_value, and modified on return to
dflet 0:400d8e75a8d0 985 indicate the actual size of the value returned. If no option
dflet 0:400d8e75a8d0 986 value is to be supplied or returned, option_value may be
dflet 0:400d8e75a8d0 987 NULL.
dflet 0:400d8e75a8d0 988
dflet 0:400d8e75a8d0 989 \param[in] sd socket handle
dflet 0:400d8e75a8d0 990 \param[in] level defines the protocol level for this option
dflet 0:400d8e75a8d0 991 - <b>SL_SOL_SOCKET</b> Socket level configurations (L4, transport layer)
dflet 0:400d8e75a8d0 992 - <b>SL_IPPROTO_IP</b> IP level configurations (L3, network layer)
dflet 0:400d8e75a8d0 993 - <b>SL_SOL_PHY_OPT</b> Link level configurations (L2, link layer)
dflet 0:400d8e75a8d0 994 \param[in] optname defines the option name to interrogate
dflet 0:400d8e75a8d0 995 - <b>SL_SOL_SOCKET</b>
dflet 0:400d8e75a8d0 996 - <b>SL_SO_KEEPALIVE</b> \n
dflet 0:400d8e75a8d0 997 Enable/Disable periodic keep alive.
dflet 0:400d8e75a8d0 998 Keeps TCP connections active by enabling the periodic transmission of messages \n
dflet 0:400d8e75a8d0 999 Timeout is 5 minutes.\n
dflet 0:400d8e75a8d0 1000 Default: Enabled \n
dflet 0:400d8e75a8d0 1001 This options takes SlSockKeepalive_t struct as parameter
dflet 0:400d8e75a8d0 1002 - <b>SL_SO_RCVTIMEO</b> \n
dflet 0:400d8e75a8d0 1003 Sets the timeout value that specifies the maximum amount of time an input function waits until it completes. \n
dflet 0:400d8e75a8d0 1004 Default: No timeout \n
dflet 0:400d8e75a8d0 1005 This options takes SlTimeval_t struct as parameter
dflet 0:400d8e75a8d0 1006 - <b>SL_SO_RCVBUF</b> \n
dflet 0:400d8e75a8d0 1007 Sets tcp max recv window size. \n
dflet 0:400d8e75a8d0 1008 This options takes SlSockWinsize_t struct as parameter
dflet 0:400d8e75a8d0 1009 - <b>SL_SO_NONBLOCKING</b> \n
dflet 0:400d8e75a8d0 1010 Sets socket to non-blocking operation Impacts: connect, accept, send, sendto, recv and recvfrom. \n
dflet 0:400d8e75a8d0 1011 Default: Blocking.
dflet 0:400d8e75a8d0 1012 This options takes SlSockNonblocking_t struct as parameter
dflet 0:400d8e75a8d0 1013 - <b>SL_SO_SECMETHOD</b> \n
dflet 0:400d8e75a8d0 1014 Sets method to tcp secured socket (SL_SEC_SOCKET) \n
dflet 0:400d8e75a8d0 1015 Default: SL_SO_SEC_METHOD_SSLv3_TLSV1_2 \n
dflet 0:400d8e75a8d0 1016 This options takes SlSockSecureMethod struct as parameter
dflet 0:400d8e75a8d0 1017 - <b>SL_SO_SEC_MASK</b> \n
dflet 0:400d8e75a8d0 1018 Sets specific cipher to tcp secured socket (SL_SEC_SOCKET) \n
dflet 0:400d8e75a8d0 1019 Default: "Best" cipher suitable to method \n
dflet 0:400d8e75a8d0 1020 This options takes SlSockSecureMask struct as parameter
dflet 0:400d8e75a8d0 1021 - <b>SL_SO_SECURE_FILES_CA_FILE_NAME</b> \n
dflet 0:400d8e75a8d0 1022 Map secured socket to CA file by name \n
dflet 0:400d8e75a8d0 1023 This options takes <b>uint8_t</b> buffer as parameter
dflet 0:400d8e75a8d0 1024 - <b>SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME</b> \n
dflet 0:400d8e75a8d0 1025 Map secured socket to private key by name \n
dflet 0:400d8e75a8d0 1026 This options takes <b>uint8_t</b> buffer as parameter
dflet 0:400d8e75a8d0 1027 - <b>SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME</b> \n
dflet 0:400d8e75a8d0 1028 Map secured socket to certificate file by name \n
dflet 0:400d8e75a8d0 1029 This options takes <b>uint8_t</b> buffer as parameter
dflet 0:400d8e75a8d0 1030 - <b>SL_SO_SECURE_FILES_DH_KEY_FILE_NAME</b> \n
dflet 0:400d8e75a8d0 1031 Map secured socket to Diffie Hellman file by name \n
dflet 0:400d8e75a8d0 1032 This options takes <b>uint8_t</b> buffer as parameter
dflet 0:400d8e75a8d0 1033 - <b>SL_SO_CHANGE_CHANNEL</b> \n
dflet 0:400d8e75a8d0 1034 Sets channel in transceiver mode.
dflet 0:400d8e75a8d0 1035 This options takes <b>uint32_t</b> as channel number parameter
dflet 0:400d8e75a8d0 1036 - <b>SL_IPPROTO_IP</b>
dflet 0:400d8e75a8d0 1037 - <b>SL_IP_MULTICAST_TTL</b> \n
dflet 0:400d8e75a8d0 1038 Set the time-to-live value of outgoing multicast packets for this socket. \n
dflet 0:400d8e75a8d0 1039 This options takes <b>uint8_t</b> as parameter
dflet 0:400d8e75a8d0 1040 - <b>SL_IP_ADD_MEMBERSHIP</b> \n
dflet 0:400d8e75a8d0 1041 UDP socket, Join a multicast group. \n
dflet 0:400d8e75a8d0 1042 This options takes SlSockIpMreq struct as parameter
dflet 0:400d8e75a8d0 1043 - <b>SL_IP_DROP_MEMBERSHIP</b> \n
dflet 0:400d8e75a8d0 1044 UDP socket, Leave a multicast group \n
dflet 0:400d8e75a8d0 1045 This options takes SlSockIpMreq struct as parameter
dflet 0:400d8e75a8d0 1046 - <b>SL_IP_RAW_RX_NO_HEADER</b> \n
dflet 0:400d8e75a8d0 1047 Raw socket remove IP header from received data. \n
dflet 0:400d8e75a8d0 1048 Default: data includes ip header \n
dflet 0:400d8e75a8d0 1049 This options takes <b>uint32_t</b> as parameter
dflet 0:400d8e75a8d0 1050 - <b>SL_IP_HDRINCL</b> \n
dflet 0:400d8e75a8d0 1051 RAW socket only, the IPv4 layer generates an IP header when sending a packet unless \n
dflet 0:400d8e75a8d0 1052 the IP_HDRINCL socket option is enabled on the socket. \n
dflet 0:400d8e75a8d0 1053 When it is enabled, the packet must contain an IP header. \n
dflet 0:400d8e75a8d0 1054 Default: disabled, IPv4 header generated by Network Stack \n
dflet 0:400d8e75a8d0 1055 This options takes <b>uint32_t</b> as parameter
dflet 0:400d8e75a8d0 1056 - <b>SL_IP_RAW_IPV6_HDRINCL</b> (inactive) \n
dflet 0:400d8e75a8d0 1057 RAW socket only, the IPv6 layer generates an IP header when sending a packet unless \n
dflet 0:400d8e75a8d0 1058 the IP_HDRINCL socket option is enabled on the socket. When it is enabled, the packet must contain an IP header \n
dflet 0:400d8e75a8d0 1059 Default: disabled, IPv4 header generated by Network Stack \n
dflet 0:400d8e75a8d0 1060 This options takes <b>uint32_t</b> as parameter
dflet 0:400d8e75a8d0 1061 - <b>SL_SOL_PHY_OPT</b>
dflet 0:400d8e75a8d0 1062 - <b>SL_SO_PHY_RATE</b> \n
dflet 0:400d8e75a8d0 1063 RAW socket, set WLAN PHY transmit rate \n
dflet 0:400d8e75a8d0 1064 The values are based on RateIndex_e \n
dflet 0:400d8e75a8d0 1065 This options takes <b>uint32_t</b> as parameter
dflet 0:400d8e75a8d0 1066 - <b>SL_SO_PHY_TX_POWER</b> \n
dflet 0:400d8e75a8d0 1067 RAW socket, set WLAN PHY TX power \n
dflet 0:400d8e75a8d0 1068 Valid rage is 1-15 \n
dflet 0:400d8e75a8d0 1069 This options takes <b>uint32_t</b> as parameter
dflet 0:400d8e75a8d0 1070 - <b>SL_SO_PHY_NUM_FRAMES_TO_TX</b> \n
dflet 0:400d8e75a8d0 1071 RAW socket, set number of frames to transmit in transceiver mode.
dflet 0:400d8e75a8d0 1072 Default: 1 packet
dflet 0:400d8e75a8d0 1073 This options takes <b>uint32_t</b> as parameter
dflet 0:400d8e75a8d0 1074 - <b>SL_SO_PHY_PREAMBLE</b> \n
dflet 0:400d8e75a8d0 1075 RAW socket, set WLAN PHY preamble for Long/Short\n
dflet 0:400d8e75a8d0 1076 This options takes <b>uint32_t</b> as parameter
dflet 0:400d8e75a8d0 1077
dflet 0:400d8e75a8d0 1078 \param[in] optval specifies a value for the option
dflet 0:400d8e75a8d0 1079 \param[in] optlen specifies the length of the
dflet 0:400d8e75a8d0 1080 option value
dflet 0:400d8e75a8d0 1081
dflet 0:400d8e75a8d0 1082 \return On success, zero is returned.
dflet 0:400d8e75a8d0 1083 On error, a negative value is returned.
dflet 0:400d8e75a8d0 1084 \sa sl_getsockopt
dflet 0:400d8e75a8d0 1085 \note belongs to \ref basic_api
dflet 0:400d8e75a8d0 1086 \warning
dflet 0:400d8e75a8d0 1087 \par Examples:
dflet 0:400d8e75a8d0 1088 \par
dflet 0:400d8e75a8d0 1089 <b> SL_SO_KEEPALIVE: </b>(disable Keepalive)
dflet 0:400d8e75a8d0 1090 \code
dflet 0:400d8e75a8d0 1091 SlSockKeepalive_t enableOption;
dflet 0:400d8e75a8d0 1092 enableOption.KeepaliveEnabled = 0;
dflet 0:400d8e75a8d0 1093 sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_KEEPALIVE, (uint8_t *)&enableOption,sizeof(enableOption));
dflet 0:400d8e75a8d0 1094 \endcode
dflet 0:400d8e75a8d0 1095 \par
dflet 0:400d8e75a8d0 1096 <b> SL_SO_RCVTIMEO: </b>
dflet 0:400d8e75a8d0 1097 \code
dflet 0:400d8e75a8d0 1098 struct SlTimeval_t timeVal;
dflet 0:400d8e75a8d0 1099 timeVal.tv_sec = 1; // Seconds
dflet 0:400d8e75a8d0 1100 timeVal.tv_usec = 0; // Microseconds. 10000 microseconds resolution
dflet 0:400d8e75a8d0 1101 sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_RCVTIMEO, (uint8_t *)&timeVal, sizeof(timeVal)); // Enable receive timeout
dflet 0:400d8e75a8d0 1102 \endcode
dflet 0:400d8e75a8d0 1103 \par
dflet 0:400d8e75a8d0 1104 <b> SL_SO_RCVBUF: </b>
dflet 0:400d8e75a8d0 1105 \code
dflet 0:400d8e75a8d0 1106 SlSockWinsize_t size;
dflet 0:400d8e75a8d0 1107 size.Winsize = 3000; // bytes
dflet 0:400d8e75a8d0 1108 sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_RCVBUF, (uint8_t *)&size, sizeof(size));
dflet 0:400d8e75a8d0 1109 \endcode
dflet 0:400d8e75a8d0 1110 \par
dflet 0:400d8e75a8d0 1111 <b> SL_SO_NONBLOCKING: </b>
dflet 0:400d8e75a8d0 1112 \code
dflet 0:400d8e75a8d0 1113 SlSockNonblocking_t enableOption;
dflet 0:400d8e75a8d0 1114 enableOption.NonblockingEnabled = 1;
dflet 0:400d8e75a8d0 1115 sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_NONBLOCKING, (uint8_t *)&enableOption,sizeof(enableOption)); // Enable/disable nonblocking mode
dflet 0:400d8e75a8d0 1116 \endcode
dflet 0:400d8e75a8d0 1117 \par
dflet 0:400d8e75a8d0 1118 <b> SL_SO_SECMETHOD:</b>
dflet 0:400d8e75a8d0 1119 \code
dflet 0:400d8e75a8d0 1120 SlSockSecureMethod method;
dflet 0:400d8e75a8d0 1121 method.secureMethod = SL_SO_SEC_METHOD_SSLV3; // security method we want to use
dflet 0:400d8e75a8d0 1122 SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET);
dflet 0:400d8e75a8d0 1123 sl_SetSockOpt(SockID, SL_SOL_SOCKET, SL_SO_SECMETHOD, (uint8_t *)&method, sizeof(method));
dflet 0:400d8e75a8d0 1124 \endcode
dflet 0:400d8e75a8d0 1125 \par
dflet 0:400d8e75a8d0 1126 <b> SL_SO_SECURE_MASK:</b>
dflet 0:400d8e75a8d0 1127 \code
dflet 0:400d8e75a8d0 1128 SlSockSecureMask cipher;
dflet 0:400d8e75a8d0 1129 cipher.secureMask = SL_SEC_MASK_SSL_RSA_WITH_RC4_128_SHA; // cipher type
dflet 0:400d8e75a8d0 1130 SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET);
dflet 0:400d8e75a8d0 1131 sl_SetSockOpt(SockID, SL_SOL_SOCKET, SL_SO_SEC_MASK,(uint8_t *)&cipher, sizeof(cipher));
dflet 0:400d8e75a8d0 1132 \endcode
dflet 0:400d8e75a8d0 1133 \par
dflet 0:400d8e75a8d0 1134 <b> SL_SO_SECURE_FILES_CA_FILE_NAME:</b>
dflet 0:400d8e75a8d0 1135 \code
dflet 0:400d8e75a8d0 1136 sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_CA_FILE_NAME,"exuifaxCaCert.der",strlen("exuifaxCaCert.der"));
dflet 0:400d8e75a8d0 1137 \endcode
dflet 0:400d8e75a8d0 1138
dflet 0:400d8e75a8d0 1139 \par
dflet 0:400d8e75a8d0 1140 <b> SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME:</b>
dflet 0:400d8e75a8d0 1141 \code
dflet 0:400d8e75a8d0 1142 sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME,"myPrivateKey.der",strlen("myPrivateKey.der"));
dflet 0:400d8e75a8d0 1143 \endcode
dflet 0:400d8e75a8d0 1144
dflet 0:400d8e75a8d0 1145 \par
dflet 0:400d8e75a8d0 1146 <b> SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME:</b>
dflet 0:400d8e75a8d0 1147 \code
dflet 0:400d8e75a8d0 1148 sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME,"myCertificate.der",strlen("myCertificate.der"));
dflet 0:400d8e75a8d0 1149 \endcode
dflet 0:400d8e75a8d0 1150
dflet 0:400d8e75a8d0 1151 \par
dflet 0:400d8e75a8d0 1152 <b> SL_SO_SECURE_FILES_DH_KEY_FILE_NAME:</b>
dflet 0:400d8e75a8d0 1153 \code
dflet 0:400d8e75a8d0 1154 sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_DH_KEY_FILE_NAME,"myDHinServerMode.der",strlen("myDHinServerMode.der"));
dflet 0:400d8e75a8d0 1155 \endcode
dflet 0:400d8e75a8d0 1156
dflet 0:400d8e75a8d0 1157 \par
dflet 0:400d8e75a8d0 1158 <b> SL_IP_MULTICAST_TTL:</b>
dflet 0:400d8e75a8d0 1159 \code
dflet 0:400d8e75a8d0 1160 uint8_t ttl = 20;
dflet 0:400d8e75a8d0 1161 sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_MULTICAST_TTL, &ttl, sizeof(ttl));
dflet 0:400d8e75a8d0 1162 \endcode
dflet 0:400d8e75a8d0 1163
dflet 0:400d8e75a8d0 1164 \par
dflet 0:400d8e75a8d0 1165 <b> SL_IP_ADD_MEMBERSHIP:</b>
dflet 0:400d8e75a8d0 1166 \code
dflet 0:400d8e75a8d0 1167 SlSockIpMreq mreq;
dflet 0:400d8e75a8d0 1168 sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
dflet 0:400d8e75a8d0 1169 \endcode
dflet 0:400d8e75a8d0 1170
dflet 0:400d8e75a8d0 1171 \par
dflet 0:400d8e75a8d0 1172 <b> SL_IP_DROP_MEMBERSHIP:</b>
dflet 0:400d8e75a8d0 1173 \code
dflet 0:400d8e75a8d0 1174 SlSockIpMreq mreq;
dflet 0:400d8e75a8d0 1175 sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));
dflet 0:400d8e75a8d0 1176 \endcode
dflet 0:400d8e75a8d0 1177
dflet 0:400d8e75a8d0 1178 \par
dflet 0:400d8e75a8d0 1179 <b> SL_SO_CHANGE_CHANNEL:</b>
dflet 0:400d8e75a8d0 1180 \code
dflet 0:400d8e75a8d0 1181 uint32_t newChannel = 6; // range is 1-13
dflet 0:400d8e75a8d0 1182 sl_SetSockOpt(SockID, SL_SOL_SOCKET, SL_SO_CHANGE_CHANNEL, &newChannel, sizeof(newChannel));
dflet 0:400d8e75a8d0 1183 \endcode
dflet 0:400d8e75a8d0 1184
dflet 0:400d8e75a8d0 1185 \par
dflet 0:400d8e75a8d0 1186 <b> SL_IP_RAW_RX_NO_HEADER:</b>
dflet 0:400d8e75a8d0 1187 \code
dflet 0:400d8e75a8d0 1188 uint32_t header = 1; // remove ip header
dflet 0:400d8e75a8d0 1189 sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_RAW_RX_NO_HEADER, &header, sizeof(header));
dflet 0:400d8e75a8d0 1190 \endcode
dflet 0:400d8e75a8d0 1191
dflet 0:400d8e75a8d0 1192 \par
dflet 0:400d8e75a8d0 1193 <b> SL_IP_HDRINCL:</b>
dflet 0:400d8e75a8d0 1194 \code
dflet 0:400d8e75a8d0 1195 uint32_t header = 1;
dflet 0:400d8e75a8d0 1196 sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_HDRINCL, &header, sizeof(header));
dflet 0:400d8e75a8d0 1197 \endcode
dflet 0:400d8e75a8d0 1198 \par
dflet 0:400d8e75a8d0 1199 <b> SL_IP_RAW_IPV6_HDRINCL:</b>
dflet 0:400d8e75a8d0 1200 \code
dflet 0:400d8e75a8d0 1201 uint32_t header = 1;
dflet 0:400d8e75a8d0 1202 sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_RAW_IPV6_HDRINCL, &header, sizeof(header));
dflet 0:400d8e75a8d0 1203 \endcode
dflet 0:400d8e75a8d0 1204
dflet 0:400d8e75a8d0 1205 \par
dflet 0:400d8e75a8d0 1206 <b> SL_SO_PHY_RATE:</b>
dflet 0:400d8e75a8d0 1207 \code
dflet 0:400d8e75a8d0 1208 uint32_t rate = 6; // see wlan.h RateIndex_e for values
dflet 0:400d8e75a8d0 1209 sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_RATE, &rate, sizeof(rate));
dflet 0:400d8e75a8d0 1210 \endcode
dflet 0:400d8e75a8d0 1211
dflet 0:400d8e75a8d0 1212 \par
dflet 0:400d8e75a8d0 1213 <b> SL_SO_PHY_TX_POWER:</b>
dflet 0:400d8e75a8d0 1214 \code
dflet 0:400d8e75a8d0 1215 uint32_t txpower = 1; // valid range is 1-15
dflet 0:400d8e75a8d0 1216 sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_TX_POWER, &txpower, sizeof(txpower));
dflet 0:400d8e75a8d0 1217 \endcode
dflet 0:400d8e75a8d0 1218
dflet 0:400d8e75a8d0 1219 \par
dflet 0:400d8e75a8d0 1220 <b> SL_SO_PHY_NUM_FRAMES_TO_TX:</b>
dflet 0:400d8e75a8d0 1221 \code
dflet 0:400d8e75a8d0 1222 uint32_t numframes = 1;
dflet 0:400d8e75a8d0 1223 sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_NUM_FRAMES_TO_TX, &numframes, sizeof(numframes));
dflet 0:400d8e75a8d0 1224 \endcode
dflet 0:400d8e75a8d0 1225
dflet 0:400d8e75a8d0 1226 \par
dflet 0:400d8e75a8d0 1227 <b> SL_SO_PHY_PREAMBLE:</b>
dflet 0:400d8e75a8d0 1228 \code
dflet 0:400d8e75a8d0 1229 uint32_t preamble = 1;
dflet 0:400d8e75a8d0 1230 sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_PREAMBLE, &preamble, sizeof(preamble));
dflet 0:400d8e75a8d0 1231 \endcode
dflet 0:400d8e75a8d0 1232
dflet 0:400d8e75a8d0 1233 */
dflet 0:400d8e75a8d0 1234 #if _SL_INCLUDE_FUNC(sl_SetSockOpt)
dflet 0:400d8e75a8d0 1235 int16_t sl_SetSockOpt(int16_t sd, int16_t level, int16_t optname, const void *optval, SlSocklen_t optlen);
dflet 0:400d8e75a8d0 1236 #endif
dflet 0:400d8e75a8d0 1237
dflet 0:400d8e75a8d0 1238 /*!
dflet 0:400d8e75a8d0 1239 \brief Get socket options
dflet 0:400d8e75a8d0 1240
dflet 0:400d8e75a8d0 1241 This function manipulate the options associated with a socket.
dflet 0:400d8e75a8d0 1242 Options may exist at multiple protocol levels; they are always
dflet 0:400d8e75a8d0 1243 present at the uppermost socket level.
dflet 0:400d8e75a8d0 1244
dflet 0:400d8e75a8d0 1245 When manipulating socket options the level at which the option resides
dflet 0:400d8e75a8d0 1246 and the name of the option must be specified. To manipulate options at
dflet 0:400d8e75a8d0 1247 the socket level, level is specified as SOL_SOCKET. To manipulate
dflet 0:400d8e75a8d0 1248 options at any other level the protocol number of the appropriate proto-
dflet 0:400d8e75a8d0 1249 col controlling the option is supplied. For example, to indicate that an
dflet 0:400d8e75a8d0 1250 option is to be interpreted by the TCP protocol, level should be set to
dflet 0:400d8e75a8d0 1251 the protocol number of TCP;
dflet 0:400d8e75a8d0 1252
dflet 0:400d8e75a8d0 1253 The parameters optval and optlen are used to access optval -
dflet 0:400d8e75a8d0 1254 ues for setsockopt(). For getsockopt() they identify a
dflet 0:400d8e75a8d0 1255 buffer in which the value for the requested option(s) are to
dflet 0:400d8e75a8d0 1256 be returned. For getsockopt(), optlen is a value-result
dflet 0:400d8e75a8d0 1257 parameter, initially containing the size of the buffer
dflet 0:400d8e75a8d0 1258 pointed to by option_value, and modified on return to
dflet 0:400d8e75a8d0 1259 indicate the actual size of the value returned. If no option
dflet 0:400d8e75a8d0 1260 value is to be supplied or returned, option_value may be
dflet 0:400d8e75a8d0 1261 NULL.
dflet 0:400d8e75a8d0 1262
dflet 0:400d8e75a8d0 1263
dflet 0:400d8e75a8d0 1264 \param[in] sd socket handle
dflet 0:400d8e75a8d0 1265 \param[in] level defines the protocol level for this option
dflet 0:400d8e75a8d0 1266 \param[in] optname defines the option name to interrogate
dflet 0:400d8e75a8d0 1267 \param[out] optval specifies a value for the option
dflet 0:400d8e75a8d0 1268 \param[out] optlen specifies the length of the
dflet 0:400d8e75a8d0 1269 option value
dflet 0:400d8e75a8d0 1270
dflet 0:400d8e75a8d0 1271 \return On success, zero is returned.
dflet 0:400d8e75a8d0 1272 On error, a negative value is returned.
dflet 0:400d8e75a8d0 1273 \sa sl_SetSockOpt
dflet 0:400d8e75a8d0 1274 \note See sl_SetSockOpt
dflet 0:400d8e75a8d0 1275 belongs to \ref ext_api
dflet 0:400d8e75a8d0 1276 \warning
dflet 0:400d8e75a8d0 1277 */
dflet 0:400d8e75a8d0 1278 #if _SL_INCLUDE_FUNC(sl_GetSockOpt)
dflet 0:400d8e75a8d0 1279 int16_t sl_GetSockOpt(int16_t sd, int16_t level, int16_t optname, void *optval, SlSocklen_t *optlen);
dflet 0:400d8e75a8d0 1280 #endif
dflet 0:400d8e75a8d0 1281
dflet 0:400d8e75a8d0 1282 /*!
dflet 0:400d8e75a8d0 1283 \brief read data from TCP socket
dflet 0:400d8e75a8d0 1284
dflet 0:400d8e75a8d0 1285 function receives a message from a connection-mode socket
dflet 0:400d8e75a8d0 1286
dflet 0:400d8e75a8d0 1287 \param[in] sd socket handle
dflet 0:400d8e75a8d0 1288 \param[out] buf Points to the buffer where the
dflet 0:400d8e75a8d0 1289 message should be stored.
dflet 0:400d8e75a8d0 1290 \param[in] Len Specifies the length in bytes of
dflet 0:400d8e75a8d0 1291 the buffer pointed to by the buffer argument.
dflet 0:400d8e75a8d0 1292 Range: 1-16000 bytes
dflet 0:400d8e75a8d0 1293 \param[in] flags Specifies the type of message
dflet 0:400d8e75a8d0 1294 reception. On this version, this parameter is not
dflet 0:400d8e75a8d0 1295 supported.
dflet 0:400d8e75a8d0 1296
dflet 0:400d8e75a8d0 1297 \return return the number of bytes received,
dflet 0:400d8e75a8d0 1298 or a negative value if an error occurred.
dflet 0:400d8e75a8d0 1299 using a non-blocking recv a possible negative value is SL_EAGAIN.
dflet 0:400d8e75a8d0 1300 SL_POOL_IS_EMPTY may be return in case there are no resources in the system
dflet 0:400d8e75a8d0 1301 In this case try again later or increase MAX_CONCURRENT_ACTIONS
dflet 0:400d8e75a8d0 1302
dflet 0:400d8e75a8d0 1303 \sa sl_RecvFrom
dflet 0:400d8e75a8d0 1304 \note belongs to \ref recv_api
dflet 0:400d8e75a8d0 1305 \warning
dflet 0:400d8e75a8d0 1306 \par Examples:
dflet 0:400d8e75a8d0 1307 \code An example of receiving data using TCP socket:
dflet 0:400d8e75a8d0 1308
dflet 0:400d8e75a8d0 1309 SlSockAddrIn_t Addr;
dflet 0:400d8e75a8d0 1310 SlSockAddrIn_t LocalAddr;
dflet 0:400d8e75a8d0 1311 int16_t AddrSize = sizeof(SlSockAddrIn_t);
dflet 0:400d8e75a8d0 1312 int16_t SockID, newSockID;
dflet 0:400d8e75a8d0 1313 int16_t Status;
dflet 0:400d8e75a8d0 1314 int8_t Buf[RECV_BUF_LEN];
dflet 0:400d8e75a8d0 1315
dflet 0:400d8e75a8d0 1316 LocalAddr.sin_family = SL_AF_INET;
dflet 0:400d8e75a8d0 1317 LocalAddr.sin_port = sl_Htons(5001);
dflet 0:400d8e75a8d0 1318 LocalAddr.sin_addr.s_addr = 0;
dflet 0:400d8e75a8d0 1319
dflet 0:400d8e75a8d0 1320 Addr.sin_family = SL_AF_INET;
dflet 0:400d8e75a8d0 1321 Addr.sin_port = sl_Htons(5001);
dflet 0:400d8e75a8d0 1322 Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(10,1,1,200));
dflet 0:400d8e75a8d0 1323
dflet 0:400d8e75a8d0 1324 SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
dflet 0:400d8e75a8d0 1325 Status = sl_Bind(SockID, (SlSockAddr_t *)&LocalAddr, AddrSize);
dflet 0:400d8e75a8d0 1326 Status = sl_Listen(SockID, 0);
dflet 0:400d8e75a8d0 1327 newSockID = sl_Accept(SockID, (SlSockAddr_t*)&Addr, (SlSocklen_t*) &AddrSize);
dflet 0:400d8e75a8d0 1328 Status = sl_Recv(newSockID, Buf, 1460, 0);
dflet 0:400d8e75a8d0 1329 \endcode
dflet 0:400d8e75a8d0 1330 \code Example code for Rx transceiver mode using a raw socket
dflet 0:400d8e75a8d0 1331 int8_t buffer[1536];
dflet 0:400d8e75a8d0 1332 int16_t sd;
dflet 0:400d8e75a8d0 1333 uint16_t size;
dflet 0:400d8e75a8d0 1334 SlTransceiverRxOverHead_t *transHeader;
dflet 0:400d8e75a8d0 1335 sd = sl_Socket(SL_AF_RF,SL_SOCK_RAW,11); // channel 11
dflet 0:400d8e75a8d0 1336 while(1)
dflet 0:400d8e75a8d0 1337 {
dflet 0:400d8e75a8d0 1338 size = sl_Recv(sd,buffer,1536,0);
dflet 0:400d8e75a8d0 1339 transHeader = (SlTransceiverRxOverHead_t *)buffer;
dflet 0:400d8e75a8d0 1340 printf("RSSI is %d frame type is 0x%x size %d\n",transHeader->rssi,buffer[sizeof(SlTransceiverRxOverHead_t)],size);
dflet 0:400d8e75a8d0 1341 }
dflet 0:400d8e75a8d0 1342 \endcode
dflet 0:400d8e75a8d0 1343 */
dflet 0:400d8e75a8d0 1344 #if _SL_INCLUDE_FUNC(sl_Recv)
dflet 0:400d8e75a8d0 1345 int16_t sl_Recv(int16_t sd, void *buf, int16_t Len, int16_t flags);
dflet 0:400d8e75a8d0 1346 #endif
dflet 0:400d8e75a8d0 1347
dflet 0:400d8e75a8d0 1348 /*!
dflet 0:400d8e75a8d0 1349 \brief read data from socket
dflet 0:400d8e75a8d0 1350
dflet 0:400d8e75a8d0 1351 function receives a message from a connection-mode or
dflet 0:400d8e75a8d0 1352 connectionless-mode socket
dflet 0:400d8e75a8d0 1353
dflet 0:400d8e75a8d0 1354 \param[in] sd socket handle
dflet 0:400d8e75a8d0 1355 \param[out] buf Points to the buffer where the message should be stored.
dflet 0:400d8e75a8d0 1356 \param[in] Len Specifies the length in bytes of the buffer pointed to by the buffer argument.
dflet 0:400d8e75a8d0 1357 Range: 1-16000 bytes
dflet 0:400d8e75a8d0 1358 \param[in] flags Specifies the type of message
dflet 0:400d8e75a8d0 1359 reception. On this version, this parameter is not
dflet 0:400d8e75a8d0 1360 supported.
dflet 0:400d8e75a8d0 1361 \param[in] from pointer to an address structure
dflet 0:400d8e75a8d0 1362 indicating the source
dflet 0:400d8e75a8d0 1363 address.\n sockaddr:\n - code
dflet 0:400d8e75a8d0 1364 for the address format. On this
dflet 0:400d8e75a8d0 1365 version only AF_INET is
dflet 0:400d8e75a8d0 1366 supported.\n - socket address,
dflet 0:400d8e75a8d0 1367 the length depends on the code
dflet 0:400d8e75a8d0 1368 format
dflet 0:400d8e75a8d0 1369 \param[in] fromlen source address structure
dflet 0:400d8e75a8d0 1370 size. This parameter MUST be set to the size of the structure pointed to by addr.
dflet 0:400d8e75a8d0 1371
dflet 0:400d8e75a8d0 1372
dflet 0:400d8e75a8d0 1373 \return return the number of bytes received,
dflet 0:400d8e75a8d0 1374 or a negative value if an error occurred.
dflet 0:400d8e75a8d0 1375 using a non-blocking recv a possible negative value is SL_EAGAIN.
dflet 0:400d8e75a8d0 1376 SL_RET_CODE_INVALID_INPUT (-2) will be returned if fromlen has incorrect length.
dflet 0:400d8e75a8d0 1377 SL_POOL_IS_EMPTY may be return in case there are no resources in the system
dflet 0:400d8e75a8d0 1378 In this case try again later or increase MAX_CONCURRENT_ACTIONS
dflet 0:400d8e75a8d0 1379
dflet 0:400d8e75a8d0 1380 \sa sl_Recv
dflet 0:400d8e75a8d0 1381 \note belongs to \ref recv_api
dflet 0:400d8e75a8d0 1382 \warning
dflet 0:400d8e75a8d0 1383 \par Example:
dflet 0:400d8e75a8d0 1384 \code An example of receiving data:
dflet 0:400d8e75a8d0 1385
dflet 0:400d8e75a8d0 1386 SlSockAddrIn_t Addr;
dflet 0:400d8e75a8d0 1387 SlSockAddrIn_t LocalAddr;
dflet 0:400d8e75a8d0 1388 int16_t AddrSize = sizeof(SlSockAddrIn_t);
dflet 0:400d8e75a8d0 1389 int16_t SockID;
dflet 0:400d8e75a8d0 1390 int16_t Status;
dflet 0:400d8e75a8d0 1391 int8_t Buf[RECV_BUF_LEN];
dflet 0:400d8e75a8d0 1392
dflet 0:400d8e75a8d0 1393 LocalAddr.sin_family = SL_AF_INET;
dflet 0:400d8e75a8d0 1394 LocalAddr.sin_port = sl_Htons(5001);
dflet 0:400d8e75a8d0 1395 LocalAddr.sin_addr.s_addr = 0;
dflet 0:400d8e75a8d0 1396
dflet 0:400d8e75a8d0 1397 SockID = sl_Socket(SL_AF_INET,SL_SOCK_DGRAM, 0);
dflet 0:400d8e75a8d0 1398 Status = sl_Bind(SockID, (SlSockAddr_t *)&LocalAddr, AddrSize);
dflet 0:400d8e75a8d0 1399 Status = sl_RecvFrom(SockID, Buf, 1472, 0, (SlSockAddr_t *)&Addr, (SlSocklen_t*)&AddrSize);
dflet 0:400d8e75a8d0 1400
dflet 0:400d8e75a8d0 1401 \endcode
dflet 0:400d8e75a8d0 1402 */
dflet 0:400d8e75a8d0 1403 #if _SL_INCLUDE_FUNC(sl_RecvFrom)
dflet 0:400d8e75a8d0 1404 int16_t sl_RecvFrom(int16_t sd, void *buf, int16_t Len, int16_t flags, SlSockAddr_t *from, SlSocklen_t *fromlen);
dflet 0:400d8e75a8d0 1405 #endif
dflet 0:400d8e75a8d0 1406
dflet 0:400d8e75a8d0 1407 /*!
dflet 0:400d8e75a8d0 1408 \brief write data to TCP socket
dflet 0:400d8e75a8d0 1409
dflet 0:400d8e75a8d0 1410 This function is used to transmit a message to another socket.
dflet 0:400d8e75a8d0 1411 Returns immediately after sending data to device.
dflet 0:400d8e75a8d0 1412 In case of TCP failure an async event SL_SOCKET_TX_FAILED_EVENT is going to
dflet 0:400d8e75a8d0 1413 be received.
dflet 0:400d8e75a8d0 1414 In case of a RAW socket (transceiver mode), extra 4 bytes should be reserved at the end of the
dflet 0:400d8e75a8d0 1415 frame data buffer for WLAN FCS
dflet 0:400d8e75a8d0 1416
dflet 0:400d8e75a8d0 1417 \param[in] sd socket handle
dflet 0:400d8e75a8d0 1418 \param[in] buf Points to a buffer containing
dflet 0:400d8e75a8d0 1419 the message to be sent
dflet 0:400d8e75a8d0 1420 \param[in] Len message size in bytes. Range: 1-1460 bytes
dflet 0:400d8e75a8d0 1421 \param[in] flags Specifies the type of message
dflet 0:400d8e75a8d0 1422 transmission. On this version, this parameter is not
dflet 0:400d8e75a8d0 1423 supported for TCP.
dflet 0:400d8e75a8d0 1424 For transceiver mode, the SL_RAW_RF_TX_PARAMS macro can be used to determine
dflet 0:400d8e75a8d0 1425 transmission parameters (channel,rate,tx_power,preamble)
dflet 0:400d8e75a8d0 1426
dflet 0:400d8e75a8d0 1427
dflet 0:400d8e75a8d0 1428 \return Return the number of bytes transmitted,
dflet 0:400d8e75a8d0 1429 or -1 if an error occurred
dflet 0:400d8e75a8d0 1430
dflet 0:400d8e75a8d0 1431 \sa sl_SendTo
dflet 0:400d8e75a8d0 1432 \note belongs to \ref send_api
dflet 0:400d8e75a8d0 1433 \warning
dflet 0:400d8e75a8d0 1434 \par Example:
dflet 0:400d8e75a8d0 1435 \code An example of sending data:
dflet 0:400d8e75a8d0 1436
dflet 0:400d8e75a8d0 1437 SlSockAddrIn_t Addr;
dflet 0:400d8e75a8d0 1438 int16_t AddrSize = sizeof(SlSockAddrIn_t);
dflet 0:400d8e75a8d0 1439 int16_t SockID;
dflet 0:400d8e75a8d0 1440 int16_t Status;
dflet 0:400d8e75a8d0 1441 int8_t Buf[SEND_BUF_LEN];
dflet 0:400d8e75a8d0 1442
dflet 0:400d8e75a8d0 1443 Addr.sin_family = SL_AF_INET;
dflet 0:400d8e75a8d0 1444 Addr.sin_port = sl_Htons(5001);
dflet 0:400d8e75a8d0 1445 Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(10,1,1,200));
dflet 0:400d8e75a8d0 1446
dflet 0:400d8e75a8d0 1447 SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
dflet 0:400d8e75a8d0 1448 Status = sl_Connect(SockID, (SlSockAddr_t *)&Addr, AddrSize);
dflet 0:400d8e75a8d0 1449 Status = sl_Send(SockID, Buf, 1460, 0 );
dflet 0:400d8e75a8d0 1450
dflet 0:400d8e75a8d0 1451 \endcode
dflet 0:400d8e75a8d0 1452 */
dflet 0:400d8e75a8d0 1453 #if _SL_INCLUDE_FUNC(sl_Send )
dflet 0:400d8e75a8d0 1454 int16_t sl_Send(int16_t sd, const void *buf, int16_t Len, int16_t flags);
dflet 0:400d8e75a8d0 1455 #endif
dflet 0:400d8e75a8d0 1456
dflet 0:400d8e75a8d0 1457 /*!
dflet 0:400d8e75a8d0 1458 \brief write data to socket
dflet 0:400d8e75a8d0 1459
dflet 0:400d8e75a8d0 1460 This function is used to transmit a message to another socket
dflet 0:400d8e75a8d0 1461 (connection less socket SOCK_DGRAM, SOCK_RAW).
dflet 0:400d8e75a8d0 1462 Returns immediately after sending data to device.
dflet 0:400d8e75a8d0 1463 In case of transmission failure an async event SL_SOCKET_TX_FAILED_EVENT is going to
dflet 0:400d8e75a8d0 1464 be received.
dflet 0:400d8e75a8d0 1465
dflet 0:400d8e75a8d0 1466 \param[in] sd socket handle
dflet 0:400d8e75a8d0 1467 \param[in] buf Points to a buffer containing
dflet 0:400d8e75a8d0 1468 the message to be sent
dflet 0:400d8e75a8d0 1469 \param[in] Len message size in bytes. Range: 1-1460 bytes
dflet 0:400d8e75a8d0 1470 \param[in] flags Specifies the type of message
dflet 0:400d8e75a8d0 1471 transmission. On this version, this parameter is not
dflet 0:400d8e75a8d0 1472 supported
dflet 0:400d8e75a8d0 1473 \param[in] to pointer to an address structure
dflet 0:400d8e75a8d0 1474 indicating the destination
dflet 0:400d8e75a8d0 1475 address.\n sockaddr:\n - code
dflet 0:400d8e75a8d0 1476 for the address format. On this
dflet 0:400d8e75a8d0 1477 version only AF_INET is
dflet 0:400d8e75a8d0 1478 supported.\n - socket address,
dflet 0:400d8e75a8d0 1479 the length depends on the code
dflet 0:400d8e75a8d0 1480 format
dflet 0:400d8e75a8d0 1481 \param[in] tolen destination address structure size
dflet 0:400d8e75a8d0 1482
dflet 0:400d8e75a8d0 1483 \return Return the number of transmitted bytes,
dflet 0:400d8e75a8d0 1484 or -1 if an error occurred
dflet 0:400d8e75a8d0 1485
dflet 0:400d8e75a8d0 1486 \sa sl_Send
dflet 0:400d8e75a8d0 1487 \note belongs to \ref send_api
dflet 0:400d8e75a8d0 1488 \warning
dflet 0:400d8e75a8d0 1489 \par Example:
dflet 0:400d8e75a8d0 1490 \code An example of sending data:
dflet 0:400d8e75a8d0 1491
dflet 0:400d8e75a8d0 1492 SlSockAddrIn_t Addr;
dflet 0:400d8e75a8d0 1493 int16_t AddrSize = sizeof(SlSockAddrIn_t);
dflet 0:400d8e75a8d0 1494 int16_t SockID;
dflet 0:400d8e75a8d0 1495 int16_t Status;
dflet 0:400d8e75a8d0 1496 int8_t Buf[SEND_BUF_LEN];
dflet 0:400d8e75a8d0 1497
dflet 0:400d8e75a8d0 1498 Addr.sin_family = SL_AF_INET;
dflet 0:400d8e75a8d0 1499 Addr.sin_port = sl_Htons(5001);
dflet 0:400d8e75a8d0 1500 Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(10,1,1,200));
dflet 0:400d8e75a8d0 1501
dflet 0:400d8e75a8d0 1502 SockID = sl_Socket(SL_AF_INET,SL_SOCK_DGRAM, 0);
dflet 0:400d8e75a8d0 1503 Status = sl_SendTo(SockID, Buf, 1472, 0, (SlSockAddr_t *)&Addr, AddrSize);
dflet 0:400d8e75a8d0 1504
dflet 0:400d8e75a8d0 1505 \endcode
dflet 0:400d8e75a8d0 1506 */
dflet 0:400d8e75a8d0 1507 #if _SL_INCLUDE_FUNC(sl_SendTo)
dflet 0:400d8e75a8d0 1508 int16_t sl_SendTo(int16_t sd, const void *buf, int16_t Len, int16_t flags, const SlSockAddr_t *to, SlSocklen_t tolen);
dflet 0:400d8e75a8d0 1509 #endif
dflet 0:400d8e75a8d0 1510
dflet 0:400d8e75a8d0 1511 /*!
dflet 0:400d8e75a8d0 1512 \brief Reorder the bytes of a 32-bit unsigned value
dflet 0:400d8e75a8d0 1513
dflet 0:400d8e75a8d0 1514 This function is used to Reorder the bytes of a 32-bit unsigned value from processor order to network order.
dflet 0:400d8e75a8d0 1515
dflet 0:400d8e75a8d0 1516 \param[in] var variable to reorder
dflet 0:400d8e75a8d0 1517
dflet 0:400d8e75a8d0 1518 \return Return the reorder variable,
dflet 0:400d8e75a8d0 1519
dflet 0:400d8e75a8d0 1520 \sa sl_SendTo sl_Bind sl_Connect sl_RecvFrom sl_Accept
dflet 0:400d8e75a8d0 1521 \note belongs to \ref send_api
dflet 0:400d8e75a8d0 1522 \warning
dflet 0:400d8e75a8d0 1523 */
dflet 0:400d8e75a8d0 1524 #if _SL_INCLUDE_FUNC(sl_Htonl )
dflet 0:400d8e75a8d0 1525 uint32_t sl_Htonl( uint32_t val );
dflet 0:400d8e75a8d0 1526
dflet 0:400d8e75a8d0 1527 #define sl_Ntohl sl_Htonl /* Reorder the bytes of a 16-bit unsigned value from network order to processor orde. */
dflet 0:400d8e75a8d0 1528 #endif
dflet 0:400d8e75a8d0 1529
dflet 0:400d8e75a8d0 1530 /*!
dflet 0:400d8e75a8d0 1531 \brief Reorder the bytes of a 16-bit unsigned value
dflet 0:400d8e75a8d0 1532
dflet 0:400d8e75a8d0 1533 This function is used to Reorder the bytes of a 16-bit unsigned value from processor order to network order.
dflet 0:400d8e75a8d0 1534
dflet 0:400d8e75a8d0 1535 \param[in] var variable to reorder
dflet 0:400d8e75a8d0 1536
dflet 0:400d8e75a8d0 1537 \return Return the reorder variable,
dflet 0:400d8e75a8d0 1538
dflet 0:400d8e75a8d0 1539 \sa sl_SendTo sl_Bind sl_Connect sl_RecvFrom sl_Accept
dflet 0:400d8e75a8d0 1540 \note belongs to \ref send_api
dflet 0:400d8e75a8d0 1541 \warning
dflet 0:400d8e75a8d0 1542 */
dflet 0:400d8e75a8d0 1543 #if _SL_INCLUDE_FUNC(sl_Htons )
dflet 0:400d8e75a8d0 1544 uint16_t sl_Htons( uint16_t val );
dflet 0:400d8e75a8d0 1545
dflet 0:400d8e75a8d0 1546 #define sl_Ntohs sl_Htons /* Reorder the bytes of a 16-bit unsigned value from network order to processor orde. */
dflet 0:400d8e75a8d0 1547 #endif
dflet 0:400d8e75a8d0 1548
dflet 0:400d8e75a8d0 1549 private:
dflet 0:400d8e75a8d0 1550
dflet 0:400d8e75a8d0 1551 cc3100_driver &_driver;
dflet 0:400d8e75a8d0 1552 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:400d8e75a8d0 1553 cc3100_nonos &_nonos;
dflet 0:400d8e75a8d0 1554 #endif
dflet 0:400d8e75a8d0 1555
dflet 0:400d8e75a8d0 1556 };//class
dflet 0:400d8e75a8d0 1557
dflet 0:400d8e75a8d0 1558
dflet 0:400d8e75a8d0 1559 }//namespace mbed_cc3100
dflet 0:400d8e75a8d0 1560
dflet 0:400d8e75a8d0 1561 /*!
dflet 0:400d8e75a8d0 1562
dflet 0:400d8e75a8d0 1563 Close the Doxygen group.
dflet 0:400d8e75a8d0 1564 @}
dflet 0:400d8e75a8d0 1565
dflet 0:400d8e75a8d0 1566 */
dflet 0:400d8e75a8d0 1567
dflet 0:400d8e75a8d0 1568 #endif /* __SOCKET_H__ */
dflet 0:400d8e75a8d0 1569
dflet 0:400d8e75a8d0 1570
dflet 0:400d8e75a8d0 1571