TI's MQTT Demo with freertos CM4F

Dependencies:   mbed

Committer:
dflet
Date:
Thu Sep 03 14:07:01 2015 +0000
Revision:
0:1e7b5dd9edb4
First commit, it's been hanging around for a while. Updated SPI mode change 1 to 0.

Who changed what in which revision?

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