cc3000 hostdriver with the mbed socket interface

Dependents:   cc3000_hello_world_demo cc3000_simple_socket_demo cc3000_ntp_demo cc3000_ping_demo ... more

Committer:
SolderSplashLabs
Date:
Thu Oct 03 21:00:00 2013 +0000
Revision:
23:fed7f64dd520
Parent:
16:f3676ae62f96
Child:
42:bd2c631a031a
Added separate debug messages and VT100 formatting

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SolderSplashLabs 23:fed7f64dd520 1 /*****************************************************************************
SolderSplashLabs 23:fed7f64dd520 2 *
SolderSplashLabs 23:fed7f64dd520 3 * C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to
SolderSplashLabs 23:fed7f64dd520 4 * Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and
SolderSplashLabs 23:fed7f64dd520 5 * provided help.
SolderSplashLabs 23:fed7f64dd520 6 *
SolderSplashLabs 23:fed7f64dd520 7 * This version of "host driver" uses CC3000 Host Driver Implementation. Thus
SolderSplashLabs 23:fed7f64dd520 8 * read the following copyright:
SolderSplashLabs 23:fed7f64dd520 9 *
SolderSplashLabs 23:fed7f64dd520 10 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
SolderSplashLabs 23:fed7f64dd520 11 *
SolderSplashLabs 23:fed7f64dd520 12 * Redistribution and use in source and binary forms, with or without
SolderSplashLabs 23:fed7f64dd520 13 * modification, are permitted provided that the following conditions
SolderSplashLabs 23:fed7f64dd520 14 * are met:
SolderSplashLabs 23:fed7f64dd520 15 *
SolderSplashLabs 23:fed7f64dd520 16 * Redistributions of source code must retain the above copyright
SolderSplashLabs 23:fed7f64dd520 17 * notice, this list of conditions and the following disclaimer.
SolderSplashLabs 23:fed7f64dd520 18 *
SolderSplashLabs 23:fed7f64dd520 19 * Redistributions in binary form must reproduce the above copyright
SolderSplashLabs 23:fed7f64dd520 20 * notice, this list of conditions and the following disclaimer in the
SolderSplashLabs 23:fed7f64dd520 21 * documentation and/or other materials provided with the
SolderSplashLabs 23:fed7f64dd520 22 * distribution.
SolderSplashLabs 23:fed7f64dd520 23 *
SolderSplashLabs 23:fed7f64dd520 24 * Neither the name of Texas Instruments Incorporated nor the names of
SolderSplashLabs 23:fed7f64dd520 25 * its contributors may be used to endorse or promote products derived
SolderSplashLabs 23:fed7f64dd520 26 * from this software without specific prior written permission.
SolderSplashLabs 23:fed7f64dd520 27 *
SolderSplashLabs 23:fed7f64dd520 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
SolderSplashLabs 23:fed7f64dd520 29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
SolderSplashLabs 23:fed7f64dd520 30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
SolderSplashLabs 23:fed7f64dd520 31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
SolderSplashLabs 23:fed7f64dd520 32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SolderSplashLabs 23:fed7f64dd520 33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
SolderSplashLabs 23:fed7f64dd520 34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
SolderSplashLabs 23:fed7f64dd520 35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
SolderSplashLabs 23:fed7f64dd520 36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SolderSplashLabs 23:fed7f64dd520 37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
SolderSplashLabs 23:fed7f64dd520 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
SolderSplashLabs 23:fed7f64dd520 39 *
SolderSplashLabs 23:fed7f64dd520 40 *****************************************************************************/
SolderSplashLabs 23:fed7f64dd520 41 #include "cc3000.h"
SolderSplashLabs 23:fed7f64dd520 42 #include "cc3000_socket.h"
SolderSplashLabs 23:fed7f64dd520 43 #include "cc3000_event.h" //TODO - remove this
SolderSplashLabs 23:fed7f64dd520 44 #include "cc3000_common.h"
SolderSplashLabs 23:fed7f64dd520 45
SolderSplashLabs 23:fed7f64dd520 46 namespace mbed_cc3000 {
SolderSplashLabs 23:fed7f64dd520 47
SolderSplashLabs 23:fed7f64dd520 48 cc3000_socket::cc3000_socket(cc3000_simple_link &simplelink, cc3000_hci &hci, cc3000_event &event)
SolderSplashLabs 23:fed7f64dd520 49 : _simple_link(simplelink), _hci(hci), _event(event)
SolderSplashLabs 23:fed7f64dd520 50 {
SolderSplashLabs 23:fed7f64dd520 51
SolderSplashLabs 23:fed7f64dd520 52 }
SolderSplashLabs 23:fed7f64dd520 53
SolderSplashLabs 23:fed7f64dd520 54 cc3000_socket::~cc3000_socket()
SolderSplashLabs 23:fed7f64dd520 55 {
SolderSplashLabs 23:fed7f64dd520 56
SolderSplashLabs 23:fed7f64dd520 57 }
SolderSplashLabs 23:fed7f64dd520 58
SolderSplashLabs 23:fed7f64dd520 59 int32_t cc3000_socket::HostFlowControlConsumeBuff(int32_t sd) {
SolderSplashLabs 23:fed7f64dd520 60 #ifndef SEND_NON_BLOCKING
SolderSplashLabs 23:fed7f64dd520 61 /* wait in busy loop */
SolderSplashLabs 23:fed7f64dd520 62 do
SolderSplashLabs 23:fed7f64dd520 63 {
SolderSplashLabs 23:fed7f64dd520 64 // When the last transmission failed, return the last failure reason.
SolderSplashLabs 23:fed7f64dd520 65 // Note that the buffer will not be allocated in this case
SolderSplashLabs 23:fed7f64dd520 66 if (_simple_link.get_transmit_error() != 0)
SolderSplashLabs 23:fed7f64dd520 67 {
SolderSplashLabs 23:fed7f64dd520 68 errno = _simple_link.get_transmit_error();
SolderSplashLabs 23:fed7f64dd520 69 _simple_link.set_transmit_error(0);
SolderSplashLabs 23:fed7f64dd520 70 return errno;
SolderSplashLabs 23:fed7f64dd520 71 }
SolderSplashLabs 23:fed7f64dd520 72
SolderSplashLabs 23:fed7f64dd520 73 if(SOCKET_STATUS_ACTIVE != _event.get_socket_active_status(sd))
SolderSplashLabs 23:fed7f64dd520 74 return -1;
SolderSplashLabs 23:fed7f64dd520 75 } while(0 == _simple_link.get_number_free_buffers());
SolderSplashLabs 23:fed7f64dd520 76
SolderSplashLabs 23:fed7f64dd520 77 uint16_t free_buffer = _simple_link.get_number_free_buffers();
SolderSplashLabs 23:fed7f64dd520 78 free_buffer--;
SolderSplashLabs 23:fed7f64dd520 79 _simple_link.set_number_free_buffers(free_buffer);
SolderSplashLabs 23:fed7f64dd520 80
SolderSplashLabs 23:fed7f64dd520 81 return 0;
SolderSplashLabs 23:fed7f64dd520 82 #else
SolderSplashLabs 23:fed7f64dd520 83
SolderSplashLabs 23:fed7f64dd520 84 // When the last transmission failed, return the last failure reason.
SolderSplashLabs 23:fed7f64dd520 85 // Note that the buffer will not be allocated in this case
SolderSplashLabs 23:fed7f64dd520 86 if (_simple_link.get_transmit_error() != 0)
SolderSplashLabs 23:fed7f64dd520 87 {
SolderSplashLabs 23:fed7f64dd520 88 errno = _simple_link.get_transmit_error();
SolderSplashLabs 23:fed7f64dd520 89 _simple_link.set_transmit_error(0);
SolderSplashLabs 23:fed7f64dd520 90 return errno;
SolderSplashLabs 23:fed7f64dd520 91 }
SolderSplashLabs 23:fed7f64dd520 92 if(SOCKET_STATUS_ACTIVE != _event.get_socket_active_status(sd))
SolderSplashLabs 23:fed7f64dd520 93 return -1;
SolderSplashLabs 23:fed7f64dd520 94
SolderSplashLabs 23:fed7f64dd520 95 // If there are no available buffers, return -2. It is recommended to use
SolderSplashLabs 23:fed7f64dd520 96 // select or receive to see if there is any buffer occupied with received data
SolderSplashLabs 23:fed7f64dd520 97 // If so, call receive() to release the buffer.
SolderSplashLabs 23:fed7f64dd520 98 if(0 == _simple_link.get_number_free_buffers())
SolderSplashLabs 23:fed7f64dd520 99 {
SolderSplashLabs 23:fed7f64dd520 100 return -2;
SolderSplashLabs 23:fed7f64dd520 101 }
SolderSplashLabs 23:fed7f64dd520 102 else
SolderSplashLabs 23:fed7f64dd520 103 {
SolderSplashLabs 23:fed7f64dd520 104 uint16_t free_buffer = _simple_link.get_number_free_buffers();
SolderSplashLabs 23:fed7f64dd520 105 free_buffer--;
SolderSplashLabs 23:fed7f64dd520 106 _simple_link.set_number_free_buffers(free_buffer);
SolderSplashLabs 23:fed7f64dd520 107 return 0;
SolderSplashLabs 23:fed7f64dd520 108 }
SolderSplashLabs 23:fed7f64dd520 109 #endif
SolderSplashLabs 23:fed7f64dd520 110 }
SolderSplashLabs 23:fed7f64dd520 111
SolderSplashLabs 23:fed7f64dd520 112 int32_t cc3000_socket::socket(int32_t domain, int32_t type, int32_t protocol) {
SolderSplashLabs 23:fed7f64dd520 113 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 114 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 115
SolderSplashLabs 23:fed7f64dd520 116 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 117 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 118 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 119
SolderSplashLabs 23:fed7f64dd520 120 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 121 args = UINT32_TO_STREAM(args, domain);
SolderSplashLabs 23:fed7f64dd520 122 args = UINT32_TO_STREAM(args, type);
SolderSplashLabs 23:fed7f64dd520 123 args = UINT32_TO_STREAM(args, protocol);
SolderSplashLabs 23:fed7f64dd520 124
SolderSplashLabs 23:fed7f64dd520 125 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 126 _hci.command_send(HCI_CMND_SOCKET, ptr, SOCKET_OPEN_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 127
SolderSplashLabs 23:fed7f64dd520 128 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 129 _event.simplelink_wait_event(HCI_CMND_SOCKET, &ret);
SolderSplashLabs 23:fed7f64dd520 130
SolderSplashLabs 23:fed7f64dd520 131 // Process the event
SolderSplashLabs 23:fed7f64dd520 132 errno = ret;
SolderSplashLabs 23:fed7f64dd520 133
SolderSplashLabs 23:fed7f64dd520 134 _event.set_socket_active_status(ret, SOCKET_STATUS_ACTIVE);
SolderSplashLabs 23:fed7f64dd520 135
SolderSplashLabs 23:fed7f64dd520 136 return(ret);
SolderSplashLabs 23:fed7f64dd520 137 }
SolderSplashLabs 23:fed7f64dd520 138
SolderSplashLabs 23:fed7f64dd520 139 int32_t cc3000_socket::closesocket(int32_t sd) {
SolderSplashLabs 23:fed7f64dd520 140 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 141 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 142
SolderSplashLabs 23:fed7f64dd520 143 while(_simple_link.get_number_free_buffers() != SOCKET_MAX_FREE_BUFFERS);
SolderSplashLabs 23:fed7f64dd520 144 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 145 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 146 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 147
SolderSplashLabs 23:fed7f64dd520 148 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 149 args = UINT32_TO_STREAM(args, sd);
SolderSplashLabs 23:fed7f64dd520 150
SolderSplashLabs 23:fed7f64dd520 151 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 152 _hci.command_send(HCI_CMND_CLOSE_SOCKET, ptr, SOCKET_CLOSE_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 153
SolderSplashLabs 23:fed7f64dd520 154 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 155 _event.simplelink_wait_event(HCI_CMND_CLOSE_SOCKET, &ret);
SolderSplashLabs 23:fed7f64dd520 156 errno = ret;
SolderSplashLabs 23:fed7f64dd520 157
SolderSplashLabs 23:fed7f64dd520 158 // since 'close' call may result in either OK (and then it closed) or error, mark this socket as invalid
SolderSplashLabs 23:fed7f64dd520 159 _event.set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
SolderSplashLabs 23:fed7f64dd520 160
SolderSplashLabs 23:fed7f64dd520 161 return(ret);
SolderSplashLabs 23:fed7f64dd520 162 }
SolderSplashLabs 23:fed7f64dd520 163
SolderSplashLabs 23:fed7f64dd520 164 int32_t cc3000_socket::accept(int32_t sd, sockaddr *addr, socklen_t *addrlen) {
SolderSplashLabs 23:fed7f64dd520 165 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 166 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 167 tBsdReturnParams tAcceptReturnArguments;
SolderSplashLabs 23:fed7f64dd520 168
SolderSplashLabs 23:fed7f64dd520 169 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 170 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 171 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 172
SolderSplashLabs 23:fed7f64dd520 173 // Fill in temporary command buffer
SolderSplashLabs 23:fed7f64dd520 174 args = UINT32_TO_STREAM(args, sd);
SolderSplashLabs 23:fed7f64dd520 175
SolderSplashLabs 23:fed7f64dd520 176 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 177 _hci.command_send(HCI_CMND_ACCEPT, ptr, SOCKET_ACCEPT_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 178
SolderSplashLabs 23:fed7f64dd520 179 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 180 _event.simplelink_wait_event(HCI_CMND_ACCEPT, &tAcceptReturnArguments);
SolderSplashLabs 23:fed7f64dd520 181
SolderSplashLabs 23:fed7f64dd520 182
SolderSplashLabs 23:fed7f64dd520 183 // need specify return parameters!!!
SolderSplashLabs 23:fed7f64dd520 184 memcpy(addr, &tAcceptReturnArguments.tSocketAddress, ASIC_ADDR_LEN);
SolderSplashLabs 23:fed7f64dd520 185 *addrlen = ASIC_ADDR_LEN;
SolderSplashLabs 23:fed7f64dd520 186 errno = tAcceptReturnArguments.iStatus;
SolderSplashLabs 23:fed7f64dd520 187 ret = errno;
SolderSplashLabs 23:fed7f64dd520 188
SolderSplashLabs 23:fed7f64dd520 189 // if succeeded, iStatus = new socket descriptor. otherwise - error number
SolderSplashLabs 23:fed7f64dd520 190 if(M_IS_VALID_SD(ret))
SolderSplashLabs 23:fed7f64dd520 191 {
SolderSplashLabs 23:fed7f64dd520 192 _event.set_socket_active_status(ret, SOCKET_STATUS_ACTIVE);
SolderSplashLabs 23:fed7f64dd520 193 }
SolderSplashLabs 23:fed7f64dd520 194 else
SolderSplashLabs 23:fed7f64dd520 195 {
SolderSplashLabs 23:fed7f64dd520 196 _event.set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
SolderSplashLabs 23:fed7f64dd520 197 }
SolderSplashLabs 23:fed7f64dd520 198
SolderSplashLabs 23:fed7f64dd520 199 return(ret);
SolderSplashLabs 23:fed7f64dd520 200 }
SolderSplashLabs 23:fed7f64dd520 201
SolderSplashLabs 23:fed7f64dd520 202 int32_t cc3000_socket::bind(int32_t sd, const sockaddr *addr, int32_t addrlen) {
SolderSplashLabs 23:fed7f64dd520 203 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 204 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 205
SolderSplashLabs 23:fed7f64dd520 206 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 207 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 208 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 209
SolderSplashLabs 23:fed7f64dd520 210 addrlen = ASIC_ADDR_LEN;
SolderSplashLabs 23:fed7f64dd520 211
SolderSplashLabs 23:fed7f64dd520 212 // Fill in temporary command buffer
SolderSplashLabs 23:fed7f64dd520 213 args = UINT32_TO_STREAM(args, sd);
SolderSplashLabs 23:fed7f64dd520 214 args = UINT32_TO_STREAM(args, 0x00000008);
SolderSplashLabs 23:fed7f64dd520 215 args = UINT32_TO_STREAM(args, addrlen);
SolderSplashLabs 23:fed7f64dd520 216 ARRAY_TO_STREAM(args, ((uint8_t *)addr), addrlen);
SolderSplashLabs 23:fed7f64dd520 217
SolderSplashLabs 23:fed7f64dd520 218 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 219 _hci.command_send(HCI_CMND_BIND, ptr, SOCKET_BIND_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 220
SolderSplashLabs 23:fed7f64dd520 221 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 222 _event.simplelink_wait_event(HCI_CMND_BIND, &ret);
SolderSplashLabs 23:fed7f64dd520 223
SolderSplashLabs 23:fed7f64dd520 224 errno = ret;
SolderSplashLabs 23:fed7f64dd520 225
SolderSplashLabs 23:fed7f64dd520 226 return(ret);
SolderSplashLabs 23:fed7f64dd520 227 }
SolderSplashLabs 23:fed7f64dd520 228
SolderSplashLabs 23:fed7f64dd520 229 int32_t cc3000_socket::listen(int32_t sd, int32_t backlog) {
SolderSplashLabs 23:fed7f64dd520 230 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 231 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 232
SolderSplashLabs 23:fed7f64dd520 233 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 234 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 235 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 236
SolderSplashLabs 23:fed7f64dd520 237 // Fill in temporary command buffer
SolderSplashLabs 23:fed7f64dd520 238 args = UINT32_TO_STREAM(args, sd);
SolderSplashLabs 23:fed7f64dd520 239 args = UINT32_TO_STREAM(args, backlog);
SolderSplashLabs 23:fed7f64dd520 240
SolderSplashLabs 23:fed7f64dd520 241 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 242 _hci.command_send(HCI_CMND_LISTEN, ptr, SOCKET_LISTEN_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 243
SolderSplashLabs 23:fed7f64dd520 244 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 245 _event.simplelink_wait_event(HCI_CMND_LISTEN, &ret);
SolderSplashLabs 23:fed7f64dd520 246 errno = ret;
SolderSplashLabs 23:fed7f64dd520 247
SolderSplashLabs 23:fed7f64dd520 248 return(ret);
SolderSplashLabs 23:fed7f64dd520 249 }
SolderSplashLabs 23:fed7f64dd520 250
SolderSplashLabs 23:fed7f64dd520 251 int32_t cc3000_socket::connect(int32_t sd, const sockaddr *addr, int32_t addrlen) {
SolderSplashLabs 23:fed7f64dd520 252 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 253 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 254
SolderSplashLabs 23:fed7f64dd520 255 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 256 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 257 args = (ptr + SIMPLE_LINK_HCI_CMND_TRANSPORT_HEADER_SIZE);
SolderSplashLabs 23:fed7f64dd520 258 addrlen = 8;
SolderSplashLabs 23:fed7f64dd520 259
SolderSplashLabs 23:fed7f64dd520 260 // Fill in temporary command buffer
SolderSplashLabs 23:fed7f64dd520 261 args = UINT32_TO_STREAM(args, sd);
SolderSplashLabs 23:fed7f64dd520 262 args = UINT32_TO_STREAM(args, 0x00000008);
SolderSplashLabs 23:fed7f64dd520 263 args = UINT32_TO_STREAM(args, addrlen);
SolderSplashLabs 23:fed7f64dd520 264 ARRAY_TO_STREAM(args, ((uint8_t *)addr), addrlen);
SolderSplashLabs 23:fed7f64dd520 265
SolderSplashLabs 23:fed7f64dd520 266 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 267 _hci.command_send(HCI_CMND_CONNECT, ptr, SOCKET_CONNECT_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 268
SolderSplashLabs 23:fed7f64dd520 269 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 270 _event.simplelink_wait_event(HCI_CMND_CONNECT, &ret);
SolderSplashLabs 23:fed7f64dd520 271
SolderSplashLabs 23:fed7f64dd520 272 errno = ret;
SolderSplashLabs 23:fed7f64dd520 273
SolderSplashLabs 23:fed7f64dd520 274 return((int32_t)ret);
SolderSplashLabs 23:fed7f64dd520 275 }
SolderSplashLabs 23:fed7f64dd520 276
SolderSplashLabs 23:fed7f64dd520 277 int32_t cc3000_socket::select(int32_t nfds, fd_set *readsds, fd_set *writesds, fd_set *exceptsds, struct timeval *timeout) {
SolderSplashLabs 23:fed7f64dd520 278 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 279 tBsdSelectRecvParams tParams;
SolderSplashLabs 23:fed7f64dd520 280 uint32_t is_blocking;
SolderSplashLabs 23:fed7f64dd520 281
SolderSplashLabs 23:fed7f64dd520 282 if( timeout == NULL)
SolderSplashLabs 23:fed7f64dd520 283 {
SolderSplashLabs 23:fed7f64dd520 284 is_blocking = 1; /* blocking , infinity timeout */
SolderSplashLabs 23:fed7f64dd520 285 }
SolderSplashLabs 23:fed7f64dd520 286 else
SolderSplashLabs 23:fed7f64dd520 287 {
SolderSplashLabs 23:fed7f64dd520 288 is_blocking = 0; /* no blocking, timeout */
SolderSplashLabs 23:fed7f64dd520 289 }
SolderSplashLabs 23:fed7f64dd520 290
SolderSplashLabs 23:fed7f64dd520 291 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 292 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 293 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 294
SolderSplashLabs 23:fed7f64dd520 295 // Fill in temporary command buffer
SolderSplashLabs 23:fed7f64dd520 296 args = UINT32_TO_STREAM(args, nfds);
SolderSplashLabs 23:fed7f64dd520 297 args = UINT32_TO_STREAM(args, 0x00000014);
SolderSplashLabs 23:fed7f64dd520 298 args = UINT32_TO_STREAM(args, 0x00000014);
SolderSplashLabs 23:fed7f64dd520 299 args = UINT32_TO_STREAM(args, 0x00000014);
SolderSplashLabs 23:fed7f64dd520 300 args = UINT32_TO_STREAM(args, 0x00000014);
SolderSplashLabs 23:fed7f64dd520 301 args = UINT32_TO_STREAM(args, is_blocking);
SolderSplashLabs 23:fed7f64dd520 302 args = UINT32_TO_STREAM(args, ((readsds) ? *(uint32_t*)readsds : 0));
SolderSplashLabs 23:fed7f64dd520 303 args = UINT32_TO_STREAM(args, ((writesds) ? *(uint32_t*)writesds : 0));
SolderSplashLabs 23:fed7f64dd520 304 args = UINT32_TO_STREAM(args, ((exceptsds) ? *(uint32_t*)exceptsds : 0));
SolderSplashLabs 23:fed7f64dd520 305
SolderSplashLabs 23:fed7f64dd520 306 if (timeout)
SolderSplashLabs 23:fed7f64dd520 307 {
SolderSplashLabs 23:fed7f64dd520 308 if ( 0 == timeout->tv_sec && timeout->tv_usec < SELECT_TIMEOUT_MIN_MICRO_SECONDS)
SolderSplashLabs 23:fed7f64dd520 309 {
SolderSplashLabs 23:fed7f64dd520 310 timeout->tv_usec = SELECT_TIMEOUT_MIN_MICRO_SECONDS;
SolderSplashLabs 23:fed7f64dd520 311 }
SolderSplashLabs 23:fed7f64dd520 312 args = UINT32_TO_STREAM(args, timeout->tv_sec);
SolderSplashLabs 23:fed7f64dd520 313 args = UINT32_TO_STREAM(args, timeout->tv_usec);
SolderSplashLabs 23:fed7f64dd520 314 }
SolderSplashLabs 23:fed7f64dd520 315
SolderSplashLabs 23:fed7f64dd520 316 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 317 _hci.command_send(HCI_CMND_BSD_SELECT, ptr, SOCKET_SELECT_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 318
SolderSplashLabs 23:fed7f64dd520 319 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 320 _event.simplelink_wait_event(HCI_EVNT_SELECT, &tParams);
SolderSplashLabs 23:fed7f64dd520 321
SolderSplashLabs 23:fed7f64dd520 322 // Update actually read FD
SolderSplashLabs 23:fed7f64dd520 323 if (tParams.iStatus >= 0)
SolderSplashLabs 23:fed7f64dd520 324 {
SolderSplashLabs 23:fed7f64dd520 325 if (readsds)
SolderSplashLabs 23:fed7f64dd520 326 {
SolderSplashLabs 23:fed7f64dd520 327 memcpy(readsds, &tParams.uiRdfd, sizeof(tParams.uiRdfd));
SolderSplashLabs 23:fed7f64dd520 328 }
SolderSplashLabs 23:fed7f64dd520 329
SolderSplashLabs 23:fed7f64dd520 330 if (writesds)
SolderSplashLabs 23:fed7f64dd520 331 {
SolderSplashLabs 23:fed7f64dd520 332 memcpy(writesds, &tParams.uiWrfd, sizeof(tParams.uiWrfd));
SolderSplashLabs 23:fed7f64dd520 333 }
SolderSplashLabs 23:fed7f64dd520 334
SolderSplashLabs 23:fed7f64dd520 335 if (exceptsds)
SolderSplashLabs 23:fed7f64dd520 336 {
SolderSplashLabs 23:fed7f64dd520 337 memcpy(exceptsds, &tParams.uiExfd, sizeof(tParams.uiExfd));
SolderSplashLabs 23:fed7f64dd520 338 }
SolderSplashLabs 23:fed7f64dd520 339
SolderSplashLabs 23:fed7f64dd520 340 return(tParams.iStatus);
SolderSplashLabs 23:fed7f64dd520 341
SolderSplashLabs 23:fed7f64dd520 342 }
SolderSplashLabs 23:fed7f64dd520 343 else
SolderSplashLabs 23:fed7f64dd520 344 {
SolderSplashLabs 23:fed7f64dd520 345 errno = tParams.iStatus;
SolderSplashLabs 23:fed7f64dd520 346 return(-1);
SolderSplashLabs 23:fed7f64dd520 347 }
SolderSplashLabs 23:fed7f64dd520 348 }
SolderSplashLabs 23:fed7f64dd520 349
SolderSplashLabs 23:fed7f64dd520 350 int32_t cc3000_socket::getsockopt (int32_t sd, int32_t level, int32_t optname, void *optval, socklen_t *optlen) {
SolderSplashLabs 23:fed7f64dd520 351 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 352 tBsdGetSockOptReturnParams tRetParams;
SolderSplashLabs 23:fed7f64dd520 353
SolderSplashLabs 23:fed7f64dd520 354 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 355 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 356
SolderSplashLabs 23:fed7f64dd520 357 // Fill in temporary command buffer
SolderSplashLabs 23:fed7f64dd520 358 args = UINT32_TO_STREAM(args, sd);
SolderSplashLabs 23:fed7f64dd520 359 args = UINT32_TO_STREAM(args, level);
SolderSplashLabs 23:fed7f64dd520 360 args = UINT32_TO_STREAM(args, optname);
SolderSplashLabs 23:fed7f64dd520 361
SolderSplashLabs 23:fed7f64dd520 362 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 363 _hci.command_send(HCI_CMND_GETSOCKOPT, ptr, SOCKET_GET_SOCK_OPT_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 364
SolderSplashLabs 23:fed7f64dd520 365 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 366 _event.simplelink_wait_event(HCI_CMND_GETSOCKOPT, &tRetParams);
SolderSplashLabs 23:fed7f64dd520 367
SolderSplashLabs 23:fed7f64dd520 368 if (((int8_t)tRetParams.iStatus) >= 0)
SolderSplashLabs 23:fed7f64dd520 369 {
SolderSplashLabs 23:fed7f64dd520 370 *optlen = 4;
SolderSplashLabs 23:fed7f64dd520 371 memcpy(optval, tRetParams.ucOptValue, 4);
SolderSplashLabs 23:fed7f64dd520 372 return (0);
SolderSplashLabs 23:fed7f64dd520 373 }
SolderSplashLabs 23:fed7f64dd520 374 else
SolderSplashLabs 23:fed7f64dd520 375 {
SolderSplashLabs 23:fed7f64dd520 376 errno = tRetParams.iStatus;
SolderSplashLabs 23:fed7f64dd520 377 return errno;
SolderSplashLabs 23:fed7f64dd520 378 }
SolderSplashLabs 23:fed7f64dd520 379 }
SolderSplashLabs 23:fed7f64dd520 380
SolderSplashLabs 23:fed7f64dd520 381 int32_t cc3000_socket::simple_link_recv(int32_t sd, void *buf, int32_t len, int32_t flags, sockaddr *from, socklen_t *fromlen, int32_t opcode) {
SolderSplashLabs 23:fed7f64dd520 382 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 383 tBsdReadReturnParams tSocketReadEvent;
SolderSplashLabs 23:fed7f64dd520 384
SolderSplashLabs 23:fed7f64dd520 385 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 386 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 387
SolderSplashLabs 23:fed7f64dd520 388 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 389 args = UINT32_TO_STREAM(args, sd);
SolderSplashLabs 23:fed7f64dd520 390 args = UINT32_TO_STREAM(args, len);
SolderSplashLabs 23:fed7f64dd520 391 args = UINT32_TO_STREAM(args, flags);
SolderSplashLabs 23:fed7f64dd520 392
SolderSplashLabs 23:fed7f64dd520 393 // Generate the read command, and wait for the
SolderSplashLabs 23:fed7f64dd520 394 _hci.command_send(opcode, ptr, SOCKET_RECV_FROM_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 395
SolderSplashLabs 23:fed7f64dd520 396 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 397 _event.simplelink_wait_event(opcode, &tSocketReadEvent);
SolderSplashLabs 23:fed7f64dd520 398
SolderSplashLabs 23:fed7f64dd520 399 // In case the number of bytes is more then zero - read data
SolderSplashLabs 23:fed7f64dd520 400 if (tSocketReadEvent.iNumberOfBytes > 0)
SolderSplashLabs 23:fed7f64dd520 401 {
SolderSplashLabs 23:fed7f64dd520 402 // Wait for the data in a synchronous way. Here we assume that the bug is
SolderSplashLabs 23:fed7f64dd520 403 // big enough to store also parameters of receive from too....
SolderSplashLabs 23:fed7f64dd520 404 _event.simplelink_wait_data((uint8_t *)buf, (uint8_t *)from, (uint8_t *)fromlen);
SolderSplashLabs 23:fed7f64dd520 405 }
SolderSplashLabs 23:fed7f64dd520 406
SolderSplashLabs 23:fed7f64dd520 407 errno = tSocketReadEvent.iNumberOfBytes;
SolderSplashLabs 23:fed7f64dd520 408
SolderSplashLabs 23:fed7f64dd520 409 return(tSocketReadEvent.iNumberOfBytes);
SolderSplashLabs 23:fed7f64dd520 410 }
SolderSplashLabs 23:fed7f64dd520 411
SolderSplashLabs 23:fed7f64dd520 412 int32_t cc3000_socket::recv(int32_t sd, void *buf, int32_t len, int32_t flags) {
SolderSplashLabs 23:fed7f64dd520 413 return(simple_link_recv(sd, buf, len, flags, NULL, NULL, HCI_CMND_RECV));
SolderSplashLabs 23:fed7f64dd520 414 }
SolderSplashLabs 23:fed7f64dd520 415
SolderSplashLabs 23:fed7f64dd520 416 int32_t cc3000_socket::recvfrom(int32_t sd, void *buf, int32_t len, int32_t flags, sockaddr *from, socklen_t *fromlen) {
SolderSplashLabs 23:fed7f64dd520 417 return(simple_link_recv(sd, buf, len, flags, from, fromlen, HCI_CMND_RECVFROM));
SolderSplashLabs 23:fed7f64dd520 418 }
SolderSplashLabs 23:fed7f64dd520 419
SolderSplashLabs 23:fed7f64dd520 420 int32_t cc3000_socket::simple_link_send(int32_t sd, const void *buf, int32_t len, int32_t flags, const sockaddr *to, int32_t tolen, int32_t opcode) {
SolderSplashLabs 23:fed7f64dd520 421 uint8_t uArgSize = 0x00, addrlen = 0x00;
SolderSplashLabs 23:fed7f64dd520 422 uint8_t *ptr, *pDataPtr = NULL, *args;
SolderSplashLabs 23:fed7f64dd520 423 uint32_t addr_offset = 0x00;
SolderSplashLabs 23:fed7f64dd520 424 int32_t res;
SolderSplashLabs 23:fed7f64dd520 425 tBsdReadReturnParams tSocketSendEvent;
SolderSplashLabs 23:fed7f64dd520 426
SolderSplashLabs 23:fed7f64dd520 427 // Check the bsd_arguments
SolderSplashLabs 23:fed7f64dd520 428 if (0 != (res = HostFlowControlConsumeBuff(sd)))
SolderSplashLabs 23:fed7f64dd520 429 {
SolderSplashLabs 23:fed7f64dd520 430 return res;
SolderSplashLabs 23:fed7f64dd520 431 }
SolderSplashLabs 23:fed7f64dd520 432
SolderSplashLabs 23:fed7f64dd520 433 //Update the number of sent packets
SolderSplashLabs 23:fed7f64dd520 434 uint16_t sent_packets = _simple_link.get_sent_packets();
SolderSplashLabs 23:fed7f64dd520 435 sent_packets++;
SolderSplashLabs 23:fed7f64dd520 436 _simple_link.set_sent_packets(sent_packets);
SolderSplashLabs 23:fed7f64dd520 437
SolderSplashLabs 23:fed7f64dd520 438 // Allocate a buffer and construct a packet and send it over spi
SolderSplashLabs 23:fed7f64dd520 439 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 440 args = (ptr + HEADERS_SIZE_DATA);
SolderSplashLabs 23:fed7f64dd520 441
SolderSplashLabs 23:fed7f64dd520 442 // Update the offset of data and parameters according to the command
SolderSplashLabs 23:fed7f64dd520 443 switch(opcode)
SolderSplashLabs 23:fed7f64dd520 444 {
SolderSplashLabs 23:fed7f64dd520 445 case HCI_CMND_SENDTO:
SolderSplashLabs 23:fed7f64dd520 446 {
SolderSplashLabs 23:fed7f64dd520 447 addr_offset = len + sizeof(len) + sizeof(len);
SolderSplashLabs 23:fed7f64dd520 448 addrlen = 8;
SolderSplashLabs 23:fed7f64dd520 449 uArgSize = SOCKET_SENDTO_PARAMS_LEN;
SolderSplashLabs 23:fed7f64dd520 450 pDataPtr = ptr + HEADERS_SIZE_DATA + SOCKET_SENDTO_PARAMS_LEN;
SolderSplashLabs 23:fed7f64dd520 451 break;
SolderSplashLabs 23:fed7f64dd520 452 }
SolderSplashLabs 23:fed7f64dd520 453
SolderSplashLabs 23:fed7f64dd520 454 case HCI_CMND_SEND:
SolderSplashLabs 23:fed7f64dd520 455 {
SolderSplashLabs 23:fed7f64dd520 456 tolen = 0;
SolderSplashLabs 23:fed7f64dd520 457 to = NULL;
SolderSplashLabs 23:fed7f64dd520 458 uArgSize = HCI_CMND_SEND_ARG_LENGTH;
SolderSplashLabs 23:fed7f64dd520 459 pDataPtr = ptr + HEADERS_SIZE_DATA + HCI_CMND_SEND_ARG_LENGTH;
SolderSplashLabs 23:fed7f64dd520 460 break;
SolderSplashLabs 23:fed7f64dd520 461 }
SolderSplashLabs 23:fed7f64dd520 462
SolderSplashLabs 23:fed7f64dd520 463 default:
SolderSplashLabs 23:fed7f64dd520 464 {
SolderSplashLabs 23:fed7f64dd520 465 break;
SolderSplashLabs 23:fed7f64dd520 466 }
SolderSplashLabs 23:fed7f64dd520 467 }
SolderSplashLabs 23:fed7f64dd520 468
SolderSplashLabs 23:fed7f64dd520 469 // Fill in temporary command buffer
SolderSplashLabs 23:fed7f64dd520 470 args = UINT32_TO_STREAM(args, sd);
SolderSplashLabs 23:fed7f64dd520 471 args = UINT32_TO_STREAM(args, uArgSize - sizeof(sd));
SolderSplashLabs 23:fed7f64dd520 472 args = UINT32_TO_STREAM(args, len);
SolderSplashLabs 23:fed7f64dd520 473 args = UINT32_TO_STREAM(args, flags);
SolderSplashLabs 23:fed7f64dd520 474
SolderSplashLabs 23:fed7f64dd520 475 if (opcode == HCI_CMND_SENDTO)
SolderSplashLabs 23:fed7f64dd520 476 {
SolderSplashLabs 23:fed7f64dd520 477 args = UINT32_TO_STREAM(args, addr_offset);
SolderSplashLabs 23:fed7f64dd520 478 args = UINT32_TO_STREAM(args, addrlen);
SolderSplashLabs 23:fed7f64dd520 479 }
SolderSplashLabs 23:fed7f64dd520 480
SolderSplashLabs 23:fed7f64dd520 481 // Copy the data received from user into the TX Buffer
SolderSplashLabs 23:fed7f64dd520 482 ARRAY_TO_STREAM(pDataPtr, ((uint8_t *)buf), len);
SolderSplashLabs 23:fed7f64dd520 483
SolderSplashLabs 23:fed7f64dd520 484 // In case we are using SendTo, copy the to parameters
SolderSplashLabs 23:fed7f64dd520 485 if (opcode == HCI_CMND_SENDTO)
SolderSplashLabs 23:fed7f64dd520 486 {
SolderSplashLabs 23:fed7f64dd520 487 ARRAY_TO_STREAM(pDataPtr, ((uint8_t *)to), tolen);
SolderSplashLabs 23:fed7f64dd520 488 }
SolderSplashLabs 23:fed7f64dd520 489
SolderSplashLabs 23:fed7f64dd520 490 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 491 _hci.data_send(opcode, ptr, uArgSize, len,(uint8_t*)to, tolen);
SolderSplashLabs 23:fed7f64dd520 492 if (opcode == HCI_CMND_SENDTO)
SolderSplashLabs 23:fed7f64dd520 493 _event.simplelink_wait_event(HCI_EVNT_SENDTO, &tSocketSendEvent);
SolderSplashLabs 23:fed7f64dd520 494 else
SolderSplashLabs 23:fed7f64dd520 495 _event.simplelink_wait_event(HCI_EVNT_SEND, &tSocketSendEvent);
SolderSplashLabs 23:fed7f64dd520 496
SolderSplashLabs 23:fed7f64dd520 497 return (len);
SolderSplashLabs 23:fed7f64dd520 498 }
SolderSplashLabs 23:fed7f64dd520 499
SolderSplashLabs 23:fed7f64dd520 500 int32_t cc3000_socket::send(int32_t sd, const void *buf, int32_t len, int32_t flags) {
SolderSplashLabs 23:fed7f64dd520 501 return(simple_link_send(sd, buf, len, flags, NULL, 0, HCI_CMND_SEND));
SolderSplashLabs 23:fed7f64dd520 502 }
SolderSplashLabs 23:fed7f64dd520 503
SolderSplashLabs 23:fed7f64dd520 504 int32_t cc3000_socket::sendto(int32_t sd, const void *buf, int32_t len, int32_t flags, const sockaddr *to, socklen_t tolen) {
SolderSplashLabs 23:fed7f64dd520 505 return(simple_link_send(sd, buf, len, flags, to, tolen, HCI_CMND_SENDTO));
SolderSplashLabs 23:fed7f64dd520 506 }
SolderSplashLabs 23:fed7f64dd520 507
SolderSplashLabs 23:fed7f64dd520 508 int32_t cc3000_socket::mdns_advertiser(uint16_t mdns_enabled, uint8_t *device_service_name, uint16_t device_service_name_length) {
SolderSplashLabs 23:fed7f64dd520 509 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 510 uint8_t *pTxBuffer, *pArgs;
SolderSplashLabs 23:fed7f64dd520 511
SolderSplashLabs 23:fed7f64dd520 512 if (device_service_name_length > MDNS_DEVICE_SERVICE_MAX_LENGTH)
SolderSplashLabs 23:fed7f64dd520 513 {
SolderSplashLabs 23:fed7f64dd520 514 return EFAIL;
SolderSplashLabs 23:fed7f64dd520 515 }
SolderSplashLabs 23:fed7f64dd520 516
SolderSplashLabs 23:fed7f64dd520 517 pTxBuffer = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 518 pArgs = (pTxBuffer + SIMPLE_LINK_HCI_CMND_TRANSPORT_HEADER_SIZE);
SolderSplashLabs 23:fed7f64dd520 519
SolderSplashLabs 23:fed7f64dd520 520 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 521 pArgs = UINT32_TO_STREAM(pArgs, mdns_enabled);
SolderSplashLabs 23:fed7f64dd520 522 pArgs = UINT32_TO_STREAM(pArgs, 8);
SolderSplashLabs 23:fed7f64dd520 523 pArgs = UINT32_TO_STREAM(pArgs, device_service_name_length);
SolderSplashLabs 23:fed7f64dd520 524 ARRAY_TO_STREAM(pArgs, device_service_name, device_service_name_length);
SolderSplashLabs 23:fed7f64dd520 525
SolderSplashLabs 23:fed7f64dd520 526 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 527 _hci.command_send(HCI_CMND_MDNS_ADVERTISE, pTxBuffer, SOCKET_MDNS_ADVERTISE_PARAMS_LEN + device_service_name_length);
SolderSplashLabs 23:fed7f64dd520 528
SolderSplashLabs 23:fed7f64dd520 529 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 530 _event.simplelink_wait_event(HCI_EVNT_MDNS_ADVERTISE, &ret);
SolderSplashLabs 23:fed7f64dd520 531
SolderSplashLabs 23:fed7f64dd520 532 return ret;
SolderSplashLabs 23:fed7f64dd520 533 }
SolderSplashLabs 23:fed7f64dd520 534
SolderSplashLabs 23:fed7f64dd520 535
SolderSplashLabs 23:fed7f64dd520 536 #ifndef CC3000_TINY_DRIVER
SolderSplashLabs 23:fed7f64dd520 537 int32_t cc3000_socket::gethostbyname(uint8_t *hostname, uint16_t name_length, uint32_t *out_ip_addr) {
SolderSplashLabs 23:fed7f64dd520 538 tBsdGethostbynameParams ret;
SolderSplashLabs 23:fed7f64dd520 539 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 540
SolderSplashLabs 23:fed7f64dd520 541 errno = EFAIL;
SolderSplashLabs 23:fed7f64dd520 542
SolderSplashLabs 23:fed7f64dd520 543 if (name_length > HOSTNAME_MAX_LENGTH)
SolderSplashLabs 23:fed7f64dd520 544 {
SolderSplashLabs 23:fed7f64dd520 545 return errno;
SolderSplashLabs 23:fed7f64dd520 546 }
SolderSplashLabs 23:fed7f64dd520 547
SolderSplashLabs 23:fed7f64dd520 548 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 549 args = (ptr + SIMPLE_LINK_HCI_CMND_TRANSPORT_HEADER_SIZE);
SolderSplashLabs 23:fed7f64dd520 550
SolderSplashLabs 23:fed7f64dd520 551 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 552 args = UINT32_TO_STREAM(args, 8);
SolderSplashLabs 23:fed7f64dd520 553 args = UINT32_TO_STREAM(args, name_length);
SolderSplashLabs 23:fed7f64dd520 554 ARRAY_TO_STREAM(args, hostname, name_length);
SolderSplashLabs 23:fed7f64dd520 555
SolderSplashLabs 23:fed7f64dd520 556 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 557 _hci.command_send(HCI_CMND_GETHOSTNAME, ptr, SOCKET_GET_HOST_BY_NAME_PARAMS_LEN + name_length - 1);
SolderSplashLabs 23:fed7f64dd520 558
SolderSplashLabs 23:fed7f64dd520 559 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 560 _event.simplelink_wait_event(HCI_EVNT_BSD_GETHOSTBYNAME, &ret);
SolderSplashLabs 23:fed7f64dd520 561
SolderSplashLabs 23:fed7f64dd520 562 errno = ret.retVal;
SolderSplashLabs 23:fed7f64dd520 563
SolderSplashLabs 23:fed7f64dd520 564 (*((int32_t*)out_ip_addr)) = ret.outputAddress;
SolderSplashLabs 23:fed7f64dd520 565
SolderSplashLabs 23:fed7f64dd520 566 return (errno);
SolderSplashLabs 23:fed7f64dd520 567 }
SolderSplashLabs 23:fed7f64dd520 568
SolderSplashLabs 23:fed7f64dd520 569 int32_t cc3000_socket::setsockopt(int32_t sd, int32_t level, int32_t optname, const void *optval, socklen_t optlen) {
SolderSplashLabs 23:fed7f64dd520 570 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 571 uint8_t *ptr, *args;
SolderSplashLabs 23:fed7f64dd520 572
SolderSplashLabs 23:fed7f64dd520 573 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 574 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 575
SolderSplashLabs 23:fed7f64dd520 576 // Fill in temporary command buffer
SolderSplashLabs 23:fed7f64dd520 577 args = UINT32_TO_STREAM(args, sd);
SolderSplashLabs 23:fed7f64dd520 578 args = UINT32_TO_STREAM(args, level);
SolderSplashLabs 23:fed7f64dd520 579 args = UINT32_TO_STREAM(args, optname);
SolderSplashLabs 23:fed7f64dd520 580 args = UINT32_TO_STREAM(args, 0x00000008);
SolderSplashLabs 23:fed7f64dd520 581 args = UINT32_TO_STREAM(args, optlen);
SolderSplashLabs 23:fed7f64dd520 582 ARRAY_TO_STREAM(args, ((uint8_t *)optval), optlen);
SolderSplashLabs 23:fed7f64dd520 583
SolderSplashLabs 23:fed7f64dd520 584 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 585 _hci.command_send(HCI_CMND_SETSOCKOPT, ptr, SOCKET_SET_SOCK_OPT_PARAMS_LEN + optlen);
SolderSplashLabs 23:fed7f64dd520 586
SolderSplashLabs 23:fed7f64dd520 587 // Since we are in blocking state - wait for event complete
SolderSplashLabs 23:fed7f64dd520 588 _event.simplelink_wait_event(HCI_CMND_SETSOCKOPT, &ret);
SolderSplashLabs 23:fed7f64dd520 589
SolderSplashLabs 23:fed7f64dd520 590 if (ret >= 0)
SolderSplashLabs 23:fed7f64dd520 591 {
SolderSplashLabs 23:fed7f64dd520 592 return (0);
SolderSplashLabs 23:fed7f64dd520 593 }
SolderSplashLabs 23:fed7f64dd520 594 else
SolderSplashLabs 23:fed7f64dd520 595 {
SolderSplashLabs 23:fed7f64dd520 596 errno = ret;
SolderSplashLabs 23:fed7f64dd520 597 return ret;
SolderSplashLabs 23:fed7f64dd520 598 }
SolderSplashLabs 23:fed7f64dd520 599 }
SolderSplashLabs 23:fed7f64dd520 600
SolderSplashLabs 23:fed7f64dd520 601 #endif
SolderSplashLabs 23:fed7f64dd520 602
SolderSplashLabs 23:fed7f64dd520 603 } /* end of cc3000 namespace */