TI's CC3100. A test demo with very little testing done!
Fork of cc3100_Test_Demo2 by
Diff: simplelink/cc3100_socket.h
- Revision:
- 6:778b081f6a13
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simplelink/cc3100_socket.h Thu Mar 19 15:39:08 2015 +0000 @@ -0,0 +1,1566 @@ +/* + * socket.h - CC31xx/CC32xx Host Driver Implementation + * + * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/ + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +/*****************************************************************************/ +/* Include files */ +/*****************************************************************************/ +#include "cc3100_simplelink.h" + +#ifndef SL_SOCKET_H_ +#define SL_SOCKET_H_ + +#include "cc3100_protocol.h" + +namespace mbed_cc3100 { + +//#include "cc3100_driver.h" + +/*! + + \addtogroup socket + @{ + +*/ + +/*****************************************************************************/ +/* Macro declarations */ +/*****************************************************************************/ + +const uint8_t SL_FD_SETSIZE = SL_MAX_SOCKETS; /* Number of sockets to select on - same is max sockets! */ +const uint8_t BSD_SOCKET_ID_MASK = (0x0F); /* Index using the LBS 4 bits for socket id 0-7 */ +/* Define some BSD protocol constants. */ +const uint8_t SL_SOCK_STREAM = (1); /* TCP Socket */ +const uint8_t SL_SOCK_DGRAM = (2); /* UDP Socket */ +const uint8_t SL_SOCK_RAW = (3); /* Raw socket */ +const uint8_t SL_IPPROTO_TCP = (6); /* TCP Raw Socket */ +const uint8_t SL_IPPROTO_UDP = (17); /* UDP Raw Socket */ +const uint8_t SL_IPPROTO_RAW = (255); /* Raw Socket */ +const uint8_t SL_SEC_SOCKET = (100); /* Secured Socket Layer (SSL,TLS) */ + +/* Address families. */ +const uint8_t SL_AF_INET = (2); /* IPv4 socket (UDP, TCP, etc) */ +const uint8_t SL_AF_INET6 = (3); /* IPv6 socket (UDP, TCP, etc) */ +const uint8_t SL_AF_INET6_EUI_48 = (9); +const uint8_t AF_INET = SL_AF_INET; +const uint8_t AF_INET6 = SL_AF_INET6; +const uint8_t SL_AF_RF = (6); /* data include RF parameter, All layer by user (Wifi could be disconnected) */ +const uint8_t SL_AF_PACKET = (17); +/* Protocol families, same as address families. */ +const uint8_t SL_PF_INET = AF_INET; +const uint8_t SL_PF_INET6 = AF_INET6; +const uint8_t SL_INADDR_ANY = (0); /* bind any address */ + +/* error codes */ +const int8_t SL_SOC_ERROR = (-1); /* Failure. */ +const int8_t SL_SOC_OK = ( 0); /* Success. */ +const int8_t SL_INEXE = (-8); /* socket command in execution */ +const int8_t SL_EBADF = (-9); /* Bad file number */ +const int8_t SL_ENSOCK = (-10); /* The system limit on the total number of open socket, has been reached */ +const int8_t SL_EAGAIN = (-11); /* Try again */ +const int8_t SL_EWOULDBLOCK = SL_EAGAIN; +const int8_t SL_ENOMEM = (-12); /* Out of memory */ +const int8_t SL_EACCES = (-13); /* Permission denied */ +const int8_t SL_EFAULT = (-14); /* Bad address */ +const int8_t SL_ECLOSE = (-15); /* close socket operation failed to transmit all queued packets */ +const int8_t SL_EALREADY_ENABLED = (-21); /* Transceiver - Transceiver already ON. there could be only one */ +const int8_t SL_EINVAL = (-22); /* Invalid argument */ +const int8_t SL_EAUTO_CONNECT_OR_CONNECTING = (-69); /* Transceiver - During connection, connected or auto mode started */ +const int8_t SL_CONNECTION_PENDING = (-72); /* Transceiver - Device is connected, disconnect first to open transceiver */ +const int8_t SL_EUNSUPPORTED_ROLE = (-86); /* Transceiver - Trying to start when WLAN role is AP or P2P GO */ +const int8_t SL_EDESTADDRREQ = (-89); /* Destination address required */ +const int8_t SL_EPROTOTYPE = (-91); /* Protocol wrong type for socket */ +const int8_t SL_ENOPROTOOPT = (-92); /* Protocol not available */ +const int8_t SL_EPROTONOSUPPORT = (-93); /* Protocol not supported */ +const int8_t SL_ESOCKTNOSUPPORT = (-94); /* Socket type not supported */ +const int8_t SL_EOPNOTSUPP = (-95); /* Operation not supported on transport endpoint */ +const int8_t SL_EAFNOSUPPORT = (-97); /* Address family not supported by protocol */ +const int8_t SL_EADDRINUSE = (-98); /* Address already in use */ +const int8_t SL_EADDRNOTAVAIL = (-99); /* Cannot assign requested address */ +const int8_t SL_ENETUNREACH = (-101); /* Network is unreachable */ +const int8_t SL_ENOBUFS = (-105); /* No buffer space available */ +const int8_t SL_EOBUFF = SL_ENOBUFS; +const int8_t SL_EISCONN = (-106); /* Transport endpoint is already connected */ +const int8_t SL_ENOTCONN = (-107); /* Transport endpoint is not connected */ +const int8_t SL_ETIMEDOUT = (-110); /* Connection timed out */ +const int8_t SL_ECONNREFUSED = (-111); /* Connection refused */ +const int8_t SL_EALREADY = (-114); /* Non blocking connect in progress, try again */ + +const int16_t SL_ESEC_RSA_WRONG_TYPE_E = (-130); /* RSA wrong block type for RSA function */ +const int16_t SL_ESEC_RSA_BUFFER_E = (-131); /* RSA buffer error, output too small or */ +const int16_t SL_ESEC_BUFFER_E = (-132); /* output buffer too small or input too large */ +const int16_t SL_ESEC_ALGO_ID_E = (-133); /* setting algo id error */ +const int16_t SL_ESEC_PUBLIC_KEY_E = (-134); /* setting public key error */ +const int16_t SL_ESEC_DATE_E = (-135); /* setting date validity error */ +const int16_t SL_ESEC_SUBJECT_E = (-136); /* setting subject name error */ +const int16_t SL_ESEC_ISSUER_E = (-137); /* setting issuer name error */ +const int16_t SL_ESEC_CA_TRUE_E = (-138); /* setting CA basic constraint true error */ +const int16_t SL_ESEC_EXTENSIONS_E = (-139); /* setting extensions error */ +const int16_t SL_ESEC_ASN_PARSE_E = (-140); /* ASN parsing error, invalid input */ +const int16_t SL_ESEC_ASN_VERSION_E = (-141); /* ASN version error, invalid number */ +const int16_t SL_ESEC_ASN_GETINT_E = (-142); /* ASN get big int16_t error, invalid data */ +const int16_t SL_ESEC_ASN_RSA_KEY_E = (-143); /* ASN key init error, invalid input */ +const int16_t SL_ESEC_ASN_OBJECT_ID_E = (-144); /* ASN object id error, invalid id */ +const int16_t SL_ESEC_ASN_TAG_NULL_E = (-145); /* ASN tag error, not null */ +const int16_t SL_ESEC_ASN_EXPECT_0_E = (-146); /* ASN expect error, not zero */ +const int16_t SL_ESEC_ASN_BITSTR_E = (-147); /* ASN bit string error, wrong id */ +const int16_t SL_ESEC_ASN_UNKNOWN_OID_E = (-148); /* ASN oid error, unknown sum id */ +const int16_t SL_ESEC_ASN_DATE_SZ_E = (-149); /* ASN date error, bad size */ +const int16_t SL_ESEC_ASN_BEFORE_DATE_E = (-150); /* ASN date error, current date before */ +const int16_t SL_ESEC_ASN_AFTER_DATE_E = (-151); /* ASN date error, current date after */ +const int16_t SL_ESEC_ASN_SIG_OID_E = (-152); /* ASN signature error, mismatched oid */ +const int16_t SL_ESEC_ASN_TIME_E = (-153); /* ASN time error, unknown time type */ +const int16_t SL_ESEC_ASN_INPUT_E = (-154); /* ASN input error, not enough data */ +const int16_t SL_ESEC_ASN_SIG_CONFIRM_E = (-155); /* ASN sig error, confirm failure */ +const int16_t SL_ESEC_ASN_SIG_HASH_E = (-156); /* ASN sig error, unsupported hash type */ +const int16_t SL_ESEC_ASN_SIG_KEY_E = (-157); /* ASN sig error, unsupported key type */ +const int16_t SL_ESEC_ASN_DH_KEY_E = (-158); /* ASN key init error, invalid input */ +const int16_t SL_ESEC_ASN_NTRU_KEY_E = (-159); /* ASN ntru key decode error, invalid input */ +const int16_t SL_ESEC_ECC_BAD_ARG_E = (-170); /* ECC input argument of wrong type */ +const int16_t SL_ESEC_ASN_ECC_KEY_E = (-171); /* ASN ECC bad input */ +const int16_t SL_ESEC_ECC_CURVE_OID_E = (-172); /* Unsupported ECC OID curve type */ +const int16_t SL_ESEC_BAD_FUNC_ARG = (-173); /* Bad function argument provided */ +const int16_t SL_ESEC_NOT_COMPILED_IN = (-174); /* Feature not compiled in */ +const int16_t SL_ESEC_UNICODE_SIZE_E = (-175); /* Unicode password too big */ +const int16_t SL_ESEC_NO_PASSWORD = (-176); /* no password provided by user */ +const int16_t SL_ESEC_ALT_NAME_E = (-177); /* alt name size problem, too big */ +const int16_t SL_ESEC_AES_GCM_AUTH_E = (-180); /* AES-GCM Authentication check failure */ +const int16_t SL_ESEC_AES_CCM_AUTH_E = (-181); /* AES-CCM Authentication check failure */ +#define SL_SOCKET_ERROR_E (-208) /* Error state on socket */ + +#define SL_ESEC_MEMORY_ERROR (-203) /* out of memory */ +#define SL_ESEC_VERIFY_FINISHED_ERROR (-204) /* verify problem on finished */ +#define SL_ESEC_VERIFY_MAC_ERROR (-205) /* verify mac problem */ +#define SL_ESEC_UNKNOWN_HANDSHAKE_TYPE (-207) /* weird handshake type */ +#define SL_ESEC_SOCKET_ERROR_E (-208) /* error state on socket */ +#define SL_ESEC_SOCKET_NODATA (-209) /* expected data, not there */ +#define SL_ESEC_INCOMPLETE_DATA (-210) /* don't have enough data to complete task */ +#define SL_ESEC_UNKNOWN_RECORD_TYPE (-211) /* unknown type in record hdr */ +#define SL_ESEC_FATAL_ERROR (-213) /* recvd alert fatal error */ +#define SL_ESEC_ENCRYPT_ERROR (-214) /* error during encryption */ +#define SL_ESEC_NO_PEER_KEY (-216) /* need peer's key */ +#define SL_ESEC_NO_PRIVATE_KEY (-217) /* need the private key */ +#define SL_ESEC_RSA_PRIVATE_ERROR (-218) /* error during rsa priv op */ +#define SL_ESEC_NO_DH_PARAMS (-219) /* server missing DH params */ +#define SL_ESEC_BUILD_MSG_ERROR (-220) /* build message failure */ +#define SL_ESEC_BAD_HELLO (-221) /* client hello malformed */ +#define SL_ESEC_DOMAIN_NAME_MISMATCH (-222) /* peer subject name mismatch */ +#define SL_ESEC_WANT_READ (-223) /* want read, call again */ +#define SL_ESEC_NOT_READY_ERROR (-224) /* handshake layer not ready */ +#define SL_ESEC_PMS_VERSION_ERROR (-225) /* pre m secret version error */ +#define SL_ESEC_VERSION_ERROR (-226) /* record layer version error */ +#define SL_ESEC_WANT_WRITE (-227) /* want write, call again */ +#define SL_ESEC_BUFFER_ERROR (-228) /* malformed buffer input */ +#define SL_ESEC_VERIFY_CERT_ERROR (-229) /* verify cert error */ +#define SL_ESEC_VERIFY_SIGN_ERROR (-230) /* verify sign error */ + +#define SL_ESEC_LENGTH_ERROR (-241) /* record layer length error */ +#define SL_ESEC_PEER_KEY_ERROR (-242) /* can't decode peer key */ +#define SL_ESEC_ZERO_RETURN (-243) /* peer sent close notify */ +#define SL_ESEC_SIDE_ERROR (-244) /* wrong client/server type */ +#define SL_ESEC_NO_PEER_CERT (-245) /* peer didn't send key */ +#define SL_ESEC_ECC_CURVETYPE_ERROR (-250) /* Bad ECC Curve Type */ +#define SL_ESEC_ECC_CURVE_ERROR (-251) /* Bad ECC Curve */ +#define SL_ESEC_ECC_PEERKEY_ERROR (-252) /* Bad Peer ECC Key */ +#define SL_ESEC_ECC_MAKEKEY_ERROR (-253) /* Bad Make ECC Key */ +#define SL_ESEC_ECC_EXPORT_ERROR (-254) /* Bad ECC Export Key */ +#define SL_ESEC_ECC_SHARED_ERROR (-255) /* Bad ECC Shared Secret */ +#define SL_ESEC_NOT_CA_ERROR (-257) /* Not a CA cert error */ +#define SL_ESEC_BAD_PATH_ERROR (-258) /* Bad path for opendir */ +#define SL_ESEC_BAD_CERT_MANAGER_ERROR (-259) /* Bad Cert Manager */ +#define SL_ESEC_MAX_CHAIN_ERROR (-268) /* max chain depth exceeded */ +#define SL_ESEC_SUITES_ERROR (-271) /* suites pointer error */ +#define SL_ESEC_SSL_NO_PEM_HEADER (-272) /* no PEM header found */ +#define SL_ESEC_OUT_OF_ORDER_E (-273) /* out of order message */ +#define SL_ESEC_SANITY_CIPHER_E (-275) /* sanity check on cipher error */ +#define SL_ESEC_GEN_COOKIE_E (-277) /* Generate Cookie Error */ +#define SL_ESEC_NO_PEER_VERIFY (-278) /* Need peer cert verify Error */ +#define SL_ESEC_UNKNOWN_SNI_HOST_NAME_E (-281) /* Unrecognized host name Error */ +/* begin negotiation parameter errors */ +#define SL_ESEC_UNSUPPORTED_SUITE (-290) /* unsupported cipher suite */ +#define SL_ESEC_MATCH_SUITE_ERROR (-291 ) /* can't match cipher suite */ + +/* ssl tls security start with -300 offset */ +const int16_t SL_ESEC_CLOSE_NOTIFY = (-300); /* ssl/tls alerts */ +const int16_t SL_ESEC_UNEXPECTED_MESSAGE = (-310); /* ssl/tls alerts */ +const int16_t SL_ESEC_BAD_RECORD_MAC = (-320); /* ssl/tls alerts */ +const int16_t SL_ESEC_DECRYPTION_FAILED = (-321); /* ssl/tls alerts */ +const int16_t SL_ESEC_RECORD_OVERFLOW = (-322); /* ssl/tls alerts */ +const int16_t SL_ESEC_DECOMPRESSION_FAILURE = (-330); /* ssl/tls alerts */ +const int16_t SL_ESEC_HANDSHAKE_FAILURE = (-340); /* ssl/tls alerts */ +const int16_t SL_ESEC_NO_CERTIFICATE = (-341); /* ssl/tls alerts */ +const int16_t SL_ESEC_BAD_CERTIFICATE = (-342); /* ssl/tls alerts */ +const int16_t SL_ESEC_UNSUPPORTED_CERTIFICATE = (-343); /* ssl/tls alerts */ +const int16_t SL_ESEC_CERTIFICATE_REVOKED = (-344); /* ssl/tls alerts */ +const int16_t SL_ESEC_CERTIFICATE_EXPIRED = (-345); /* ssl/tls alerts */ +const int16_t SL_ESEC_CERTIFICATE_UNKNOWN = (-346); /* ssl/tls alerts */ +const int16_t SL_ESEC_ILLEGAL_PARAMETER = (-347); /* ssl/tls alerts */ +const int16_t SL_ESEC_UNKNOWN_CA = (-348); /* ssl/tls alerts */ +const int16_t SL_ESEC_ACCESS_DENIED = (-349); /* ssl/tls alerts */ +const int16_t SL_ESEC_DECODE_ERROR = (-350); /* ssl/tls alerts */ +const int16_t SL_ESEC_DECRYPT_ERROR = (-351); /* ssl/tls alerts */ +const int16_t SL_ESEC_EXPORT_RESTRICTION = (-360); /* ssl/tls alerts */ +const int16_t SL_ESEC_PROTOCOL_VERSION = (-370); /* ssl/tls alerts */ +const int16_t SL_ESEC_INSUFFICIENT_SECURITY = (-371); /* ssl/tls alerts */ +const int16_t SL_ESEC_INTERNAL_ERROR = (-380); /* ssl/tls alerts */ +const int16_t SL_ESEC_USER_CANCELLED = (-390); /* ssl/tls alerts */ +const int16_t SL_ESEC_NO_RENEGOTIATION = (-400); /* ssl/tls alerts */ +const int16_t SL_ESEC_UNSUPPORTED_EXTENSION = (-410); /* ssl/tls alerts */ +const int16_t SL_ESEC_CERTIFICATE_UNOBTAINABLE = (-411); /* ssl/tls alerts */ +const int16_t SL_ESEC_UNRECOGNIZED_NAME = (-412); /* ssl/tls alerts */ +const int16_t SL_ESEC_BAD_CERTIFICATE_STATUS_RESPONSE = (-413); /* ssl/tls alerts */ +const int16_t SL_ESEC_BAD_CERTIFICATE_HASH_VALUE = (-414); /* ssl/tls alerts */ +/* propierty secure */ +const int16_t SL_ESECGENERAL = (-450); /* error secure level general error */ +const int16_t SL_ESECDECRYPT = (-451); /* error secure level, decrypt recv packet fail */ +const int16_t SL_ESECCLOSED = (-452); /* secure layrer is closed by other size , tcp is still connected */ +const int16_t SL_ESECSNOVERIFY = (-453); /* Connected without server verification */ +const int16_t SL_ESECNOCAFILE = (-454); /* error secure level CA file not found*/ +const int16_t SL_ESECMEMORY = (-455); /* error secure level No memory space available */ +const int16_t SL_ESECBADCAFILE = (-456); /* error secure level bad CA file */ +const int16_t SL_ESECBADCERTFILE = (-457); /* error secure level bad Certificate file */ +const int16_t SL_ESECBADPRIVATEFILE = (-458); /* error secure level bad private file */ +const int16_t SL_ESECBADDHFILE = (-459); /* error secure level bad DH file */ +const int16_t SL_ESECT00MANYSSLOPENED = (-460); /* MAX SSL Sockets are opened */ +const int16_t SL_ESECDATEERROR = (-461); /* connected with certificate date verification error */ +const int16_t SL_ESECHANDSHAKETIMEDOUT = (-462); /* connection timed out due to handshake time */ + +/* end error codes */ + +/* Max payload size by protocol */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_MASK = (0xF0); /*4 bits type, 4 bits sockets id */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV4 = (0x00); /* 1472 bytes */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV4 = (0x10); /* 1460 bytes */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV6 = (0x20); /* 1452 bytes */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV6 = (0x30); /* 1440 bytes */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV4_SECURE =(0x40); /* */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV4_SECURE =(0x50); /* */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV6_SECURE =(0x60); /* */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV6_SECURE =(0x70); /* */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_TRANCEIVER =(0x80); /* 1536 bytes */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_PACKET = (0x90); /* 1536 bytes */ +const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_IP4 = (0xa0); +const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_IP6 = (SL_SOCKET_PAYLOAD_TYPE_RAW_IP4 ); + + + +const uint8_t SL_SOL_SOCKET = (1); /* Define the socket option category. */ +const uint8_t SL_IPPROTO_IP = (2); /* Define the IP option category. */ +const uint8_t SL_SOL_PHY_OPT = (3); /* Define the PHY option category. */ + +const uint8_t SL_SO_RCVBUF = (8); /* Setting TCP receive buffer size */ +const uint8_t SL_SO_KEEPALIVE = (9); /* Connections are kept alive with periodic messages */ +const uint8_t SL_SO_RCVTIMEO = (20); /* Enable receive timeout */ +const uint8_t SL_SO_NONBLOCKING = (24); /* Enable . disable nonblocking mode */ +const uint8_t SL_SO_SECMETHOD = (25); /* security metohd */ +const uint8_t SL_SO_SECURE_MASK = (26); /* security mask */ +const uint8_t SL_SO_SECURE_FILES = (27); /* security files */ +const uint8_t SL_SO_CHANGE_CHANNEL = (28); /* This option is available only when transceiver started */ +const uint8_t SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME =(30); /* This option used to configue secure file */ +const uint8_t SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME =(31); /* This option used to configue secure file */ +const uint8_t SL_SO_SECURE_FILES_CA_FILE_NAME = (32); /* This option used to configue secure file */ +const uint8_t SL_SO_SECURE_FILES_DH_KEY_FILE_NAME = (33); /* This option used to configue secure file */ + +const uint8_t SL_IP_MULTICAST_IF = (60); /* Specify outgoing multicast interface */ +const uint8_t SL_IP_MULTICAST_TTL = (61); /* Specify the TTL value to use for outgoing multicast packet. */ +const uint8_t SL_IP_ADD_MEMBERSHIP = (65); /* Join IPv4 multicast membership */ +const uint8_t SL_IP_DROP_MEMBERSHIP= (66); /* Leave IPv4 multicast membership */ +const uint8_t SL_IP_HDRINCL = (67); /* Raw socket IPv4 header included. */ +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*/ +const uint8_t SL_IP_RAW_IPV6_HDRINCL =(69); /* Transmitted buffer over IPv6 socket contains IPv6 header. */ + +const uint8_t SL_SO_PHY_RATE = (100); /* WLAN Transmit rate */ +const uint8_t SL_SO_PHY_TX_POWER = (101); /* TX Power level */ +const uint8_t SL_SO_PHY_NUM_FRAMES_TO_TX = (102); /* Number of frames to transmit */ +const uint8_t SL_SO_PHY_PREAMBLE = (103); /* Preamble for transmission */ + +const uint8_t SL_SO_SEC_METHOD_SSLV3 = (0); /* security metohd SSL v3*/ +const uint8_t SL_SO_SEC_METHOD_TLSV1 = (1); /* security metohd TLS v1*/ +const uint8_t SL_SO_SEC_METHOD_TLSV1_1 = (2); /* security metohd TLS v1_1*/ +const uint8_t SL_SO_SEC_METHOD_TLSV1_2 = (3); /* security metohd TLS v1_2*/ +const uint8_t SL_SO_SEC_METHOD_SSLv3_TLSV1_2 = (4); /* use highest possible version from SSLv3 - TLS 1.2*/ +const uint8_t SL_SO_SEC_METHOD_DLSV1 = (5); /* security metohd DTL v1 */ + +#define SL_SEC_MASK_SSL_RSA_WITH_RC4_128_SHA (1 << 0) +#define SL_SEC_MASK_SSL_RSA_WITH_RC4_128_MD5 (1 << 1) +#define SL_SEC_MASK_TLS_RSA_WITH_AES_256_CBC_SHA (1 << 2) +#define SL_SEC_MASK_TLS_DHE_RSA_WITH_AES_256_CBC_SHA (1 << 3) +#define SL_SEC_MASK_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (1 << 4) +#define SL_SEC_MASK_TLS_ECDHE_RSA_WITH_RC4_128_SHA (1 << 5) +#define SL_SEC_MASK_TLS_RSA_WITH_AES_128_CBC_SHA256 (1 << 6) +#define SL_SEC_MASK_TLS_RSA_WITH_AES_256_CBC_SHA256 (1 << 7) +#define SL_SEC_MASK_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (1 << 8) +#define SL_SEC_MASK_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (1 << 9) + +#define SL_SEC_MASK_SECURE_DEFAULT ((SL_SEC_MASK_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 << 1) - 1) + +const uint32_t SL_MSG_DONTWAIT = (0x00000008); /* Nonblocking IO */ + +/* AP DHCP Server - IP Release reason code */ +const uint8_t SL_IP_LEASE_PEER_RELEASE = (0); +const uint8_t SL_IP_LEASE_PEER_DECLINE = (1); +const uint8_t SL_IP_LEASE_EXPIRED = (2); + +/* possible types when receiving SL_SOCKET_ASYNC_EVENT*/ +const uint8_t SSL_ACCEPT = (1); /* accept failed due to ssl issue ( tcp pass) */ +const uint8_t RX_FRAGMENTATION_TOO_BIG = (2); /* connection less mode, rx packet fragmentation > 16K, packet is being released */ +const uint8_t OTHER_SIDE_CLOSE_SSL_DATA_NOT_ENCRYPTED = (3); /* remote side down from secure to unsecure */ + + + +#ifdef SL_INC_STD_BSD_API_NAMING + +#define FD_SETSIZE SL_FD_SETSIZE + +#define SOCK_STREAM SL_SOCK_STREAM +#define SOCK_DGRAM SL_SOCK_DGRAM +#define SOCK_RAW SL_SOCK_RAW +#define IPPROTO_TCP SL_IPPROTO_TCP +#define IPPROTO_UDP SL_IPPROTO_UDP +#define IPPROTO_RAW SL_IPPROTO_RAW + +#define AF_INET6_EUI_48 SL_AF_INET6_EUI_48 +#define AF_RF SL_AF_RF +#define AF_PACKET SL_AF_PACKET + +#define PF_INET SL_PF_INET +#define PF_INET6 SL_PF_INET6 + +#define INADDR_ANY SL_INADDR_ANY +#define ERROR SL_SOC_ERROR +#define INEXE SL_INEXE +#define EBADF SL_EBADF +#define ENSOCK SL_ENSOCK +#define EAGAIN SL_EAGAIN +#define EWOULDBLOCK SL_EWOULDBLOCK +#define ENOMEM SL_ENOMEM +#define EACCES SL_EACCES +#define EFAULT SL_EFAULT +#define EINVAL SL_EINVAL +#define EDESTADDRREQ SL_EDESTADDRREQ +#define EPROTOTYPE SL_EPROTOTYPE +#define ENOPROTOOPT SL_ENOPROTOOPT +#define EPROTONOSUPPORT SL_EPROTONOSUPPORT +#define ESOCKTNOSUPPORT SL_ESOCKTNOSUPPORT +#define EOPNOTSUPP SL_EOPNOTSUPP +#define EAFNOSUPPORT SL_EAFNOSUPPORT +#define EADDRINUSE SL_EADDRINUSE +#define EADDRNOTAVAIL SL_EADDRNOTAVAIL +#define ENETUNREACH SL_ENETUNREACH +#define ENOBUFS SL_ENOBUFS +#define EOBUFF SL_EOBUFF +#define EISCONN SL_EISCONN +#define ENOTCONN SL_ENOTCONN +#define ETIMEDOUT SL_ETIMEDOUT +#define ECONNREFUSED SL_ECONNREFUSED + +#define SOL_SOCKET SL_SOL_SOCKET +#define IPPROTO_IP SL_IPPROTO_IP +#define SO_KEEPALIVE SL_SO_KEEPALIVE + +#define SO_RCVTIMEO SL_SO_RCVTIMEO +#define SO_NONBLOCKING SL_SO_NONBLOCKING + +#define IP_MULTICAST_IF SL_IP_MULTICAST_IF +#define IP_MULTICAST_TTL SL_IP_MULTICAST_TTL +#define IP_ADD_MEMBERSHIP SL_IP_ADD_MEMBERSHIP +#define IP_DROP_MEMBERSHIP SL_IP_DROP_MEMBERSHIP + +#define socklen_t SlSocklen_t +#define timeval SlTimeval_t +#define sockaddr SlSockAddr_t +#define in6_addr SlIn6Addr_t +#define sockaddr_in6 SlSockAddrIn6_t +#define in_addr SlInAddr_t +#define sockaddr_in SlSockAddrIn_t + +#define MSG_DONTWAIT SL_MSG_DONTWAIT + +#define FD_SET SL_FD_SET +#define FD_CLR SL_FD_CLR +#define FD_ISSET SL_FD_ISSET +#define FD_ZERO SL_FD_ZERO +#define fd_set SlFdSet_t + +#define socket sl_Socket +#define close sl_Close +#define accept sl_Accept +#define bind sl_Bind +#define listen sl_Listen +#define connect sl_Connect +#define select sl_Select +#define setsockopt sl_SetSockOpt +#define getsockopt sl_GetSockOpt +#define recv sl_Recv +#define recvfrom sl_RecvFrom +#define write_ sl_Write +#define send sl_Send +#define sendto sl_SendTo +#define gethostbyname sl_NetAppDnsGetHostByName +#define htonl sl_Htonl +#define ntohl sl_Ntohl +#define htons sl_Htons +#define ntohs sl_Ntohs +#endif + + +/*****************************************************************************/ +/* Structure/Enum declarations */ +/*****************************************************************************/ + +/* Internet address */ +typedef struct SlInAddr_t { +#ifndef s_addr + uint32_t s_addr; /* Internet address 32 bits */ +#else + union S_un { + struct { + uint8_t s_b1,s_b2,s_b3,s_b4; + } S_un_b; + struct { + uint8_t s_w1,s_w2; + } S_un_w; + uint32_t S_addr; + } S_un; +#endif +} SlInAddr_t; + + +/* sockopt */ +typedef struct { + uint32_t KeepaliveEnabled; /* 0 = disabled;1 = enabled; default = 1*/ +} SlSockKeepalive_t; + +typedef struct { + uint32_t ReuseaddrEnabled; /* 0 = disabled; 1 = enabled; default = 1*/ +} SlSockReuseaddr_t; + +typedef struct { + uint32_t Winsize; /* receive window size for tcp sockets */ +} SlSockWinsize_t; + +typedef struct { + uint32_t NonblockingEnabled;/* 0 = disabled;1 = enabled;default = 1*/ +} SlSockNonblocking_t; + +typedef struct { + uint8_t sd; + uint8_t type; + uint16_t val; + uint8_t* pExtraInfo; +} SlSocketAsyncEvent_t; + +typedef struct { + int16_t status; + uint8_t sd; + uint8_t padding; +} SlSockTxFailEventData_t; + + +typedef union +{ + SlSockTxFailEventData_t SockTxFailData; + SlSocketAsyncEvent_t SockAsyncData; +} SlSockEventData_u; + + +typedef struct { + uint32_t Event; + SlSockEventData_u socketAsyncEvent; +} SlSockEvent_t; + + +typedef struct { + uint32_t secureMask; +} SlSockSecureMask; + +typedef struct { + uint8_t secureMethod; +} SlSockSecureMethod; + +typedef enum { + SL_BSD_SECURED_PRIVATE_KEY_IDX = 0, + SL_BSD_SECURED_CERTIFICATE_IDX, + SL_BSD_SECURED_CA_IDX, + SL_BSD_SECURED_DH_IDX +} slBsd_secureSocketFilesIndex_e; + +typedef struct { + SlInAddr_t imr_multiaddr; /* The IPv4 multicast address to join */ + SlInAddr_t imr_interface; /* The interface to use for this group */ +} SlSockIpMreq; + + +/* sockopt */ +typedef uint32_t SlTime_t; +typedef uint32_t SlSuseconds_t; + +typedef struct { + SlTime_t tv_sec; /* Seconds */ + SlSuseconds_t tv_usec; /* Microseconds */ +} SlTimeval_t; + +typedef uint16_t SlSocklen_t; + +/* IpV4 socket address */ +typedef struct { + uint16_t sa_family; /* Address family (e.g. , AF_INET) */ + uint8_t sa_data[14]; /* Protocol- specific address information*/ +} SlSockAddr_t; + + +/* IpV6 or Ipv6 EUI64 */ +typedef struct { + union { + uint8_t _S6_u8[16]; + uint32_t _S6_u32[4]; + } _S6_un; +} SlIn6Addr_t; + +typedef struct { + uint16_t sin6_family; /* AF_INET6 || AF_INET6_EUI_48*/ + uint16_t sin6_port; /* Transport layer port. */ + uint32_t sin6_flowinfo; /* IPv6 flow information. */ + SlIn6Addr_t sin6_addr; /* IPv6 address. */ + uint32_t sin6_scope_id; /* set of interfaces for a scope. */ +} SlSockAddrIn6_t; + +/* Socket address, Internet style. */ + +typedef struct { + uint16_t sin_family; /* Internet Protocol (AF_INET). */ + uint16_t sin_port; /* Address port (16 bits). */ + SlInAddr_t sin_addr; /* Internet address (32 bits). */ + int8_t sin_zero[8]; /* Not used. */ +} SlSockAddrIn_t; + +typedef struct { + uint32_t ip; + uint32_t gateway; + uint32_t dns; +} SlIpV4AcquiredAsync_t; + +typedef struct { + uint32_t type; + uint32_t ip[4]; + uint32_t gateway[4]; + uint32_t dns[4]; +} SlIpV6AcquiredAsync_t; + +typedef struct { + uint32_t ip_address; + uint32_t lease_time; + uint8_t mac[6]; + uint16_t padding; +} SlIpLeasedAsync_t; + +typedef struct { + uint32_t ip_address; + uint8_t mac[6]; + uint16_t reason; +} SlIpReleasedAsync_t; + + +typedef union { + SlIpV4AcquiredAsync_t ipAcquiredV4; /*SL_NETAPP_IPV4_IPACQUIRED_EVENT*/ + SlIpV6AcquiredAsync_t ipAcquiredV6; /*SL_NETAPP_IPV6_IPACQUIRED_EVENT*/ + uint32_t sd; /*SL_SOCKET_TX_FAILED_EVENT*/ + SlIpLeasedAsync_t ipLeased; /* SL_NETAPP_IP_LEASED_EVENT */ + SlIpReleasedAsync_t ipReleased; /* SL_NETAPP_IP_RELEASED_EVENT */ +} SlNetAppEventData_u; + +typedef struct { + uint32_t Event; + SlNetAppEventData_u EventData; +} SlNetAppEvent_t; + + +typedef struct sock_secureFiles { + uint8_t secureFiles[4]; +} SlSockSecureFiles_t; + + +typedef struct SlFdSet_t { /* The select socket array manager */ + uint32_t fd_array[(SL_FD_SETSIZE + 31)/32]; /* Bit map of SOCKET Descriptors */ +} SlFdSet_t; + +typedef struct { + uint8_t rate; /* Recevied Rate */ + uint8_t channel; /* The received channel*/ + int8_t rssi; /* The computed RSSI value in db of current frame */ + uint8_t padding; /* pad to align to 32 bits */ + uint32_t timestamp; /* Timestamp in microseconds, */ +} SlTransceiverRxOverHead_t; + +class cc3100_nonos; + +class cc3100_socket +{ + +public: + + cc3100_socket(cc3100_driver &driver, cc3100_nonos &nonos); + + ~cc3100_socket(); + + /*******************************************************************************/ + /* Functions prototypes */ + /*******************************************************************************/ + void _sl_BuildAddress(const SlSockAddr_t *addr, _SocketAddrCommand_u *pCmd); + void _sl_ParseAddress(_SocketAddrResponse_u *pRsp, SlSockAddr_t *addr, SlSocklen_t *addrlen); + uint16_t _sl_TruncatePayloadByProtocol(const int16_t pSd,const uint16_t length); + + /*****************************************************************************/ + /* Function prototypes */ + /*****************************************************************************/ + + /*! + + \brief create an endpoint for communication + + The socket function creates a new socket of a certain socket type, identified + by an integer number, and allocates system resources to it. + This function is called by the application layer to obtain a socket handle. + + \param[in] domain specifies the protocol family of the created socket. + For example: + AF_INET for network protocol IPv4 + AF_RF for starting transceiver mode. Notes: + - sending and receiving any packet overriding 802.11 header + - for optimized power consumption the socket will be started in TX + only mode until receive command is activated + AF_INET6 for IPv6 + + + \param[in] type specifies the communication semantic, one of: + SOCK_STREAM (reliable stream-oriented service or Stream Sockets) + SOCK_DGRAM (datagram service or Datagram Sockets) + SOCK_RAW (raw protocols atop the network layer) + when used with AF_RF: + SOCK_DGRAM - L2 socket + SOCK_RAW - L1 socket - bypass WLAN CCA (Clear Channel Assessment) + + \param[in] protocol specifies a particular transport to be used with + the socket. + The most common are IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, + IPPROTO_DCCP. + The value 0 may be used to select a default + protocol from the selected domain and type + + + \return On success, socket handle that is used for consequent socket operations. + A successful return code should be a positive number (int16) + On error, a negative (int16) value will be returned specifying the error code. + SL_EAFNOSUPPORT - illegal domain parameter + SL_EPROTOTYPE - illegal type parameter + SL_EACCES - permission denied + SL_ENSOCK - exceeded maximal number of socket + SL_ENOMEM - memory allocation error + SL_EINVAL - error in socket configuration + SL_EPROTONOSUPPORT - illegal protocol parameter + SL_EOPNOTSUPP - illegal combination of protocol and type parameters + + + \sa sl_Close + \note belongs to \ref basic_api + \warning + */ +#if _SL_INCLUDE_FUNC(sl_Socket) + int16_t sl_Socket(int16_t Domain, int16_t Type, int16_t Protocol); +#endif + + /*! + \brief gracefully close socket + + This function causes the system to release resources allocated to a socket. \n + In case of TCP, the connection is terminated. + + \param[in] sd socket handle (received in sl_Socket) + + \return On success, zero is returned. + On error, a negative number is returned. + + \sa sl_Socket + \note belongs to \ref ext_api + \warning + */ +#if _SL_INCLUDE_FUNC(sl_Close) + int16_t sl_Close(int16_t sd); +#endif + + /*! + \brief Accept a connection on a socket + + This function is used with connection-based socket types (SOCK_STREAM). + It extracts the first connection request on the queue of pending + connections, creates a new connected socket, and returns a new file + descriptor referring to that socket. + The newly created socket is not in the listening state. The + original socket sd is unaffected by this call. + The argument sd is a socket that has been created with + sl_Socket(), bound to a local address with sl_Bind(), and is + listening for connections after a sl_Listen(). The argument \b + \e addr is a pointer to a sockaddr structure. This structure + is filled in with the address of the peer socket, as known to + the communications layer. The exact format of the address + returned addr is determined by the socket's address family. + The \b \e addrlen argument is a value-result argument: it + should initially contain the size of the structure pointed to + by addr, on return it will contain the actual length (in + bytes) of the address returned. + + \param[in] sd socket descriptor (handle) + \param[out] addr the argument addr is a pointer + to a sockaddr structure. This + structure is filled in with the + address of the peer socket, as + known to the communications + layer. The exact format of the + address returned addr is + determined by the socket's + address\n + sockaddr:\n - code for the + address format. On this version + only AF_INET is supported.\n - + socket address, the length + depends on the code format + \param[out] addrlen the addrlen argument is a value-result + argument: it should initially contain the + size of the structure pointed to by addr + + \return On success, a socket handle. + On a non-blocking accept a possible negative value is SL_EAGAIN. + On failure, negative value. + SL_POOL_IS_EMPTY may be return in case there are no resources in the system + In this case try again later or increase MAX_CONCURRENT_ACTIONS + + \sa sl_Socket sl_Bind sl_Listen + \note belongs to \ref server_side + \warning + */ +#if _SL_INCLUDE_FUNC(sl_Accept) + int16_t sl_Accept(int16_t sd, SlSockAddr_t *addr, SlSocklen_t *addrlen); +#endif + + /*! + \brief assign a name to a socket + + This function gives the socket the local address addr. + addr is addrlen bytes long. Traditionally, this is called + When a socket is created with socket, it exists in a name + space (address family) but has no name assigned. + It is necessary to assign a local address before a SOCK_STREAM + socket may receive connections. + + \param[in] sd socket descriptor (handle) + \param[in] addr specifies the destination + addrs\n sockaddr:\n - code for + the address format. On this + version only AF_INET is + supported.\n - socket address, + the length depends on the code + format + \param[in] addrlen contains the size of the structure pointed to by addr + + \return On success, zero is returned. On error, a negative error code is returned. + + \sa sl_Socket sl_Accept sl_Listen + \note belongs to \ref basic_api + \warning + */ +#if _SL_INCLUDE_FUNC(sl_Bind) + int16_t sl_Bind(int16_t sd, const SlSockAddr_t *addr, int16_t addrlen); +#endif + + /*! + \brief listen for connections on a socket + + The willingness to accept incoming connections and a queue + limit for incoming connections are specified with listen(), + and then the connections are accepted with accept. + The listen() call applies only to sockets of type SOCK_STREAM + The backlog parameter defines the maximum length the queue of + pending connections may grow to. + + \param[in] sd socket descriptor (handle) + \param[in] backlog specifies the listen queue depth. + + + \return On success, zero is returned. On error, a negative error code is returned. + + \sa sl_Socket sl_Accept sl_Bind + \note belongs to \ref server_side + \warning + */ +#if _SL_INCLUDE_FUNC(sl_Listen) + int16_t sl_Listen(int16_t sd, int16_t backlog); +#endif + + /*! + \brief Initiate a connection on a socket + + Function connects the socket referred to by the socket + descriptor sd, to the address specified by addr. The addrlen + argument specifies the size of addr. The format of the + address in addr is determined by the address space of the + socket. If it is of type SOCK_DGRAM, this call specifies the + peer with which the socket is to be associated; this address + is that to which datagrams are to be sent, and the only + address from which datagrams are to be received. If the + socket is of type SOCK_STREAM, this call attempts to make a + connection to another socket. The other socket is specified + by address, which is an address in the communications space + of the socket. + + + \param[in] sd socket descriptor (handle) + \param[in] addr specifies the destination addr\n + sockaddr:\n - code for the + address format. On this version + only AF_INET is supported.\n - + socket address, the length + depends on the code format + + \param[in] addrlen contains the size of the structure pointed + to by addr + + \return On success, a socket handle. + On a non-blocking connect a possible negative value is SL_EALREADY. + On failure, negative value. + SL_POOL_IS_EMPTY may be return in case there are no resources in the system + In this case try again later or increase MAX_CONCURRENT_ACTIONS + + \sa sl_Socket + \note belongs to \ref client_side + \warning + */ +#if _SL_INCLUDE_FUNC(sl_Connect) + int16_t sl_Connect(int16_t sd, const SlSockAddr_t *addr, int16_t addrlen); +#endif + + /*! + \brief Monitor socket activity + + Select allow a program to monitor multiple file descriptors, + waiting until one or more of the file descriptors become + "ready" for some class of I/O operation + + + \param[in] nfds the highest-numbered file descriptor in any of the + three sets, plus 1. + \param[out] readsds socket descriptors list for read monitoring and accept monitoring + \param[out] writesds socket descriptors list for connect monitoring only, write monitoring is not supported, non blocking connect is supported + \param[out] exceptsds socket descriptors list for exception monitoring, not supported. + \param[in] timeout is an upper bound on the amount of time elapsed + before select() returns. Null or above 0xffff seconds means + infinity timeout. The minimum timeout is 10 milliseconds, + less than 10 milliseconds will be set automatically to 10 milliseconds. + Max microseconds supported is 0xfffc00. + + \return On success, select() returns the number of + file descriptors contained in the three returned + descriptor sets (that is, the total number of bits that + are set in readfds, writefds, exceptfds) which may be + zero if the timeout expires before anything interesting + happens. On error, a negative value is returned. + readsds - return the sockets on which Read request will + return without delay with valid data. + writesds - return the sockets on which Write request + will return without delay. + exceptsds - return the sockets closed recently. + SL_POOL_IS_EMPTY may be return in case there are no resources in the system + In this case try again later or increase MAX_CONCURRENT_ACTIONS + + \sa sl_Socket + \note If the timeout value set to less than 5ms it will automatically set + to 5ms to prevent overload of the system + belongs to \ref basic_api + + Only one sl_Select can be handled at a time. + Calling this API while the same command is called from another thread, may result + in one of the two scenarios: + 1. The command will wait (internal) until the previous command finish, and then be executed. + 2. There are not enough resources and SL_POOL_IS_EMPTY error will return. + In this case, MAX_CONCURRENT_ACTIONS can be increased (result in memory increase) or try + again later to issue the command. + + \warning + */ +#if _SL_INCLUDE_FUNC(sl_Select) + int16_t sl_Select(int16_t nfds, SlFdSet_t *readsds, SlFdSet_t *writesds, SlFdSet_t *exceptsds, SlTimeval_t *timeout); + + + /*! + \brief Select's SlFdSet_t SET function + + Sets current socket descriptor on SlFdSet_t container + */ + void SL_FD_SET(int16_t fd, SlFdSet_t *fdset); + + /*! + \brief Select's SlFdSet_t CLR function + + Clears current socket descriptor on SlFdSet_t container + */ + void SL_FD_CLR(int16_t fd, SlFdSet_t *fdset); + + + /*! + \brief Select's SlFdSet_t ISSET function + + Checks if current socket descriptor is set (TRUE/FALSE) + + \return Returns TRUE if set, FALSE if unset + + */ + int16_t SL_FD_ISSET(int16_t fd, SlFdSet_t *fdset); + + /*! + \brief Select's SlFdSet_t ZERO function + + Clears all socket descriptors from SlFdSet_t + */ + void SL_FD_ZERO(SlFdSet_t *fdset); + + + +#endif + + /*! + \brief set socket options + + This function manipulate the options associated with a socket. + Options may exist at multiple protocol levels; they are always + present at the uppermost socket level. + + When manipulating socket options the level at which the option resides + and the name of the option must be specified. To manipulate options at + the socket level, level is specified as SOL_SOCKET. To manipulate + options at any other level the protocol number of the appropriate proto- + col controlling the option is supplied. For example, to indicate that an + option is to be interpreted by the TCP protocol, level should be set to + the protocol number of TCP; + + The parameters optval and optlen are used to access optval - + ues for setsockopt(). For getsockopt() they identify a + buffer in which the value for the requested option(s) are to + be returned. For getsockopt(), optlen is a value-result + parameter, initially containing the size of the buffer + pointed to by option_value, and modified on return to + indicate the actual size of the value returned. If no option + value is to be supplied or returned, option_value may be + NULL. + + \param[in] sd socket handle + \param[in] level defines the protocol level for this option + - <b>SL_SOL_SOCKET</b> Socket level configurations (L4, transport layer) + - <b>SL_IPPROTO_IP</b> IP level configurations (L3, network layer) + - <b>SL_SOL_PHY_OPT</b> Link level configurations (L2, link layer) + \param[in] optname defines the option name to interrogate + - <b>SL_SOL_SOCKET</b> + - <b>SL_SO_KEEPALIVE</b> \n + Enable/Disable periodic keep alive. + Keeps TCP connections active by enabling the periodic transmission of messages \n + Timeout is 5 minutes.\n + Default: Enabled \n + This options takes SlSockKeepalive_t struct as parameter + - <b>SL_SO_RCVTIMEO</b> \n + Sets the timeout value that specifies the maximum amount of time an input function waits until it completes. \n + Default: No timeout \n + This options takes SlTimeval_t struct as parameter + - <b>SL_SO_RCVBUF</b> \n + Sets tcp max recv window size. \n + This options takes SlSockWinsize_t struct as parameter + - <b>SL_SO_NONBLOCKING</b> \n + Sets socket to non-blocking operation Impacts: connect, accept, send, sendto, recv and recvfrom. \n + Default: Blocking. + This options takes SlSockNonblocking_t struct as parameter + - <b>SL_SO_SECMETHOD</b> \n + Sets method to tcp secured socket (SL_SEC_SOCKET) \n + Default: SL_SO_SEC_METHOD_SSLv3_TLSV1_2 \n + This options takes SlSockSecureMethod struct as parameter + - <b>SL_SO_SEC_MASK</b> \n + Sets specific cipher to tcp secured socket (SL_SEC_SOCKET) \n + Default: "Best" cipher suitable to method \n + This options takes SlSockSecureMask struct as parameter + - <b>SL_SO_SECURE_FILES_CA_FILE_NAME</b> \n + Map secured socket to CA file by name \n + This options takes <b>uint8_t</b> buffer as parameter + - <b>SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME</b> \n + Map secured socket to private key by name \n + This options takes <b>uint8_t</b> buffer as parameter + - <b>SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME</b> \n + Map secured socket to certificate file by name \n + This options takes <b>uint8_t</b> buffer as parameter + - <b>SL_SO_SECURE_FILES_DH_KEY_FILE_NAME</b> \n + Map secured socket to Diffie Hellman file by name \n + This options takes <b>uint8_t</b> buffer as parameter + - <b>SL_SO_CHANGE_CHANNEL</b> \n + Sets channel in transceiver mode. + This options takes <b>uint32_t</b> as channel number parameter + - <b>SL_IPPROTO_IP</b> + - <b>SL_IP_MULTICAST_TTL</b> \n + Set the time-to-live value of outgoing multicast packets for this socket. \n + This options takes <b>uint8_t</b> as parameter + - <b>SL_IP_ADD_MEMBERSHIP</b> \n + UDP socket, Join a multicast group. \n + This options takes SlSockIpMreq struct as parameter + - <b>SL_IP_DROP_MEMBERSHIP</b> \n + UDP socket, Leave a multicast group \n + This options takes SlSockIpMreq struct as parameter + - <b>SL_IP_RAW_RX_NO_HEADER</b> \n + Raw socket remove IP header from received data. \n + Default: data includes ip header \n + This options takes <b>uint32_t</b> as parameter + - <b>SL_IP_HDRINCL</b> \n + RAW socket only, the IPv4 layer generates an IP header when sending a packet unless \n + the IP_HDRINCL socket option is enabled on the socket. \n + When it is enabled, the packet must contain an IP header. \n + Default: disabled, IPv4 header generated by Network Stack \n + This options takes <b>uint32_t</b> as parameter + - <b>SL_IP_RAW_IPV6_HDRINCL</b> (inactive) \n + RAW socket only, the IPv6 layer generates an IP header when sending a packet unless \n + the IP_HDRINCL socket option is enabled on the socket. When it is enabled, the packet must contain an IP header \n + Default: disabled, IPv4 header generated by Network Stack \n + This options takes <b>uint32_t</b> as parameter + - <b>SL_SOL_PHY_OPT</b> + - <b>SL_SO_PHY_RATE</b> \n + RAW socket, set WLAN PHY transmit rate \n + The values are based on RateIndex_e \n + This options takes <b>uint32_t</b> as parameter + - <b>SL_SO_PHY_TX_POWER</b> \n + RAW socket, set WLAN PHY TX power \n + Valid rage is 1-15 \n + This options takes <b>uint32_t</b> as parameter + - <b>SL_SO_PHY_NUM_FRAMES_TO_TX</b> \n + RAW socket, set number of frames to transmit in transceiver mode. + Default: 1 packet + This options takes <b>uint32_t</b> as parameter + - <b>SL_SO_PHY_PREAMBLE</b> \n + RAW socket, set WLAN PHY preamble for Long/Short\n + This options takes <b>uint32_t</b> as parameter + + \param[in] optval specifies a value for the option + \param[in] optlen specifies the length of the + option value + + \return On success, zero is returned. + On error, a negative value is returned. + \sa sl_getsockopt + \note belongs to \ref basic_api + \warning + \par Examples: + \par + <b> SL_SO_KEEPALIVE: </b>(disable Keepalive) + \code + SlSockKeepalive_t enableOption; + enableOption.KeepaliveEnabled = 0; + sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_KEEPALIVE, (uint8_t *)&enableOption,sizeof(enableOption)); + \endcode + \par + <b> SL_SO_RCVTIMEO: </b> + \code + struct SlTimeval_t timeVal; + timeVal.tv_sec = 1; // Seconds + timeVal.tv_usec = 0; // Microseconds. 10000 microseconds resolution + sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_RCVTIMEO, (uint8_t *)&timeVal, sizeof(timeVal)); // Enable receive timeout + \endcode + \par + <b> SL_SO_RCVBUF: </b> + \code + SlSockWinsize_t size; + size.Winsize = 3000; // bytes + sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_RCVBUF, (uint8_t *)&size, sizeof(size)); + \endcode + \par + <b> SL_SO_NONBLOCKING: </b> + \code + SlSockNonblocking_t enableOption; + enableOption.NonblockingEnabled = 1; + sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_NONBLOCKING, (uint8_t *)&enableOption,sizeof(enableOption)); // Enable/disable nonblocking mode + \endcode + \par + <b> SL_SO_SECMETHOD:</b> + \code + SlSockSecureMethod method; + method.secureMethod = SL_SO_SEC_METHOD_SSLV3; // security method we want to use + SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET); + sl_SetSockOpt(SockID, SL_SOL_SOCKET, SL_SO_SECMETHOD, (uint8_t *)&method, sizeof(method)); + \endcode + \par + <b> SL_SO_SECURE_MASK:</b> + \code + SlSockSecureMask cipher; + cipher.secureMask = SL_SEC_MASK_SSL_RSA_WITH_RC4_128_SHA; // cipher type + SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET); + sl_SetSockOpt(SockID, SL_SOL_SOCKET, SL_SO_SEC_MASK,(uint8_t *)&cipher, sizeof(cipher)); + \endcode + \par + <b> SL_SO_SECURE_FILES_CA_FILE_NAME:</b> + \code + sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_CA_FILE_NAME,"exuifaxCaCert.der",strlen("exuifaxCaCert.der")); + \endcode + + \par + <b> SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME:</b> + \code + sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME,"myPrivateKey.der",strlen("myPrivateKey.der")); + \endcode + + \par + <b> SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME:</b> + \code + sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME,"myCertificate.der",strlen("myCertificate.der")); + \endcode + + \par + <b> SL_SO_SECURE_FILES_DH_KEY_FILE_NAME:</b> + \code + sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_DH_KEY_FILE_NAME,"myDHinServerMode.der",strlen("myDHinServerMode.der")); + \endcode + + \par + <b> SL_IP_MULTICAST_TTL:</b> + \code + uint8_t ttl = 20; + sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_MULTICAST_TTL, &ttl, sizeof(ttl)); + \endcode + + \par + <b> SL_IP_ADD_MEMBERSHIP:</b> + \code + SlSockIpMreq mreq; + sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); + \endcode + + \par + <b> SL_IP_DROP_MEMBERSHIP:</b> + \code + SlSockIpMreq mreq; + sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); + \endcode + + \par + <b> SL_SO_CHANGE_CHANNEL:</b> + \code + uint32_t newChannel = 6; // range is 1-13 + sl_SetSockOpt(SockID, SL_SOL_SOCKET, SL_SO_CHANGE_CHANNEL, &newChannel, sizeof(newChannel)); + \endcode + + \par + <b> SL_IP_RAW_RX_NO_HEADER:</b> + \code + uint32_t header = 1; // remove ip header + sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_RAW_RX_NO_HEADER, &header, sizeof(header)); + \endcode + + \par + <b> SL_IP_HDRINCL:</b> + \code + uint32_t header = 1; + sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_HDRINCL, &header, sizeof(header)); + \endcode + \par + <b> SL_IP_RAW_IPV6_HDRINCL:</b> + \code + uint32_t header = 1; + sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_RAW_IPV6_HDRINCL, &header, sizeof(header)); + \endcode + + \par + <b> SL_SO_PHY_RATE:</b> + \code + uint32_t rate = 6; // see wlan.h RateIndex_e for values + sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_RATE, &rate, sizeof(rate)); + \endcode + + \par + <b> SL_SO_PHY_TX_POWER:</b> + \code + uint32_t txpower = 1; // valid range is 1-15 + sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_TX_POWER, &txpower, sizeof(txpower)); + \endcode + + \par + <b> SL_SO_PHY_NUM_FRAMES_TO_TX:</b> + \code + uint32_t numframes = 1; + sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_NUM_FRAMES_TO_TX, &numframes, sizeof(numframes)); + \endcode + + \par + <b> SL_SO_PHY_PREAMBLE:</b> + \code + uint32_t preamble = 1; + sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_PREAMBLE, &preamble, sizeof(preamble)); + \endcode + + */ +#if _SL_INCLUDE_FUNC(sl_SetSockOpt) + int16_t sl_SetSockOpt(int16_t sd, int16_t level, int16_t optname, const void *optval, SlSocklen_t optlen); +#endif + + /*! + \brief Get socket options + + This function manipulate the options associated with a socket. + Options may exist at multiple protocol levels; they are always + present at the uppermost socket level. + + When manipulating socket options the level at which the option resides + and the name of the option must be specified. To manipulate options at + the socket level, level is specified as SOL_SOCKET. To manipulate + options at any other level the protocol number of the appropriate proto- + col controlling the option is supplied. For example, to indicate that an + option is to be interpreted by the TCP protocol, level should be set to + the protocol number of TCP; + + The parameters optval and optlen are used to access optval - + ues for setsockopt(). For getsockopt() they identify a + buffer in which the value for the requested option(s) are to + be returned. For getsockopt(), optlen is a value-result + parameter, initially containing the size of the buffer + pointed to by option_value, and modified on return to + indicate the actual size of the value returned. If no option + value is to be supplied or returned, option_value may be + NULL. + + + \param[in] sd socket handle + \param[in] level defines the protocol level for this option + \param[in] optname defines the option name to interrogate + \param[out] optval specifies a value for the option + \param[out] optlen specifies the length of the + option value + + \return On success, zero is returned. + On error, a negative value is returned. + \sa sl_SetSockOpt + \note See sl_SetSockOpt + belongs to \ref ext_api + \warning + */ +#if _SL_INCLUDE_FUNC(sl_GetSockOpt) + int16_t sl_GetSockOpt(int16_t sd, int16_t level, int16_t optname, void *optval, SlSocklen_t *optlen); +#endif + + /*! + \brief read data from TCP socket + + function receives a message from a connection-mode socket + + \param[in] sd socket handle + \param[out] buf Points to the buffer where the + message should be stored. + \param[in] Len Specifies the length in bytes of + the buffer pointed to by the buffer argument. + Range: 1-16000 bytes + \param[in] flags Specifies the type of message + reception. On this version, this parameter is not + supported. + + \return return the number of bytes received, + or a negative value if an error occurred. + using a non-blocking recv a possible negative value is SL_EAGAIN. + SL_POOL_IS_EMPTY may be return in case there are no resources in the system + In this case try again later or increase MAX_CONCURRENT_ACTIONS + + \sa sl_RecvFrom + \note belongs to \ref recv_api + \warning + \par Examples: + \code An example of receiving data using TCP socket: + + SlSockAddrIn_t Addr; + SlSockAddrIn_t LocalAddr; + int16_t AddrSize = sizeof(SlSockAddrIn_t); + int16_t SockID, newSockID; + int16_t Status; + int8_t Buf[RECV_BUF_LEN]; + + LocalAddr.sin_family = SL_AF_INET; + LocalAddr.sin_port = sl_Htons(5001); + LocalAddr.sin_addr.s_addr = 0; + + Addr.sin_family = SL_AF_INET; + Addr.sin_port = sl_Htons(5001); + Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(10,1,1,200)); + + SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0); + Status = sl_Bind(SockID, (SlSockAddr_t *)&LocalAddr, AddrSize); + Status = sl_Listen(SockID, 0); + newSockID = sl_Accept(SockID, (SlSockAddr_t*)&Addr, (SlSocklen_t*) &AddrSize); + Status = sl_Recv(newSockID, Buf, 1460, 0); + \endcode + \code Example code for Rx transceiver mode using a raw socket + int8_t buffer[1536]; + int16_t sd; + uint16_t size; + SlTransceiverRxOverHead_t *transHeader; + sd = sl_Socket(SL_AF_RF,SL_SOCK_RAW,11); // channel 11 + while(1) + { + size = sl_Recv(sd,buffer,1536,0); + transHeader = (SlTransceiverRxOverHead_t *)buffer; + printf("RSSI is %d frame type is 0x%x size %d\n",transHeader->rssi,buffer[sizeof(SlTransceiverRxOverHead_t)],size); + } + \endcode + */ +#if _SL_INCLUDE_FUNC(sl_Recv) + int16_t sl_Recv(int16_t sd, void *buf, int16_t Len, int16_t flags); +#endif + + /*! + \brief read data from socket + + function receives a message from a connection-mode or + connectionless-mode socket + + \param[in] sd socket handle + \param[out] buf Points to the buffer where the message should be stored. + \param[in] Len Specifies the length in bytes of the buffer pointed to by the buffer argument. + Range: 1-16000 bytes + \param[in] flags Specifies the type of message + reception. On this version, this parameter is not + supported. + \param[in] from pointer to an address structure + indicating the source + address.\n sockaddr:\n - code + for the address format. On this + version only AF_INET is + supported.\n - socket address, + the length depends on the code + format + \param[in] fromlen source address structure + size. This parameter MUST be set to the size of the structure pointed to by addr. + + + \return return the number of bytes received, + or a negative value if an error occurred. + using a non-blocking recv a possible negative value is SL_EAGAIN. + SL_RET_CODE_INVALID_INPUT (-2) will be returned if fromlen has incorrect length. + SL_POOL_IS_EMPTY may be return in case there are no resources in the system + In this case try again later or increase MAX_CONCURRENT_ACTIONS + + \sa sl_Recv + \note belongs to \ref recv_api + \warning + \par Example: + \code An example of receiving data: + + SlSockAddrIn_t Addr; + SlSockAddrIn_t LocalAddr; + int16_t AddrSize = sizeof(SlSockAddrIn_t); + int16_t SockID; + int16_t Status; + int8_t Buf[RECV_BUF_LEN]; + + LocalAddr.sin_family = SL_AF_INET; + LocalAddr.sin_port = sl_Htons(5001); + LocalAddr.sin_addr.s_addr = 0; + + SockID = sl_Socket(SL_AF_INET,SL_SOCK_DGRAM, 0); + Status = sl_Bind(SockID, (SlSockAddr_t *)&LocalAddr, AddrSize); + Status = sl_RecvFrom(SockID, Buf, 1472, 0, (SlSockAddr_t *)&Addr, (SlSocklen_t*)&AddrSize); + + \endcode + */ +#if _SL_INCLUDE_FUNC(sl_RecvFrom) + int16_t sl_RecvFrom(int16_t sd, void *buf, int16_t Len, int16_t flags, SlSockAddr_t *from, SlSocklen_t *fromlen); +#endif + + /*! + \brief write data to TCP socket + + This function is used to transmit a message to another socket. + Returns immediately after sending data to device. + In case of TCP failure an async event SL_SOCKET_TX_FAILED_EVENT is going to + be received. + In case of a RAW socket (transceiver mode), extra 4 bytes should be reserved at the end of the + frame data buffer for WLAN FCS + + \param[in] sd socket handle + \param[in] buf Points to a buffer containing + the message to be sent + \param[in] Len message size in bytes. Range: 1-1460 bytes + \param[in] flags Specifies the type of message + transmission. On this version, this parameter is not + supported for TCP. + For transceiver mode, the SL_RAW_RF_TX_PARAMS macro can be used to determine + transmission parameters (channel,rate,tx_power,preamble) + + + \return Return the number of bytes transmitted, + or -1 if an error occurred + + \sa sl_SendTo + \note belongs to \ref send_api + \warning + \par Example: + \code An example of sending data: + + SlSockAddrIn_t Addr; + int16_t AddrSize = sizeof(SlSockAddrIn_t); + int16_t SockID; + int16_t Status; + int8_t Buf[SEND_BUF_LEN]; + + Addr.sin_family = SL_AF_INET; + Addr.sin_port = sl_Htons(5001); + Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(10,1,1,200)); + + SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0); + Status = sl_Connect(SockID, (SlSockAddr_t *)&Addr, AddrSize); + Status = sl_Send(SockID, Buf, 1460, 0 ); + + \endcode + */ +#if _SL_INCLUDE_FUNC(sl_Send ) + int16_t sl_Send(int16_t sd, const void *buf, int16_t Len, int16_t flags); +#endif + + /*! + \brief write data to socket + + This function is used to transmit a message to another socket + (connection less socket SOCK_DGRAM, SOCK_RAW). + Returns immediately after sending data to device. + In case of transmission failure an async event SL_SOCKET_TX_FAILED_EVENT is going to + be received. + + \param[in] sd socket handle + \param[in] buf Points to a buffer containing + the message to be sent + \param[in] Len message size in bytes. Range: 1-1460 bytes + \param[in] flags Specifies the type of message + transmission. On this version, this parameter is not + supported + \param[in] to pointer to an address structure + indicating the destination + address.\n sockaddr:\n - code + for the address format. On this + version only AF_INET is + supported.\n - socket address, + the length depends on the code + format + \param[in] tolen destination address structure size + + \return Return the number of transmitted bytes, + or -1 if an error occurred + + \sa sl_Send + \note belongs to \ref send_api + \warning + \par Example: + \code An example of sending data: + + SlSockAddrIn_t Addr; + int16_t AddrSize = sizeof(SlSockAddrIn_t); + int16_t SockID; + int16_t Status; + int8_t Buf[SEND_BUF_LEN]; + + Addr.sin_family = SL_AF_INET; + Addr.sin_port = sl_Htons(5001); + Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(10,1,1,200)); + + SockID = sl_Socket(SL_AF_INET,SL_SOCK_DGRAM, 0); + Status = sl_SendTo(SockID, Buf, 1472, 0, (SlSockAddr_t *)&Addr, AddrSize); + + \endcode + */ +#if _SL_INCLUDE_FUNC(sl_SendTo) + int16_t sl_SendTo(int16_t sd, const void *buf, int16_t Len, int16_t flags, const SlSockAddr_t *to, SlSocklen_t tolen); +#endif + + /*! + \brief Reorder the bytes of a 32-bit unsigned value + + This function is used to Reorder the bytes of a 32-bit unsigned value from processor order to network order. + + \param[in] var variable to reorder + + \return Return the reorder variable, + + \sa sl_SendTo sl_Bind sl_Connect sl_RecvFrom sl_Accept + \note belongs to \ref send_api + \warning + */ +#if _SL_INCLUDE_FUNC(sl_Htonl ) + uint32_t sl_Htonl( uint32_t val ); + +#define sl_Ntohl sl_Htonl /* Reorder the bytes of a 16-bit unsigned value from network order to processor orde. */ +#endif + + /*! + \brief Reorder the bytes of a 16-bit unsigned value + + This function is used to Reorder the bytes of a 16-bit unsigned value from processor order to network order. + + \param[in] var variable to reorder + + \return Return the reorder variable, + + \sa sl_SendTo sl_Bind sl_Connect sl_RecvFrom sl_Accept + \note belongs to \ref send_api + \warning + */ +#if _SL_INCLUDE_FUNC(sl_Htons ) + uint16_t sl_Htons( uint16_t val ); + +#define sl_Ntohs sl_Htons /* Reorder the bytes of a 16-bit unsigned value from network order to processor orde. */ +#endif + +private: + + cc3100_driver &_driver; + cc3100_nonos &_nonos; + +};//class + + +}//namespace mbed_cc3100 + + /*! + + Close the Doxygen group. + @} + + */ + +#endif /* __SOCKET_H__ */ + + +