CC3000HostDriver for device TI CC3000 some changes were made due to mbed compiler and the use of void*

Dependents:   CC3000Test

Committer:
dflet
Date:
Fri Aug 02 15:06:15 2013 +0000
Revision:
0:9cb694f00b7b
First commit TI CC3000HostDriver library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:9cb694f00b7b 1 /*****************************************************************************
dflet 0:9cb694f00b7b 2 *
dflet 0:9cb694f00b7b 3 * socket.c - CC3000 Host Driver Implementation.
dflet 0:9cb694f00b7b 4 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:9cb694f00b7b 5 *
dflet 0:9cb694f00b7b 6 * Redistribution and use in source and binary forms, with or without
dflet 0:9cb694f00b7b 7 * modification, are permitted provided that the following conditions
dflet 0:9cb694f00b7b 8 * are met:
dflet 0:9cb694f00b7b 9 *
dflet 0:9cb694f00b7b 10 * Redistributions of source code must retain the above copyright
dflet 0:9cb694f00b7b 11 * notice, this list of conditions and the following disclaimer.
dflet 0:9cb694f00b7b 12 *
dflet 0:9cb694f00b7b 13 * Redistributions in binary form must reproduce the above copyright
dflet 0:9cb694f00b7b 14 * notice, this list of conditions and the following disclaimer in the
dflet 0:9cb694f00b7b 15 * documentation and/or other materials provided with the
dflet 0:9cb694f00b7b 16 * distribution.
dflet 0:9cb694f00b7b 17 *
dflet 0:9cb694f00b7b 18 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:9cb694f00b7b 19 * its contributors may be used to endorse or promote products derived
dflet 0:9cb694f00b7b 20 * from this software without specific prior written permission.
dflet 0:9cb694f00b7b 21 *
dflet 0:9cb694f00b7b 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:9cb694f00b7b 23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:9cb694f00b7b 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:9cb694f00b7b 25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:9cb694f00b7b 26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:9cb694f00b7b 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:9cb694f00b7b 28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:9cb694f00b7b 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:9cb694f00b7b 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:9cb694f00b7b 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:9cb694f00b7b 32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:9cb694f00b7b 33 *
dflet 0:9cb694f00b7b 34 *****************************************************************************/
dflet 0:9cb694f00b7b 35
dflet 0:9cb694f00b7b 36 //*****************************************************************************
dflet 0:9cb694f00b7b 37 //
dflet 0:9cb694f00b7b 38 //! \addtogroup socket_api
dflet 0:9cb694f00b7b 39 //! @{
dflet 0:9cb694f00b7b 40 //
dflet 0:9cb694f00b7b 41 //*****************************************************************************
dflet 0:9cb694f00b7b 42
dflet 0:9cb694f00b7b 43 #include <stdio.h>
dflet 0:9cb694f00b7b 44 #include <string.h>
dflet 0:9cb694f00b7b 45 #include <stdlib.h>
dflet 0:9cb694f00b7b 46 #include "hci.h"
dflet 0:9cb694f00b7b 47 #include "socket.h"
dflet 0:9cb694f00b7b 48 #include "evnt_handler.h"
dflet 0:9cb694f00b7b 49 #include "netapp.h"
dflet 0:9cb694f00b7b 50
dflet 0:9cb694f00b7b 51
dflet 0:9cb694f00b7b 52
dflet 0:9cb694f00b7b 53 //Enable this flag if and only if you must comply with BSD socket
dflet 0:9cb694f00b7b 54 //close() function
dflet 0:9cb694f00b7b 55 #ifdef _API_USE_BSD_CLOSE
dflet 0:9cb694f00b7b 56 #define close(sd) closesocket(sd)
dflet 0:9cb694f00b7b 57 #endif
dflet 0:9cb694f00b7b 58
dflet 0:9cb694f00b7b 59 //Enable this flag if and only if you must comply with BSD socket read() and
dflet 0:9cb694f00b7b 60 //write() functions
dflet 0:9cb694f00b7b 61 #ifdef _API_USE_BSD_READ_WRITE
dflet 0:9cb694f00b7b 62 #define read(sd, buf, len, flags) recv(sd, buf, len, flags)
dflet 0:9cb694f00b7b 63 #define write(sd, buf, len, flags) send(sd, buf, len, flags)
dflet 0:9cb694f00b7b 64 #endif
dflet 0:9cb694f00b7b 65
dflet 0:9cb694f00b7b 66 #define SOCKET_OPEN_PARAMS_LEN (12)
dflet 0:9cb694f00b7b 67 #define SOCKET_CLOSE_PARAMS_LEN (4)
dflet 0:9cb694f00b7b 68 #define SOCKET_ACCEPT_PARAMS_LEN (4)
dflet 0:9cb694f00b7b 69 #define SOCKET_BIND_PARAMS_LEN (20)
dflet 0:9cb694f00b7b 70 #define SOCKET_LISTEN_PARAMS_LEN (8)
dflet 0:9cb694f00b7b 71 #define SOCKET_GET_HOST_BY_NAME_PARAMS_LEN (9)
dflet 0:9cb694f00b7b 72 #define SOCKET_CONNECT_PARAMS_LEN (20)
dflet 0:9cb694f00b7b 73 #define SOCKET_SELECT_PARAMS_LEN (44)
dflet 0:9cb694f00b7b 74 #define SOCKET_SET_SOCK_OPT_PARAMS_LEN (20)
dflet 0:9cb694f00b7b 75 #define SOCKET_GET_SOCK_OPT_PARAMS_LEN (12)
dflet 0:9cb694f00b7b 76 #define SOCKET_RECV_FROM_PARAMS_LEN (12)
dflet 0:9cb694f00b7b 77 #define SOCKET_SENDTO_PARAMS_LEN (24)
dflet 0:9cb694f00b7b 78 #define SOCKET_MDNS_ADVERTISE_PARAMS_LEN (12)
dflet 0:9cb694f00b7b 79
dflet 0:9cb694f00b7b 80
dflet 0:9cb694f00b7b 81 // The legnth of arguments for the SEND command: sd + buff_offset + len + flags,
dflet 0:9cb694f00b7b 82 // while size of each parameter is 32 bit - so the total length is 16 bytes;
dflet 0:9cb694f00b7b 83
dflet 0:9cb694f00b7b 84 #define HCI_CMND_SEND_ARG_LENGTH (16)
dflet 0:9cb694f00b7b 85
dflet 0:9cb694f00b7b 86
dflet 0:9cb694f00b7b 87 #define SELECT_TIMEOUT_MIN_MICRO_SECONDS 5000
dflet 0:9cb694f00b7b 88
dflet 0:9cb694f00b7b 89 #define HEADERS_SIZE_DATA (SPI_HEADER_SIZE + 5)
dflet 0:9cb694f00b7b 90
dflet 0:9cb694f00b7b 91 #define SIMPLE_LINK_HCI_CMND_TRANSPORT_HEADER_SIZE (SPI_HEADER_SIZE + SIMPLE_LINK_HCI_CMND_HEADER_SIZE)
dflet 0:9cb694f00b7b 92
dflet 0:9cb694f00b7b 93 #define MDNS_DEVICE_SERVICE_MAX_LENGTH (32)
dflet 0:9cb694f00b7b 94
dflet 0:9cb694f00b7b 95
dflet 0:9cb694f00b7b 96 //*****************************************************************************
dflet 0:9cb694f00b7b 97 //
dflet 0:9cb694f00b7b 98 //! HostFlowControlConsumeBuff
dflet 0:9cb694f00b7b 99 //!
dflet 0:9cb694f00b7b 100 //! @param sd socket descriptor
dflet 0:9cb694f00b7b 101 //!
dflet 0:9cb694f00b7b 102 //! @return 0 in case there are buffers available,
dflet 0:9cb694f00b7b 103 //! -1 in case of bad socket
dflet 0:9cb694f00b7b 104 //! -2 if there are no free buffers present (only when
dflet 0:9cb694f00b7b 105 //! SEND_NON_BLOCKING is enabled)
dflet 0:9cb694f00b7b 106 //!
dflet 0:9cb694f00b7b 107 //! @brief if SEND_NON_BLOCKING not define - block until have free buffer
dflet 0:9cb694f00b7b 108 //! becomes available, else return immediately with correct status
dflet 0:9cb694f00b7b 109 //! regarding the buffers available.
dflet 0:9cb694f00b7b 110 //
dflet 0:9cb694f00b7b 111 //*****************************************************************************
dflet 0:9cb694f00b7b 112 int
dflet 0:9cb694f00b7b 113 HostFlowControlConsumeBuff(int sd)
dflet 0:9cb694f00b7b 114 {
dflet 0:9cb694f00b7b 115 #ifndef SEND_NON_BLOCKING
dflet 0:9cb694f00b7b 116 /* wait in busy loop */
dflet 0:9cb694f00b7b 117 do
dflet 0:9cb694f00b7b 118 {
dflet 0:9cb694f00b7b 119 // In case last transmission failed then we will return the last failure
dflet 0:9cb694f00b7b 120 // reason here.
dflet 0:9cb694f00b7b 121 // Note that the buffer will not be allocated in this case
dflet 0:9cb694f00b7b 122 if (tSLInformation.slTransmitDataError != 0)
dflet 0:9cb694f00b7b 123 {
dflet 0:9cb694f00b7b 124 errno = tSLInformation.slTransmitDataError;
dflet 0:9cb694f00b7b 125 tSLInformation.slTransmitDataError = 0;
dflet 0:9cb694f00b7b 126 return errno;
dflet 0:9cb694f00b7b 127 }
dflet 0:9cb694f00b7b 128
dflet 0:9cb694f00b7b 129 if(SOCKET_STATUS_ACTIVE != get_socket_active_status(sd))
dflet 0:9cb694f00b7b 130 return -1;
dflet 0:9cb694f00b7b 131 } while(0 == tSLInformation.usNumberOfFreeBuffers);
dflet 0:9cb694f00b7b 132
dflet 0:9cb694f00b7b 133 tSLInformation.usNumberOfFreeBuffers--;
dflet 0:9cb694f00b7b 134
dflet 0:9cb694f00b7b 135 return 0;
dflet 0:9cb694f00b7b 136 #else
dflet 0:9cb694f00b7b 137
dflet 0:9cb694f00b7b 138 // In case last transmission failed then we will return the last failure
dflet 0:9cb694f00b7b 139 // reason here.
dflet 0:9cb694f00b7b 140 // Note that the buffer will not be allocated in this case
dflet 0:9cb694f00b7b 141 if (tSLInformation.slTransmitDataError != 0)
dflet 0:9cb694f00b7b 142 {
dflet 0:9cb694f00b7b 143 errno = tSLInformation.slTransmitDataError;
dflet 0:9cb694f00b7b 144 tSLInformation.slTransmitDataError = 0;
dflet 0:9cb694f00b7b 145 return errno;
dflet 0:9cb694f00b7b 146 }
dflet 0:9cb694f00b7b 147 if(SOCKET_STATUS_ACTIVE != get_socket_active_status(sd))
dflet 0:9cb694f00b7b 148 return -1;
dflet 0:9cb694f00b7b 149
dflet 0:9cb694f00b7b 150 //If there are no available buffers, return -2. It is recommended to use
dflet 0:9cb694f00b7b 151 // select or receive to see if there is any buffer occupied with received data
dflet 0:9cb694f00b7b 152 // If so, call receive() to release the buffer.
dflet 0:9cb694f00b7b 153 if(0 == tSLInformation.usNumberOfFreeBuffers)
dflet 0:9cb694f00b7b 154 {
dflet 0:9cb694f00b7b 155 return -2;
dflet 0:9cb694f00b7b 156 }
dflet 0:9cb694f00b7b 157 else
dflet 0:9cb694f00b7b 158 {
dflet 0:9cb694f00b7b 159 tSLInformation.usNumberOfFreeBuffers--;
dflet 0:9cb694f00b7b 160 return 0;
dflet 0:9cb694f00b7b 161 }
dflet 0:9cb694f00b7b 162 #endif
dflet 0:9cb694f00b7b 163 }
dflet 0:9cb694f00b7b 164
dflet 0:9cb694f00b7b 165 //*****************************************************************************
dflet 0:9cb694f00b7b 166 //
dflet 0:9cb694f00b7b 167 //! socket
dflet 0:9cb694f00b7b 168 //!
dflet 0:9cb694f00b7b 169 //! @param domain selects the protocol family which will be used for
dflet 0:9cb694f00b7b 170 //! communication. On this version only AF_INET is supported
dflet 0:9cb694f00b7b 171 //! @param type specifies the communication semantics. On this version
dflet 0:9cb694f00b7b 172 //! only SOCK_STREAM, SOCK_DGRAM, SOCK_RAW are supported
dflet 0:9cb694f00b7b 173 //! @param protocol specifies a particular protocol to be used with the
dflet 0:9cb694f00b7b 174 //! socket IPPROTO_TCP, IPPROTO_UDP or IPPROTO_RAW are
dflet 0:9cb694f00b7b 175 //! supported.
dflet 0:9cb694f00b7b 176 //!
dflet 0:9cb694f00b7b 177 //! @return On success, socket handle that is used for consequent socket
dflet 0:9cb694f00b7b 178 //! operations. On error, -1 is returned.
dflet 0:9cb694f00b7b 179 //!
dflet 0:9cb694f00b7b 180 //! @brief create an endpoint for communication
dflet 0:9cb694f00b7b 181 //! The socket function creates a socket that is bound to a specific
dflet 0:9cb694f00b7b 182 //! transport service provider. This function is called by the
dflet 0:9cb694f00b7b 183 //! application layer to obtain a socket handle.
dflet 0:9cb694f00b7b 184 //
dflet 0:9cb694f00b7b 185 //*****************************************************************************
dflet 0:9cb694f00b7b 186
dflet 0:9cb694f00b7b 187 int
dflet 0:9cb694f00b7b 188 socket(long domain, long type, long protocol)
dflet 0:9cb694f00b7b 189 {
dflet 0:9cb694f00b7b 190 long ret;
dflet 0:9cb694f00b7b 191 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 192
dflet 0:9cb694f00b7b 193 ret = EFAIL;
dflet 0:9cb694f00b7b 194 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 195 args = (ptr + HEADERS_SIZE_CMD);
dflet 0:9cb694f00b7b 196
dflet 0:9cb694f00b7b 197 // Fill in HCI packet structure
dflet 0:9cb694f00b7b 198 args = UINT32_TO_STREAM(args, domain);
dflet 0:9cb694f00b7b 199 args = UINT32_TO_STREAM(args, type);
dflet 0:9cb694f00b7b 200 args = UINT32_TO_STREAM(args, protocol);
dflet 0:9cb694f00b7b 201
dflet 0:9cb694f00b7b 202 // Initiate a HCI command
dflet 0:9cb694f00b7b 203 hci_command_send(HCI_CMND_SOCKET, ptr, SOCKET_OPEN_PARAMS_LEN);
dflet 0:9cb694f00b7b 204
dflet 0:9cb694f00b7b 205 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 206 SimpleLinkWaitEvent(HCI_CMND_SOCKET, &ret);
dflet 0:9cb694f00b7b 207
dflet 0:9cb694f00b7b 208 // Process the event
dflet 0:9cb694f00b7b 209 errno = ret;
dflet 0:9cb694f00b7b 210
dflet 0:9cb694f00b7b 211 set_socket_active_status(ret, SOCKET_STATUS_ACTIVE);
dflet 0:9cb694f00b7b 212
dflet 0:9cb694f00b7b 213 return(ret);
dflet 0:9cb694f00b7b 214 }
dflet 0:9cb694f00b7b 215
dflet 0:9cb694f00b7b 216 //*****************************************************************************
dflet 0:9cb694f00b7b 217 //
dflet 0:9cb694f00b7b 218 //! closesocket
dflet 0:9cb694f00b7b 219 //!
dflet 0:9cb694f00b7b 220 //! @param sd socket handle.
dflet 0:9cb694f00b7b 221 //!
dflet 0:9cb694f00b7b 222 //! @return On success, zero is returned. On error, -1 is returned.
dflet 0:9cb694f00b7b 223 //!
dflet 0:9cb694f00b7b 224 //! @brief The socket function closes a created socket.
dflet 0:9cb694f00b7b 225 //
dflet 0:9cb694f00b7b 226 //*****************************************************************************
dflet 0:9cb694f00b7b 227
dflet 0:9cb694f00b7b 228 long
dflet 0:9cb694f00b7b 229 closesocket(long sd)
dflet 0:9cb694f00b7b 230 {
dflet 0:9cb694f00b7b 231 long ret;
dflet 0:9cb694f00b7b 232 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 233
dflet 0:9cb694f00b7b 234 ret = EFAIL;
dflet 0:9cb694f00b7b 235 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 236 args = (ptr + HEADERS_SIZE_CMD);
dflet 0:9cb694f00b7b 237
dflet 0:9cb694f00b7b 238 // Fill in HCI packet structure
dflet 0:9cb694f00b7b 239 args = UINT32_TO_STREAM(args, sd);
dflet 0:9cb694f00b7b 240
dflet 0:9cb694f00b7b 241 // Initiate a HCI command
dflet 0:9cb694f00b7b 242 hci_command_send(HCI_CMND_CLOSE_SOCKET,
dflet 0:9cb694f00b7b 243 ptr, SOCKET_CLOSE_PARAMS_LEN);
dflet 0:9cb694f00b7b 244
dflet 0:9cb694f00b7b 245 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 246 SimpleLinkWaitEvent(HCI_CMND_CLOSE_SOCKET, &ret);
dflet 0:9cb694f00b7b 247 errno = ret;
dflet 0:9cb694f00b7b 248
dflet 0:9cb694f00b7b 249 // since 'close' call may result in either OK (and then it closed) or error
dflet 0:9cb694f00b7b 250 // mark this socket as invalid
dflet 0:9cb694f00b7b 251 set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
dflet 0:9cb694f00b7b 252
dflet 0:9cb694f00b7b 253 return(ret);
dflet 0:9cb694f00b7b 254 }
dflet 0:9cb694f00b7b 255
dflet 0:9cb694f00b7b 256 //*****************************************************************************
dflet 0:9cb694f00b7b 257 //
dflet 0:9cb694f00b7b 258 //! accept
dflet 0:9cb694f00b7b 259 //!
dflet 0:9cb694f00b7b 260 //! @param[in] sd socket descriptor (handle)
dflet 0:9cb694f00b7b 261 //! @param[out] addr the argument addr is a pointer to a sockaddr structure
dflet 0:9cb694f00b7b 262 //! This structure is filled in with the address of the
dflet 0:9cb694f00b7b 263 //! peer socket, as known to the communications layer.
dflet 0:9cb694f00b7b 264 //! determined. The exact format of the address returned
dflet 0:9cb694f00b7b 265 //! addr is by the socket's address sockaddr.
dflet 0:9cb694f00b7b 266 //! On this version only AF_INET is supported.
dflet 0:9cb694f00b7b 267 //! This argument returns in network order.
dflet 0:9cb694f00b7b 268 //! @param[out] addrlen the addrlen argument is a value-result argument:
dflet 0:9cb694f00b7b 269 //! it should initially contain the size of the structure
dflet 0:9cb694f00b7b 270 //! pointed to by addr.
dflet 0:9cb694f00b7b 271 //!
dflet 0:9cb694f00b7b 272 //! @return For socket in blocking mode:
dflet 0:9cb694f00b7b 273 //! On success, socket handle. on failure negative
dflet 0:9cb694f00b7b 274 //! For socket in non-blocking mode:
dflet 0:9cb694f00b7b 275 //! - On connection establishment, socket handle
dflet 0:9cb694f00b7b 276 //! - On connection pending, SOC_IN_PROGRESS (-2)
dflet 0:9cb694f00b7b 277 //! - On failure, SOC_ERROR (-1)
dflet 0:9cb694f00b7b 278 //!
dflet 0:9cb694f00b7b 279 //! @brief accept a connection on a socket:
dflet 0:9cb694f00b7b 280 //! This function is used with connection-based socket types
dflet 0:9cb694f00b7b 281 //! (SOCK_STREAM). It extracts the first connection request on the
dflet 0:9cb694f00b7b 282 //! queue of pending connections, creates a new connected socket, and
dflet 0:9cb694f00b7b 283 //! returns a new file descriptor referring to that socket.
dflet 0:9cb694f00b7b 284 //! The newly created socket is not in the listening state.
dflet 0:9cb694f00b7b 285 //! The original socket sd is unaffected by this call.
dflet 0:9cb694f00b7b 286 //! The argument sd is a socket that has been created with socket(),
dflet 0:9cb694f00b7b 287 //! bound to a local address with bind(), and is listening for
dflet 0:9cb694f00b7b 288 //! connections after a listen(). The argument addr is a pointer
dflet 0:9cb694f00b7b 289 //! to a sockaddr structure. This structure is filled in with the
dflet 0:9cb694f00b7b 290 //! address of the peer socket, as known to the communications layer.
dflet 0:9cb694f00b7b 291 //! The exact format of the address returned addr is determined by the
dflet 0:9cb694f00b7b 292 //! socket's address family. The addrlen argument is a value-result
dflet 0:9cb694f00b7b 293 //! argument: it should initially contain the size of the structure
dflet 0:9cb694f00b7b 294 //! pointed to by addr, on return it will contain the actual
dflet 0:9cb694f00b7b 295 //! length (in bytes) of the address returned.
dflet 0:9cb694f00b7b 296 //!
dflet 0:9cb694f00b7b 297 //! @sa socket ; bind ; listen
dflet 0:9cb694f00b7b 298 //
dflet 0:9cb694f00b7b 299 //*****************************************************************************
dflet 0:9cb694f00b7b 300
dflet 0:9cb694f00b7b 301 long
dflet 0:9cb694f00b7b 302 accept(long sd, sockaddr *addr, socklen_t *addrlen)
dflet 0:9cb694f00b7b 303 {
dflet 0:9cb694f00b7b 304 long ret;
dflet 0:9cb694f00b7b 305 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 306 tBsdReturnParams tAcceptReturnArguments;
dflet 0:9cb694f00b7b 307
dflet 0:9cb694f00b7b 308 ret = EFAIL;
dflet 0:9cb694f00b7b 309 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 310 args = (ptr + HEADERS_SIZE_CMD);
dflet 0:9cb694f00b7b 311
dflet 0:9cb694f00b7b 312 // Fill in temporary command buffer
dflet 0:9cb694f00b7b 313 args = UINT32_TO_STREAM(args, sd);
dflet 0:9cb694f00b7b 314
dflet 0:9cb694f00b7b 315 // Initiate a HCI command
dflet 0:9cb694f00b7b 316 hci_command_send(HCI_CMND_ACCEPT, ptr, SOCKET_ACCEPT_PARAMS_LEN);
dflet 0:9cb694f00b7b 317
dflet 0:9cb694f00b7b 318 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 319 SimpleLinkWaitEvent(HCI_CMND_ACCEPT, (long*)&tAcceptReturnArguments);
dflet 0:9cb694f00b7b 320
dflet 0:9cb694f00b7b 321
dflet 0:9cb694f00b7b 322 // need specify return parameters!!!
dflet 0:9cb694f00b7b 323 memcpy(addr, &tAcceptReturnArguments.tSocketAddress, ASIC_ADDR_LEN);
dflet 0:9cb694f00b7b 324 *addrlen = ASIC_ADDR_LEN;
dflet 0:9cb694f00b7b 325 errno = tAcceptReturnArguments.iStatus;
dflet 0:9cb694f00b7b 326 ret = errno;
dflet 0:9cb694f00b7b 327
dflet 0:9cb694f00b7b 328 // if succeeded, iStatus = new socket descriptor. otherwise - error number
dflet 0:9cb694f00b7b 329 if(M_IS_VALID_SD(ret))
dflet 0:9cb694f00b7b 330 {
dflet 0:9cb694f00b7b 331 set_socket_active_status(ret, SOCKET_STATUS_ACTIVE);
dflet 0:9cb694f00b7b 332 }
dflet 0:9cb694f00b7b 333 else
dflet 0:9cb694f00b7b 334 {
dflet 0:9cb694f00b7b 335 set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
dflet 0:9cb694f00b7b 336 }
dflet 0:9cb694f00b7b 337
dflet 0:9cb694f00b7b 338 return(ret);
dflet 0:9cb694f00b7b 339 }
dflet 0:9cb694f00b7b 340
dflet 0:9cb694f00b7b 341 //*****************************************************************************
dflet 0:9cb694f00b7b 342 //
dflet 0:9cb694f00b7b 343 //! bind
dflet 0:9cb694f00b7b 344 //!
dflet 0:9cb694f00b7b 345 //! @param[in] sd socket descriptor (handle)
dflet 0:9cb694f00b7b 346 //! @param[out] addr specifies the destination address. On this version
dflet 0:9cb694f00b7b 347 //! only AF_INET is supported.
dflet 0:9cb694f00b7b 348 //! @param[out] addrlen contains the size of the structure pointed to by addr.
dflet 0:9cb694f00b7b 349 //!
dflet 0:9cb694f00b7b 350 //! @return On success, zero is returned. On error, -1 is returned.
dflet 0:9cb694f00b7b 351 //!
dflet 0:9cb694f00b7b 352 //! @brief assign a name to a socket
dflet 0:9cb694f00b7b 353 //! This function gives the socket the local address addr.
dflet 0:9cb694f00b7b 354 //! addr is addrlen bytes long. Traditionally, this is called when a
dflet 0:9cb694f00b7b 355 //! socket is created with socket, it exists in a name space (address
dflet 0:9cb694f00b7b 356 //! family) but has no name assigned.
dflet 0:9cb694f00b7b 357 //! It is necessary to assign a local address before a SOCK_STREAM
dflet 0:9cb694f00b7b 358 //! socket may receive connections.
dflet 0:9cb694f00b7b 359 //!
dflet 0:9cb694f00b7b 360 //! @sa socket ; accept ; listen
dflet 0:9cb694f00b7b 361 //
dflet 0:9cb694f00b7b 362 //*****************************************************************************
dflet 0:9cb694f00b7b 363
dflet 0:9cb694f00b7b 364 long
dflet 0:9cb694f00b7b 365 bind(long sd, const sockaddr *addr, long addrlen)
dflet 0:9cb694f00b7b 366 {
dflet 0:9cb694f00b7b 367 long ret;
dflet 0:9cb694f00b7b 368 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 369
dflet 0:9cb694f00b7b 370 ret = EFAIL;
dflet 0:9cb694f00b7b 371 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 372 args = (ptr + HEADERS_SIZE_CMD);
dflet 0:9cb694f00b7b 373
dflet 0:9cb694f00b7b 374 addrlen = ASIC_ADDR_LEN;
dflet 0:9cb694f00b7b 375
dflet 0:9cb694f00b7b 376 // Fill in temporary command buffer
dflet 0:9cb694f00b7b 377 args = UINT32_TO_STREAM(args, sd);
dflet 0:9cb694f00b7b 378 args = UINT32_TO_STREAM(args, 0x00000008);
dflet 0:9cb694f00b7b 379 args = UINT32_TO_STREAM(args, addrlen);
dflet 0:9cb694f00b7b 380 ARRAY_TO_STREAM(args, ((unsigned char *)addr), addrlen);
dflet 0:9cb694f00b7b 381
dflet 0:9cb694f00b7b 382 // Initiate a HCI command
dflet 0:9cb694f00b7b 383 hci_command_send(HCI_CMND_BIND, ptr, SOCKET_BIND_PARAMS_LEN);
dflet 0:9cb694f00b7b 384
dflet 0:9cb694f00b7b 385 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 386 SimpleLinkWaitEvent(HCI_CMND_BIND, &ret);
dflet 0:9cb694f00b7b 387
dflet 0:9cb694f00b7b 388 errno = ret;
dflet 0:9cb694f00b7b 389
dflet 0:9cb694f00b7b 390 return(ret);
dflet 0:9cb694f00b7b 391 }
dflet 0:9cb694f00b7b 392
dflet 0:9cb694f00b7b 393 //*****************************************************************************
dflet 0:9cb694f00b7b 394 //
dflet 0:9cb694f00b7b 395 //! listen
dflet 0:9cb694f00b7b 396 //!
dflet 0:9cb694f00b7b 397 //! @param[in] sd socket descriptor (handle)
dflet 0:9cb694f00b7b 398 //! @param[in] backlog specifies the listen queue depth. On this version
dflet 0:9cb694f00b7b 399 //! backlog is not supported.
dflet 0:9cb694f00b7b 400 //! @return On success, zero is returned. On error, -1 is returned.
dflet 0:9cb694f00b7b 401 //!
dflet 0:9cb694f00b7b 402 //! @brief listen for connections on a socket
dflet 0:9cb694f00b7b 403 //! The willingness to accept incoming connections and a queue
dflet 0:9cb694f00b7b 404 //! limit for incoming connections are specified with listen(),
dflet 0:9cb694f00b7b 405 //! and then the connections are accepted with accept.
dflet 0:9cb694f00b7b 406 //! The listen() call applies only to sockets of type SOCK_STREAM
dflet 0:9cb694f00b7b 407 //! The backlog parameter defines the maximum length the queue of
dflet 0:9cb694f00b7b 408 //! pending connections may grow to.
dflet 0:9cb694f00b7b 409 //!
dflet 0:9cb694f00b7b 410 //! @sa socket ; accept ; bind
dflet 0:9cb694f00b7b 411 //!
dflet 0:9cb694f00b7b 412 //! @note On this version, backlog is not supported
dflet 0:9cb694f00b7b 413 //
dflet 0:9cb694f00b7b 414 //*****************************************************************************
dflet 0:9cb694f00b7b 415
dflet 0:9cb694f00b7b 416 long
dflet 0:9cb694f00b7b 417 listen(long sd, long backlog)
dflet 0:9cb694f00b7b 418 {
dflet 0:9cb694f00b7b 419 long ret;
dflet 0:9cb694f00b7b 420 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 421
dflet 0:9cb694f00b7b 422 ret = EFAIL;
dflet 0:9cb694f00b7b 423 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 424 args = (ptr + HEADERS_SIZE_CMD);
dflet 0:9cb694f00b7b 425
dflet 0:9cb694f00b7b 426 // Fill in temporary command buffer
dflet 0:9cb694f00b7b 427 args = UINT32_TO_STREAM(args, sd);
dflet 0:9cb694f00b7b 428 args = UINT32_TO_STREAM(args, backlog);
dflet 0:9cb694f00b7b 429
dflet 0:9cb694f00b7b 430 // Initiate a HCI command
dflet 0:9cb694f00b7b 431 hci_command_send(HCI_CMND_LISTEN, ptr, SOCKET_LISTEN_PARAMS_LEN);
dflet 0:9cb694f00b7b 432
dflet 0:9cb694f00b7b 433 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 434 SimpleLinkWaitEvent(HCI_CMND_LISTEN, &ret);
dflet 0:9cb694f00b7b 435 errno = ret;
dflet 0:9cb694f00b7b 436
dflet 0:9cb694f00b7b 437 return(ret);
dflet 0:9cb694f00b7b 438 }
dflet 0:9cb694f00b7b 439
dflet 0:9cb694f00b7b 440 //*****************************************************************************
dflet 0:9cb694f00b7b 441 //
dflet 0:9cb694f00b7b 442 //! gethostbyname
dflet 0:9cb694f00b7b 443 //!
dflet 0:9cb694f00b7b 444 //! @param[in] hostname host name
dflet 0:9cb694f00b7b 445 //! @param[in] usNameLen name length
dflet 0:9cb694f00b7b 446 //! @param[out] out_ip_addr This parameter is filled in with host IP address.
dflet 0:9cb694f00b7b 447 //! In case that host name is not resolved,
dflet 0:9cb694f00b7b 448 //! out_ip_addr is zero.
dflet 0:9cb694f00b7b 449 //! @return On success, positive is returned. On error, negative is returned
dflet 0:9cb694f00b7b 450 //!
dflet 0:9cb694f00b7b 451 //! @brief Get host IP by name. Obtain the IP Address of machine on network,
dflet 0:9cb694f00b7b 452 //! by its name.
dflet 0:9cb694f00b7b 453 //!
dflet 0:9cb694f00b7b 454 //! @note On this version, only blocking mode is supported. Also note that
dflet 0:9cb694f00b7b 455 //! the function requires DNS server to be configured prior to its usage.
dflet 0:9cb694f00b7b 456 //
dflet 0:9cb694f00b7b 457 //*****************************************************************************
dflet 0:9cb694f00b7b 458
dflet 0:9cb694f00b7b 459 #ifndef CC3000_TINY_DRIVER
dflet 0:9cb694f00b7b 460 int
dflet 0:9cb694f00b7b 461 gethostbyname(char * hostname, unsigned short usNameLen, unsigned long* out_ip_addr)
dflet 0:9cb694f00b7b 462 {
dflet 0:9cb694f00b7b 463 tBsdGethostbynameParams ret;
dflet 0:9cb694f00b7b 464 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 465
dflet 0:9cb694f00b7b 466 errno = EFAIL;
dflet 0:9cb694f00b7b 467
dflet 0:9cb694f00b7b 468 if (usNameLen > HOSTNAME_MAX_LENGTH)
dflet 0:9cb694f00b7b 469 {
dflet 0:9cb694f00b7b 470 return errno;
dflet 0:9cb694f00b7b 471 }
dflet 0:9cb694f00b7b 472
dflet 0:9cb694f00b7b 473 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 474 args = (ptr + SIMPLE_LINK_HCI_CMND_TRANSPORT_HEADER_SIZE);
dflet 0:9cb694f00b7b 475
dflet 0:9cb694f00b7b 476 // Fill in HCI packet structure
dflet 0:9cb694f00b7b 477 args = UINT32_TO_STREAM(args, 8);
dflet 0:9cb694f00b7b 478 args = UINT32_TO_STREAM(args, usNameLen);
dflet 0:9cb694f00b7b 479 ARRAY_TO_STREAM(args, hostname, usNameLen);
dflet 0:9cb694f00b7b 480
dflet 0:9cb694f00b7b 481 // Initiate a HCI command
dflet 0:9cb694f00b7b 482 hci_command_send(HCI_CMND_GETHOSTNAME, ptr, SOCKET_GET_HOST_BY_NAME_PARAMS_LEN + usNameLen - 1);
dflet 0:9cb694f00b7b 483
dflet 0:9cb694f00b7b 484 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 485 SimpleLinkWaitEvent(HCI_EVNT_BSD_GETHOSTBYNAME, (long*)&ret);
dflet 0:9cb694f00b7b 486
dflet 0:9cb694f00b7b 487 errno = ret.retVal;
dflet 0:9cb694f00b7b 488
dflet 0:9cb694f00b7b 489 (*((long*)out_ip_addr)) = ret.outputAddress;
dflet 0:9cb694f00b7b 490
dflet 0:9cb694f00b7b 491 return (errno);
dflet 0:9cb694f00b7b 492
dflet 0:9cb694f00b7b 493 }
dflet 0:9cb694f00b7b 494 #endif
dflet 0:9cb694f00b7b 495
dflet 0:9cb694f00b7b 496 //*****************************************************************************
dflet 0:9cb694f00b7b 497 //
dflet 0:9cb694f00b7b 498 //! connect
dflet 0:9cb694f00b7b 499 //!
dflet 0:9cb694f00b7b 500 //! @param[in] sd socket descriptor (handle)
dflet 0:9cb694f00b7b 501 //! @param[in] addr specifies the destination addr. On this version
dflet 0:9cb694f00b7b 502 //! only AF_INET is supported.
dflet 0:9cb694f00b7b 503 //! @param[out] addrlen contains the size of the structure pointed to by addr
dflet 0:9cb694f00b7b 504 //! @return On success, zero is returned. On error, -1 is returned
dflet 0:9cb694f00b7b 505 //!
dflet 0:9cb694f00b7b 506 //! @brief initiate a connection on a socket
dflet 0:9cb694f00b7b 507 //! Function connects the socket referred to by the socket descriptor
dflet 0:9cb694f00b7b 508 //! sd, to the address specified by addr. The addrlen argument
dflet 0:9cb694f00b7b 509 //! specifies the size of addr. The format of the address in addr is
dflet 0:9cb694f00b7b 510 //! determined by the address space of the socket. If it is of type
dflet 0:9cb694f00b7b 511 //! SOCK_DGRAM, this call specifies the peer with which the socket is
dflet 0:9cb694f00b7b 512 //! to be associated; this address is that to which datagrams are to be
dflet 0:9cb694f00b7b 513 //! sent, and the only address from which datagrams are to be received.
dflet 0:9cb694f00b7b 514 //! If the socket is of type SOCK_STREAM, this call attempts to make a
dflet 0:9cb694f00b7b 515 //! connection to another socket. The other socket is specified by
dflet 0:9cb694f00b7b 516 //! address, which is an address in the communications space of the
dflet 0:9cb694f00b7b 517 //! socket. Note that the function implements only blocking behavior
dflet 0:9cb694f00b7b 518 //! thus the caller will be waiting either for the connection
dflet 0:9cb694f00b7b 519 //! establishment or for the connection establishment failure.
dflet 0:9cb694f00b7b 520 //!
dflet 0:9cb694f00b7b 521 //! @sa socket
dflet 0:9cb694f00b7b 522 //
dflet 0:9cb694f00b7b 523 //*****************************************************************************
dflet 0:9cb694f00b7b 524
dflet 0:9cb694f00b7b 525 long
dflet 0:9cb694f00b7b 526 connect(long sd, const sockaddr *addr, long addrlen)
dflet 0:9cb694f00b7b 527 {
dflet 0:9cb694f00b7b 528 long int ret;
dflet 0:9cb694f00b7b 529 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 530
dflet 0:9cb694f00b7b 531 ret = EFAIL;
dflet 0:9cb694f00b7b 532 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 533 args = (ptr + SIMPLE_LINK_HCI_CMND_TRANSPORT_HEADER_SIZE);
dflet 0:9cb694f00b7b 534 addrlen = 8;
dflet 0:9cb694f00b7b 535
dflet 0:9cb694f00b7b 536 // Fill in temporary command buffer
dflet 0:9cb694f00b7b 537 args = UINT32_TO_STREAM(args, sd);
dflet 0:9cb694f00b7b 538 args = UINT32_TO_STREAM(args, 0x00000008);
dflet 0:9cb694f00b7b 539 args = UINT32_TO_STREAM(args, addrlen);
dflet 0:9cb694f00b7b 540 ARRAY_TO_STREAM(args, ((unsigned char *)addr), addrlen);
dflet 0:9cb694f00b7b 541
dflet 0:9cb694f00b7b 542 // Initiate a HCI command
dflet 0:9cb694f00b7b 543 hci_command_send(HCI_CMND_CONNECT,
dflet 0:9cb694f00b7b 544 ptr, SOCKET_CONNECT_PARAMS_LEN);
dflet 0:9cb694f00b7b 545
dflet 0:9cb694f00b7b 546 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 547 SimpleLinkWaitEvent(HCI_CMND_CONNECT, &ret);
dflet 0:9cb694f00b7b 548
dflet 0:9cb694f00b7b 549 errno = ret;
dflet 0:9cb694f00b7b 550
dflet 0:9cb694f00b7b 551 return((long)ret);
dflet 0:9cb694f00b7b 552 }
dflet 0:9cb694f00b7b 553
dflet 0:9cb694f00b7b 554
dflet 0:9cb694f00b7b 555 //*****************************************************************************
dflet 0:9cb694f00b7b 556 //
dflet 0:9cb694f00b7b 557 //! select
dflet 0:9cb694f00b7b 558 //!
dflet 0:9cb694f00b7b 559 //! @param[in] nfds the highest-numbered file descriptor in any of the
dflet 0:9cb694f00b7b 560 //! three sets, plus 1.
dflet 0:9cb694f00b7b 561 //! @param[out] writesds socket descriptors list for write monitoring
dflet 0:9cb694f00b7b 562 //! @param[out] readsds socket descriptors list for read monitoring
dflet 0:9cb694f00b7b 563 //! @param[out] exceptsds socket descriptors list for exception monitoring
dflet 0:9cb694f00b7b 564 //! @param[in] timeout is an upper bound on the amount of time elapsed
dflet 0:9cb694f00b7b 565 //! before select() returns. Null means infinity
dflet 0:9cb694f00b7b 566 //! timeout. The minimum timeout is 5 milliseconds,
dflet 0:9cb694f00b7b 567 //! less than 5 milliseconds will be set
dflet 0:9cb694f00b7b 568 //! automatically to 5 milliseconds.
dflet 0:9cb694f00b7b 569 //! @return On success, select() returns the number of file descriptors
dflet 0:9cb694f00b7b 570 //! contained in the three returned descriptor sets (that is, the
dflet 0:9cb694f00b7b 571 //! total number of bits that are set in readfds, writefds,
dflet 0:9cb694f00b7b 572 //! exceptfds) which may be zero if the timeout expires before
dflet 0:9cb694f00b7b 573 //! anything interesting happens.
dflet 0:9cb694f00b7b 574 //! On error, -1 is returned.
dflet 0:9cb694f00b7b 575 //! *readsds - return the sockets on which Read request will
dflet 0:9cb694f00b7b 576 //! return without delay with valid data.
dflet 0:9cb694f00b7b 577 //! *writesds - return the sockets on which Write request
dflet 0:9cb694f00b7b 578 //! will return without delay.
dflet 0:9cb694f00b7b 579 //! *exceptsds - return the sockets which closed recently.
dflet 0:9cb694f00b7b 580 //!
dflet 0:9cb694f00b7b 581 //! @brief Monitor socket activity
dflet 0:9cb694f00b7b 582 //! Select allow a program to monitor multiple file descriptors,
dflet 0:9cb694f00b7b 583 //! waiting until one or more of the file descriptors become
dflet 0:9cb694f00b7b 584 //! "ready" for some class of I/O operation
dflet 0:9cb694f00b7b 585 //!
dflet 0:9cb694f00b7b 586 //! @Note If the timeout value set to less than 5ms it will automatically set
dflet 0:9cb694f00b7b 587 //! to 5ms to prevent overload of the system
dflet 0:9cb694f00b7b 588 //!
dflet 0:9cb694f00b7b 589 //! @sa socket
dflet 0:9cb694f00b7b 590 //
dflet 0:9cb694f00b7b 591 //*****************************************************************************
dflet 0:9cb694f00b7b 592
dflet 0:9cb694f00b7b 593 int
dflet 0:9cb694f00b7b 594 select(long nfds, fd_set *readsds, fd_set *writesds, fd_set *exceptsds,
dflet 0:9cb694f00b7b 595 struct timeval *timeout)
dflet 0:9cb694f00b7b 596 {
dflet 0:9cb694f00b7b 597 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 598 tBsdSelectRecvParams tParams;
dflet 0:9cb694f00b7b 599 unsigned long is_blocking;
dflet 0:9cb694f00b7b 600
dflet 0:9cb694f00b7b 601 if( timeout == NULL)
dflet 0:9cb694f00b7b 602 {
dflet 0:9cb694f00b7b 603 is_blocking = 1; /* blocking , infinity timeout */
dflet 0:9cb694f00b7b 604 }
dflet 0:9cb694f00b7b 605 else
dflet 0:9cb694f00b7b 606 {
dflet 0:9cb694f00b7b 607 is_blocking = 0; /* no blocking, timeout */
dflet 0:9cb694f00b7b 608 }
dflet 0:9cb694f00b7b 609
dflet 0:9cb694f00b7b 610 // Fill in HCI packet structure
dflet 0:9cb694f00b7b 611 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 612 args = (ptr + HEADERS_SIZE_CMD);
dflet 0:9cb694f00b7b 613
dflet 0:9cb694f00b7b 614 // Fill in temporary command buffer
dflet 0:9cb694f00b7b 615 args = UINT32_TO_STREAM(args, nfds);
dflet 0:9cb694f00b7b 616 args = UINT32_TO_STREAM(args, 0x00000014);
dflet 0:9cb694f00b7b 617 args = UINT32_TO_STREAM(args, 0x00000014);
dflet 0:9cb694f00b7b 618 args = UINT32_TO_STREAM(args, 0x00000014);
dflet 0:9cb694f00b7b 619 args = UINT32_TO_STREAM(args, 0x00000014);
dflet 0:9cb694f00b7b 620 args = UINT32_TO_STREAM(args, is_blocking);
dflet 0:9cb694f00b7b 621 args = UINT32_TO_STREAM(args, ((readsds) ? *(unsigned long*)readsds : 0));
dflet 0:9cb694f00b7b 622 args = UINT32_TO_STREAM(args, ((writesds) ? *(unsigned long*)writesds : 0));
dflet 0:9cb694f00b7b 623 args = UINT32_TO_STREAM(args, ((exceptsds) ? *(unsigned long*)exceptsds : 0));
dflet 0:9cb694f00b7b 624
dflet 0:9cb694f00b7b 625 if (timeout)
dflet 0:9cb694f00b7b 626 {
dflet 0:9cb694f00b7b 627 if ( 0 == timeout->tv_sec && timeout->tv_usec <
dflet 0:9cb694f00b7b 628 SELECT_TIMEOUT_MIN_MICRO_SECONDS)
dflet 0:9cb694f00b7b 629 {
dflet 0:9cb694f00b7b 630 timeout->tv_usec = SELECT_TIMEOUT_MIN_MICRO_SECONDS;
dflet 0:9cb694f00b7b 631 }
dflet 0:9cb694f00b7b 632 args = UINT32_TO_STREAM(args, timeout->tv_sec);
dflet 0:9cb694f00b7b 633 args = UINT32_TO_STREAM(args, timeout->tv_usec);
dflet 0:9cb694f00b7b 634 }
dflet 0:9cb694f00b7b 635
dflet 0:9cb694f00b7b 636 // Initiate a HCI command
dflet 0:9cb694f00b7b 637 hci_command_send(HCI_CMND_BSD_SELECT, ptr, SOCKET_SELECT_PARAMS_LEN);
dflet 0:9cb694f00b7b 638
dflet 0:9cb694f00b7b 639 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 640 SimpleLinkWaitEvent(HCI_EVNT_SELECT, (long*)&tParams);
dflet 0:9cb694f00b7b 641
dflet 0:9cb694f00b7b 642 // Update actually read FD
dflet 0:9cb694f00b7b 643 if (tParams.iStatus >= 0)
dflet 0:9cb694f00b7b 644 {
dflet 0:9cb694f00b7b 645 if (readsds)
dflet 0:9cb694f00b7b 646 {
dflet 0:9cb694f00b7b 647 memcpy(readsds, &tParams.uiRdfd, sizeof(tParams.uiRdfd));
dflet 0:9cb694f00b7b 648 }
dflet 0:9cb694f00b7b 649
dflet 0:9cb694f00b7b 650 if (writesds)
dflet 0:9cb694f00b7b 651 {
dflet 0:9cb694f00b7b 652 memcpy(writesds, &tParams.uiWrfd, sizeof(tParams.uiWrfd));
dflet 0:9cb694f00b7b 653 }
dflet 0:9cb694f00b7b 654
dflet 0:9cb694f00b7b 655 if (exceptsds)
dflet 0:9cb694f00b7b 656 {
dflet 0:9cb694f00b7b 657 memcpy(exceptsds, &tParams.uiExfd, sizeof(tParams.uiExfd));
dflet 0:9cb694f00b7b 658 }
dflet 0:9cb694f00b7b 659
dflet 0:9cb694f00b7b 660 return(tParams.iStatus);
dflet 0:9cb694f00b7b 661
dflet 0:9cb694f00b7b 662 }
dflet 0:9cb694f00b7b 663 else
dflet 0:9cb694f00b7b 664 {
dflet 0:9cb694f00b7b 665 errno = tParams.iStatus;
dflet 0:9cb694f00b7b 666 return(-1);
dflet 0:9cb694f00b7b 667 }
dflet 0:9cb694f00b7b 668 }
dflet 0:9cb694f00b7b 669
dflet 0:9cb694f00b7b 670 //*****************************************************************************
dflet 0:9cb694f00b7b 671 //
dflet 0:9cb694f00b7b 672 //! setsockopt
dflet 0:9cb694f00b7b 673 //!
dflet 0:9cb694f00b7b 674 //! @param[in] sd socket handle
dflet 0:9cb694f00b7b 675 //! @param[in] level defines the protocol level for this option
dflet 0:9cb694f00b7b 676 //! @param[in] optname defines the option name to Interrogate
dflet 0:9cb694f00b7b 677 //! @param[in] optval specifies a value for the option
dflet 0:9cb694f00b7b 678 //! @param[in] optlen specifies the length of the option value
dflet 0:9cb694f00b7b 679 //! @return On success, zero is returned. On error, -1 is returned
dflet 0:9cb694f00b7b 680 //!
dflet 0:9cb694f00b7b 681 //! @brief set socket options
dflet 0:9cb694f00b7b 682 //! This function manipulate the options associated with a socket.
dflet 0:9cb694f00b7b 683 //! Options may exist at multiple protocol levels; they are always
dflet 0:9cb694f00b7b 684 //! present at the uppermost socket level.
dflet 0:9cb694f00b7b 685 //! When manipulating socket options the level at which the option
dflet 0:9cb694f00b7b 686 //! resides and the name of the option must be specified.
dflet 0:9cb694f00b7b 687 //! To manipulate options at the socket level, level is specified as
dflet 0:9cb694f00b7b 688 //! SOL_SOCKET. To manipulate options at any other level the protocol
dflet 0:9cb694f00b7b 689 //! number of the appropriate protocol controlling the option is
dflet 0:9cb694f00b7b 690 //! supplied. For example, to indicate that an option is to be
dflet 0:9cb694f00b7b 691 //! interpreted by the TCP protocol, level should be set to the
dflet 0:9cb694f00b7b 692 //! protocol number of TCP;
dflet 0:9cb694f00b7b 693 //! The parameters optval and optlen are used to access optval -
dflet 0:9cb694f00b7b 694 //! use for setsockopt(). For getsockopt() they identify a buffer
dflet 0:9cb694f00b7b 695 //! in which the value for the requested option(s) are to
dflet 0:9cb694f00b7b 696 //! be returned. For getsockopt(), optlen is a value-result
dflet 0:9cb694f00b7b 697 //! parameter, initially containing the size of the buffer
dflet 0:9cb694f00b7b 698 //! pointed to by option_value, and modified on return to
dflet 0:9cb694f00b7b 699 //! indicate the actual size of the value returned. If no option
dflet 0:9cb694f00b7b 700 //! value is to be supplied or returned, option_value may be NULL.
dflet 0:9cb694f00b7b 701 //!
dflet 0:9cb694f00b7b 702 //! @Note On this version the following two socket options are enabled:
dflet 0:9cb694f00b7b 703 //! The only protocol level supported in this version
dflet 0:9cb694f00b7b 704 //! is SOL_SOCKET (level).
dflet 0:9cb694f00b7b 705 //! 1. SOCKOPT_RECV_TIMEOUT (optname)
dflet 0:9cb694f00b7b 706 //! SOCKOPT_RECV_TIMEOUT configures recv and recvfrom timeout
dflet 0:9cb694f00b7b 707 //! in milliseconds.
dflet 0:9cb694f00b7b 708 //! In that case optval should be pointer to unsigned long.
dflet 0:9cb694f00b7b 709 //! 2. SOCKOPT_NONBLOCK (optname). sets the socket non-blocking mode on
dflet 0:9cb694f00b7b 710 //! or off.
dflet 0:9cb694f00b7b 711 //! In that case optval should be SOCK_ON or SOCK_OFF (optval).
dflet 0:9cb694f00b7b 712 //!
dflet 0:9cb694f00b7b 713 //! @sa getsockopt
dflet 0:9cb694f00b7b 714 //
dflet 0:9cb694f00b7b 715 //*****************************************************************************
dflet 0:9cb694f00b7b 716
dflet 0:9cb694f00b7b 717 #ifndef CC3000_TINY_DRIVER
dflet 0:9cb694f00b7b 718 int
dflet 0:9cb694f00b7b 719 setsockopt(long sd, long level, long optname, const void *optval,
dflet 0:9cb694f00b7b 720 socklen_t optlen)
dflet 0:9cb694f00b7b 721 {
dflet 0:9cb694f00b7b 722 int ret;
dflet 0:9cb694f00b7b 723 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 724
dflet 0:9cb694f00b7b 725 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 726 args = (ptr + HEADERS_SIZE_CMD);
dflet 0:9cb694f00b7b 727
dflet 0:9cb694f00b7b 728 // Fill in temporary command buffer
dflet 0:9cb694f00b7b 729 args = UINT32_TO_STREAM(args, sd);
dflet 0:9cb694f00b7b 730 args = UINT32_TO_STREAM(args, level);
dflet 0:9cb694f00b7b 731 args = UINT32_TO_STREAM(args, optname);
dflet 0:9cb694f00b7b 732 args = UINT32_TO_STREAM(args, 0x00000008);
dflet 0:9cb694f00b7b 733 args = UINT32_TO_STREAM(args, optlen);
dflet 0:9cb694f00b7b 734 ARRAY_TO_STREAM(args, ((unsigned char *)optval), optlen);
dflet 0:9cb694f00b7b 735
dflet 0:9cb694f00b7b 736 // Initiate a HCI command
dflet 0:9cb694f00b7b 737 hci_command_send(HCI_CMND_SETSOCKOPT, ptr, SOCKET_SET_SOCK_OPT_PARAMS_LEN + optlen);
dflet 0:9cb694f00b7b 738
dflet 0:9cb694f00b7b 739 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 740 SimpleLinkWaitEvent(HCI_CMND_SETSOCKOPT, (long*)&ret);
dflet 0:9cb694f00b7b 741
dflet 0:9cb694f00b7b 742 if (ret >= 0)
dflet 0:9cb694f00b7b 743 {
dflet 0:9cb694f00b7b 744 return (0);
dflet 0:9cb694f00b7b 745 }
dflet 0:9cb694f00b7b 746 else
dflet 0:9cb694f00b7b 747 {
dflet 0:9cb694f00b7b 748 errno = ret;
dflet 0:9cb694f00b7b 749 return (errno);
dflet 0:9cb694f00b7b 750 }
dflet 0:9cb694f00b7b 751 }
dflet 0:9cb694f00b7b 752 #endif
dflet 0:9cb694f00b7b 753
dflet 0:9cb694f00b7b 754 //*****************************************************************************
dflet 0:9cb694f00b7b 755 //
dflet 0:9cb694f00b7b 756 //! getsockopt
dflet 0:9cb694f00b7b 757 //!
dflet 0:9cb694f00b7b 758 //! @param[in] sd socket handle
dflet 0:9cb694f00b7b 759 //! @param[in] level defines the protocol level for this option
dflet 0:9cb694f00b7b 760 //! @param[in] optname defines the option name to Interrogate
dflet 0:9cb694f00b7b 761 //! @param[out] optval specifies a value for the option
dflet 0:9cb694f00b7b 762 //! @param[out] optlen specifies the length of the option value
dflet 0:9cb694f00b7b 763 //! @return On success, zero is returned. On error, -1 is returned
dflet 0:9cb694f00b7b 764 //!
dflet 0:9cb694f00b7b 765 //! @brief set socket options
dflet 0:9cb694f00b7b 766 //! This function manipulate the options associated with a socket.
dflet 0:9cb694f00b7b 767 //! Options may exist at multiple protocol levels; they are always
dflet 0:9cb694f00b7b 768 //! present at the uppermost socket level.
dflet 0:9cb694f00b7b 769 //! When manipulating socket options the level at which the option
dflet 0:9cb694f00b7b 770 //! resides and the name of the option must be specified.
dflet 0:9cb694f00b7b 771 //! To manipulate options at the socket level, level is specified as
dflet 0:9cb694f00b7b 772 //! SOL_SOCKET. To manipulate options at any other level the protocol
dflet 0:9cb694f00b7b 773 //! number of the appropriate protocol controlling the option is
dflet 0:9cb694f00b7b 774 //! supplied. For example, to indicate that an option is to be
dflet 0:9cb694f00b7b 775 //! interpreted by the TCP protocol, level should be set to the
dflet 0:9cb694f00b7b 776 //! protocol number of TCP;
dflet 0:9cb694f00b7b 777 //! The parameters optval and optlen are used to access optval -
dflet 0:9cb694f00b7b 778 //! use for setsockopt(). For getsockopt() they identify a buffer
dflet 0:9cb694f00b7b 779 //! in which the value for the requested option(s) are to
dflet 0:9cb694f00b7b 780 //! be returned. For getsockopt(), optlen is a value-result
dflet 0:9cb694f00b7b 781 //! parameter, initially containing the size of the buffer
dflet 0:9cb694f00b7b 782 //! pointed to by option_value, and modified on return to
dflet 0:9cb694f00b7b 783 //! indicate the actual size of the value returned. If no option
dflet 0:9cb694f00b7b 784 //! value is to be supplied or returned, option_value may be NULL.
dflet 0:9cb694f00b7b 785 //!
dflet 0:9cb694f00b7b 786 //! @Note On this version the following two socket options are enabled:
dflet 0:9cb694f00b7b 787 //! The only protocol level supported in this version
dflet 0:9cb694f00b7b 788 //! is SOL_SOCKET (level).
dflet 0:9cb694f00b7b 789 //! 1. SOCKOPT_RECV_TIMEOUT (optname)
dflet 0:9cb694f00b7b 790 //! SOCKOPT_RECV_TIMEOUT configures recv and recvfrom timeout
dflet 0:9cb694f00b7b 791 //! in milliseconds.
dflet 0:9cb694f00b7b 792 //! In that case optval should be pointer to unsigned long.
dflet 0:9cb694f00b7b 793 //! 2. SOCKOPT_NONBLOCK (optname). sets the socket non-blocking mode on
dflet 0:9cb694f00b7b 794 //! or off.
dflet 0:9cb694f00b7b 795 //! In that case optval should be SOCK_ON or SOCK_OFF (optval).
dflet 0:9cb694f00b7b 796 //!
dflet 0:9cb694f00b7b 797 //! @sa setsockopt
dflet 0:9cb694f00b7b 798 //
dflet 0:9cb694f00b7b 799 //*****************************************************************************
dflet 0:9cb694f00b7b 800
dflet 0:9cb694f00b7b 801 int
dflet 0:9cb694f00b7b 802 getsockopt (long sd, long level, long optname, void *optval, socklen_t *optlen)
dflet 0:9cb694f00b7b 803 {
dflet 0:9cb694f00b7b 804 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 805 tBsdGetSockOptReturnParams tRetParams;
dflet 0:9cb694f00b7b 806
dflet 0:9cb694f00b7b 807 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 808 args = (ptr + HEADERS_SIZE_CMD);
dflet 0:9cb694f00b7b 809
dflet 0:9cb694f00b7b 810 // Fill in temporary command buffer
dflet 0:9cb694f00b7b 811 args = UINT32_TO_STREAM(args, sd);
dflet 0:9cb694f00b7b 812 args = UINT32_TO_STREAM(args, level);
dflet 0:9cb694f00b7b 813 args = UINT32_TO_STREAM(args, optname);
dflet 0:9cb694f00b7b 814
dflet 0:9cb694f00b7b 815 // Initiate a HCI command
dflet 0:9cb694f00b7b 816 hci_command_send(HCI_CMND_GETSOCKOPT, ptr, SOCKET_GET_SOCK_OPT_PARAMS_LEN);
dflet 0:9cb694f00b7b 817
dflet 0:9cb694f00b7b 818 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 819 SimpleLinkWaitEvent(HCI_CMND_GETSOCKOPT, (long*)&tRetParams);
dflet 0:9cb694f00b7b 820
dflet 0:9cb694f00b7b 821 if (((signed char)tRetParams.iStatus) >= 0)
dflet 0:9cb694f00b7b 822 {
dflet 0:9cb694f00b7b 823 *optlen = 4;
dflet 0:9cb694f00b7b 824 memcpy(optval, tRetParams.ucOptValue, 4);
dflet 0:9cb694f00b7b 825 return (0);
dflet 0:9cb694f00b7b 826 }
dflet 0:9cb694f00b7b 827 else
dflet 0:9cb694f00b7b 828 {
dflet 0:9cb694f00b7b 829 errno = tRetParams.iStatus;
dflet 0:9cb694f00b7b 830 return (errno);
dflet 0:9cb694f00b7b 831 }
dflet 0:9cb694f00b7b 832 }
dflet 0:9cb694f00b7b 833
dflet 0:9cb694f00b7b 834 //*****************************************************************************
dflet 0:9cb694f00b7b 835 //
dflet 0:9cb694f00b7b 836 //! simple_link_recv
dflet 0:9cb694f00b7b 837 //!
dflet 0:9cb694f00b7b 838 //! @param sd socket handle
dflet 0:9cb694f00b7b 839 //! @param buf read buffer
dflet 0:9cb694f00b7b 840 //! @param len buffer length
dflet 0:9cb694f00b7b 841 //! @param flags indicates blocking or non-blocking operation
dflet 0:9cb694f00b7b 842 //! @param from pointer to an address structure indicating source address
dflet 0:9cb694f00b7b 843 //! @param fromlen source address structure size
dflet 0:9cb694f00b7b 844 //!
dflet 0:9cb694f00b7b 845 //! @return Return the number of bytes received, or -1 if an error
dflet 0:9cb694f00b7b 846 //! occurred
dflet 0:9cb694f00b7b 847 //!
dflet 0:9cb694f00b7b 848 //! @brief Read data from socket
dflet 0:9cb694f00b7b 849 //! Return the length of the message on successful completion.
dflet 0:9cb694f00b7b 850 //! If a message is too long to fit in the supplied buffer,
dflet 0:9cb694f00b7b 851 //! excess bytes may be discarded depending on the type of
dflet 0:9cb694f00b7b 852 //! socket the message is received from
dflet 0:9cb694f00b7b 853 //
dflet 0:9cb694f00b7b 854 //*****************************************************************************
dflet 0:9cb694f00b7b 855 int
dflet 0:9cb694f00b7b 856 simple_link_recv(long sd, unsigned char *buf, long len, long flags, sockaddr *from, socklen_t *fromlen, long opcode)
dflet 0:9cb694f00b7b 857 {
dflet 0:9cb694f00b7b 858 unsigned char *ptr, *args;
dflet 0:9cb694f00b7b 859 tBsdReadReturnParams tSocketReadEvent;
dflet 0:9cb694f00b7b 860
dflet 0:9cb694f00b7b 861 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 862 args = (ptr + HEADERS_SIZE_CMD);
dflet 0:9cb694f00b7b 863
dflet 0:9cb694f00b7b 864 // Fill in HCI packet structure
dflet 0:9cb694f00b7b 865 args = UINT32_TO_STREAM(args, sd);
dflet 0:9cb694f00b7b 866 args = UINT32_TO_STREAM(args, len);
dflet 0:9cb694f00b7b 867 args = UINT32_TO_STREAM(args, flags);
dflet 0:9cb694f00b7b 868
dflet 0:9cb694f00b7b 869 // Generate the read command, and wait for the
dflet 0:9cb694f00b7b 870 hci_command_send(opcode, ptr, SOCKET_RECV_FROM_PARAMS_LEN);
dflet 0:9cb694f00b7b 871
dflet 0:9cb694f00b7b 872 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 873 SimpleLinkWaitEvent(opcode, (long*)&tSocketReadEvent);
dflet 0:9cb694f00b7b 874
dflet 0:9cb694f00b7b 875 // In case the number of bytes is more then zero - read data
dflet 0:9cb694f00b7b 876 if (tSocketReadEvent.iNumberOfBytes > 0)
dflet 0:9cb694f00b7b 877 {
dflet 0:9cb694f00b7b 878 // Wait for the data in a synchronous way. Here we assume that the bug is
dflet 0:9cb694f00b7b 879 // big enough to store also parameters of receive from too....
dflet 0:9cb694f00b7b 880 SimpleLinkWaitData(buf, (unsigned char *)from, (unsigned char *)fromlen);
dflet 0:9cb694f00b7b 881 }
dflet 0:9cb694f00b7b 882
dflet 0:9cb694f00b7b 883 errno = tSocketReadEvent.iNumberOfBytes;
dflet 0:9cb694f00b7b 884
dflet 0:9cb694f00b7b 885 return(tSocketReadEvent.iNumberOfBytes);
dflet 0:9cb694f00b7b 886 }
dflet 0:9cb694f00b7b 887
dflet 0:9cb694f00b7b 888 //*****************************************************************************
dflet 0:9cb694f00b7b 889 //
dflet 0:9cb694f00b7b 890 //! recv
dflet 0:9cb694f00b7b 891 //!
dflet 0:9cb694f00b7b 892 //! @param[in] sd socket handle
dflet 0:9cb694f00b7b 893 //! @param[out] buf Points to the buffer where the message should be stored
dflet 0:9cb694f00b7b 894 //! @param[in] len Specifies the length in bytes of the buffer pointed to
dflet 0:9cb694f00b7b 895 //! by the buffer argument.
dflet 0:9cb694f00b7b 896 //! @param[in] flags Specifies the type of message reception.
dflet 0:9cb694f00b7b 897 //! On this version, this parameter is not supported.
dflet 0:9cb694f00b7b 898 //!
dflet 0:9cb694f00b7b 899 //! @return Return the number of bytes received, or -1 if an error
dflet 0:9cb694f00b7b 900 //! occurred
dflet 0:9cb694f00b7b 901 //!
dflet 0:9cb694f00b7b 902 //! @brief function receives a message from a connection-mode socket
dflet 0:9cb694f00b7b 903 //!
dflet 0:9cb694f00b7b 904 //! @sa recvfrom
dflet 0:9cb694f00b7b 905 //!
dflet 0:9cb694f00b7b 906 //! @Note On this version, only blocking mode is supported.
dflet 0:9cb694f00b7b 907 //
dflet 0:9cb694f00b7b 908 //*****************************************************************************
dflet 0:9cb694f00b7b 909
dflet 0:9cb694f00b7b 910 int
dflet 0:9cb694f00b7b 911 recv(long sd, unsigned char *buf, long len, long flags)
dflet 0:9cb694f00b7b 912 {
dflet 0:9cb694f00b7b 913 return(simple_link_recv(sd, buf, len, flags, NULL, NULL, HCI_CMND_RECV));
dflet 0:9cb694f00b7b 914 }
dflet 0:9cb694f00b7b 915
dflet 0:9cb694f00b7b 916 //*****************************************************************************
dflet 0:9cb694f00b7b 917 //
dflet 0:9cb694f00b7b 918 //! recvfrom
dflet 0:9cb694f00b7b 919 //!
dflet 0:9cb694f00b7b 920 //! @param[in] sd socket handle
dflet 0:9cb694f00b7b 921 //! @param[out] buf Points to the buffer where the message should be stored
dflet 0:9cb694f00b7b 922 //! @param[in] len Specifies the length in bytes of the buffer pointed to
dflet 0:9cb694f00b7b 923 //! by the buffer argument.
dflet 0:9cb694f00b7b 924 //! @param[in] flags Specifies the type of message reception.
dflet 0:9cb694f00b7b 925 //! On this version, this parameter is not supported.
dflet 0:9cb694f00b7b 926 //! @param[in] from pointer to an address structure indicating the source
dflet 0:9cb694f00b7b 927 //! address: sockaddr. On this version only AF_INET is
dflet 0:9cb694f00b7b 928 //! supported.
dflet 0:9cb694f00b7b 929 //! @param[in] fromlen source address tructure size
dflet 0:9cb694f00b7b 930 //!
dflet 0:9cb694f00b7b 931 //! @return Return the number of bytes received, or -1 if an error
dflet 0:9cb694f00b7b 932 //! occurred
dflet 0:9cb694f00b7b 933 //!
dflet 0:9cb694f00b7b 934 //! @brief read data from socket
dflet 0:9cb694f00b7b 935 //! function receives a message from a connection-mode or
dflet 0:9cb694f00b7b 936 //! connectionless-mode socket. Note that raw sockets are not
dflet 0:9cb694f00b7b 937 //! supported.
dflet 0:9cb694f00b7b 938 //!
dflet 0:9cb694f00b7b 939 //! @sa recv
dflet 0:9cb694f00b7b 940 //!
dflet 0:9cb694f00b7b 941 //! @Note On this version, only blocking mode is supported.
dflet 0:9cb694f00b7b 942 //
dflet 0:9cb694f00b7b 943 //*****************************************************************************
dflet 0:9cb694f00b7b 944 int
dflet 0:9cb694f00b7b 945 recvfrom(long sd, unsigned char *buf, long len, long flags, sockaddr *from, socklen_t *fromlen)
dflet 0:9cb694f00b7b 946 {
dflet 0:9cb694f00b7b 947 return(simple_link_recv(sd, buf, len, flags, from, fromlen, HCI_CMND_RECVFROM));
dflet 0:9cb694f00b7b 948 }
dflet 0:9cb694f00b7b 949
dflet 0:9cb694f00b7b 950 //*****************************************************************************
dflet 0:9cb694f00b7b 951 //
dflet 0:9cb694f00b7b 952 //! simple_link_send
dflet 0:9cb694f00b7b 953 //!
dflet 0:9cb694f00b7b 954 //! @param sd socket handle
dflet 0:9cb694f00b7b 955 //! @param buf write buffer
dflet 0:9cb694f00b7b 956 //! @param len buffer length
dflet 0:9cb694f00b7b 957 //! @param flags On this version, this parameter is not supported
dflet 0:9cb694f00b7b 958 //! @param to pointer to an address structure indicating destination
dflet 0:9cb694f00b7b 959 //! address
dflet 0:9cb694f00b7b 960 //! @param tolen destination address structure size
dflet 0:9cb694f00b7b 961 //!
dflet 0:9cb694f00b7b 962 //! @return Return the number of bytes transmitted, or -1 if an error
dflet 0:9cb694f00b7b 963 //! occurred, or -2 in case there are no free buffers available
dflet 0:9cb694f00b7b 964 //! (only when SEND_NON_BLOCKING is enabled)
dflet 0:9cb694f00b7b 965 //!
dflet 0:9cb694f00b7b 966 //! @brief This function is used to transmit a message to another
dflet 0:9cb694f00b7b 967 //! socket
dflet 0:9cb694f00b7b 968 //
dflet 0:9cb694f00b7b 969 //*****************************************************************************
dflet 0:9cb694f00b7b 970 int
dflet 0:9cb694f00b7b 971 simple_link_send(long sd, const void *buf, long len, long flags, const sockaddr *to, long tolen, long opcode)
dflet 0:9cb694f00b7b 972 {
dflet 0:9cb694f00b7b 973 unsigned char uArgSize, addrlen;
dflet 0:9cb694f00b7b 974 unsigned char *ptr, *pDataPtr, *args;
dflet 0:9cb694f00b7b 975 unsigned long addr_offset;
dflet 0:9cb694f00b7b 976 int res;
dflet 0:9cb694f00b7b 977 tBsdReadReturnParams tSocketSendEvent;
dflet 0:9cb694f00b7b 978
dflet 0:9cb694f00b7b 979 // Check the bsd_arguments
dflet 0:9cb694f00b7b 980 if (0 != (res = HostFlowControlConsumeBuff(sd)))
dflet 0:9cb694f00b7b 981 {
dflet 0:9cb694f00b7b 982 return res;
dflet 0:9cb694f00b7b 983 }
dflet 0:9cb694f00b7b 984
dflet 0:9cb694f00b7b 985 //Update the number of sent packets
dflet 0:9cb694f00b7b 986 tSLInformation.NumberOfSentPackets++;
dflet 0:9cb694f00b7b 987
dflet 0:9cb694f00b7b 988 // Allocate a buffer and construct a packet and send it over spi
dflet 0:9cb694f00b7b 989 ptr = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 990 args = (ptr + HEADERS_SIZE_DATA);
dflet 0:9cb694f00b7b 991
dflet 0:9cb694f00b7b 992 // Update the offset of data and parameters according to the command
dflet 0:9cb694f00b7b 993 switch(opcode)
dflet 0:9cb694f00b7b 994 {
dflet 0:9cb694f00b7b 995 case HCI_CMND_SENDTO:
dflet 0:9cb694f00b7b 996 {
dflet 0:9cb694f00b7b 997 addr_offset = len + sizeof(len) + sizeof(len);
dflet 0:9cb694f00b7b 998 addrlen = 8;
dflet 0:9cb694f00b7b 999 uArgSize = SOCKET_SENDTO_PARAMS_LEN;
dflet 0:9cb694f00b7b 1000 pDataPtr = ptr + HEADERS_SIZE_DATA + SOCKET_SENDTO_PARAMS_LEN;
dflet 0:9cb694f00b7b 1001 break;
dflet 0:9cb694f00b7b 1002 }
dflet 0:9cb694f00b7b 1003
dflet 0:9cb694f00b7b 1004 case HCI_CMND_SEND:
dflet 0:9cb694f00b7b 1005 {
dflet 0:9cb694f00b7b 1006 tolen = 0;
dflet 0:9cb694f00b7b 1007 to = NULL;
dflet 0:9cb694f00b7b 1008 uArgSize = HCI_CMND_SEND_ARG_LENGTH;
dflet 0:9cb694f00b7b 1009 pDataPtr = ptr + HEADERS_SIZE_DATA + HCI_CMND_SEND_ARG_LENGTH;
dflet 0:9cb694f00b7b 1010 break;
dflet 0:9cb694f00b7b 1011 }
dflet 0:9cb694f00b7b 1012
dflet 0:9cb694f00b7b 1013 default:
dflet 0:9cb694f00b7b 1014 {
dflet 0:9cb694f00b7b 1015 break;
dflet 0:9cb694f00b7b 1016 }
dflet 0:9cb694f00b7b 1017 }
dflet 0:9cb694f00b7b 1018
dflet 0:9cb694f00b7b 1019 // Fill in temporary command buffer
dflet 0:9cb694f00b7b 1020 args = UINT32_TO_STREAM(args, sd);
dflet 0:9cb694f00b7b 1021 args = UINT32_TO_STREAM(args, uArgSize - sizeof(sd));
dflet 0:9cb694f00b7b 1022 args = UINT32_TO_STREAM(args, len);
dflet 0:9cb694f00b7b 1023 args = UINT32_TO_STREAM(args, flags);
dflet 0:9cb694f00b7b 1024
dflet 0:9cb694f00b7b 1025 if (opcode == HCI_CMND_SENDTO)
dflet 0:9cb694f00b7b 1026 {
dflet 0:9cb694f00b7b 1027 args = UINT32_TO_STREAM(args, addr_offset);
dflet 0:9cb694f00b7b 1028 args = UINT32_TO_STREAM(args, addrlen);
dflet 0:9cb694f00b7b 1029 }
dflet 0:9cb694f00b7b 1030
dflet 0:9cb694f00b7b 1031 // Copy the data received from user into the TX Buffer
dflet 0:9cb694f00b7b 1032 ARRAY_TO_STREAM(pDataPtr, ((unsigned char *)buf), len);
dflet 0:9cb694f00b7b 1033
dflet 0:9cb694f00b7b 1034 // In case we are using SendTo, copy the to parameters
dflet 0:9cb694f00b7b 1035 if (opcode == HCI_CMND_SENDTO)
dflet 0:9cb694f00b7b 1036 {
dflet 0:9cb694f00b7b 1037 ARRAY_TO_STREAM(pDataPtr, ((unsigned char *)to), tolen);
dflet 0:9cb694f00b7b 1038 }
dflet 0:9cb694f00b7b 1039
dflet 0:9cb694f00b7b 1040 // Initiate a HCI command
dflet 0:9cb694f00b7b 1041 hci_data_send(opcode, ptr, uArgSize, len,(unsigned char*)to, tolen);
dflet 0:9cb694f00b7b 1042
dflet 0:9cb694f00b7b 1043 if (opcode == HCI_CMND_SENDTO)
dflet 0:9cb694f00b7b 1044 SimpleLinkWaitEvent(HCI_EVNT_SENDTO, (long*)&tSocketSendEvent);
dflet 0:9cb694f00b7b 1045 else
dflet 0:9cb694f00b7b 1046 SimpleLinkWaitEvent(HCI_EVNT_SEND, (long*)&tSocketSendEvent);
dflet 0:9cb694f00b7b 1047
dflet 0:9cb694f00b7b 1048 return (len);
dflet 0:9cb694f00b7b 1049 }
dflet 0:9cb694f00b7b 1050
dflet 0:9cb694f00b7b 1051
dflet 0:9cb694f00b7b 1052 //*****************************************************************************
dflet 0:9cb694f00b7b 1053 //
dflet 0:9cb694f00b7b 1054 //! send
dflet 0:9cb694f00b7b 1055 //!
dflet 0:9cb694f00b7b 1056 //! @param sd socket handle
dflet 0:9cb694f00b7b 1057 //! @param buf Points to a buffer containing the message to be sent
dflet 0:9cb694f00b7b 1058 //! @param len message size in bytes
dflet 0:9cb694f00b7b 1059 //! @param flags On this version, this parameter is not supported
dflet 0:9cb694f00b7b 1060 //!
dflet 0:9cb694f00b7b 1061 //! @return Return the number of bytes transmitted, or -1 if an
dflet 0:9cb694f00b7b 1062 //! error occurred
dflet 0:9cb694f00b7b 1063 //!
dflet 0:9cb694f00b7b 1064 //! @brief Write data to TCP socket
dflet 0:9cb694f00b7b 1065 //! This function is used to transmit a message to another
dflet 0:9cb694f00b7b 1066 //! socket.
dflet 0:9cb694f00b7b 1067 //!
dflet 0:9cb694f00b7b 1068 //! @Note On this version, only blocking mode is supported.
dflet 0:9cb694f00b7b 1069 //!
dflet 0:9cb694f00b7b 1070 //! @sa sendto
dflet 0:9cb694f00b7b 1071 //
dflet 0:9cb694f00b7b 1072 //*****************************************************************************
dflet 0:9cb694f00b7b 1073
dflet 0:9cb694f00b7b 1074 int
dflet 0:9cb694f00b7b 1075 send(long sd, const void *buf, long len, long flags)
dflet 0:9cb694f00b7b 1076 {
dflet 0:9cb694f00b7b 1077 return(simple_link_send(sd, buf, len, flags, NULL, 0, HCI_CMND_SEND));
dflet 0:9cb694f00b7b 1078 }
dflet 0:9cb694f00b7b 1079
dflet 0:9cb694f00b7b 1080 //*****************************************************************************
dflet 0:9cb694f00b7b 1081 //
dflet 0:9cb694f00b7b 1082 //! sendto
dflet 0:9cb694f00b7b 1083 //!
dflet 0:9cb694f00b7b 1084 //! @param sd socket handle
dflet 0:9cb694f00b7b 1085 //! @param buf Points to a buffer containing the message to be sent
dflet 0:9cb694f00b7b 1086 //! @param len message size in bytes
dflet 0:9cb694f00b7b 1087 //! @param flags On this version, this parameter is not supported
dflet 0:9cb694f00b7b 1088 //! @param to pointer to an address structure indicating the destination
dflet 0:9cb694f00b7b 1089 //! address: sockaddr. On this version only AF_INET is
dflet 0:9cb694f00b7b 1090 //! supported.
dflet 0:9cb694f00b7b 1091 //! @param tolen destination address structure size
dflet 0:9cb694f00b7b 1092 //!
dflet 0:9cb694f00b7b 1093 //! @return Return the number of bytes transmitted, or -1 if an
dflet 0:9cb694f00b7b 1094 //! error occurred
dflet 0:9cb694f00b7b 1095 //!
dflet 0:9cb694f00b7b 1096 //! @brief Write data to TCP socket
dflet 0:9cb694f00b7b 1097 //! This function is used to transmit a message to another
dflet 0:9cb694f00b7b 1098 //! socket.
dflet 0:9cb694f00b7b 1099 //!
dflet 0:9cb694f00b7b 1100 //! @Note On this version, only blocking mode is supported.
dflet 0:9cb694f00b7b 1101 //!
dflet 0:9cb694f00b7b 1102 //! @sa send
dflet 0:9cb694f00b7b 1103 //
dflet 0:9cb694f00b7b 1104 //*****************************************************************************
dflet 0:9cb694f00b7b 1105
dflet 0:9cb694f00b7b 1106 int
dflet 0:9cb694f00b7b 1107 sendto(long sd, const void *buf, long len, long flags, const sockaddr *to, socklen_t tolen)
dflet 0:9cb694f00b7b 1108 {
dflet 0:9cb694f00b7b 1109 return(simple_link_send(sd, buf, len, flags, to, tolen, HCI_CMND_SENDTO));
dflet 0:9cb694f00b7b 1110 }
dflet 0:9cb694f00b7b 1111
dflet 0:9cb694f00b7b 1112 //*****************************************************************************
dflet 0:9cb694f00b7b 1113 //
dflet 0:9cb694f00b7b 1114 //! mdnsAdvertiser
dflet 0:9cb694f00b7b 1115 //!
dflet 0:9cb694f00b7b 1116 //! @param[in] mdnsEnabled flag to enable/disable the mDNS feature
dflet 0:9cb694f00b7b 1117 //! @param[in] deviceServiceName Service name as part of the published
dflet 0:9cb694f00b7b 1118 //! canonical domain name
dflet 0:9cb694f00b7b 1119 //! @param[in] deviceServiceNameLength Length of the service name
dflet 0:9cb694f00b7b 1120 //!
dflet 0:9cb694f00b7b 1121 //!
dflet 0:9cb694f00b7b 1122 //! @return On success, zero is returned, return SOC_ERROR if socket was not
dflet 0:9cb694f00b7b 1123 //! opened successfully, or if an error occurred.
dflet 0:9cb694f00b7b 1124 //!
dflet 0:9cb694f00b7b 1125 //! @brief Set CC3000 in mDNS advertiser mode in order to advertise itself.
dflet 0:9cb694f00b7b 1126 //
dflet 0:9cb694f00b7b 1127 //*****************************************************************************
dflet 0:9cb694f00b7b 1128
dflet 0:9cb694f00b7b 1129 int
dflet 0:9cb694f00b7b 1130 mdnsAdvertiser(unsigned short mdnsEnabled, char * deviceServiceName, unsigned short deviceServiceNameLength)
dflet 0:9cb694f00b7b 1131 {
dflet 0:9cb694f00b7b 1132 int ret;
dflet 0:9cb694f00b7b 1133 unsigned char *pTxBuffer, *pArgs;
dflet 0:9cb694f00b7b 1134
dflet 0:9cb694f00b7b 1135 if (deviceServiceNameLength > MDNS_DEVICE_SERVICE_MAX_LENGTH)
dflet 0:9cb694f00b7b 1136 {
dflet 0:9cb694f00b7b 1137 return EFAIL;
dflet 0:9cb694f00b7b 1138 }
dflet 0:9cb694f00b7b 1139
dflet 0:9cb694f00b7b 1140 pTxBuffer = tSLInformation.pucTxCommandBuffer;
dflet 0:9cb694f00b7b 1141 pArgs = (pTxBuffer + SIMPLE_LINK_HCI_CMND_TRANSPORT_HEADER_SIZE);
dflet 0:9cb694f00b7b 1142
dflet 0:9cb694f00b7b 1143 // Fill in HCI packet structure
dflet 0:9cb694f00b7b 1144 pArgs = UINT32_TO_STREAM(pArgs, mdnsEnabled);
dflet 0:9cb694f00b7b 1145 pArgs = UINT32_TO_STREAM(pArgs, 8);
dflet 0:9cb694f00b7b 1146 pArgs = UINT32_TO_STREAM(pArgs, deviceServiceNameLength);
dflet 0:9cb694f00b7b 1147 ARRAY_TO_STREAM(pArgs, deviceServiceName, deviceServiceNameLength);
dflet 0:9cb694f00b7b 1148
dflet 0:9cb694f00b7b 1149 // Initiate a HCI command
dflet 0:9cb694f00b7b 1150 hci_command_send(HCI_CMND_MDNS_ADVERTISE, pTxBuffer, SOCKET_MDNS_ADVERTISE_PARAMS_LEN + deviceServiceNameLength);
dflet 0:9cb694f00b7b 1151
dflet 0:9cb694f00b7b 1152 // Since we are in blocking state - wait for event complete
dflet 0:9cb694f00b7b 1153 SimpleLinkWaitEvent(HCI_EVNT_MDNS_ADVERTISE, (long*)&ret);
dflet 0:9cb694f00b7b 1154
dflet 0:9cb694f00b7b 1155 return ret;
dflet 0:9cb694f00b7b 1156
dflet 0:9cb694f00b7b 1157 }
dflet 0:9cb694f00b7b 1158