TI's CC3100 host driver and demo. Experimental and a work in progress.

Dependencies:   mbed

Committer:
dflet
Date:
Wed Nov 19 23:04:04 2014 +0000
Revision:
2:a3e52cf86086
Parent:
0:bbe98578d4c0
Added more boards!

Who changed what in which revision?

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