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

Dependents:   CC3000Test

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:9cb694f00b7b 1 /*****************************************************************************
dflet 0:9cb694f00b7b 2 *
dflet 0:9cb694f00b7b 3 * evnt_handler.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 //! \addtogroup evnt_handler_api
dflet 0:9cb694f00b7b 38 //! @{
dflet 0:9cb694f00b7b 39 //
dflet 0:9cb694f00b7b 40 //******************************************************************************
dflet 0:9cb694f00b7b 41
dflet 0:9cb694f00b7b 42 //******************************************************************************
dflet 0:9cb694f00b7b 43 // INCLUDE FILES
dflet 0:9cb694f00b7b 44 //******************************************************************************
dflet 0:9cb694f00b7b 45
dflet 0:9cb694f00b7b 46 #include "cc3000_common.h"
dflet 0:9cb694f00b7b 47 #include "string.h"
dflet 0:9cb694f00b7b 48 #include "hci.h"
dflet 0:9cb694f00b7b 49 #include "evnt_handler.h"
dflet 0:9cb694f00b7b 50 #include "wlan.h"
dflet 0:9cb694f00b7b 51 #include "socket.h"
dflet 0:9cb694f00b7b 52 #include "netapp.h"
dflet 0:9cb694f00b7b 53 #include "mbed.h"
dflet 0:9cb694f00b7b 54 #include "spi.h"
dflet 0:9cb694f00b7b 55
dflet 0:9cb694f00b7b 56
dflet 0:9cb694f00b7b 57
dflet 0:9cb694f00b7b 58 //*****************************************************************************
dflet 0:9cb694f00b7b 59 // COMMON DEFINES
dflet 0:9cb694f00b7b 60 //*****************************************************************************
dflet 0:9cb694f00b7b 61
dflet 0:9cb694f00b7b 62 #define FLOW_CONTROL_EVENT_HANDLE_OFFSET (0)
dflet 0:9cb694f00b7b 63 #define FLOW_CONTROL_EVENT_BLOCK_MODE_OFFSET (1)
dflet 0:9cb694f00b7b 64 #define FLOW_CONTROL_EVENT_FREE_BUFFS_OFFSET (2)
dflet 0:9cb694f00b7b 65 #define FLOW_CONTROL_EVENT_SIZE (4)
dflet 0:9cb694f00b7b 66
dflet 0:9cb694f00b7b 67 #define BSD_RSP_PARAMS_SOCKET_OFFSET (0)
dflet 0:9cb694f00b7b 68 #define BSD_RSP_PARAMS_STATUS_OFFSET (4)
dflet 0:9cb694f00b7b 69
dflet 0:9cb694f00b7b 70 #define GET_HOST_BY_NAME_RETVAL_OFFSET (0)
dflet 0:9cb694f00b7b 71 #define GET_HOST_BY_NAME_ADDR_OFFSET (4)
dflet 0:9cb694f00b7b 72
dflet 0:9cb694f00b7b 73 #define ACCEPT_SD_OFFSET (0)
dflet 0:9cb694f00b7b 74 #define ACCEPT_RETURN_STATUS_OFFSET (4)
dflet 0:9cb694f00b7b 75 #define ACCEPT_ADDRESS__OFFSET (8)
dflet 0:9cb694f00b7b 76
dflet 0:9cb694f00b7b 77 #define SL_RECEIVE_SD_OFFSET (0)
dflet 0:9cb694f00b7b 78 #define SL_RECEIVE_NUM_BYTES_OFFSET (4)
dflet 0:9cb694f00b7b 79 #define SL_RECEIVE__FLAGS__OFFSET (8)
dflet 0:9cb694f00b7b 80
dflet 0:9cb694f00b7b 81
dflet 0:9cb694f00b7b 82 #define SELECT_STATUS_OFFSET (0)
dflet 0:9cb694f00b7b 83 #define SELECT_READFD_OFFSET (4)
dflet 0:9cb694f00b7b 84 #define SELECT_WRITEFD_OFFSET (8)
dflet 0:9cb694f00b7b 85 #define SELECT_EXFD_OFFSET (12)
dflet 0:9cb694f00b7b 86
dflet 0:9cb694f00b7b 87
dflet 0:9cb694f00b7b 88 #define NETAPP_IPCONFIG_IP_OFFSET (0)
dflet 0:9cb694f00b7b 89 #define NETAPP_IPCONFIG_SUBNET_OFFSET (4)
dflet 0:9cb694f00b7b 90 #define NETAPP_IPCONFIG_GW_OFFSET (8)
dflet 0:9cb694f00b7b 91 #define NETAPP_IPCONFIG_DHCP_OFFSET (12)
dflet 0:9cb694f00b7b 92 #define NETAPP_IPCONFIG_DNS_OFFSET (16)
dflet 0:9cb694f00b7b 93 #define NETAPP_IPCONFIG_MAC_OFFSET (20)
dflet 0:9cb694f00b7b 94 #define NETAPP_IPCONFIG_SSID_OFFSET (26)
dflet 0:9cb694f00b7b 95
dflet 0:9cb694f00b7b 96 #define NETAPP_IPCONFIG_IP_LENGTH (4)
dflet 0:9cb694f00b7b 97 #define NETAPP_IPCONFIG_MAC_LENGTH (6)
dflet 0:9cb694f00b7b 98 #define NETAPP_IPCONFIG_SSID_LENGTH (32)
dflet 0:9cb694f00b7b 99
dflet 0:9cb694f00b7b 100
dflet 0:9cb694f00b7b 101 #define NETAPP_PING_PACKETS_SENT_OFFSET (0)
dflet 0:9cb694f00b7b 102 #define NETAPP_PING_PACKETS_RCVD_OFFSET (4)
dflet 0:9cb694f00b7b 103 #define NETAPP_PING_MIN_RTT_OFFSET (8)
dflet 0:9cb694f00b7b 104 #define NETAPP_PING_MAX_RTT_OFFSET (12)
dflet 0:9cb694f00b7b 105 #define NETAPP_PING_AVG_RTT_OFFSET (16)
dflet 0:9cb694f00b7b 106
dflet 0:9cb694f00b7b 107 #define GET_SCAN_RESULTS_TABlE_COUNT_OFFSET (0)
dflet 0:9cb694f00b7b 108 #define GET_SCAN_RESULTS_SCANRESULT_STATUS_OFFSET (4)
dflet 0:9cb694f00b7b 109 #define GET_SCAN_RESULTS_ISVALID_TO_SSIDLEN_OFFSET (8)
dflet 0:9cb694f00b7b 110 #define GET_SCAN_RESULTS_FRAME_TIME_OFFSET (10)
dflet 0:9cb694f00b7b 111 #define GET_SCAN_RESULTS_SSID_MAC_LENGTH (38)
dflet 0:9cb694f00b7b 112
dflet 0:9cb694f00b7b 113
dflet 0:9cb694f00b7b 114
dflet 0:9cb694f00b7b 115 //*****************************************************************************
dflet 0:9cb694f00b7b 116 // GLOBAL VARAIABLES
dflet 0:9cb694f00b7b 117 //*****************************************************************************
dflet 0:9cb694f00b7b 118
dflet 0:9cb694f00b7b 119 unsigned long socket_active_status = SOCKET_STATUS_INIT_VAL;
dflet 0:9cb694f00b7b 120
dflet 0:9cb694f00b7b 121
dflet 0:9cb694f00b7b 122 //*****************************************************************************
dflet 0:9cb694f00b7b 123 // Prototypes for the static functions
dflet 0:9cb694f00b7b 124 //*****************************************************************************
dflet 0:9cb694f00b7b 125
dflet 0:9cb694f00b7b 126 static long hci_event_unsol_flowcontrol_handler(char *pEvent);
dflet 0:9cb694f00b7b 127
dflet 0:9cb694f00b7b 128 static void update_socket_active_status(char *resp_params);
dflet 0:9cb694f00b7b 129
dflet 0:9cb694f00b7b 130
dflet 0:9cb694f00b7b 131 //*****************************************************************************
dflet 0:9cb694f00b7b 132 //
dflet 0:9cb694f00b7b 133 //! hci_unsol_handle_patch_request
dflet 0:9cb694f00b7b 134 //!
dflet 0:9cb694f00b7b 135 //! @param event_hdr event header
dflet 0:9cb694f00b7b 136 //!
dflet 0:9cb694f00b7b 137 //! @return none
dflet 0:9cb694f00b7b 138 //!
dflet 0:9cb694f00b7b 139 //! @brief Handle unsolicited event from type patch request
dflet 0:9cb694f00b7b 140 //
dflet 0:9cb694f00b7b 141 //*****************************************************************************
dflet 0:9cb694f00b7b 142 void hci_unsol_handle_patch_request(char *event_hdr)
dflet 0:9cb694f00b7b 143 {
dflet 0:9cb694f00b7b 144 char *params = (char *)(event_hdr) + HCI_EVENT_HEADER_SIZE;
dflet 0:9cb694f00b7b 145 unsigned long ucLength = 0;
dflet 0:9cb694f00b7b 146 char *patch;
dflet 0:9cb694f00b7b 147
dflet 0:9cb694f00b7b 148 switch (*params)
dflet 0:9cb694f00b7b 149 {
dflet 0:9cb694f00b7b 150 case HCI_EVENT_PATCHES_DRV_REQ:
dflet 0:9cb694f00b7b 151
dflet 0:9cb694f00b7b 152 if (tSLInformation.sDriverPatches)
dflet 0:9cb694f00b7b 153 {
dflet 0:9cb694f00b7b 154 patch = tSLInformation.sDriverPatches(&ucLength);
dflet 0:9cb694f00b7b 155
dflet 0:9cb694f00b7b 156 if (patch)
dflet 0:9cb694f00b7b 157 {
dflet 0:9cb694f00b7b 158 hci_patch_send(HCI_EVENT_PATCHES_DRV_REQ, tSLInformation.pucTxCommandBuffer, patch, ucLength);
dflet 0:9cb694f00b7b 159 return;
dflet 0:9cb694f00b7b 160 }
dflet 0:9cb694f00b7b 161 }
dflet 0:9cb694f00b7b 162
dflet 0:9cb694f00b7b 163 // Send 0 length Patches response event
dflet 0:9cb694f00b7b 164 hci_patch_send(HCI_EVENT_PATCHES_DRV_REQ, tSLInformation.pucTxCommandBuffer, 0, 0);
dflet 0:9cb694f00b7b 165 break;
dflet 0:9cb694f00b7b 166
dflet 0:9cb694f00b7b 167 case HCI_EVENT_PATCHES_FW_REQ:
dflet 0:9cb694f00b7b 168
dflet 0:9cb694f00b7b 169 if (tSLInformation.sFWPatches)
dflet 0:9cb694f00b7b 170 {
dflet 0:9cb694f00b7b 171 patch = tSLInformation.sFWPatches(&ucLength);
dflet 0:9cb694f00b7b 172
dflet 0:9cb694f00b7b 173 // Build and send a patch
dflet 0:9cb694f00b7b 174 if (patch)
dflet 0:9cb694f00b7b 175 {
dflet 0:9cb694f00b7b 176 hci_patch_send(HCI_EVENT_PATCHES_FW_REQ, tSLInformation.pucTxCommandBuffer, patch, ucLength);
dflet 0:9cb694f00b7b 177 return;
dflet 0:9cb694f00b7b 178 }
dflet 0:9cb694f00b7b 179 }
dflet 0:9cb694f00b7b 180
dflet 0:9cb694f00b7b 181 // Send 0 length Patches response event
dflet 0:9cb694f00b7b 182 hci_patch_send(HCI_EVENT_PATCHES_FW_REQ, tSLInformation.pucTxCommandBuffer, 0, 0);
dflet 0:9cb694f00b7b 183 break;
dflet 0:9cb694f00b7b 184
dflet 0:9cb694f00b7b 185 case HCI_EVENT_PATCHES_BOOTLOAD_REQ:
dflet 0:9cb694f00b7b 186
dflet 0:9cb694f00b7b 187 if (tSLInformation.sBootLoaderPatches)
dflet 0:9cb694f00b7b 188 {
dflet 0:9cb694f00b7b 189 patch = tSLInformation.sBootLoaderPatches(&ucLength);
dflet 0:9cb694f00b7b 190
dflet 0:9cb694f00b7b 191 if (patch)
dflet 0:9cb694f00b7b 192 {
dflet 0:9cb694f00b7b 193 hci_patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ, tSLInformation.pucTxCommandBuffer, patch, ucLength);
dflet 0:9cb694f00b7b 194 return;
dflet 0:9cb694f00b7b 195 }
dflet 0:9cb694f00b7b 196 }
dflet 0:9cb694f00b7b 197
dflet 0:9cb694f00b7b 198 // Send 0 length Patches response event
dflet 0:9cb694f00b7b 199 hci_patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ, tSLInformation.pucTxCommandBuffer, 0, 0);
dflet 0:9cb694f00b7b 200 break;
dflet 0:9cb694f00b7b 201 }
dflet 0:9cb694f00b7b 202 }
dflet 0:9cb694f00b7b 203
dflet 0:9cb694f00b7b 204
dflet 0:9cb694f00b7b 205
dflet 0:9cb694f00b7b 206 //*****************************************************************************
dflet 0:9cb694f00b7b 207 //
dflet 0:9cb694f00b7b 208 //! hci_event_handler
dflet 0:9cb694f00b7b 209 //!
dflet 0:9cb694f00b7b 210 //! @param pRetParams incoming data buffer
dflet 0:9cb694f00b7b 211 //! @param from from information (in case of data received)
dflet 0:9cb694f00b7b 212 //! @param fromlen from information length (in case of data received)
dflet 0:9cb694f00b7b 213 //!
dflet 0:9cb694f00b7b 214 //! @return none
dflet 0:9cb694f00b7b 215 //!
dflet 0:9cb694f00b7b 216 //! @brief Parse the incoming events packets and issues corresponding
dflet 0:9cb694f00b7b 217 //! event handler from global array of handlers pointers
dflet 0:9cb694f00b7b 218 //
dflet 0:9cb694f00b7b 219 //*****************************************************************************
dflet 0:9cb694f00b7b 220
dflet 0:9cb694f00b7b 221 //unsigned char * hci_event_handler(void *pRetParams, unsigned char *from, unsigned char *fromlen)
dflet 0:9cb694f00b7b 222 unsigned char *
dflet 0:9cb694f00b7b 223 hci_event_handler(char *pRetParams, unsigned char *from, unsigned char *fromlen)
dflet 0:9cb694f00b7b 224 {
dflet 0:9cb694f00b7b 225 unsigned char *pucReceivedData, ucArgsize;
dflet 0:9cb694f00b7b 226 unsigned short usLength = 0;
dflet 0:9cb694f00b7b 227 unsigned char *pucReceivedParams;
dflet 0:9cb694f00b7b 228 unsigned short usReceivedEventOpcode = 0;
dflet 0:9cb694f00b7b 229 unsigned long retValue32;
dflet 0:9cb694f00b7b 230 unsigned char * RecvParams;
dflet 0:9cb694f00b7b 231 char *RetParams;
dflet 0:9cb694f00b7b 232
dflet 0:9cb694f00b7b 233
dflet 0:9cb694f00b7b 234 while (1)
dflet 0:9cb694f00b7b 235 {
dflet 0:9cb694f00b7b 236
dflet 0:9cb694f00b7b 237 if (tSLInformation.usEventOrDataReceived != 0)
dflet 0:9cb694f00b7b 238 {
dflet 0:9cb694f00b7b 239
dflet 0:9cb694f00b7b 240 pucReceivedData = (tSLInformation.pucReceivedData);
dflet 0:9cb694f00b7b 241
dflet 0:9cb694f00b7b 242
dflet 0:9cb694f00b7b 243 if (*pucReceivedData == HCI_TYPE_EVNT)
dflet 0:9cb694f00b7b 244 {
dflet 0:9cb694f00b7b 245
dflet 0:9cb694f00b7b 246 // Event Received
dflet 0:9cb694f00b7b 247 STREAM_TO_UINT16((char *)pucReceivedData, HCI_EVENT_OPCODE_OFFSET, usReceivedEventOpcode);
dflet 0:9cb694f00b7b 248 pucReceivedParams = pucReceivedData + HCI_EVENT_HEADER_SIZE;
dflet 0:9cb694f00b7b 249 RecvParams = pucReceivedParams;
dflet 0:9cb694f00b7b 250 RetParams = pRetParams;
dflet 0:9cb694f00b7b 251
dflet 0:9cb694f00b7b 252 // In case unsolicited event received - here the handling finished
dflet 0:9cb694f00b7b 253
dflet 0:9cb694f00b7b 254 if (hci_unsol_event_handler((char *)pucReceivedData) == 0)
dflet 0:9cb694f00b7b 255 {
dflet 0:9cb694f00b7b 256
dflet 0:9cb694f00b7b 257 STREAM_TO_UINT8(pucReceivedData, HCI_DATA_LENGTH_OFFSET, usLength);
dflet 0:9cb694f00b7b 258
dflet 0:9cb694f00b7b 259 switch(usReceivedEventOpcode)
dflet 0:9cb694f00b7b 260 {
dflet 0:9cb694f00b7b 261 case HCI_CMND_READ_BUFFER_SIZE:
dflet 0:9cb694f00b7b 262 {
dflet 0:9cb694f00b7b 263
dflet 0:9cb694f00b7b 264 STREAM_TO_UINT8((char *)pucReceivedParams, 0,
dflet 0:9cb694f00b7b 265 tSLInformation.usNumberOfFreeBuffers);
dflet 0:9cb694f00b7b 266 STREAM_TO_UINT16((char *)pucReceivedParams, 1,
dflet 0:9cb694f00b7b 267 tSLInformation.usSlBufferLength);
dflet 0:9cb694f00b7b 268 }
dflet 0:9cb694f00b7b 269
dflet 0:9cb694f00b7b 270 break;
dflet 0:9cb694f00b7b 271
dflet 0:9cb694f00b7b 272 case HCI_CMND_WLAN_CONFIGURE_PATCH:
dflet 0:9cb694f00b7b 273 case HCI_NETAPP_DHCP:
dflet 0:9cb694f00b7b 274 case HCI_NETAPP_PING_SEND:
dflet 0:9cb694f00b7b 275 case HCI_NETAPP_PING_STOP:
dflet 0:9cb694f00b7b 276 case HCI_NETAPP_ARP_FLUSH:
dflet 0:9cb694f00b7b 277 case HCI_NETAPP_SET_DEBUG_LEVEL:
dflet 0:9cb694f00b7b 278 case HCI_NETAPP_SET_TIMERS:
dflet 0:9cb694f00b7b 279 case HCI_EVNT_NVMEM_READ:
dflet 0:9cb694f00b7b 280 case HCI_EVNT_NVMEM_CREATE_ENTRY:
dflet 0:9cb694f00b7b 281 case HCI_CMND_NVMEM_WRITE_PATCH:
dflet 0:9cb694f00b7b 282 case HCI_NETAPP_PING_REPORT:
dflet 0:9cb694f00b7b 283 case HCI_EVNT_MDNS_ADVERTISE:
dflet 0:9cb694f00b7b 284
dflet 0:9cb694f00b7b 285 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET, *(unsigned char *)pRetParams);
dflet 0:9cb694f00b7b 286
dflet 0:9cb694f00b7b 287 break;
dflet 0:9cb694f00b7b 288
dflet 0:9cb694f00b7b 289 case HCI_CMND_SETSOCKOPT:
dflet 0:9cb694f00b7b 290 case HCI_CMND_WLAN_CONNECT:
dflet 0:9cb694f00b7b 291 case HCI_CMND_WLAN_IOCTL_STATUSGET:
dflet 0:9cb694f00b7b 292 case HCI_EVNT_WLAN_IOCTL_ADD_PROFILE:
dflet 0:9cb694f00b7b 293 case HCI_CMND_WLAN_IOCTL_DEL_PROFILE:
dflet 0:9cb694f00b7b 294 case HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY:
dflet 0:9cb694f00b7b 295 case HCI_CMND_WLAN_IOCTL_SET_SCANPARAM:
dflet 0:9cb694f00b7b 296 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START:
dflet 0:9cb694f00b7b 297 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP:
dflet 0:9cb694f00b7b 298 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX:
dflet 0:9cb694f00b7b 299 case HCI_CMND_EVENT_MASK:
dflet 0:9cb694f00b7b 300 case HCI_EVNT_WLAN_DISCONNECT:
dflet 0:9cb694f00b7b 301 case HCI_EVNT_SOCKET:
dflet 0:9cb694f00b7b 302 case HCI_EVNT_BIND:
dflet 0:9cb694f00b7b 303 case HCI_CMND_LISTEN:
dflet 0:9cb694f00b7b 304 case HCI_EVNT_CLOSE_SOCKET:
dflet 0:9cb694f00b7b 305 case HCI_EVNT_CONNECT:
dflet 0:9cb694f00b7b 306 case HCI_EVNT_NVMEM_WRITE:
dflet 0:9cb694f00b7b 307
dflet 0:9cb694f00b7b 308 STREAM_TO_UINT32((char *)pucReceivedParams, 0, *(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 309
dflet 0:9cb694f00b7b 310 break;
dflet 0:9cb694f00b7b 311
dflet 0:9cb694f00b7b 312 case HCI_EVNT_READ_SP_VERSION:
dflet 0:9cb694f00b7b 313
dflet 0:9cb694f00b7b 314 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET, *(unsigned char *)pRetParams);
dflet 0:9cb694f00b7b 315 pRetParams = ((char *)pRetParams) + 1;
dflet 0:9cb694f00b7b 316 STREAM_TO_UINT32((char *)pucReceivedParams, 0, retValue32);
dflet 0:9cb694f00b7b 317 UINT32_TO_STREAM((unsigned char *)pRetParams, retValue32);
dflet 0:9cb694f00b7b 318
dflet 0:9cb694f00b7b 319 break;
dflet 0:9cb694f00b7b 320
dflet 0:9cb694f00b7b 321 case HCI_EVNT_BSD_GETHOSTBYNAME:
dflet 0:9cb694f00b7b 322
dflet 0:9cb694f00b7b 323 STREAM_TO_UINT32((char *)pucReceivedParams, GET_HOST_BY_NAME_RETVAL_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 324 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 325 STREAM_TO_UINT32((char *)pucReceivedParams, GET_HOST_BY_NAME_ADDR_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 326
dflet 0:9cb694f00b7b 327 break;
dflet 0:9cb694f00b7b 328
dflet 0:9cb694f00b7b 329 case HCI_EVNT_ACCEPT:
dflet 0:9cb694f00b7b 330 {
dflet 0:9cb694f00b7b 331 STREAM_TO_UINT32((char *)pucReceivedParams,ACCEPT_SD_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 332 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 333 STREAM_TO_UINT32((char *)pucReceivedParams,ACCEPT_RETURN_STATUS_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 334 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 335
dflet 0:9cb694f00b7b 336 //This argument returns in network order
dflet 0:9cb694f00b7b 337 memcpy((unsigned char *)pRetParams, pucReceivedParams + ACCEPT_ADDRESS__OFFSET, sizeof(sockaddr));
dflet 0:9cb694f00b7b 338
dflet 0:9cb694f00b7b 339 break;
dflet 0:9cb694f00b7b 340 }
dflet 0:9cb694f00b7b 341
dflet 0:9cb694f00b7b 342 case HCI_EVNT_RECV:
dflet 0:9cb694f00b7b 343 case HCI_EVNT_RECVFROM:
dflet 0:9cb694f00b7b 344 {
dflet 0:9cb694f00b7b 345 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 346 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 347 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 348 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 349 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE__FLAGS__OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 350
dflet 0:9cb694f00b7b 351 if(((tBsdReadReturnParams *)pRetParams)->iNumberOfBytes == ERROR_SOCKET_INACTIVE)
dflet 0:9cb694f00b7b 352 {
dflet 0:9cb694f00b7b 353
dflet 0:9cb694f00b7b 354 set_socket_active_status(((tBsdReadReturnParams *)pRetParams)->iSocketDescriptor,SOCKET_STATUS_INACTIVE);
dflet 0:9cb694f00b7b 355
dflet 0:9cb694f00b7b 356 }
dflet 0:9cb694f00b7b 357
dflet 0:9cb694f00b7b 358 break;
dflet 0:9cb694f00b7b 359 }
dflet 0:9cb694f00b7b 360
dflet 0:9cb694f00b7b 361 case HCI_EVNT_SEND:
dflet 0:9cb694f00b7b 362 case HCI_EVNT_SENDTO:
dflet 0:9cb694f00b7b 363 {
dflet 0:9cb694f00b7b 364 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 365 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 366 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 367 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 368
dflet 0:9cb694f00b7b 369 break;
dflet 0:9cb694f00b7b 370 }
dflet 0:9cb694f00b7b 371
dflet 0:9cb694f00b7b 372 case HCI_EVNT_SELECT:
dflet 0:9cb694f00b7b 373 {
dflet 0:9cb694f00b7b 374 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_STATUS_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 375 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 376 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_READFD_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 377 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 378 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_WRITEFD_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 379 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 380 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_EXFD_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 381
dflet 0:9cb694f00b7b 382 break;
dflet 0:9cb694f00b7b 383 }
dflet 0:9cb694f00b7b 384
dflet 0:9cb694f00b7b 385 case HCI_CMND_GETSOCKOPT:
dflet 0:9cb694f00b7b 386
dflet 0:9cb694f00b7b 387 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET,((tBsdGetSockOptReturnParams *)pRetParams)->iStatus);
dflet 0:9cb694f00b7b 388 //This argument returns in network order
dflet 0:9cb694f00b7b 389 memcpy((unsigned char *)pRetParams, pucReceivedParams, 4);
dflet 0:9cb694f00b7b 390
dflet 0:9cb694f00b7b 391 break;
dflet 0:9cb694f00b7b 392
dflet 0:9cb694f00b7b 393 case HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS:
dflet 0:9cb694f00b7b 394
dflet 0:9cb694f00b7b 395 STREAM_TO_UINT32((char *)pucReceivedParams,GET_SCAN_RESULTS_TABlE_COUNT_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 396 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 397 STREAM_TO_UINT32((char *)pucReceivedParams,GET_SCAN_RESULTS_SCANRESULT_STATUS_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 398 pRetParams = ((char *)pRetParams) + 4;
dflet 0:9cb694f00b7b 399 STREAM_TO_UINT16((char *)pucReceivedParams,GET_SCAN_RESULTS_ISVALID_TO_SSIDLEN_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 400 pRetParams = ((char *)pRetParams) + 2;
dflet 0:9cb694f00b7b 401 STREAM_TO_UINT16((char *)pucReceivedParams,GET_SCAN_RESULTS_FRAME_TIME_OFFSET,*(unsigned long *)pRetParams);
dflet 0:9cb694f00b7b 402 pRetParams = ((char *)pRetParams) + 2;
dflet 0:9cb694f00b7b 403 memcpy((unsigned char *)pRetParams, (char *)(pucReceivedParams + GET_SCAN_RESULTS_FRAME_TIME_OFFSET + 2), GET_SCAN_RESULTS_SSID_MAC_LENGTH);
dflet 0:9cb694f00b7b 404
dflet 0:9cb694f00b7b 405 break;
dflet 0:9cb694f00b7b 406
dflet 0:9cb694f00b7b 407 case HCI_CMND_SIMPLE_LINK_START:
dflet 0:9cb694f00b7b 408
dflet 0:9cb694f00b7b 409 break;
dflet 0:9cb694f00b7b 410
dflet 0:9cb694f00b7b 411 case HCI_NETAPP_IPCONFIG:
dflet 0:9cb694f00b7b 412
dflet 0:9cb694f00b7b 413 //Read IP address
dflet 0:9cb694f00b7b 414 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:9cb694f00b7b 415 RecvParams += 4;
dflet 0:9cb694f00b7b 416
dflet 0:9cb694f00b7b 417 //Read subnet
dflet 0:9cb694f00b7b 418 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:9cb694f00b7b 419 RecvParams += 4;
dflet 0:9cb694f00b7b 420
dflet 0:9cb694f00b7b 421 //Read default GW
dflet 0:9cb694f00b7b 422 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:9cb694f00b7b 423 RecvParams += 4;
dflet 0:9cb694f00b7b 424
dflet 0:9cb694f00b7b 425 //Read DHCP server
dflet 0:9cb694f00b7b 426 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:9cb694f00b7b 427 RecvParams += 4;
dflet 0:9cb694f00b7b 428
dflet 0:9cb694f00b7b 429 //Read DNS server
dflet 0:9cb694f00b7b 430 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:9cb694f00b7b 431 RecvParams += 4;
dflet 0:9cb694f00b7b 432
dflet 0:9cb694f00b7b 433 //Read Mac address
dflet 0:9cb694f00b7b 434 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_MAC_LENGTH);
dflet 0:9cb694f00b7b 435 RecvParams += 6;
dflet 0:9cb694f00b7b 436
dflet 0:9cb694f00b7b 437 //Read SSID
dflet 0:9cb694f00b7b 438 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_SSID_LENGTH);
dflet 0:9cb694f00b7b 439
dflet 0:9cb694f00b7b 440 }
dflet 0:9cb694f00b7b 441 }
dflet 0:9cb694f00b7b 442
dflet 0:9cb694f00b7b 443 if (usReceivedEventOpcode == tSLInformation.usRxEventOpcode)
dflet 0:9cb694f00b7b 444
dflet 0:9cb694f00b7b 445 {
dflet 0:9cb694f00b7b 446 tSLInformation.usRxEventOpcode = 0;
dflet 0:9cb694f00b7b 447 }
dflet 0:9cb694f00b7b 448 }
dflet 0:9cb694f00b7b 449 else
dflet 0:9cb694f00b7b 450 {
dflet 0:9cb694f00b7b 451
dflet 0:9cb694f00b7b 452 pucReceivedParams = pucReceivedData;
dflet 0:9cb694f00b7b 453 STREAM_TO_UINT8((char *)pucReceivedData, HCI_PACKET_ARGSIZE_OFFSET, ucArgsize);
dflet 0:9cb694f00b7b 454
dflet 0:9cb694f00b7b 455 STREAM_TO_UINT16((char *)pucReceivedData, HCI_PACKET_LENGTH_OFFSET, usLength);
dflet 0:9cb694f00b7b 456
dflet 0:9cb694f00b7b 457 // Data received: note that the only case where from and from length
dflet 0:9cb694f00b7b 458 // are not null is in recv from, so fill the args accordingly
dflet 0:9cb694f00b7b 459 if (from)
dflet 0:9cb694f00b7b 460 {
dflet 0:9cb694f00b7b 461
dflet 0:9cb694f00b7b 462 STREAM_TO_UINT32((char *)(pucReceivedData + HCI_DATA_HEADER_SIZE), BSD_RECV_FROM_FROMLEN_OFFSET, *(unsigned long *)fromlen);
dflet 0:9cb694f00b7b 463
dflet 0:9cb694f00b7b 464 memcpy(from, (pucReceivedData + HCI_DATA_HEADER_SIZE + BSD_RECV_FROM_FROM_OFFSET) ,*fromlen);
dflet 0:9cb694f00b7b 465 }
dflet 0:9cb694f00b7b 466
dflet 0:9cb694f00b7b 467
dflet 0:9cb694f00b7b 468
dflet 0:9cb694f00b7b 469 memcpy(pRetParams, pucReceivedParams + HCI_DATA_HEADER_SIZE + ucArgsize, usLength - ucArgsize);
dflet 0:9cb694f00b7b 470
dflet 0:9cb694f00b7b 471 tSLInformation.usRxDataPending = 0;
dflet 0:9cb694f00b7b 472
dflet 0:9cb694f00b7b 473 }
dflet 0:9cb694f00b7b 474
dflet 0:9cb694f00b7b 475 tSLInformation.usEventOrDataReceived = 0;
dflet 0:9cb694f00b7b 476
dflet 0:9cb694f00b7b 477 SpiResumeSpi();
dflet 0:9cb694f00b7b 478
dflet 0:9cb694f00b7b 479 // Since we are going to TX - we need to handle this event after the
dflet 0:9cb694f00b7b 480 // ResumeSPi since we need interrupts
dflet 0:9cb694f00b7b 481 if ((*pucReceivedData == HCI_TYPE_EVNT) && (usReceivedEventOpcode == HCI_EVNT_PATCHES_REQ))
dflet 0:9cb694f00b7b 482 {
dflet 0:9cb694f00b7b 483 hci_unsol_handle_patch_request((char *)pucReceivedData);
dflet 0:9cb694f00b7b 484
dflet 0:9cb694f00b7b 485 }
dflet 0:9cb694f00b7b 486
dflet 0:9cb694f00b7b 487 if ((tSLInformation.usRxEventOpcode == 0) && (tSLInformation.usRxDataPending == 0))
dflet 0:9cb694f00b7b 488 {
dflet 0:9cb694f00b7b 489
dflet 0:9cb694f00b7b 490 return NULL;
dflet 0:9cb694f00b7b 491 }
dflet 0:9cb694f00b7b 492 }
dflet 0:9cb694f00b7b 493 }
dflet 0:9cb694f00b7b 494
dflet 0:9cb694f00b7b 495 }
dflet 0:9cb694f00b7b 496
dflet 0:9cb694f00b7b 497 //*****************************************************************************
dflet 0:9cb694f00b7b 498 //
dflet 0:9cb694f00b7b 499 //! hci_unsol_event_handler
dflet 0:9cb694f00b7b 500 //!
dflet 0:9cb694f00b7b 501 //! @param event_hdr event header
dflet 0:9cb694f00b7b 502 //!
dflet 0:9cb694f00b7b 503 //! @return 1 if event supported and handled
dflet 0:9cb694f00b7b 504 //! 0 if event is not supported
dflet 0:9cb694f00b7b 505 //!
dflet 0:9cb694f00b7b 506 //! @brief Handle unsolicited events
dflet 0:9cb694f00b7b 507 //
dflet 0:9cb694f00b7b 508 //*****************************************************************************
dflet 0:9cb694f00b7b 509 long
dflet 0:9cb694f00b7b 510 hci_unsol_event_handler(char *event_hdr)
dflet 0:9cb694f00b7b 511 {
dflet 0:9cb694f00b7b 512 char * data = NULL;
dflet 0:9cb694f00b7b 513 long event_type;
dflet 0:9cb694f00b7b 514 unsigned long NumberOfReleasedPackets;
dflet 0:9cb694f00b7b 515 unsigned long NumberOfSentPackets;
dflet 0:9cb694f00b7b 516
dflet 0:9cb694f00b7b 517 STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET,event_type);
dflet 0:9cb694f00b7b 518
dflet 0:9cb694f00b7b 519 if (event_type & HCI_EVNT_UNSOL_BASE)
dflet 0:9cb694f00b7b 520 {
dflet 0:9cb694f00b7b 521
dflet 0:9cb694f00b7b 522 switch(event_type)
dflet 0:9cb694f00b7b 523 {
dflet 0:9cb694f00b7b 524
dflet 0:9cb694f00b7b 525 case HCI_EVNT_DATA_UNSOL_FREE_BUFF:
dflet 0:9cb694f00b7b 526 {
dflet 0:9cb694f00b7b 527 hci_event_unsol_flowcontrol_handler(event_hdr);
dflet 0:9cb694f00b7b 528
dflet 0:9cb694f00b7b 529 NumberOfReleasedPackets = tSLInformation.NumberOfReleasedPackets;
dflet 0:9cb694f00b7b 530 NumberOfSentPackets = tSLInformation.NumberOfSentPackets;
dflet 0:9cb694f00b7b 531
dflet 0:9cb694f00b7b 532 if (NumberOfReleasedPackets == NumberOfSentPackets)
dflet 0:9cb694f00b7b 533 {
dflet 0:9cb694f00b7b 534 if (tSLInformation.InformHostOnTxComplete)
dflet 0:9cb694f00b7b 535 {
dflet 0:9cb694f00b7b 536 tSLInformation.sWlanCB(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0);
dflet 0:9cb694f00b7b 537 }
dflet 0:9cb694f00b7b 538 }
dflet 0:9cb694f00b7b 539 return 1;
dflet 0:9cb694f00b7b 540
dflet 0:9cb694f00b7b 541 }
dflet 0:9cb694f00b7b 542 }
dflet 0:9cb694f00b7b 543 }
dflet 0:9cb694f00b7b 544
dflet 0:9cb694f00b7b 545 if(event_type & HCI_EVNT_WLAN_UNSOL_BASE)
dflet 0:9cb694f00b7b 546 {
dflet 0:9cb694f00b7b 547 switch(event_type)
dflet 0:9cb694f00b7b 548 {
dflet 0:9cb694f00b7b 549 case HCI_EVNT_WLAN_KEEPALIVE:
dflet 0:9cb694f00b7b 550 case HCI_EVNT_WLAN_UNSOL_CONNECT:
dflet 0:9cb694f00b7b 551 case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
dflet 0:9cb694f00b7b 552 case HCI_EVNT_WLAN_UNSOL_INIT:
dflet 0:9cb694f00b7b 553 case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:
dflet 0:9cb694f00b7b 554
dflet 0:9cb694f00b7b 555 if( tSLInformation.sWlanCB )
dflet 0:9cb694f00b7b 556 {
dflet 0:9cb694f00b7b 557 tSLInformation.sWlanCB(event_type, 0, 0);
dflet 0:9cb694f00b7b 558 }
dflet 0:9cb694f00b7b 559 break;
dflet 0:9cb694f00b7b 560
dflet 0:9cb694f00b7b 561 case HCI_EVNT_WLAN_UNSOL_DHCP:
dflet 0:9cb694f00b7b 562 {
dflet 0:9cb694f00b7b 563 unsigned char params[NETAPP_IPCONFIG_MAC_OFFSET + 1]; // extra byte is for the status
dflet 0:9cb694f00b7b 564 unsigned char *recParams = params;
dflet 0:9cb694f00b7b 565
dflet 0:9cb694f00b7b 566 data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
dflet 0:9cb694f00b7b 567
dflet 0:9cb694f00b7b 568 //Read IP address
dflet 0:9cb694f00b7b 569 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:9cb694f00b7b 570 data += 4;
dflet 0:9cb694f00b7b 571 //Read subnet
dflet 0:9cb694f00b7b 572 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:9cb694f00b7b 573 data += 4;
dflet 0:9cb694f00b7b 574 //Read default GW
dflet 0:9cb694f00b7b 575 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:9cb694f00b7b 576 data += 4;
dflet 0:9cb694f00b7b 577 //Read DHCP server
dflet 0:9cb694f00b7b 578 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:9cb694f00b7b 579 data += 4;
dflet 0:9cb694f00b7b 580 //Read DNS server
dflet 0:9cb694f00b7b 581 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:9cb694f00b7b 582 // read the status
dflet 0:9cb694f00b7b 583 STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams);
dflet 0:9cb694f00b7b 584
dflet 0:9cb694f00b7b 585
dflet 0:9cb694f00b7b 586 if( tSLInformation.sWlanCB )
dflet 0:9cb694f00b7b 587 {
dflet 0:9cb694f00b7b 588 tSLInformation.sWlanCB(event_type, (char *)params, sizeof(params));
dflet 0:9cb694f00b7b 589 }
dflet 0:9cb694f00b7b 590 }
dflet 0:9cb694f00b7b 591 break;
dflet 0:9cb694f00b7b 592
dflet 0:9cb694f00b7b 593 case HCI_EVNT_WLAN_ASYNC_PING_REPORT:
dflet 0:9cb694f00b7b 594 {
dflet 0:9cb694f00b7b 595 netapp_pingreport_args_t params;
dflet 0:9cb694f00b7b 596 data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
dflet 0:9cb694f00b7b 597 STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET, params.packets_sent);
dflet 0:9cb694f00b7b 598 STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET, params.packets_received);
dflet 0:9cb694f00b7b 599 STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET, params.min_round_time);
dflet 0:9cb694f00b7b 600 STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time);
dflet 0:9cb694f00b7b 601 STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time);
dflet 0:9cb694f00b7b 602
dflet 0:9cb694f00b7b 603 if( tSLInformation.sWlanCB )
dflet 0:9cb694f00b7b 604 {
dflet 0:9cb694f00b7b 605 tSLInformation.sWlanCB(event_type, (char *)&params, sizeof(params));
dflet 0:9cb694f00b7b 606 }
dflet 0:9cb694f00b7b 607 }
dflet 0:9cb694f00b7b 608 break;
dflet 0:9cb694f00b7b 609 case HCI_EVNT_BSD_TCP_CLOSE_WAIT:
dflet 0:9cb694f00b7b 610 {
dflet 0:9cb694f00b7b 611 data = (char *)(event_hdr) + HCI_EVENT_HEADER_SIZE;
dflet 0:9cb694f00b7b 612 if( tSLInformation.sWlanCB )
dflet 0:9cb694f00b7b 613 {
dflet 0:9cb694f00b7b 614 tSLInformation.sWlanCB(event_type, data, 0);
dflet 0:9cb694f00b7b 615 }
dflet 0:9cb694f00b7b 616 }
dflet 0:9cb694f00b7b 617 break;
dflet 0:9cb694f00b7b 618
dflet 0:9cb694f00b7b 619 //'default' case which means "event not supported"
dflet 0:9cb694f00b7b 620 default:
dflet 0:9cb694f00b7b 621 return (0);
dflet 0:9cb694f00b7b 622 }
dflet 0:9cb694f00b7b 623 return(1);
dflet 0:9cb694f00b7b 624 }
dflet 0:9cb694f00b7b 625
dflet 0:9cb694f00b7b 626 if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO) || (event_type == HCI_EVNT_WRITE))
dflet 0:9cb694f00b7b 627 {
dflet 0:9cb694f00b7b 628 char *pArg;
dflet 0:9cb694f00b7b 629 long status;
dflet 0:9cb694f00b7b 630
dflet 0:9cb694f00b7b 631 pArg = M_BSD_RESP_PARAMS_OFFSET(event_hdr);
dflet 0:9cb694f00b7b 632 STREAM_TO_UINT32(pArg, BSD_RSP_PARAMS_STATUS_OFFSET,status);
dflet 0:9cb694f00b7b 633
dflet 0:9cb694f00b7b 634 if (ERROR_SOCKET_INACTIVE == status)
dflet 0:9cb694f00b7b 635 {
dflet 0:9cb694f00b7b 636 // The only synchronous event that can come from SL device in form of
dflet 0:9cb694f00b7b 637 // command complete is "Command Complete" on data sent, in case SL device
dflet 0:9cb694f00b7b 638 // was unable to transmit
dflet 0:9cb694f00b7b 639 STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, tSLInformation.slTransmitDataError);
dflet 0:9cb694f00b7b 640 update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr));
dflet 0:9cb694f00b7b 641
dflet 0:9cb694f00b7b 642 return (1);
dflet 0:9cb694f00b7b 643 }
dflet 0:9cb694f00b7b 644 else
dflet 0:9cb694f00b7b 645 return (0);
dflet 0:9cb694f00b7b 646 }
dflet 0:9cb694f00b7b 647
dflet 0:9cb694f00b7b 648 return(0);
dflet 0:9cb694f00b7b 649 }
dflet 0:9cb694f00b7b 650
dflet 0:9cb694f00b7b 651 //*****************************************************************************
dflet 0:9cb694f00b7b 652 //
dflet 0:9cb694f00b7b 653 //! hci_unsolicited_event_handler
dflet 0:9cb694f00b7b 654 //!
dflet 0:9cb694f00b7b 655 //! @param None
dflet 0:9cb694f00b7b 656 //!
dflet 0:9cb694f00b7b 657 //! @return ESUCCESS if successful, EFAIL if an error occurred
dflet 0:9cb694f00b7b 658 //!
dflet 0:9cb694f00b7b 659 //! @brief Parse the incoming unsolicited event packets and issues
dflet 0:9cb694f00b7b 660 //! corresponding event handler.
dflet 0:9cb694f00b7b 661 //
dflet 0:9cb694f00b7b 662 //*****************************************************************************
dflet 0:9cb694f00b7b 663 long
dflet 0:9cb694f00b7b 664 hci_unsolicited_event_handler(void)
dflet 0:9cb694f00b7b 665 {
dflet 0:9cb694f00b7b 666 unsigned long res = 0;
dflet 0:9cb694f00b7b 667 unsigned char *pucReceivedData;
dflet 0:9cb694f00b7b 668
dflet 0:9cb694f00b7b 669 if (tSLInformation.usEventOrDataReceived != 0)
dflet 0:9cb694f00b7b 670 {
dflet 0:9cb694f00b7b 671 pucReceivedData = (tSLInformation.pucReceivedData);
dflet 0:9cb694f00b7b 672
dflet 0:9cb694f00b7b 673 if (*pucReceivedData == HCI_TYPE_EVNT)
dflet 0:9cb694f00b7b 674 {
dflet 0:9cb694f00b7b 675
dflet 0:9cb694f00b7b 676 // In case unsolicited event received - here the handling finished
dflet 0:9cb694f00b7b 677 if (hci_unsol_event_handler((char *)pucReceivedData) == 1)
dflet 0:9cb694f00b7b 678 {
dflet 0:9cb694f00b7b 679
dflet 0:9cb694f00b7b 680 // There was an unsolicited event received - we can release the buffer
dflet 0:9cb694f00b7b 681 // and clean the event received
dflet 0:9cb694f00b7b 682 tSLInformation.usEventOrDataReceived = 0;
dflet 0:9cb694f00b7b 683
dflet 0:9cb694f00b7b 684 res = 1;
dflet 0:9cb694f00b7b 685 SpiResumeSpi();
dflet 0:9cb694f00b7b 686 }
dflet 0:9cb694f00b7b 687 }
dflet 0:9cb694f00b7b 688 }
dflet 0:9cb694f00b7b 689
dflet 0:9cb694f00b7b 690 return res;
dflet 0:9cb694f00b7b 691 }
dflet 0:9cb694f00b7b 692
dflet 0:9cb694f00b7b 693 //*****************************************************************************
dflet 0:9cb694f00b7b 694 //
dflet 0:9cb694f00b7b 695 //! set_socket_active_status
dflet 0:9cb694f00b7b 696 //!
dflet 0:9cb694f00b7b 697 //! @param Sd
dflet 0:9cb694f00b7b 698 //! @param Status
dflet 0:9cb694f00b7b 699 //! @return none
dflet 0:9cb694f00b7b 700 //!
dflet 0:9cb694f00b7b 701 //! @brief Check if the socket ID and status are valid and set
dflet 0:9cb694f00b7b 702 //! accordingly the global socket status
dflet 0:9cb694f00b7b 703 //
dflet 0:9cb694f00b7b 704 //*****************************************************************************
dflet 0:9cb694f00b7b 705 void set_socket_active_status(long Sd, long Status)
dflet 0:9cb694f00b7b 706 {
dflet 0:9cb694f00b7b 707 if(M_IS_VALID_SD(Sd) && M_IS_VALID_STATUS(Status))
dflet 0:9cb694f00b7b 708 {
dflet 0:9cb694f00b7b 709 socket_active_status &= ~(1 << Sd); /* clean socket's mask */
dflet 0:9cb694f00b7b 710 socket_active_status |= (Status << Sd); /* set new socket's mask */
dflet 0:9cb694f00b7b 711 }
dflet 0:9cb694f00b7b 712 }
dflet 0:9cb694f00b7b 713
dflet 0:9cb694f00b7b 714
dflet 0:9cb694f00b7b 715 //*****************************************************************************
dflet 0:9cb694f00b7b 716 //
dflet 0:9cb694f00b7b 717 //! hci_event_unsol_flowcontrol_handler
dflet 0:9cb694f00b7b 718 //!
dflet 0:9cb694f00b7b 719 //! @param pEvent pointer to the string contains parameters for IPERF
dflet 0:9cb694f00b7b 720 //! @return ESUCCESS if successful, EFAIL if an error occurred
dflet 0:9cb694f00b7b 721 //!
dflet 0:9cb694f00b7b 722 //! @brief Called in case unsolicited event from type
dflet 0:9cb694f00b7b 723 //! HCI_EVNT_DATA_UNSOL_FREE_BUFF has received.
dflet 0:9cb694f00b7b 724 //! Keep track on the number of packets transmitted and update the
dflet 0:9cb694f00b7b 725 //! number of free buffer in the SL device.
dflet 0:9cb694f00b7b 726 //
dflet 0:9cb694f00b7b 727 //*****************************************************************************
dflet 0:9cb694f00b7b 728 long
dflet 0:9cb694f00b7b 729 hci_event_unsol_flowcontrol_handler(char *pEvent)
dflet 0:9cb694f00b7b 730 {
dflet 0:9cb694f00b7b 731
dflet 0:9cb694f00b7b 732 long temp, value;
dflet 0:9cb694f00b7b 733 unsigned short i;
dflet 0:9cb694f00b7b 734 unsigned short pusNumberOfHandles=0;
dflet 0:9cb694f00b7b 735 char *pReadPayload;
dflet 0:9cb694f00b7b 736
dflet 0:9cb694f00b7b 737 STREAM_TO_UINT16((char *)pEvent,HCI_EVENT_HEADER_SIZE,pusNumberOfHandles);
dflet 0:9cb694f00b7b 738 pReadPayload = ((char *)pEvent + HCI_EVENT_HEADER_SIZE + sizeof(pusNumberOfHandles));
dflet 0:9cb694f00b7b 739 temp = 0;
dflet 0:9cb694f00b7b 740
dflet 0:9cb694f00b7b 741 for(i = 0; i < pusNumberOfHandles ; i++)
dflet 0:9cb694f00b7b 742 {
dflet 0:9cb694f00b7b 743 STREAM_TO_UINT16(pReadPayload, FLOW_CONTROL_EVENT_FREE_BUFFS_OFFSET, value);
dflet 0:9cb694f00b7b 744 temp += value;
dflet 0:9cb694f00b7b 745 pReadPayload += FLOW_CONTROL_EVENT_SIZE;
dflet 0:9cb694f00b7b 746 }
dflet 0:9cb694f00b7b 747
dflet 0:9cb694f00b7b 748 tSLInformation.usNumberOfFreeBuffers += temp;
dflet 0:9cb694f00b7b 749 tSLInformation.NumberOfReleasedPackets += temp;
dflet 0:9cb694f00b7b 750
dflet 0:9cb694f00b7b 751 return(ESUCCESS);
dflet 0:9cb694f00b7b 752 }
dflet 0:9cb694f00b7b 753
dflet 0:9cb694f00b7b 754 //*****************************************************************************
dflet 0:9cb694f00b7b 755 //
dflet 0:9cb694f00b7b 756 //! get_socket_active_status
dflet 0:9cb694f00b7b 757 //!
dflet 0:9cb694f00b7b 758 //! @param Sd Socket IS
dflet 0:9cb694f00b7b 759 //! @return Current status of the socket.
dflet 0:9cb694f00b7b 760 //!
dflet 0:9cb694f00b7b 761 //! @brief Retrieve socket status
dflet 0:9cb694f00b7b 762 //
dflet 0:9cb694f00b7b 763 //*****************************************************************************
dflet 0:9cb694f00b7b 764
dflet 0:9cb694f00b7b 765 long
dflet 0:9cb694f00b7b 766 get_socket_active_status(long Sd)
dflet 0:9cb694f00b7b 767 {
dflet 0:9cb694f00b7b 768 if(M_IS_VALID_SD(Sd))
dflet 0:9cb694f00b7b 769 {
dflet 0:9cb694f00b7b 770 return (socket_active_status & (1 << Sd)) ? SOCKET_STATUS_INACTIVE : SOCKET_STATUS_ACTIVE;
dflet 0:9cb694f00b7b 771 }
dflet 0:9cb694f00b7b 772 return SOCKET_STATUS_INACTIVE;
dflet 0:9cb694f00b7b 773 }
dflet 0:9cb694f00b7b 774
dflet 0:9cb694f00b7b 775 //*****************************************************************************
dflet 0:9cb694f00b7b 776 //
dflet 0:9cb694f00b7b 777 //! update_socket_active_status
dflet 0:9cb694f00b7b 778 //!
dflet 0:9cb694f00b7b 779 //! @param resp_params Socket IS
dflet 0:9cb694f00b7b 780 //! @return Current status of the socket.
dflet 0:9cb694f00b7b 781 //!
dflet 0:9cb694f00b7b 782 //! @brief Retrieve socket status
dflet 0:9cb694f00b7b 783 //
dflet 0:9cb694f00b7b 784 //*****************************************************************************
dflet 0:9cb694f00b7b 785 void
dflet 0:9cb694f00b7b 786 update_socket_active_status(char *resp_params)
dflet 0:9cb694f00b7b 787 {
dflet 0:9cb694f00b7b 788 long status, sd;
dflet 0:9cb694f00b7b 789
dflet 0:9cb694f00b7b 790 STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_SOCKET_OFFSET,sd);
dflet 0:9cb694f00b7b 791 STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_STATUS_OFFSET,status);
dflet 0:9cb694f00b7b 792
dflet 0:9cb694f00b7b 793 if(ERROR_SOCKET_INACTIVE == status)
dflet 0:9cb694f00b7b 794 {
dflet 0:9cb694f00b7b 795 set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
dflet 0:9cb694f00b7b 796 }
dflet 0:9cb694f00b7b 797 }
dflet 0:9cb694f00b7b 798
dflet 0:9cb694f00b7b 799
dflet 0:9cb694f00b7b 800 //*****************************************************************************
dflet 0:9cb694f00b7b 801 //
dflet 0:9cb694f00b7b 802 //! SimpleLinkWaitEvent
dflet 0:9cb694f00b7b 803 //!
dflet 0:9cb694f00b7b 804 //! @param usOpcode command operation code
dflet 0:9cb694f00b7b 805 //! @param pRetParams command return parameters
dflet 0:9cb694f00b7b 806 //!
dflet 0:9cb694f00b7b 807 //! @return none
dflet 0:9cb694f00b7b 808 //!
dflet 0:9cb694f00b7b 809 //! @brief Wait for event, pass it to the hci_event_handler and
dflet 0:9cb694f00b7b 810 //! update the event opcode in a global variable.
dflet 0:9cb694f00b7b 811 //
dflet 0:9cb694f00b7b 812 //*****************************************************************************
dflet 0:9cb694f00b7b 813
dflet 0:9cb694f00b7b 814 void
dflet 0:9cb694f00b7b 815 SimpleLinkWaitEvent(unsigned short usOpcode, long* pRetParams)
dflet 0:9cb694f00b7b 816 {
dflet 0:9cb694f00b7b 817 // In the blocking implementation the control to caller will be returned only
dflet 0:9cb694f00b7b 818 // after the end of current transaction
dflet 0:9cb694f00b7b 819 tSLInformation.usRxEventOpcode = usOpcode;
dflet 0:9cb694f00b7b 820
dflet 0:9cb694f00b7b 821 hci_event_handler((char*)pRetParams, 0, 0);
dflet 0:9cb694f00b7b 822
dflet 0:9cb694f00b7b 823 }
dflet 0:9cb694f00b7b 824
dflet 0:9cb694f00b7b 825 //*****************************************************************************
dflet 0:9cb694f00b7b 826 //
dflet 0:9cb694f00b7b 827 //! SimpleLinkWaitData
dflet 0:9cb694f00b7b 828 //!
dflet 0:9cb694f00b7b 829 //! @param pBuf data buffer
dflet 0:9cb694f00b7b 830 //! @param from from information
dflet 0:9cb694f00b7b 831 //! @param fromlen from information length
dflet 0:9cb694f00b7b 832 //!
dflet 0:9cb694f00b7b 833 //! @return none
dflet 0:9cb694f00b7b 834 //!
dflet 0:9cb694f00b7b 835 //! @brief Wait for data, pass it to the hci_event_handler
dflet 0:9cb694f00b7b 836 //! and update in a global variable that there is
dflet 0:9cb694f00b7b 837 //! data to read.
dflet 0:9cb694f00b7b 838 //
dflet 0:9cb694f00b7b 839 //*****************************************************************************
dflet 0:9cb694f00b7b 840
dflet 0:9cb694f00b7b 841 void
dflet 0:9cb694f00b7b 842 SimpleLinkWaitData(unsigned char *pBuf, unsigned char *from,
dflet 0:9cb694f00b7b 843 unsigned char *fromlen)
dflet 0:9cb694f00b7b 844 {
dflet 0:9cb694f00b7b 845 // In the blocking implementation the control to caller will be returned only
dflet 0:9cb694f00b7b 846 // after the end of current transaction, i.e. only after data will be received
dflet 0:9cb694f00b7b 847 tSLInformation.usRxDataPending = 1;
dflet 0:9cb694f00b7b 848 hci_event_handler((char*)pBuf, from, fromlen);
dflet 0:9cb694f00b7b 849 }
dflet 0:9cb694f00b7b 850
dflet 0:9cb694f00b7b 851 //*****************************************************************************
dflet 0:9cb694f00b7b 852 //
dflet 0:9cb694f00b7b 853 // Close the Doxygen group.
dflet 0:9cb694f00b7b 854 //! @}
dflet 0:9cb694f00b7b 855 //
dflet 0:9cb694f00b7b 856 //*****************************************************************************
dflet 0:9cb694f00b7b 857