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.c - 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
dflet 0:400d8e75a8d0 39
dflet 0:400d8e75a8d0 40 /*****************************************************************************/
dflet 0:400d8e75a8d0 41 /* Include files */
dflet 0:400d8e75a8d0 42 /*****************************************************************************/
dflet 0:400d8e75a8d0 43 #include "cc3100_simplelink.h"
dflet 0:400d8e75a8d0 44 #include "cc3100_protocol.h"
dflet 0:400d8e75a8d0 45 #include "cc3100_driver.h"
dflet 0:400d8e75a8d0 46
dflet 0:400d8e75a8d0 47 #include "cc3100_socket.h"
dflet 0:400d8e75a8d0 48 #include "HttpDebug.h"
dflet 0:400d8e75a8d0 49
dflet 0:400d8e75a8d0 50 namespace mbed_cc3100 {
dflet 0:400d8e75a8d0 51
dflet 0:400d8e75a8d0 52 /* Note: parsing of family and port in the generic way for all IPV4, IPV6 and EUI48 */
dflet 0:400d8e75a8d0 53 /* is possible as _i32 as these parameters are in the same offset and size for these */
dflet 0:400d8e75a8d0 54 /* three families. */
dflet 0:400d8e75a8d0 55 #define SL_SOCKET_PAYLOAD_BASE (1350)
dflet 0:400d8e75a8d0 56
dflet 0:400d8e75a8d0 57 const uint8_t _SlPayloadByProtocolLUT[16] =
dflet 0:400d8e75a8d0 58 {
dflet 0:400d8e75a8d0 59 (1472 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_UDP_IPV4 */
dflet 0:400d8e75a8d0 60 (1460 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_TCP_IPV4 */
dflet 0:400d8e75a8d0 61 (1452 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_UDP_IPV6 */
dflet 0:400d8e75a8d0 62 (1440 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_TCP_IPV6 */
dflet 0:400d8e75a8d0 63 (1386 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_TCP_IPV4_SECURE */
dflet 0:400d8e75a8d0 64 (1386 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_UDP_IPV4_SECURE */
dflet 0:400d8e75a8d0 65 (1396 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_UDP_IPV6_SECURE */
dflet 0:400d8e75a8d0 66 (1396 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_TCP_IPV6_SECURE */
dflet 0:400d8e75a8d0 67 (1476 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_RAW_TRANCEIVER */
dflet 0:400d8e75a8d0 68 (1514 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_RAW_PACKET */
dflet 0:400d8e75a8d0 69 (1480 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_RAW_IP4 */
dflet 0:400d8e75a8d0 70 (1480 - SL_SOCKET_PAYLOAD_BASE), /* SL_SOCKET_PAYLOAD_TYPE_RAW_IP6 */
dflet 0:400d8e75a8d0 71 (1440 - SL_SOCKET_PAYLOAD_BASE), /* Default */
dflet 0:400d8e75a8d0 72 (1440 - SL_SOCKET_PAYLOAD_BASE), /* Default */
dflet 0:400d8e75a8d0 73 (1440 - SL_SOCKET_PAYLOAD_BASE), /* Default */
dflet 0:400d8e75a8d0 74 (1440 - SL_SOCKET_PAYLOAD_BASE) /* Default */
dflet 0:400d8e75a8d0 75 };
dflet 0:400d8e75a8d0 76
dflet 0:400d8e75a8d0 77 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:400d8e75a8d0 78 cc3100_socket::cc3100_socket(cc3100_driver &driver, cc3100_nonos &nonos)
dflet 0:400d8e75a8d0 79 : _driver(driver), _nonos(nonos)
dflet 0:400d8e75a8d0 80 {
dflet 0:400d8e75a8d0 81 }
dflet 0:400d8e75a8d0 82 #else
dflet 0:400d8e75a8d0 83 cc3100_socket::cc3100_socket(cc3100_driver &driver)
dflet 0:400d8e75a8d0 84 : _driver(driver)
dflet 0:400d8e75a8d0 85 {
dflet 0:400d8e75a8d0 86 }
dflet 0:400d8e75a8d0 87 #endif
dflet 0:400d8e75a8d0 88 cc3100_socket::~cc3100_socket()
dflet 0:400d8e75a8d0 89 {
dflet 0:400d8e75a8d0 90
dflet 0:400d8e75a8d0 91 }
dflet 0:400d8e75a8d0 92
dflet 0:400d8e75a8d0 93 /*******************************************************************************/
dflet 0:400d8e75a8d0 94 /* Functions */
dflet 0:400d8e75a8d0 95 /*******************************************************************************/
dflet 0:400d8e75a8d0 96
dflet 0:400d8e75a8d0 97 /* ******************************************************************************/
dflet 0:400d8e75a8d0 98 /* _sl_BuildAddress */
dflet 0:400d8e75a8d0 99 /* ******************************************************************************/
dflet 0:400d8e75a8d0 100 void cc3100_socket::_sl_BuildAddress(const SlSockAddr_t *addr, _SocketAddrCommand_u *pCmd)
dflet 0:400d8e75a8d0 101 {
dflet 0:400d8e75a8d0 102 /* Note: parsing of family and port in the generic way for all IPV4, IPV6 and EUI48
dflet 0:400d8e75a8d0 103 is possible as long as these parameters are in the same offset and size for these
dflet 0:400d8e75a8d0 104 three families. */
dflet 0:400d8e75a8d0 105 pCmd->IpV4.FamilyAndFlags = (addr->sa_family << 4) & 0xF0;
dflet 0:400d8e75a8d0 106 pCmd->IpV4.port = ((SlSockAddrIn_t *)addr)->sin_port;
dflet 0:400d8e75a8d0 107
dflet 0:400d8e75a8d0 108 if(SL_AF_INET == addr->sa_family) {
dflet 0:400d8e75a8d0 109 pCmd->IpV4.address = ((SlSockAddrIn_t *)addr)->sin_addr.s_addr;
dflet 0:400d8e75a8d0 110 } else if (SL_AF_INET6_EUI_48 == addr->sa_family ) {
dflet 0:400d8e75a8d0 111 memcpy( pCmd->IpV6EUI48.address,((SlSockAddrIn6_t *)addr)->sin6_addr._S6_un._S6_u8, 6);
dflet 0:400d8e75a8d0 112 }
dflet 0:400d8e75a8d0 113 #ifdef SL_SUPPORT_IPV6
dflet 0:400d8e75a8d0 114 else {
dflet 0:400d8e75a8d0 115 memcpy(pCmd->IpV6.address, ((sockaddr_in6 *)addr)->sin6_addr._S6_un._S6_u32, 16 );
dflet 0:400d8e75a8d0 116 }
dflet 0:400d8e75a8d0 117 #endif
dflet 0:400d8e75a8d0 118 }
dflet 0:400d8e75a8d0 119
dflet 0:400d8e75a8d0 120 /* ******************************************************************************/
dflet 0:400d8e75a8d0 121 /* _sl_TruncatePayloadByProtocol */
dflet 0:400d8e75a8d0 122 /* ******************************************************************************/
dflet 0:400d8e75a8d0 123 uint16_t cc3100_socket::_sl_TruncatePayloadByProtocol(const int16_t sd,const uint16_t length)
dflet 0:400d8e75a8d0 124 {
dflet 0:400d8e75a8d0 125
dflet 0:400d8e75a8d0 126 uint32_t maxLength;
dflet 0:400d8e75a8d0 127
dflet 0:400d8e75a8d0 128 maxLength = SL_SOCKET_PAYLOAD_BASE + _SlPayloadByProtocolLUT[((sd & SL_SOCKET_PAYLOAD_TYPE_MASK) >> 4)];
dflet 0:400d8e75a8d0 129
dflet 0:400d8e75a8d0 130 if( length > maxLength )
dflet 0:400d8e75a8d0 131 {
dflet 0:400d8e75a8d0 132 return maxLength;
dflet 0:400d8e75a8d0 133 }
dflet 0:400d8e75a8d0 134 else
dflet 0:400d8e75a8d0 135 {
dflet 0:400d8e75a8d0 136 return length;
dflet 0:400d8e75a8d0 137 }
dflet 0:400d8e75a8d0 138
dflet 0:400d8e75a8d0 139 }
dflet 0:400d8e75a8d0 140
dflet 0:400d8e75a8d0 141 /*******************************************************************************/
dflet 0:400d8e75a8d0 142 /* _sl_ParseAddress */
dflet 0:400d8e75a8d0 143 /*******************************************************************************/
dflet 0:400d8e75a8d0 144 #ifndef SL_TINY_EXT
dflet 0:400d8e75a8d0 145 void cc3100_socket::_sl_ParseAddress(_SocketAddrResponse_u *pRsp, SlSockAddr_t *addr, SlSocklen_t *addrlen)
dflet 0:400d8e75a8d0 146 {
dflet 0:400d8e75a8d0 147 /* Note: parsing of family and port in the generic way for all IPV4, IPV6 and EUI48 */
dflet 0:400d8e75a8d0 148 /* is possible as long as these parameters are in the same offset and size for these */
dflet 0:400d8e75a8d0 149 /* three families. */
dflet 0:400d8e75a8d0 150 addr->sa_family = pRsp->IpV4.family;
dflet 0:400d8e75a8d0 151 ((SlSockAddrIn_t *)addr)->sin_port = pRsp->IpV4.port;
dflet 0:400d8e75a8d0 152
dflet 0:400d8e75a8d0 153 *addrlen = (SL_AF_INET == addr->sa_family) ? sizeof(SlSockAddrIn_t) : sizeof(SlSockAddrIn6_t);
dflet 0:400d8e75a8d0 154
dflet 0:400d8e75a8d0 155 if(SL_AF_INET == addr->sa_family) {
dflet 0:400d8e75a8d0 156 ((SlSockAddrIn_t *)addr)->sin_addr.s_addr = pRsp->IpV4.address;
dflet 0:400d8e75a8d0 157 } else if (SL_AF_INET6_EUI_48 == addr->sa_family ) {
dflet 0:400d8e75a8d0 158 memcpy(((SlSockAddrIn6_t *)addr)->sin6_addr._S6_un._S6_u8, pRsp->IpV6EUI48.address, 6);
dflet 0:400d8e75a8d0 159 }
dflet 0:400d8e75a8d0 160 #ifdef SL_SUPPORT_IPV6
dflet 0:400d8e75a8d0 161 else {
dflet 0:400d8e75a8d0 162 memcpy(((sockaddr_in6 *)addr)->sin6_addr._S6_un._S6_u32, pRsp->IpV6.address, 16);
dflet 0:400d8e75a8d0 163 }
dflet 0:400d8e75a8d0 164 #endif
dflet 0:400d8e75a8d0 165 }
dflet 0:400d8e75a8d0 166 #endif
dflet 0:400d8e75a8d0 167
dflet 0:400d8e75a8d0 168 /*******************************************************************************/
dflet 0:400d8e75a8d0 169 /* sl_Socket */
dflet 0:400d8e75a8d0 170 /*******************************************************************************/
dflet 0:400d8e75a8d0 171 typedef union {
dflet 0:400d8e75a8d0 172 uint32_t Dummy;
dflet 0:400d8e75a8d0 173 _SocketCommand_t Cmd;
dflet 0:400d8e75a8d0 174 _SocketResponse_t Rsp;
dflet 0:400d8e75a8d0 175 } _SlSockSocketMsg_u;
dflet 0:400d8e75a8d0 176
dflet 0:400d8e75a8d0 177 #if _SL_INCLUDE_FUNC(sl_Socket)
dflet 0:400d8e75a8d0 178 const _SlCmdCtrl_t _SlSockSocketCmdCtrl = {
dflet 0:400d8e75a8d0 179 SL_OPCODE_SOCKET_SOCKET,
dflet 0:400d8e75a8d0 180 sizeof(_SocketCommand_t),
dflet 0:400d8e75a8d0 181 sizeof(_SocketResponse_t)
dflet 0:400d8e75a8d0 182 };
dflet 0:400d8e75a8d0 183
dflet 0:400d8e75a8d0 184 int16_t cc3100_socket::sl_Socket(int16_t Domain, int16_t Type, int16_t Protocol)
dflet 0:400d8e75a8d0 185 {
dflet 0:400d8e75a8d0 186 _SlSockSocketMsg_u Msg;
dflet 0:400d8e75a8d0 187
dflet 0:400d8e75a8d0 188 Msg.Cmd.Domain = (uint8_t)Domain;
dflet 0:400d8e75a8d0 189 Msg.Cmd.Type = (uint8_t)Type;
dflet 0:400d8e75a8d0 190 Msg.Cmd.Protocol = (uint8_t)Protocol;
dflet 0:400d8e75a8d0 191
dflet 0:400d8e75a8d0 192 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlSockSocketCmdCtrl, &Msg, NULL));
dflet 0:400d8e75a8d0 193
dflet 0:400d8e75a8d0 194 if( Msg.Rsp.statusOrLen < 0 ) {
dflet 0:400d8e75a8d0 195 return( Msg.Rsp.statusOrLen );
dflet 0:400d8e75a8d0 196 } else {
dflet 0:400d8e75a8d0 197 return (int16_t)((uint8_t)Msg.Rsp.sd);
dflet 0:400d8e75a8d0 198 }
dflet 0:400d8e75a8d0 199 }
dflet 0:400d8e75a8d0 200 #endif
dflet 0:400d8e75a8d0 201
dflet 0:400d8e75a8d0 202 /*******************************************************************************/
dflet 0:400d8e75a8d0 203 /* sl_Close */
dflet 0:400d8e75a8d0 204 /*******************************************************************************/
dflet 0:400d8e75a8d0 205 typedef union {
dflet 0:400d8e75a8d0 206 _CloseCommand_t Cmd;
dflet 0:400d8e75a8d0 207 _SocketResponse_t Rsp;
dflet 0:400d8e75a8d0 208 } _SlSockCloseMsg_u;
dflet 0:400d8e75a8d0 209
dflet 0:400d8e75a8d0 210 #if _SL_INCLUDE_FUNC(sl_Close)
dflet 0:400d8e75a8d0 211 const _SlCmdCtrl_t _SlSockCloseCmdCtrl = {
dflet 0:400d8e75a8d0 212 SL_OPCODE_SOCKET_CLOSE,
dflet 0:400d8e75a8d0 213 sizeof(_CloseCommand_t),
dflet 0:400d8e75a8d0 214 sizeof(_SocketResponse_t)
dflet 0:400d8e75a8d0 215 };
dflet 0:400d8e75a8d0 216
dflet 0:400d8e75a8d0 217 int16_t cc3100_socket::sl_Close(int16_t sd)
dflet 0:400d8e75a8d0 218 {
dflet 0:400d8e75a8d0 219 _SlSockCloseMsg_u Msg;
dflet 0:400d8e75a8d0 220
dflet 0:400d8e75a8d0 221 Msg.Cmd.sd = (uint8_t)sd;
dflet 0:400d8e75a8d0 222
dflet 0:400d8e75a8d0 223 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlSockCloseCmdCtrl, &Msg, NULL));
dflet 0:400d8e75a8d0 224
dflet 0:400d8e75a8d0 225 return Msg.Rsp.statusOrLen;
dflet 0:400d8e75a8d0 226 }
dflet 0:400d8e75a8d0 227 #endif
dflet 0:400d8e75a8d0 228
dflet 0:400d8e75a8d0 229 /*******************************************************************************/
dflet 0:400d8e75a8d0 230 /* sl_Bind */
dflet 0:400d8e75a8d0 231 /*******************************************************************************/
dflet 0:400d8e75a8d0 232 typedef union {
dflet 0:400d8e75a8d0 233 _SocketAddrCommand_u Cmd;
dflet 0:400d8e75a8d0 234 _SocketResponse_t Rsp;
dflet 0:400d8e75a8d0 235 } _SlSockBindMsg_u;
dflet 0:400d8e75a8d0 236
dflet 0:400d8e75a8d0 237 #if _SL_INCLUDE_FUNC(sl_Bind)
dflet 0:400d8e75a8d0 238 int16_t cc3100_socket::sl_Bind(int16_t sd, const SlSockAddr_t *addr, int16_t addrlen)
dflet 0:400d8e75a8d0 239 {
dflet 0:400d8e75a8d0 240 _SlSockBindMsg_u Msg;
dflet 0:400d8e75a8d0 241 _SlCmdCtrl_t CmdCtrl = {0, 0, sizeof(_SocketResponse_t)};
dflet 0:400d8e75a8d0 242
dflet 0:400d8e75a8d0 243 switch(addr->sa_family) {
dflet 0:400d8e75a8d0 244 case SL_AF_INET :
dflet 0:400d8e75a8d0 245 CmdCtrl.Opcode = SL_OPCODE_SOCKET_BIND;
dflet 0:400d8e75a8d0 246 CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv4Command_t);
dflet 0:400d8e75a8d0 247 break;
dflet 0:400d8e75a8d0 248 #ifndef SL_TINY_EXT
dflet 0:400d8e75a8d0 249 case SL_AF_INET6_EUI_48:
dflet 0:400d8e75a8d0 250 CmdCtrl.Opcode = SL_OPCODE_SOCKET_BIND_V6;
dflet 0:400d8e75a8d0 251 CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6EUI48Command_t);
dflet 0:400d8e75a8d0 252 break;
dflet 0:400d8e75a8d0 253 #ifdef SL_SUPPORT_IPV6
dflet 0:400d8e75a8d0 254 case AF_INET6:
dflet 0:400d8e75a8d0 255 CmdCtrl.Opcode = SL_OPCODE_SOCKET_BIND_V6;
dflet 0:400d8e75a8d0 256 CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6Command_t);
dflet 0:400d8e75a8d0 257 break;
dflet 0:400d8e75a8d0 258 #endif
dflet 0:400d8e75a8d0 259 #endif
dflet 0:400d8e75a8d0 260 case SL_AF_RF :
dflet 0:400d8e75a8d0 261 default:
dflet 0:400d8e75a8d0 262 return SL_RET_CODE_INVALID_INPUT;
dflet 0:400d8e75a8d0 263 }
dflet 0:400d8e75a8d0 264
dflet 0:400d8e75a8d0 265 Msg.Cmd.IpV4.lenOrPadding = 0;
dflet 0:400d8e75a8d0 266 Msg.Cmd.IpV4.sd = (uint8_t)sd;
dflet 0:400d8e75a8d0 267
dflet 0:400d8e75a8d0 268 _sl_BuildAddress(addr, &Msg.Cmd);
dflet 0:400d8e75a8d0 269
dflet 0:400d8e75a8d0 270 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL));
dflet 0:400d8e75a8d0 271
dflet 0:400d8e75a8d0 272 return Msg.Rsp.statusOrLen;
dflet 0:400d8e75a8d0 273 }
dflet 0:400d8e75a8d0 274 #endif
dflet 0:400d8e75a8d0 275
dflet 0:400d8e75a8d0 276 /*******************************************************************************/
dflet 0:400d8e75a8d0 277 /* sl_Sendto */
dflet 0:400d8e75a8d0 278 /*******************************************************************************/
dflet 0:400d8e75a8d0 279 typedef union {
dflet 0:400d8e75a8d0 280 _SocketAddrCommand_u Cmd;
dflet 0:400d8e75a8d0 281 /* no response for 'sendto' commands*/
dflet 0:400d8e75a8d0 282 } _SlSendtoMsg_u;
dflet 0:400d8e75a8d0 283
dflet 0:400d8e75a8d0 284 #if _SL_INCLUDE_FUNC(sl_SendTo)
dflet 0:400d8e75a8d0 285 int16_t cc3100_socket::sl_SendTo(int16_t sd, const void *pBuf, int16_t Len, int16_t flags, const SlSockAddr_t *to, SlSocklen_t tolen)
dflet 0:400d8e75a8d0 286 {
dflet 0:400d8e75a8d0 287 _SlSendtoMsg_u Msg;
dflet 0:400d8e75a8d0 288 _SlCmdCtrl_t CmdCtrl = {0, 0, 0};
dflet 0:400d8e75a8d0 289 _SlCmdExt_t CmdExt;
dflet 0:400d8e75a8d0 290 uint16_t ChunkLen;
dflet 0:400d8e75a8d0 291 int16_t RetVal;
dflet 0:400d8e75a8d0 292
dflet 0:400d8e75a8d0 293 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:400d8e75a8d0 294 CmdExt.TxPayloadLen = (uint16_t)Len;
dflet 0:400d8e75a8d0 295 CmdExt.pTxPayload = (uint8_t *)pBuf;
dflet 0:400d8e75a8d0 296
dflet 0:400d8e75a8d0 297 switch(to->sa_family) {
dflet 0:400d8e75a8d0 298 case SL_AF_INET:
dflet 0:400d8e75a8d0 299 CmdCtrl.Opcode = SL_OPCODE_SOCKET_SENDTO;
dflet 0:400d8e75a8d0 300 CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv4Command_t);
dflet 0:400d8e75a8d0 301 break;
dflet 0:400d8e75a8d0 302 #ifndef SL_TINY_EXT
dflet 0:400d8e75a8d0 303 case SL_AF_INET6_EUI_48:
dflet 0:400d8e75a8d0 304 CmdCtrl.Opcode = SL_OPCODE_SOCKET_BIND_V6;
dflet 0:400d8e75a8d0 305 CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6EUI48Command_t);
dflet 0:400d8e75a8d0 306 break;
dflet 0:400d8e75a8d0 307 #ifdef SL_SUPPORT_IPV6
dflet 0:400d8e75a8d0 308 case AF_INET6:
dflet 0:400d8e75a8d0 309 CmdCtrl.Opcode = SL_OPCODE_SOCKET_SENDTO_V6;
dflet 0:400d8e75a8d0 310 CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6Command_t);
dflet 0:400d8e75a8d0 311 break;
dflet 0:400d8e75a8d0 312 #endif
dflet 0:400d8e75a8d0 313 #endif
dflet 0:400d8e75a8d0 314 case SL_AF_RF:
dflet 0:400d8e75a8d0 315 default:
dflet 0:400d8e75a8d0 316 return SL_RET_CODE_INVALID_INPUT;
dflet 0:400d8e75a8d0 317 }
dflet 0:400d8e75a8d0 318
dflet 0:400d8e75a8d0 319 ChunkLen = _sl_TruncatePayloadByProtocol(sd,Len);
dflet 0:400d8e75a8d0 320 Msg.Cmd.IpV4.lenOrPadding = ChunkLen;
dflet 0:400d8e75a8d0 321 CmdExt.TxPayloadLen = ChunkLen;
dflet 0:400d8e75a8d0 322
dflet 0:400d8e75a8d0 323 Msg.Cmd.IpV4.sd = (unsigned char)sd;
dflet 0:400d8e75a8d0 324
dflet 0:400d8e75a8d0 325 _sl_BuildAddress(to, &Msg.Cmd);
dflet 0:400d8e75a8d0 326
dflet 0:400d8e75a8d0 327 Msg.Cmd.IpV4.FamilyAndFlags |= flags & 0x0F;
dflet 0:400d8e75a8d0 328
dflet 0:400d8e75a8d0 329 do {
dflet 0:400d8e75a8d0 330 RetVal = _driver._SlDrvDataWriteOp((_SlSd_t)sd, &CmdCtrl, &Msg, &CmdExt);
dflet 0:400d8e75a8d0 331
dflet 0:400d8e75a8d0 332 if(SL_OS_RET_CODE_OK == RetVal) {
dflet 0:400d8e75a8d0 333 CmdExt.pTxPayload += ChunkLen;
dflet 0:400d8e75a8d0 334 ChunkLen = (uint16_t)((unsigned char *)pBuf + Len - CmdExt.pTxPayload);
dflet 0:400d8e75a8d0 335 ChunkLen = _sl_TruncatePayloadByProtocol(sd,ChunkLen);
dflet 0:400d8e75a8d0 336 CmdExt.TxPayloadLen = ChunkLen;
dflet 0:400d8e75a8d0 337 Msg.Cmd.IpV4.lenOrPadding = ChunkLen;
dflet 0:400d8e75a8d0 338 } else {
dflet 0:400d8e75a8d0 339 return RetVal;
dflet 0:400d8e75a8d0 340 }
dflet 0:400d8e75a8d0 341 } while(ChunkLen > 0);
dflet 0:400d8e75a8d0 342
dflet 0:400d8e75a8d0 343 return (int16_t)Len;
dflet 0:400d8e75a8d0 344 }
dflet 0:400d8e75a8d0 345 #endif
dflet 0:400d8e75a8d0 346
dflet 0:400d8e75a8d0 347 /*******************************************************************************/
dflet 0:400d8e75a8d0 348 /* sl_Recvfrom */
dflet 0:400d8e75a8d0 349 /*******************************************************************************/
dflet 0:400d8e75a8d0 350 typedef union {
dflet 0:400d8e75a8d0 351 _sendRecvCommand_t Cmd;
dflet 0:400d8e75a8d0 352 _SocketAddrResponse_u Rsp;
dflet 0:400d8e75a8d0 353 } _SlRecvfromMsg_u;
dflet 0:400d8e75a8d0 354
dflet 0:400d8e75a8d0 355 const _SlCmdCtrl_t _SlRecvfomCmdCtrl = {
dflet 0:400d8e75a8d0 356 SL_OPCODE_SOCKET_RECVFROM,
dflet 0:400d8e75a8d0 357 sizeof(_sendRecvCommand_t),
dflet 0:400d8e75a8d0 358 sizeof(_SocketAddrResponse_u)
dflet 0:400d8e75a8d0 359 };
dflet 0:400d8e75a8d0 360
dflet 0:400d8e75a8d0 361 #if _SL_INCLUDE_FUNC(sl_RecvFrom)
dflet 0:400d8e75a8d0 362 int16_t cc3100_socket::sl_RecvFrom(int16_t sd, void *buf, int16_t Len, int16_t flags, SlSockAddr_t *from, SlSocklen_t *fromlen)
dflet 0:400d8e75a8d0 363 {
dflet 0:400d8e75a8d0 364 _SlRecvfromMsg_u Msg;
dflet 0:400d8e75a8d0 365 _SlCmdExt_t CmdExt;
dflet 0:400d8e75a8d0 366 int16_t RetVal;
dflet 0:400d8e75a8d0 367
dflet 0:400d8e75a8d0 368 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:400d8e75a8d0 369 CmdExt.RxPayloadLen = Len;
dflet 0:400d8e75a8d0 370 CmdExt.pRxPayload = (uint8_t *)buf;
dflet 0:400d8e75a8d0 371
dflet 0:400d8e75a8d0 372 Msg.Cmd.sd = (uint8_t)sd;
dflet 0:400d8e75a8d0 373 Msg.Cmd.StatusOrLen = Len;
dflet 0:400d8e75a8d0 374 /* no size truncation in recv path */
dflet 0:400d8e75a8d0 375 CmdExt.RxPayloadLen = Msg.Cmd.StatusOrLen;
dflet 0:400d8e75a8d0 376
dflet 0:400d8e75a8d0 377 Msg.Cmd.FamilyAndFlags = flags & 0x0F;
dflet 0:400d8e75a8d0 378
dflet 0:400d8e75a8d0 379 if(sizeof(SlSockAddrIn_t) == *fromlen) {
dflet 0:400d8e75a8d0 380 Msg.Cmd.FamilyAndFlags |= (SL_AF_INET << 4);
dflet 0:400d8e75a8d0 381 }
dflet 0:400d8e75a8d0 382 else if (sizeof(SlSockAddrIn6_t) == *fromlen)
dflet 0:400d8e75a8d0 383 {
dflet 0:400d8e75a8d0 384 Msg.Cmd.FamilyAndFlags |= (SL_AF_INET6 << 4);
dflet 0:400d8e75a8d0 385 }
dflet 0:400d8e75a8d0 386 else
dflet 0:400d8e75a8d0 387 {
dflet 0:400d8e75a8d0 388 return SL_RET_CODE_INVALID_INPUT;
dflet 0:400d8e75a8d0 389 }
dflet 0:400d8e75a8d0 390
dflet 0:400d8e75a8d0 391 RetVal = _driver._SlDrvDataReadOp((_SlSd_t)sd, (_SlCmdCtrl_t *)&_SlRecvfomCmdCtrl, &Msg, &CmdExt);
dflet 0:400d8e75a8d0 392
dflet 0:400d8e75a8d0 393 if( RetVal != SL_OS_RET_CODE_OK ) {
dflet 0:400d8e75a8d0 394 return RetVal;
dflet 0:400d8e75a8d0 395 }
dflet 0:400d8e75a8d0 396
dflet 0:400d8e75a8d0 397 RetVal = Msg.Rsp.IpV4.statusOrLen;
dflet 0:400d8e75a8d0 398
dflet 0:400d8e75a8d0 399 if(RetVal >= 0) {
dflet 0:400d8e75a8d0 400 VERIFY_PROTOCOL(sd == Msg.Rsp.IpV4.sd);
dflet 0:400d8e75a8d0 401 #if 0
dflet 0:400d8e75a8d0 402 _sl_ParseAddress(&Msg.Rsp, from, fromlen);
dflet 0:400d8e75a8d0 403 #else
dflet 0:400d8e75a8d0 404 from->sa_family = Msg.Rsp.IpV4.family;
dflet 0:400d8e75a8d0 405 if(SL_AF_INET == from->sa_family) {
dflet 0:400d8e75a8d0 406 ((SlSockAddrIn_t *)from)->sin_port = Msg.Rsp.IpV4.port;
dflet 0:400d8e75a8d0 407 ((SlSockAddrIn_t *)from)->sin_addr.s_addr = Msg.Rsp.IpV4.address;
dflet 0:400d8e75a8d0 408 *fromlen = sizeof(SlSockAddrIn_t);
dflet 0:400d8e75a8d0 409 } else if (SL_AF_INET6_EUI_48 == from->sa_family ) {
dflet 0:400d8e75a8d0 410 ((SlSockAddrIn6_t *)from)->sin6_port = Msg.Rsp.IpV6EUI48.port;
dflet 0:400d8e75a8d0 411 memcpy(((SlSockAddrIn6_t *)from)->sin6_addr._S6_un._S6_u8, Msg.Rsp.IpV6EUI48.address, 6);
dflet 0:400d8e75a8d0 412 }
dflet 0:400d8e75a8d0 413 #ifdef SL_SUPPORT_IPV6
dflet 0:400d8e75a8d0 414 else if(AF_INET6 == from->sa_family) {
dflet 0:400d8e75a8d0 415 VERIFY_PROTOCOL(*fromlen >= sizeof(sockaddr_in6));
dflet 0:400d8e75a8d0 416
dflet 0:400d8e75a8d0 417 ((sockaddr_in6 *)from)->sin6_port = Msg.Rsp.IpV6.port;
dflet 0:400d8e75a8d0 418 memcpy(((sockaddr_in6 *)from)->sin6_addr._S6_un._S6_u32, Msg.Rsp.IpV6.address, 16);
dflet 0:400d8e75a8d0 419 *fromlen = sizeof(sockaddr_in6);
dflet 0:400d8e75a8d0 420 }
dflet 0:400d8e75a8d0 421 #endif
dflet 0:400d8e75a8d0 422 #endif
dflet 0:400d8e75a8d0 423 }
dflet 0:400d8e75a8d0 424
dflet 0:400d8e75a8d0 425 return (int16_t)RetVal;
dflet 0:400d8e75a8d0 426 }
dflet 0:400d8e75a8d0 427 #endif
dflet 0:400d8e75a8d0 428
dflet 0:400d8e75a8d0 429 /*******************************************************************************/
dflet 0:400d8e75a8d0 430 /* sl_Connect */
dflet 0:400d8e75a8d0 431 /*******************************************************************************/
dflet 0:400d8e75a8d0 432 typedef union {
dflet 0:400d8e75a8d0 433 _SocketAddrCommand_u Cmd;
dflet 0:400d8e75a8d0 434 _SocketResponse_t Rsp;
dflet 0:400d8e75a8d0 435 } _SlSockConnectMsg_u;
dflet 0:400d8e75a8d0 436
dflet 0:400d8e75a8d0 437 #if _SL_INCLUDE_FUNC(sl_Connect)
dflet 0:400d8e75a8d0 438 int16_t cc3100_socket::sl_Connect(int16_t sd, const SlSockAddr_t *addr, int16_t addrlen)
dflet 0:400d8e75a8d0 439 {
dflet 0:400d8e75a8d0 440 _SlSockConnectMsg_u Msg;
dflet 0:400d8e75a8d0 441 _SlReturnVal_t RetVal;
dflet 0:400d8e75a8d0 442 _SlCmdCtrl_t CmdCtrl = {0, 0, sizeof(_SocketResponse_t)};
dflet 0:400d8e75a8d0 443 _SocketResponse_t AsyncRsp;
dflet 0:400d8e75a8d0 444 uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:400d8e75a8d0 445
dflet 0:400d8e75a8d0 446
dflet 0:400d8e75a8d0 447 switch(addr->sa_family) {
dflet 0:400d8e75a8d0 448 case SL_AF_INET :
dflet 0:400d8e75a8d0 449 CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT;
dflet 0:400d8e75a8d0 450 CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv4Command_t);
dflet 0:400d8e75a8d0 451 /* Do nothing - cmd already initialized to this type */
dflet 0:400d8e75a8d0 452 break;
dflet 0:400d8e75a8d0 453 case SL_AF_INET6_EUI_48:
dflet 0:400d8e75a8d0 454 CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT_V6;
dflet 0:400d8e75a8d0 455 CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6EUI48Command_t);
dflet 0:400d8e75a8d0 456 break;
dflet 0:400d8e75a8d0 457 #ifdef SL_SUPPORT_IPV6
dflet 0:400d8e75a8d0 458 case AF_INET6:
dflet 0:400d8e75a8d0 459 CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT_V6;
dflet 0:400d8e75a8d0 460 CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6Command_t);
dflet 0:400d8e75a8d0 461 break;
dflet 0:400d8e75a8d0 462 #endif
dflet 0:400d8e75a8d0 463 case SL_AF_RF :
dflet 0:400d8e75a8d0 464 default:
dflet 0:400d8e75a8d0 465 return SL_RET_CODE_INVALID_INPUT;
dflet 0:400d8e75a8d0 466 }
dflet 0:400d8e75a8d0 467
dflet 0:400d8e75a8d0 468 Msg.Cmd.IpV4.lenOrPadding = 0;
dflet 0:400d8e75a8d0 469 Msg.Cmd.IpV4.sd = (uint8_t)sd;
dflet 0:400d8e75a8d0 470
dflet 0:400d8e75a8d0 471 _sl_BuildAddress(addr, &Msg.Cmd);
dflet 0:400d8e75a8d0 472
dflet 0:400d8e75a8d0 473
dflet 0:400d8e75a8d0 474 ObjIdx = _driver._SlDrvProtectAsyncRespSetting((uint8_t*)&AsyncRsp, CONNECT_ID, sd & BSD_SOCKET_ID_MASK);
dflet 0:400d8e75a8d0 475
dflet 0:400d8e75a8d0 476 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
dflet 0:400d8e75a8d0 477 {
dflet 0:400d8e75a8d0 478 return SL_POOL_IS_EMPTY;
dflet 0:400d8e75a8d0 479 }
dflet 0:400d8e75a8d0 480
dflet 0:400d8e75a8d0 481 /* send the command */
dflet 0:400d8e75a8d0 482 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL));
dflet 0:400d8e75a8d0 483 VERIFY_PROTOCOL(Msg.Rsp.sd == sd)
dflet 0:400d8e75a8d0 484
dflet 0:400d8e75a8d0 485 RetVal = Msg.Rsp.statusOrLen;
dflet 0:400d8e75a8d0 486
dflet 0:400d8e75a8d0 487 if(SL_RET_CODE_OK == RetVal) {
dflet 0:400d8e75a8d0 488 /* wait for async and get Data Read parameters */
dflet 0:400d8e75a8d0 489 _driver._SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
dflet 0:400d8e75a8d0 490
dflet 0:400d8e75a8d0 491 VERIFY_PROTOCOL(AsyncRsp.sd == sd);
dflet 0:400d8e75a8d0 492
dflet 0:400d8e75a8d0 493 RetVal = AsyncRsp.statusOrLen;
dflet 0:400d8e75a8d0 494 }
dflet 0:400d8e75a8d0 495 _driver._SlDrvReleasePoolObj(ObjIdx);
dflet 0:400d8e75a8d0 496 return RetVal;
dflet 0:400d8e75a8d0 497 }
dflet 0:400d8e75a8d0 498 #endif
dflet 0:400d8e75a8d0 499
dflet 0:400d8e75a8d0 500 /*******************************************************************************/
dflet 0:400d8e75a8d0 501 /* sl_Send */
dflet 0:400d8e75a8d0 502 /*******************************************************************************/
dflet 0:400d8e75a8d0 503 typedef union {
dflet 0:400d8e75a8d0 504 _sendRecvCommand_t Cmd;
dflet 0:400d8e75a8d0 505 /* no response for 'sendto' commands*/
dflet 0:400d8e75a8d0 506 } _SlSendMsg_u;
dflet 0:400d8e75a8d0 507
dflet 0:400d8e75a8d0 508 const _SlCmdCtrl_t _SlSendCmdCtrl = {
dflet 0:400d8e75a8d0 509 SL_OPCODE_SOCKET_SEND,
dflet 0:400d8e75a8d0 510 sizeof(_sendRecvCommand_t),
dflet 0:400d8e75a8d0 511 0
dflet 0:400d8e75a8d0 512 };
dflet 0:400d8e75a8d0 513
dflet 0:400d8e75a8d0 514 #if _SL_INCLUDE_FUNC(sl_Send)
dflet 0:400d8e75a8d0 515 int16_t cc3100_socket::sl_Send(int16_t sd, const void *pBuf, int16_t Len, int16_t flags)
dflet 0:400d8e75a8d0 516 {
dflet 0:400d8e75a8d0 517 _SlSendMsg_u Msg;
dflet 0:400d8e75a8d0 518 _SlCmdExt_t CmdExt;
dflet 0:400d8e75a8d0 519 uint16_t ChunkLen;
dflet 0:400d8e75a8d0 520 int16_t RetVal;
dflet 0:400d8e75a8d0 521 uint32_t tempVal;
dflet 0:400d8e75a8d0 522 uint8_t runSingleChunk = FALSE;
dflet 0:400d8e75a8d0 523
dflet 0:400d8e75a8d0 524 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:400d8e75a8d0 525 CmdExt.TxPayloadLen = Len;
dflet 0:400d8e75a8d0 526 CmdExt.pTxPayload = (uint8_t *)pBuf;
dflet 0:400d8e75a8d0 527
dflet 0:400d8e75a8d0 528 /* Only for RAW transceiver type socket, relay the flags parameter in the 2 bytes (4 byte aligned) before the actual payload */
dflet 0:400d8e75a8d0 529 if ((sd & SL_SOCKET_PAYLOAD_TYPE_MASK) == SL_SOCKET_PAYLOAD_TYPE_RAW_TRANCEIVER) {
dflet 0:400d8e75a8d0 530 tempVal = flags;
dflet 0:400d8e75a8d0 531 CmdExt.pRxPayload = (uint8_t *)&tempVal;
dflet 0:400d8e75a8d0 532 CmdExt.RxPayloadLen = -4; /* mark as Rx data to send */
dflet 0:400d8e75a8d0 533 runSingleChunk = TRUE;
dflet 0:400d8e75a8d0 534 } else {
dflet 0:400d8e75a8d0 535 CmdExt.pRxPayload = NULL;
dflet 0:400d8e75a8d0 536 }
dflet 0:400d8e75a8d0 537
dflet 0:400d8e75a8d0 538 ChunkLen = _sl_TruncatePayloadByProtocol(sd,Len);
dflet 0:400d8e75a8d0 539 CmdExt.TxPayloadLen = ChunkLen;
dflet 0:400d8e75a8d0 540
dflet 0:400d8e75a8d0 541 Msg.Cmd.StatusOrLen = ChunkLen;
dflet 0:400d8e75a8d0 542 Msg.Cmd.sd = (uint8_t)sd;
dflet 0:400d8e75a8d0 543 Msg.Cmd.FamilyAndFlags |= flags & 0x0F;
dflet 0:400d8e75a8d0 544
dflet 0:400d8e75a8d0 545 do {
dflet 0:400d8e75a8d0 546 RetVal = _driver._SlDrvDataWriteOp((uint8_t)sd, (_SlCmdCtrl_t *)&_SlSendCmdCtrl, &Msg, &CmdExt);
dflet 0:400d8e75a8d0 547 if(SL_OS_RET_CODE_OK == RetVal) {
dflet 0:400d8e75a8d0 548 CmdExt.pTxPayload += ChunkLen;
dflet 0:400d8e75a8d0 549 ChunkLen = (uint8_t *)pBuf + Len - CmdExt.pTxPayload;
dflet 0:400d8e75a8d0 550 ChunkLen = _sl_TruncatePayloadByProtocol(sd,ChunkLen);
dflet 0:400d8e75a8d0 551 CmdExt.TxPayloadLen = ChunkLen;
dflet 0:400d8e75a8d0 552 Msg.Cmd.StatusOrLen = ChunkLen;
dflet 0:400d8e75a8d0 553 } else {
dflet 0:400d8e75a8d0 554 return RetVal;
dflet 0:400d8e75a8d0 555 }
dflet 0:400d8e75a8d0 556 } while((ChunkLen > 0) && (runSingleChunk==FALSE));
dflet 0:400d8e75a8d0 557
dflet 0:400d8e75a8d0 558 return (int16_t)Len;
dflet 0:400d8e75a8d0 559 }
dflet 0:400d8e75a8d0 560 #endif
dflet 0:400d8e75a8d0 561
dflet 0:400d8e75a8d0 562 /*******************************************************************************/
dflet 0:400d8e75a8d0 563 /* sl_Listen */
dflet 0:400d8e75a8d0 564 /*******************************************************************************/
dflet 0:400d8e75a8d0 565 typedef union {
dflet 0:400d8e75a8d0 566 _ListenCommand_t Cmd;
dflet 0:400d8e75a8d0 567 _BasicResponse_t Rsp;
dflet 0:400d8e75a8d0 568 } _SlListenMsg_u;
dflet 0:400d8e75a8d0 569
dflet 0:400d8e75a8d0 570 #if _SL_INCLUDE_FUNC(sl_Listen)
dflet 0:400d8e75a8d0 571 const _SlCmdCtrl_t _SlListenCmdCtrl = {
dflet 0:400d8e75a8d0 572 SL_OPCODE_SOCKET_LISTEN,
dflet 0:400d8e75a8d0 573 sizeof(_ListenCommand_t),
dflet 0:400d8e75a8d0 574 sizeof(_BasicResponse_t),
dflet 0:400d8e75a8d0 575 };
dflet 0:400d8e75a8d0 576
dflet 0:400d8e75a8d0 577 int16_t cc3100_socket::sl_Listen(int16_t sd, int16_t backlog)
dflet 0:400d8e75a8d0 578 {
dflet 0:400d8e75a8d0 579 _SlListenMsg_u Msg;
dflet 0:400d8e75a8d0 580
dflet 0:400d8e75a8d0 581 Msg.Cmd.sd = (uint8_t)sd;
dflet 0:400d8e75a8d0 582 Msg.Cmd.backlog = (uint8_t)backlog;
dflet 0:400d8e75a8d0 583
dflet 0:400d8e75a8d0 584 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlListenCmdCtrl, &Msg, NULL));
dflet 0:400d8e75a8d0 585
dflet 0:400d8e75a8d0 586 return (int16_t)Msg.Rsp.status;
dflet 0:400d8e75a8d0 587 }
dflet 0:400d8e75a8d0 588 #endif
dflet 0:400d8e75a8d0 589
dflet 0:400d8e75a8d0 590 /*******************************************************************************/
dflet 0:400d8e75a8d0 591 /* sl_Accept */
dflet 0:400d8e75a8d0 592 /*******************************************************************************/
dflet 0:400d8e75a8d0 593 typedef union {
dflet 0:400d8e75a8d0 594 _AcceptCommand_t Cmd;
dflet 0:400d8e75a8d0 595 _SocketResponse_t Rsp;
dflet 0:400d8e75a8d0 596 } _SlSockAcceptMsg_u;
dflet 0:400d8e75a8d0 597
dflet 0:400d8e75a8d0 598 #if _SL_INCLUDE_FUNC(sl_Accept)
dflet 0:400d8e75a8d0 599 const _SlCmdCtrl_t _SlAcceptCmdCtrl = {
dflet 0:400d8e75a8d0 600 SL_OPCODE_SOCKET_ACCEPT,
dflet 0:400d8e75a8d0 601 sizeof(_AcceptCommand_t),
dflet 0:400d8e75a8d0 602 sizeof(_BasicResponse_t),
dflet 0:400d8e75a8d0 603 };
dflet 0:400d8e75a8d0 604
dflet 0:400d8e75a8d0 605 int16_t cc3100_socket::sl_Accept(int16_t sd, SlSockAddr_t *addr, SlSocklen_t *addrlen)
dflet 0:400d8e75a8d0 606 {
dflet 0:400d8e75a8d0 607 _SlSockAcceptMsg_u Msg;
dflet 0:400d8e75a8d0 608 _SlReturnVal_t RetVal;
dflet 0:400d8e75a8d0 609 _SocketAddrResponse_u AsyncRsp;
dflet 0:400d8e75a8d0 610
dflet 0:400d8e75a8d0 611 uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:400d8e75a8d0 612
dflet 0:400d8e75a8d0 613
dflet 0:400d8e75a8d0 614 Msg.Cmd.sd = (uint8_t)sd;
dflet 0:400d8e75a8d0 615 Msg.Cmd.family = (sizeof(SlSockAddrIn_t) == *addrlen) ? SL_AF_INET : SL_AF_INET6;
dflet 0:400d8e75a8d0 616
dflet 0:400d8e75a8d0 617 ObjIdx = _driver._SlDrvProtectAsyncRespSetting((uint8_t*)&AsyncRsp, ACCEPT_ID, sd & BSD_SOCKET_ID_MASK );
dflet 0:400d8e75a8d0 618
dflet 0:400d8e75a8d0 619 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
dflet 0:400d8e75a8d0 620 {
dflet 0:400d8e75a8d0 621 return SL_POOL_IS_EMPTY;
dflet 0:400d8e75a8d0 622 }
dflet 0:400d8e75a8d0 623
dflet 0:400d8e75a8d0 624 /* send the command */
dflet 0:400d8e75a8d0 625 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlAcceptCmdCtrl, &Msg, NULL));
dflet 0:400d8e75a8d0 626 VERIFY_PROTOCOL(Msg.Rsp.sd == sd);
dflet 0:400d8e75a8d0 627
dflet 0:400d8e75a8d0 628 RetVal = Msg.Rsp.statusOrLen;
dflet 0:400d8e75a8d0 629
dflet 0:400d8e75a8d0 630 if(SL_OS_RET_CODE_OK == RetVal) {
dflet 0:400d8e75a8d0 631 /* wait for async and get Data Read parameters */
dflet 0:400d8e75a8d0 632 _driver._SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
dflet 0:400d8e75a8d0 633
dflet 0:400d8e75a8d0 634 VERIFY_PROTOCOL(AsyncRsp.IpV4.sd == sd);
dflet 0:400d8e75a8d0 635
dflet 0:400d8e75a8d0 636 RetVal = AsyncRsp.IpV4.statusOrLen;
dflet 0:400d8e75a8d0 637 if( (NULL != addr) && (NULL != addrlen) ) {
dflet 0:400d8e75a8d0 638 #if 0 /* Kept for backup */
dflet 0:400d8e75a8d0 639 _sl_ParseAddress(&AsyncRsp, addr, addrlen);
dflet 0:400d8e75a8d0 640 #else
dflet 0:400d8e75a8d0 641 addr->sa_family = AsyncRsp.IpV4.family;
dflet 0:400d8e75a8d0 642
dflet 0:400d8e75a8d0 643 if(SL_AF_INET == addr->sa_family) {
dflet 0:400d8e75a8d0 644 if( *addrlen == sizeof( SlSockAddrIn_t ) ) {
dflet 0:400d8e75a8d0 645 ((SlSockAddrIn_t *)addr)->sin_port = AsyncRsp.IpV4.port;
dflet 0:400d8e75a8d0 646 ((SlSockAddrIn_t *)addr)->sin_addr.s_addr = AsyncRsp.IpV4.address;
dflet 0:400d8e75a8d0 647 } else {
dflet 0:400d8e75a8d0 648 *addrlen = 0;
dflet 0:400d8e75a8d0 649 }
dflet 0:400d8e75a8d0 650 } else if (SL_AF_INET6_EUI_48 == addr->sa_family ) {
dflet 0:400d8e75a8d0 651 if( *addrlen == sizeof( SlSockAddrIn6_t ) ) {
dflet 0:400d8e75a8d0 652 ((SlSockAddrIn6_t *)addr)->sin6_port = AsyncRsp.IpV6EUI48.port;
dflet 0:400d8e75a8d0 653 /* will be called from here and from _sl_BuildAddress*/
dflet 0:400d8e75a8d0 654 memcpy(((SlSockAddrIn6_t *)addr)->sin6_addr._S6_un._S6_u8, AsyncRsp.IpV6EUI48.address, 6);
dflet 0:400d8e75a8d0 655 } else {
dflet 0:400d8e75a8d0 656 *addrlen = 0;
dflet 0:400d8e75a8d0 657 }
dflet 0:400d8e75a8d0 658 }
dflet 0:400d8e75a8d0 659 #ifdef SL_SUPPORT_IPV6
dflet 0:400d8e75a8d0 660 else {
dflet 0:400d8e75a8d0 661 if( *addrlen == sizeof( sockaddr_in6 ) ) {
dflet 0:400d8e75a8d0 662 ((sockaddr_in6 *)addr)->sin6_port = AsyncRsp.IpV6.port;
dflet 0:400d8e75a8d0 663 memcpy(((sockaddr_in6 *)addr)->sin6_addr._S6_un._S6_u32, AsyncRsp.IpV6.address, 16);
dflet 0:400d8e75a8d0 664 } else {
dflet 0:400d8e75a8d0 665 *addrlen = 0;
dflet 0:400d8e75a8d0 666 }
dflet 0:400d8e75a8d0 667 }
dflet 0:400d8e75a8d0 668 #endif
dflet 0:400d8e75a8d0 669 #endif
dflet 0:400d8e75a8d0 670 }
dflet 0:400d8e75a8d0 671 }
dflet 0:400d8e75a8d0 672
dflet 0:400d8e75a8d0 673 _driver._SlDrvReleasePoolObj(ObjIdx);
dflet 0:400d8e75a8d0 674 return (int16_t)RetVal;
dflet 0:400d8e75a8d0 675 }
dflet 0:400d8e75a8d0 676 #endif
dflet 0:400d8e75a8d0 677
dflet 0:400d8e75a8d0 678
dflet 0:400d8e75a8d0 679 /*******************************************************************************/
dflet 0:400d8e75a8d0 680 /* sl_Htonl */
dflet 0:400d8e75a8d0 681 /*******************************************************************************/
dflet 0:400d8e75a8d0 682 uint32_t cc3100_socket::sl_Htonl( uint32_t val )
dflet 0:400d8e75a8d0 683 {
dflet 0:400d8e75a8d0 684 uint32_t i = 1;
dflet 0:400d8e75a8d0 685 int8_t *p = (int8_t *)&i;
dflet 0:400d8e75a8d0 686 if (p[0] == 1) { /* little endian */
dflet 0:400d8e75a8d0 687 p[0] = ((int8_t* )&val)[3];
dflet 0:400d8e75a8d0 688 p[1] = ((int8_t* )&val)[2];
dflet 0:400d8e75a8d0 689 p[2] = ((int8_t* )&val)[1];
dflet 0:400d8e75a8d0 690 p[3] = ((int8_t* )&val)[0];
dflet 0:400d8e75a8d0 691 return i;
dflet 0:400d8e75a8d0 692 } else { /* big endian */
dflet 0:400d8e75a8d0 693 return val;
dflet 0:400d8e75a8d0 694 }
dflet 0:400d8e75a8d0 695 }
dflet 0:400d8e75a8d0 696
dflet 0:400d8e75a8d0 697 /*******************************************************************************/
dflet 0:400d8e75a8d0 698 /* sl_Htonl */
dflet 0:400d8e75a8d0 699 /*******************************************************************************/
dflet 0:400d8e75a8d0 700 uint16_t cc3100_socket::sl_Htons( uint16_t val )
dflet 0:400d8e75a8d0 701 {
dflet 0:400d8e75a8d0 702 int16_t i = 1;
dflet 0:400d8e75a8d0 703 int8_t *p = (int8_t *)&i;
dflet 0:400d8e75a8d0 704 if (p[0] == 1) { /* little endian */
dflet 0:400d8e75a8d0 705 p[0] = ((int8_t* )&val)[1];
dflet 0:400d8e75a8d0 706 p[1] = ((int8_t* )&val)[0];
dflet 0:400d8e75a8d0 707 return i;
dflet 0:400d8e75a8d0 708 } else { /* big endian */
dflet 0:400d8e75a8d0 709 return val;
dflet 0:400d8e75a8d0 710 }
dflet 0:400d8e75a8d0 711 }
dflet 0:400d8e75a8d0 712
dflet 0:400d8e75a8d0 713 /*******************************************************************************/
dflet 0:400d8e75a8d0 714 /* sl_Recv */
dflet 0:400d8e75a8d0 715 /*******************************************************************************/
dflet 0:400d8e75a8d0 716 typedef union {
dflet 0:400d8e75a8d0 717 _sendRecvCommand_t Cmd;
dflet 0:400d8e75a8d0 718 _SocketResponse_t Rsp;
dflet 0:400d8e75a8d0 719 } _SlRecvMsg_u;
dflet 0:400d8e75a8d0 720
dflet 0:400d8e75a8d0 721 #if _SL_INCLUDE_FUNC(sl_Recv)
dflet 0:400d8e75a8d0 722 const _SlCmdCtrl_t _SlRecvCmdCtrl = {
dflet 0:400d8e75a8d0 723 SL_OPCODE_SOCKET_RECV,
dflet 0:400d8e75a8d0 724 sizeof(_sendRecvCommand_t),
dflet 0:400d8e75a8d0 725 sizeof(_SocketResponse_t)
dflet 0:400d8e75a8d0 726 };
dflet 0:400d8e75a8d0 727
dflet 0:400d8e75a8d0 728 int16_t cc3100_socket::sl_Recv(int16_t sd, void *pBuf, int16_t Len, int16_t flags)
dflet 0:400d8e75a8d0 729 {
dflet 0:400d8e75a8d0 730 _SlRecvMsg_u Msg;
dflet 0:400d8e75a8d0 731 _SlCmdExt_t CmdExt;
dflet 0:400d8e75a8d0 732 _SlReturnVal_t status;
dflet 0:400d8e75a8d0 733
dflet 0:400d8e75a8d0 734 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:400d8e75a8d0 735 CmdExt.RxPayloadLen = Len;
dflet 0:400d8e75a8d0 736 CmdExt.pRxPayload = (uint8_t *)pBuf;
dflet 0:400d8e75a8d0 737
dflet 0:400d8e75a8d0 738 Msg.Cmd.sd = (uint8_t)sd;
dflet 0:400d8e75a8d0 739 Msg.Cmd.StatusOrLen = Len;
dflet 0:400d8e75a8d0 740
dflet 0:400d8e75a8d0 741 /* no size truncation in recv path */
dflet 0:400d8e75a8d0 742 CmdExt.RxPayloadLen = Msg.Cmd.StatusOrLen;
dflet 0:400d8e75a8d0 743
dflet 0:400d8e75a8d0 744 Msg.Cmd.FamilyAndFlags = flags & 0x0F;
dflet 0:400d8e75a8d0 745
dflet 0:400d8e75a8d0 746 status = _driver._SlDrvDataReadOp((_SlSd_t)sd, (_SlCmdCtrl_t *)&_SlRecvCmdCtrl, &Msg, &CmdExt);
dflet 0:400d8e75a8d0 747 if( status != SL_OS_RET_CODE_OK ) {
dflet 0:400d8e75a8d0 748 return status;
dflet 0:400d8e75a8d0 749 }
dflet 0:400d8e75a8d0 750
dflet 0:400d8e75a8d0 751 /* if the Device side sends less than expected it is not the Driver's role */
dflet 0:400d8e75a8d0 752 /* the returned value could be smaller than the requested size */
dflet 0:400d8e75a8d0 753 return (int16_t)Msg.Rsp.statusOrLen;
dflet 0:400d8e75a8d0 754 }
dflet 0:400d8e75a8d0 755 #endif
dflet 0:400d8e75a8d0 756
dflet 0:400d8e75a8d0 757 /*******************************************************************************/
dflet 0:400d8e75a8d0 758 /* sl_SetSockOpt */
dflet 0:400d8e75a8d0 759 /*******************************************************************************/
dflet 0:400d8e75a8d0 760 typedef union {
dflet 0:400d8e75a8d0 761 _setSockOptCommand_t Cmd;
dflet 0:400d8e75a8d0 762 _SocketResponse_t Rsp;
dflet 0:400d8e75a8d0 763 } _SlSetSockOptMsg_u;
dflet 0:400d8e75a8d0 764
dflet 0:400d8e75a8d0 765 const _SlCmdCtrl_t _SlSetSockOptCmdCtrl = {
dflet 0:400d8e75a8d0 766 SL_OPCODE_SOCKET_SETSOCKOPT,
dflet 0:400d8e75a8d0 767 sizeof(_setSockOptCommand_t),
dflet 0:400d8e75a8d0 768 sizeof(_SocketResponse_t)
dflet 0:400d8e75a8d0 769 };
dflet 0:400d8e75a8d0 770
dflet 0:400d8e75a8d0 771 #if _SL_INCLUDE_FUNC(sl_SetSockOpt)
dflet 0:400d8e75a8d0 772 int16_t cc3100_socket::sl_SetSockOpt(int16_t sd, int16_t level, int16_t optname, const void *optval, SlSocklen_t optlen)
dflet 0:400d8e75a8d0 773 {
dflet 0:400d8e75a8d0 774 _SlSetSockOptMsg_u Msg;
dflet 0:400d8e75a8d0 775 _SlCmdExt_t CmdExt;
dflet 0:400d8e75a8d0 776
dflet 0:400d8e75a8d0 777 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:400d8e75a8d0 778 CmdExt.TxPayloadLen = optlen;
dflet 0:400d8e75a8d0 779 CmdExt.pTxPayload = (uint8_t *)optval;
dflet 0:400d8e75a8d0 780
dflet 0:400d8e75a8d0 781 Msg.Cmd.sd = (uint8_t)sd;
dflet 0:400d8e75a8d0 782 Msg.Cmd.level = (uint8_t)level;
dflet 0:400d8e75a8d0 783 Msg.Cmd.optionLen = (uint8_t)optlen;
dflet 0:400d8e75a8d0 784 Msg.Cmd.optionName = (uint8_t)optname;
dflet 0:400d8e75a8d0 785
dflet 0:400d8e75a8d0 786 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlSetSockOptCmdCtrl, &Msg, &CmdExt));
dflet 0:400d8e75a8d0 787
dflet 0:400d8e75a8d0 788 return (int16_t)Msg.Rsp.statusOrLen;
dflet 0:400d8e75a8d0 789 }
dflet 0:400d8e75a8d0 790 #endif
dflet 0:400d8e75a8d0 791
dflet 0:400d8e75a8d0 792 /*******************************************************************************/
dflet 0:400d8e75a8d0 793 /* sl_GetSockOpt */
dflet 0:400d8e75a8d0 794 /*******************************************************************************/
dflet 0:400d8e75a8d0 795 typedef union {
dflet 0:400d8e75a8d0 796 _getSockOptCommand_t Cmd;
dflet 0:400d8e75a8d0 797 _getSockOptResponse_t Rsp;
dflet 0:400d8e75a8d0 798 } _SlGetSockOptMsg_u;
dflet 0:400d8e75a8d0 799
dflet 0:400d8e75a8d0 800 #if _SL_INCLUDE_FUNC(sl_GetSockOpt)
dflet 0:400d8e75a8d0 801 const _SlCmdCtrl_t _SlGetSockOptCmdCtrl = {
dflet 0:400d8e75a8d0 802 SL_OPCODE_SOCKET_GETSOCKOPT,
dflet 0:400d8e75a8d0 803 sizeof(_getSockOptCommand_t),
dflet 0:400d8e75a8d0 804 sizeof(_getSockOptResponse_t)
dflet 0:400d8e75a8d0 805 };
dflet 0:400d8e75a8d0 806
dflet 0:400d8e75a8d0 807 int16_t cc3100_socket::sl_GetSockOpt(int16_t sd, int16_t level, int16_t optname, void *optval, SlSocklen_t *optlen)
dflet 0:400d8e75a8d0 808 {
dflet 0:400d8e75a8d0 809 _SlGetSockOptMsg_u Msg;
dflet 0:400d8e75a8d0 810 _SlCmdExt_t CmdExt;
dflet 0:400d8e75a8d0 811
dflet 0:400d8e75a8d0 812 if (*optlen == 0) {
dflet 0:400d8e75a8d0 813 return SL_EZEROLEN;
dflet 0:400d8e75a8d0 814 }
dflet 0:400d8e75a8d0 815
dflet 0:400d8e75a8d0 816 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:400d8e75a8d0 817 CmdExt.RxPayloadLen = *optlen;
dflet 0:400d8e75a8d0 818 CmdExt.pRxPayload = (uint8_t*)optval;
dflet 0:400d8e75a8d0 819
dflet 0:400d8e75a8d0 820 Msg.Cmd.sd = (uint8_t)sd;
dflet 0:400d8e75a8d0 821 Msg.Cmd.level = (uint8_t)level;
dflet 0:400d8e75a8d0 822 Msg.Cmd.optionLen = (uint8_t)(*optlen);
dflet 0:400d8e75a8d0 823 Msg.Cmd.optionName = (uint8_t)optname;
dflet 0:400d8e75a8d0 824
dflet 0:400d8e75a8d0 825 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlGetSockOptCmdCtrl, &Msg, &CmdExt));
dflet 0:400d8e75a8d0 826
dflet 0:400d8e75a8d0 827 if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) {
dflet 0:400d8e75a8d0 828 *optlen = Msg.Rsp.optionLen;
dflet 0:400d8e75a8d0 829 return SL_ESMALLBUF;
dflet 0:400d8e75a8d0 830 } else {
dflet 0:400d8e75a8d0 831 *optlen = (uint8_t)CmdExt.ActualRxPayloadLen;
dflet 0:400d8e75a8d0 832 }
dflet 0:400d8e75a8d0 833 return (int16_t)Msg.Rsp.status;
dflet 0:400d8e75a8d0 834 }
dflet 0:400d8e75a8d0 835 #endif
dflet 0:400d8e75a8d0 836
dflet 0:400d8e75a8d0 837 /*******************************************************************************/
dflet 0:400d8e75a8d0 838 /* sl_Select */
dflet 0:400d8e75a8d0 839 /* ******************************************************************************/
dflet 0:400d8e75a8d0 840 typedef union {
dflet 0:400d8e75a8d0 841 _SelectCommand_t Cmd;
dflet 0:400d8e75a8d0 842 _BasicResponse_t Rsp;
dflet 0:400d8e75a8d0 843 } _SlSelectMsg_u;
dflet 0:400d8e75a8d0 844
dflet 0:400d8e75a8d0 845 #ifndef SL_TINY_EXT
dflet 0:400d8e75a8d0 846 #if _SL_INCLUDE_FUNC(sl_Select)
dflet 0:400d8e75a8d0 847 const _SlCmdCtrl_t _SlSelectCmdCtrl = {
dflet 0:400d8e75a8d0 848 SL_OPCODE_SOCKET_SELECT,
dflet 0:400d8e75a8d0 849 sizeof(_SelectCommand_t),
dflet 0:400d8e75a8d0 850 sizeof(_BasicResponse_t)
dflet 0:400d8e75a8d0 851 };
dflet 0:400d8e75a8d0 852
dflet 0:400d8e75a8d0 853 int16_t cc3100_socket::sl_Select(int16_t nfds, SlFdSet_t *readsds, SlFdSet_t *writesds, SlFdSet_t *exceptsds, SlTimeval_t *timeout)
dflet 0:400d8e75a8d0 854 {
dflet 0:400d8e75a8d0 855 _SlSelectMsg_u Msg;
dflet 0:400d8e75a8d0 856 _SelectAsyncResponse_t AsyncRsp;
dflet 0:400d8e75a8d0 857 uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:400d8e75a8d0 858
dflet 0:400d8e75a8d0 859 Msg.Cmd.nfds = (uint8_t)nfds;
dflet 0:400d8e75a8d0 860 Msg.Cmd.readFdsCount = 0;
dflet 0:400d8e75a8d0 861 Msg.Cmd.writeFdsCount = 0;
dflet 0:400d8e75a8d0 862
dflet 0:400d8e75a8d0 863 Msg.Cmd.readFds = 0;
dflet 0:400d8e75a8d0 864 Msg.Cmd.writeFds = 0;
dflet 0:400d8e75a8d0 865
dflet 0:400d8e75a8d0 866 if( readsds ) {
dflet 0:400d8e75a8d0 867 Msg.Cmd.readFds = (uint16_t)readsds->fd_array[0];
dflet 0:400d8e75a8d0 868 }
dflet 0:400d8e75a8d0 869 if( writesds ) {
dflet 0:400d8e75a8d0 870 Msg.Cmd.writeFds = (uint16_t)writesds->fd_array[0];
dflet 0:400d8e75a8d0 871 }
dflet 0:400d8e75a8d0 872 if( NULL == timeout ) {
dflet 0:400d8e75a8d0 873 Msg.Cmd.tv_sec = 0xffff;
dflet 0:400d8e75a8d0 874 Msg.Cmd.tv_usec = 0xffff;
dflet 0:400d8e75a8d0 875 } else {
dflet 0:400d8e75a8d0 876 if( 0xffff <= timeout->tv_sec ) {
dflet 0:400d8e75a8d0 877 Msg.Cmd.tv_sec = 0xffff;
dflet 0:400d8e75a8d0 878 } else {
dflet 0:400d8e75a8d0 879 Msg.Cmd.tv_sec = (uint16_t)timeout->tv_sec;
dflet 0:400d8e75a8d0 880 }
dflet 0:400d8e75a8d0 881 timeout->tv_usec = timeout->tv_usec >> 10; /* convert to milliseconds */
dflet 0:400d8e75a8d0 882 if( 0xffff <= timeout->tv_usec ) {
dflet 0:400d8e75a8d0 883 Msg.Cmd.tv_usec = 0xffff;
dflet 0:400d8e75a8d0 884 } else {
dflet 0:400d8e75a8d0 885 Msg.Cmd.tv_usec = (uint16_t)timeout->tv_usec;
dflet 0:400d8e75a8d0 886 }
dflet 0:400d8e75a8d0 887 }
dflet 0:400d8e75a8d0 888
dflet 0:400d8e75a8d0 889 /* Use Obj to issue the command, if not available try later */
dflet 0:400d8e75a8d0 890 ObjIdx = _driver._SlDrvProtectAsyncRespSetting((uint8_t*)&AsyncRsp, SELECT_ID, SL_MAX_SOCKETS);
dflet 0:400d8e75a8d0 891
dflet 0:400d8e75a8d0 892 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
dflet 0:400d8e75a8d0 893 {
dflet 0:400d8e75a8d0 894 return SL_POOL_IS_EMPTY;
dflet 0:400d8e75a8d0 895 }
dflet 0:400d8e75a8d0 896
dflet 0:400d8e75a8d0 897 /* send the command */
dflet 0:400d8e75a8d0 898 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlSelectCmdCtrl, &Msg, NULL));
dflet 0:400d8e75a8d0 899
dflet 0:400d8e75a8d0 900 if(SL_OS_RET_CODE_OK == (int16_t)Msg.Rsp.status) {
dflet 0:400d8e75a8d0 901 _driver._SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
dflet 0:400d8e75a8d0 902 Msg.Rsp.status = AsyncRsp.status;
dflet 0:400d8e75a8d0 903
dflet 0:400d8e75a8d0 904 if( ((int16_t)Msg.Rsp.status) >= 0 ) {
dflet 0:400d8e75a8d0 905 if( readsds ) {
dflet 0:400d8e75a8d0 906 readsds->fd_array[0] = AsyncRsp.readFds;
dflet 0:400d8e75a8d0 907 }
dflet 0:400d8e75a8d0 908 if( writesds ) {
dflet 0:400d8e75a8d0 909 writesds->fd_array[0] = AsyncRsp.writeFds;
dflet 0:400d8e75a8d0 910 }
dflet 0:400d8e75a8d0 911 }
dflet 0:400d8e75a8d0 912 }
dflet 0:400d8e75a8d0 913
dflet 0:400d8e75a8d0 914 _driver._SlDrvReleasePoolObj(ObjIdx);
dflet 0:400d8e75a8d0 915 return (int16_t)Msg.Rsp.status;
dflet 0:400d8e75a8d0 916 }
dflet 0:400d8e75a8d0 917
dflet 0:400d8e75a8d0 918 /* Select helper functions */
dflet 0:400d8e75a8d0 919 /*******************************************************************************/
dflet 0:400d8e75a8d0 920 /* SL_FD_SET */
dflet 0:400d8e75a8d0 921 /* ******************************************************************************/
dflet 0:400d8e75a8d0 922 void cc3100_socket::SL_FD_SET(int16_t fd, SlFdSet_t *fdset)
dflet 0:400d8e75a8d0 923 {
dflet 0:400d8e75a8d0 924 fdset->fd_array[0] |= (1<< (fd & BSD_SOCKET_ID_MASK));
dflet 0:400d8e75a8d0 925 }
dflet 0:400d8e75a8d0 926 /*******************************************************************************/
dflet 0:400d8e75a8d0 927 /* SL_FD_CLR */
dflet 0:400d8e75a8d0 928 /*******************************************************************************/
dflet 0:400d8e75a8d0 929 void cc3100_socket::SL_FD_CLR(int16_t fd, SlFdSet_t *fdset)
dflet 0:400d8e75a8d0 930 {
dflet 0:400d8e75a8d0 931 fdset->fd_array[0] &= ~(1<< (fd & BSD_SOCKET_ID_MASK));
dflet 0:400d8e75a8d0 932 }
dflet 0:400d8e75a8d0 933 /*******************************************************************************/
dflet 0:400d8e75a8d0 934 /* SL_FD_ISSET */
dflet 0:400d8e75a8d0 935 /*******************************************************************************/
dflet 0:400d8e75a8d0 936 int16_t cc3100_socket::SL_FD_ISSET(int16_t fd, SlFdSet_t *fdset)
dflet 0:400d8e75a8d0 937 {
dflet 0:400d8e75a8d0 938 if( fdset->fd_array[0] & (1<< (fd & BSD_SOCKET_ID_MASK)) ) {
dflet 0:400d8e75a8d0 939 return 1;
dflet 0:400d8e75a8d0 940 }
dflet 0:400d8e75a8d0 941 return 0;
dflet 0:400d8e75a8d0 942 }
dflet 0:400d8e75a8d0 943 /*******************************************************************************/
dflet 0:400d8e75a8d0 944 /* SL_FD_ZERO */
dflet 0:400d8e75a8d0 945 /*******************************************************************************/
dflet 0:400d8e75a8d0 946 void cc3100_socket::SL_FD_ZERO(SlFdSet_t *fdset)
dflet 0:400d8e75a8d0 947 {
dflet 0:400d8e75a8d0 948 fdset->fd_array[0] = 0;
dflet 0:400d8e75a8d0 949 }
dflet 0:400d8e75a8d0 950
dflet 0:400d8e75a8d0 951 #endif
dflet 0:400d8e75a8d0 952 #endif
dflet 0:400d8e75a8d0 953
dflet 0:400d8e75a8d0 954 }//namespace mbed_cc3100
dflet 0:400d8e75a8d0 955
dflet 0:400d8e75a8d0 956
dflet 0:400d8e75a8d0 957