CC3000HostDriver for device TI CC3000 some changes were made due to mbed compiler and the use of void*
socket.cpp@0:9cb694f00b7b, 2013-08-02 (annotated)
- 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?
User | Revision | Line number | New 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 |