DeepCover Embedded Security in IoT: Public-key Secured Data Paths

Dependencies:   MaximInterface

The MAXREFDES155# is an internet-of-things (IoT) embedded-security reference design, built to authenticate and control a sensing node using elliptic-curve-based public-key cryptography with control and notification from a web server.

The hardware includes an ARM® mbed™ shield and attached sensor endpoint. The shield contains a DS2476 DeepCover® ECDSA/SHA-2 coprocessor, Wifi communication, LCD push-button controls, and status LEDs. The sensor endpoint is attached to the shield using a 300mm cable and contains a DS28C36 DeepCover ECDSA/SHA-2 authenticator, IR-thermal sensor, and aiming laser for the IR sensor. The MAXREFDES155# is equipped with a standard Arduino® form-factor shield connector for immediate testing using an mbed board such as the MAX32600MBED#. The combination of these two devices represent an IoT device. Communication to the web server is accomplished with the shield Wifi circuitry. Communication from the shield to the attached sensor module is accomplished over I2C . The sensor module represents an IoT endpoint that generates small data with a requirement for message authenticity/integrity and secure on/off operational control.

The design is hierarchical with each mbed platform and shield communicating data from the sensor node to a web server that maintains a centralized log and dispatches notifications as necessary. The simplicity of this design enables rapid integration into any star-topology IoT network to provide security with the low overhead and cost provided by the ECDSA-P256 asymmetric-key and SHA-256 symmetric-key algorithms.

More information about the MAXREFDES155# is available on the Maxim Integrated website.

Committer:
IanBenzMaxim
Date:
Fri Feb 24 11:23:12 2017 -0600
Revision:
0:33d4e66780c0
Child:
3:d2799d8497c0
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 0:33d4e66780c0 1 /*******************************************************************************
IanBenzMaxim 0:33d4e66780c0 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 0:33d4e66780c0 3 *
IanBenzMaxim 0:33d4e66780c0 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 0:33d4e66780c0 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 0:33d4e66780c0 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 0:33d4e66780c0 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 0:33d4e66780c0 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 0:33d4e66780c0 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 0:33d4e66780c0 10 *
IanBenzMaxim 0:33d4e66780c0 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 0:33d4e66780c0 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 0:33d4e66780c0 13 *
IanBenzMaxim 0:33d4e66780c0 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 0:33d4e66780c0 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 0:33d4e66780c0 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 0:33d4e66780c0 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 0:33d4e66780c0 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 0:33d4e66780c0 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 0:33d4e66780c0 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 0:33d4e66780c0 21 *
IanBenzMaxim 0:33d4e66780c0 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 0:33d4e66780c0 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 0:33d4e66780c0 24 * Products, Inc. Branding Policy.
IanBenzMaxim 0:33d4e66780c0 25 *
IanBenzMaxim 0:33d4e66780c0 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 0:33d4e66780c0 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 0:33d4e66780c0 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 0:33d4e66780c0 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 0:33d4e66780c0 30 * ownership rights.
IanBenzMaxim 0:33d4e66780c0 31 *******************************************************************************/
IanBenzMaxim 0:33d4e66780c0 32
IanBenzMaxim 0:33d4e66780c0 33 #include <stdio.h>
IanBenzMaxim 0:33d4e66780c0 34 #include <string.h>
IanBenzMaxim 0:33d4e66780c0 35 #include <simplelink.h>
IanBenzMaxim 0:33d4e66780c0 36 #include <wait_api.h>
IanBenzMaxim 0:33d4e66780c0 37 #include "CC3100.hpp"
IanBenzMaxim 0:33d4e66780c0 38 #include "CC3100_transport.h"
IanBenzMaxim 0:33d4e66780c0 39 #include "CC3100_pins.h"
IanBenzMaxim 0:33d4e66780c0 40
IanBenzMaxim 0:33d4e66780c0 41 static CC3100::State currentState = CC3100::Stopped;
IanBenzMaxim 0:33d4e66780c0 42
IanBenzMaxim 0:33d4e66780c0 43 /*!
IanBenzMaxim 0:33d4e66780c0 44 \brief This function handles general error events indication
IanBenzMaxim 0:33d4e66780c0 45
IanBenzMaxim 0:33d4e66780c0 46 \param[in] pDevEvent is the event passed to the handler
IanBenzMaxim 0:33d4e66780c0 47
IanBenzMaxim 0:33d4e66780c0 48 \return None
IanBenzMaxim 0:33d4e66780c0 49 */
IanBenzMaxim 0:33d4e66780c0 50 void SimpleLinkGeneralEventHandler(SlDeviceEvent_t *pDevEvent)
IanBenzMaxim 0:33d4e66780c0 51 {
IanBenzMaxim 0:33d4e66780c0 52 /*
IanBenzMaxim 0:33d4e66780c0 53 * Most of the general errors are not FATAL are are to be handled
IanBenzMaxim 0:33d4e66780c0 54 * appropriately by the application
IanBenzMaxim 0:33d4e66780c0 55 */
IanBenzMaxim 0:33d4e66780c0 56 printf(" [GENERAL EVENT] \n\r");
IanBenzMaxim 0:33d4e66780c0 57 }
IanBenzMaxim 0:33d4e66780c0 58
IanBenzMaxim 0:33d4e66780c0 59 /*!
IanBenzMaxim 0:33d4e66780c0 60 \brief This function handles WLAN events
IanBenzMaxim 0:33d4e66780c0 61
IanBenzMaxim 0:33d4e66780c0 62 \param[in] pWlanEvent is the event passed to the handler
IanBenzMaxim 0:33d4e66780c0 63
IanBenzMaxim 0:33d4e66780c0 64 \return None
IanBenzMaxim 0:33d4e66780c0 65
IanBenzMaxim 0:33d4e66780c0 66 \note
IanBenzMaxim 0:33d4e66780c0 67
IanBenzMaxim 0:33d4e66780c0 68 \warning
IanBenzMaxim 0:33d4e66780c0 69 */
IanBenzMaxim 0:33d4e66780c0 70 void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent)
IanBenzMaxim 0:33d4e66780c0 71 {
IanBenzMaxim 0:33d4e66780c0 72 if(pWlanEvent == NULL)
IanBenzMaxim 0:33d4e66780c0 73 {
IanBenzMaxim 0:33d4e66780c0 74 printf(" [WLAN EVENT] NULL Pointer Error \n\r");
IanBenzMaxim 0:33d4e66780c0 75 return;
IanBenzMaxim 0:33d4e66780c0 76 }
IanBenzMaxim 0:33d4e66780c0 77
IanBenzMaxim 0:33d4e66780c0 78 switch(pWlanEvent->Event)
IanBenzMaxim 0:33d4e66780c0 79 {
IanBenzMaxim 0:33d4e66780c0 80 case SL_WLAN_CONNECT_EVENT:
IanBenzMaxim 0:33d4e66780c0 81 {
IanBenzMaxim 0:33d4e66780c0 82 currentState = CC3100::Connected;
IanBenzMaxim 0:33d4e66780c0 83
IanBenzMaxim 0:33d4e66780c0 84 /*
IanBenzMaxim 0:33d4e66780c0 85 * Information about the connected AP (like name, MAC etc) will be
IanBenzMaxim 0:33d4e66780c0 86 * available in 'slWlanConnectAsyncResponse_t' - Applications
IanBenzMaxim 0:33d4e66780c0 87 * can use it if required
IanBenzMaxim 0:33d4e66780c0 88 *
IanBenzMaxim 0:33d4e66780c0 89 * slWlanConnectAsyncResponse_t *pEventData = NULL;
IanBenzMaxim 0:33d4e66780c0 90 * pEventData = &pWlanEvent->EventData.STAandP2PModeWlanConnected;
IanBenzMaxim 0:33d4e66780c0 91 *
IanBenzMaxim 0:33d4e66780c0 92 */
IanBenzMaxim 0:33d4e66780c0 93 }
IanBenzMaxim 0:33d4e66780c0 94 break;
IanBenzMaxim 0:33d4e66780c0 95
IanBenzMaxim 0:33d4e66780c0 96 case SL_WLAN_DISCONNECT_EVENT:
IanBenzMaxim 0:33d4e66780c0 97 {
IanBenzMaxim 0:33d4e66780c0 98 currentState = CC3100::Disconnected;
IanBenzMaxim 0:33d4e66780c0 99
IanBenzMaxim 0:33d4e66780c0 100 slWlanConnectAsyncResponse_t* pEventData = NULL;
IanBenzMaxim 0:33d4e66780c0 101 pEventData = &pWlanEvent->EventData.STAandP2PModeDisconnected;
IanBenzMaxim 0:33d4e66780c0 102
IanBenzMaxim 0:33d4e66780c0 103 /* If the user has initiated 'Disconnect' request, 'reason_code' is SL_USER_INITIATED_DISCONNECTION */
IanBenzMaxim 0:33d4e66780c0 104 if(SL_WLAN_DISCONNECT_USER_INITIATED_DISCONNECTION == pEventData->reason_code)
IanBenzMaxim 0:33d4e66780c0 105 {
IanBenzMaxim 0:33d4e66780c0 106 printf(" Device disconnected from the AP on application's request \n\r");
IanBenzMaxim 0:33d4e66780c0 107 }
IanBenzMaxim 0:33d4e66780c0 108 else
IanBenzMaxim 0:33d4e66780c0 109 {
IanBenzMaxim 0:33d4e66780c0 110 printf(" Device disconnected from the AP on an ERROR..!! \n\r");
IanBenzMaxim 0:33d4e66780c0 111 }
IanBenzMaxim 0:33d4e66780c0 112 }
IanBenzMaxim 0:33d4e66780c0 113 break;
IanBenzMaxim 0:33d4e66780c0 114
IanBenzMaxim 0:33d4e66780c0 115 default:
IanBenzMaxim 0:33d4e66780c0 116 {
IanBenzMaxim 0:33d4e66780c0 117 printf(" [WLAN EVENT] Unexpected event \n\r");
IanBenzMaxim 0:33d4e66780c0 118 }
IanBenzMaxim 0:33d4e66780c0 119 break;
IanBenzMaxim 0:33d4e66780c0 120 }
IanBenzMaxim 0:33d4e66780c0 121 }
IanBenzMaxim 0:33d4e66780c0 122
IanBenzMaxim 0:33d4e66780c0 123 /*!
IanBenzMaxim 0:33d4e66780c0 124 \brief This function handles events for IP address acquisition via DHCP
IanBenzMaxim 0:33d4e66780c0 125 indication
IanBenzMaxim 0:33d4e66780c0 126
IanBenzMaxim 0:33d4e66780c0 127 \param[in] pNetAppEvent is the event passed to the handler
IanBenzMaxim 0:33d4e66780c0 128
IanBenzMaxim 0:33d4e66780c0 129 \return None
IanBenzMaxim 0:33d4e66780c0 130
IanBenzMaxim 0:33d4e66780c0 131 \note
IanBenzMaxim 0:33d4e66780c0 132
IanBenzMaxim 0:33d4e66780c0 133 \warning
IanBenzMaxim 0:33d4e66780c0 134 */
IanBenzMaxim 0:33d4e66780c0 135 void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent)
IanBenzMaxim 0:33d4e66780c0 136 {
IanBenzMaxim 0:33d4e66780c0 137 if(pNetAppEvent == NULL)
IanBenzMaxim 0:33d4e66780c0 138 {
IanBenzMaxim 0:33d4e66780c0 139 printf(" [NETAPP EVENT] NULL Pointer Error \n\r");
IanBenzMaxim 0:33d4e66780c0 140 return;
IanBenzMaxim 0:33d4e66780c0 141 }
IanBenzMaxim 0:33d4e66780c0 142
IanBenzMaxim 0:33d4e66780c0 143 switch(pNetAppEvent->Event)
IanBenzMaxim 0:33d4e66780c0 144 {
IanBenzMaxim 0:33d4e66780c0 145 case SL_NETAPP_IPV4_IPACQUIRED_EVENT:
IanBenzMaxim 0:33d4e66780c0 146 {
IanBenzMaxim 0:33d4e66780c0 147 currentState = CC3100::Connected;
IanBenzMaxim 0:33d4e66780c0 148
IanBenzMaxim 0:33d4e66780c0 149 SlIpV4AcquiredAsync_t *pEventData = NULL;
IanBenzMaxim 0:33d4e66780c0 150 pEventData = &pNetAppEvent->EventData.ipAcquiredV4;
IanBenzMaxim 0:33d4e66780c0 151 }
IanBenzMaxim 0:33d4e66780c0 152 break;
IanBenzMaxim 0:33d4e66780c0 153
IanBenzMaxim 0:33d4e66780c0 154 default:
IanBenzMaxim 0:33d4e66780c0 155 {
IanBenzMaxim 0:33d4e66780c0 156 printf(" [NETAPP EVENT] Unexpected event \n\r");
IanBenzMaxim 0:33d4e66780c0 157 }
IanBenzMaxim 0:33d4e66780c0 158 break;
IanBenzMaxim 0:33d4e66780c0 159 }
IanBenzMaxim 0:33d4e66780c0 160 }
IanBenzMaxim 0:33d4e66780c0 161
IanBenzMaxim 0:33d4e66780c0 162 /*!
IanBenzMaxim 0:33d4e66780c0 163 \brief This function handles socket events indication
IanBenzMaxim 0:33d4e66780c0 164
IanBenzMaxim 0:33d4e66780c0 165 \param[in] pSock is the event passed to the handler
IanBenzMaxim 0:33d4e66780c0 166
IanBenzMaxim 0:33d4e66780c0 167 \return None
IanBenzMaxim 0:33d4e66780c0 168 */
IanBenzMaxim 0:33d4e66780c0 169 void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)
IanBenzMaxim 0:33d4e66780c0 170 {
IanBenzMaxim 0:33d4e66780c0 171 if(pSock == NULL)
IanBenzMaxim 0:33d4e66780c0 172 {
IanBenzMaxim 0:33d4e66780c0 173 printf(" [SOCK EVENT] NULL Pointer Error \n\r");
IanBenzMaxim 0:33d4e66780c0 174 return;
IanBenzMaxim 0:33d4e66780c0 175 }
IanBenzMaxim 0:33d4e66780c0 176
IanBenzMaxim 0:33d4e66780c0 177 switch( pSock->Event )
IanBenzMaxim 0:33d4e66780c0 178 {
IanBenzMaxim 0:33d4e66780c0 179 case SL_SOCKET_TX_FAILED_EVENT:
IanBenzMaxim 0:33d4e66780c0 180 {
IanBenzMaxim 0:33d4e66780c0 181 /*
IanBenzMaxim 0:33d4e66780c0 182 * TX Failed
IanBenzMaxim 0:33d4e66780c0 183 *
IanBenzMaxim 0:33d4e66780c0 184 * Information about the socket descriptor and status will be
IanBenzMaxim 0:33d4e66780c0 185 * available in 'SlSockEventData_t' - Applications can use it if
IanBenzMaxim 0:33d4e66780c0 186 * required
IanBenzMaxim 0:33d4e66780c0 187 *
IanBenzMaxim 0:33d4e66780c0 188 * SlSockEventData_u *pEventData = NULL;
IanBenzMaxim 0:33d4e66780c0 189 * pEventData = & pSock->socketAsyncEvent;
IanBenzMaxim 0:33d4e66780c0 190 */
IanBenzMaxim 0:33d4e66780c0 191 switch( pSock->socketAsyncEvent.SockTxFailData.status )
IanBenzMaxim 0:33d4e66780c0 192 {
IanBenzMaxim 0:33d4e66780c0 193 case SL_ECLOSE:
IanBenzMaxim 0:33d4e66780c0 194 printf(" [SOCK EVENT] Close socket operation failed to transmit all queued packets\n\r");
IanBenzMaxim 0:33d4e66780c0 195 break;
IanBenzMaxim 0:33d4e66780c0 196
IanBenzMaxim 0:33d4e66780c0 197
IanBenzMaxim 0:33d4e66780c0 198 default:
IanBenzMaxim 0:33d4e66780c0 199 printf(" [SOCK EVENT] Unexpected event \n\r");
IanBenzMaxim 0:33d4e66780c0 200 break;
IanBenzMaxim 0:33d4e66780c0 201 }
IanBenzMaxim 0:33d4e66780c0 202 }
IanBenzMaxim 0:33d4e66780c0 203 break;
IanBenzMaxim 0:33d4e66780c0 204
IanBenzMaxim 0:33d4e66780c0 205 default:
IanBenzMaxim 0:33d4e66780c0 206 printf(" [SOCK EVENT] Unexpected event \n\r");
IanBenzMaxim 0:33d4e66780c0 207 break;
IanBenzMaxim 0:33d4e66780c0 208 }
IanBenzMaxim 0:33d4e66780c0 209 }
IanBenzMaxim 0:33d4e66780c0 210
IanBenzMaxim 0:33d4e66780c0 211 /*!
IanBenzMaxim 0:33d4e66780c0 212 \brief This function handles ping report events
IanBenzMaxim 0:33d4e66780c0 213
IanBenzMaxim 0:33d4e66780c0 214 \param[in] pPingReport holds the ping report statistics
IanBenzMaxim 0:33d4e66780c0 215
IanBenzMaxim 0:33d4e66780c0 216 \return None
IanBenzMaxim 0:33d4e66780c0 217
IanBenzMaxim 0:33d4e66780c0 218 \note
IanBenzMaxim 0:33d4e66780c0 219
IanBenzMaxim 0:33d4e66780c0 220 \warning
IanBenzMaxim 0:33d4e66780c0 221 */
IanBenzMaxim 0:33d4e66780c0 222 static void SimpleLinkPingReport(SlPingReport_t *pPingReport)
IanBenzMaxim 0:33d4e66780c0 223 {
IanBenzMaxim 0:33d4e66780c0 224 currentState = CC3100::Connected;
IanBenzMaxim 0:33d4e66780c0 225
IanBenzMaxim 0:33d4e66780c0 226 if(pPingReport == NULL)
IanBenzMaxim 0:33d4e66780c0 227 {
IanBenzMaxim 0:33d4e66780c0 228 printf(" [PING REPORT] NULL Pointer Error\r\n");
IanBenzMaxim 0:33d4e66780c0 229 return;
IanBenzMaxim 0:33d4e66780c0 230 }
IanBenzMaxim 0:33d4e66780c0 231
IanBenzMaxim 0:33d4e66780c0 232 printf(" [PING REPORT] Sent: %u, Received: %u\r\n", pPingReport->PacketsSent, pPingReport->PacketsReceived);
IanBenzMaxim 0:33d4e66780c0 233 }
IanBenzMaxim 0:33d4e66780c0 234
IanBenzMaxim 0:33d4e66780c0 235 CC3100::SPI::SPI(PinName mosi, PinName miso, PinName sclk, PinName ssel) :
IanBenzMaxim 0:33d4e66780c0 236 spi(mosi, miso, sclk), cs(ssel, 1) { }
IanBenzMaxim 0:33d4e66780c0 237
IanBenzMaxim 0:33d4e66780c0 238 void CC3100::SPI::transfer(const uint8_t * txData, size_t dataSize, uint8_t * rxData)
IanBenzMaxim 0:33d4e66780c0 239 {
IanBenzMaxim 0:33d4e66780c0 240 const int cs_delay_ms = 5;
IanBenzMaxim 0:33d4e66780c0 241
IanBenzMaxim 0:33d4e66780c0 242 cs = 0;
IanBenzMaxim 0:33d4e66780c0 243 wait_ms(cs_delay_ms);
IanBenzMaxim 0:33d4e66780c0 244 for (size_t i = 0; i < dataSize; i++)
IanBenzMaxim 0:33d4e66780c0 245 {
IanBenzMaxim 0:33d4e66780c0 246 if (rxData == NULL)
IanBenzMaxim 0:33d4e66780c0 247 spi.write(txData[i]);
IanBenzMaxim 0:33d4e66780c0 248 else
IanBenzMaxim 0:33d4e66780c0 249 rxData[i] = spi.write(txData[i]);
IanBenzMaxim 0:33d4e66780c0 250 }
IanBenzMaxim 0:33d4e66780c0 251 wait_ms(cs_delay_ms);
IanBenzMaxim 0:33d4e66780c0 252 cs = 1;
IanBenzMaxim 0:33d4e66780c0 253 }
IanBenzMaxim 0:33d4e66780c0 254
IanBenzMaxim 0:33d4e66780c0 255 CC3100::CC3100() : spi(HOST_SPI_MOSI_PIN, HOST_SPI_MISO_PIN, HOST_SPI_CLK_PIN, HOST_SPI_nCS_PIN) { }
IanBenzMaxim 0:33d4e66780c0 256
IanBenzMaxim 0:33d4e66780c0 257 CC3100 & CC3100::instance()
IanBenzMaxim 0:33d4e66780c0 258 {
IanBenzMaxim 0:33d4e66780c0 259 static CC3100 instance;
IanBenzMaxim 0:33d4e66780c0 260 return instance;
IanBenzMaxim 0:33d4e66780c0 261 }
IanBenzMaxim 0:33d4e66780c0 262
IanBenzMaxim 0:33d4e66780c0 263 int CC3100::start()
IanBenzMaxim 0:33d4e66780c0 264 {
IanBenzMaxim 0:33d4e66780c0 265 // Adapter should be stopped.
IanBenzMaxim 0:33d4e66780c0 266 if (currentState != Stopped)
IanBenzMaxim 0:33d4e66780c0 267 return invalidState;
IanBenzMaxim 0:33d4e66780c0 268
IanBenzMaxim 0:33d4e66780c0 269 int result = sl_Start(&spi, NULL, NULL);
IanBenzMaxim 0:33d4e66780c0 270 if (result >= 0)
IanBenzMaxim 0:33d4e66780c0 271 currentState = Disconnected;
IanBenzMaxim 0:33d4e66780c0 272 return result;
IanBenzMaxim 0:33d4e66780c0 273 }
IanBenzMaxim 0:33d4e66780c0 274
IanBenzMaxim 0:33d4e66780c0 275 CC3100::State CC3100::state() const
IanBenzMaxim 0:33d4e66780c0 276 {
IanBenzMaxim 0:33d4e66780c0 277 return currentState;
IanBenzMaxim 0:33d4e66780c0 278 }
IanBenzMaxim 0:33d4e66780c0 279
IanBenzMaxim 0:33d4e66780c0 280 int CC3100::stop()
IanBenzMaxim 0:33d4e66780c0 281 {
IanBenzMaxim 0:33d4e66780c0 282 // Adapter should not be stopped.
IanBenzMaxim 0:33d4e66780c0 283 if (currentState == Stopped)
IanBenzMaxim 0:33d4e66780c0 284 return invalidState;
IanBenzMaxim 0:33d4e66780c0 285
IanBenzMaxim 0:33d4e66780c0 286 int result = sl_Stop(0xFF);
IanBenzMaxim 0:33d4e66780c0 287 if (result >= 0)
IanBenzMaxim 0:33d4e66780c0 288 currentState = Stopped;
IanBenzMaxim 0:33d4e66780c0 289 return result;
IanBenzMaxim 0:33d4e66780c0 290 }
IanBenzMaxim 0:33d4e66780c0 291
IanBenzMaxim 0:33d4e66780c0 292 void CC3100::update()
IanBenzMaxim 0:33d4e66780c0 293 {
IanBenzMaxim 0:33d4e66780c0 294 sl_Task();
IanBenzMaxim 0:33d4e66780c0 295 }
IanBenzMaxim 0:33d4e66780c0 296
IanBenzMaxim 0:33d4e66780c0 297 int CC3100::setDateTime(const tm & dateTime)
IanBenzMaxim 0:33d4e66780c0 298 {
IanBenzMaxim 0:33d4e66780c0 299 SlDateTime_t slDateTime = {
IanBenzMaxim 0:33d4e66780c0 300 dateTime.tm_sec, // sl_tm_sec
IanBenzMaxim 0:33d4e66780c0 301 dateTime.tm_min, // sl_tm_min
IanBenzMaxim 0:33d4e66780c0 302 dateTime.tm_hour, // sl_tm_hour
IanBenzMaxim 0:33d4e66780c0 303 dateTime.tm_mday, // sl_tm_day
IanBenzMaxim 0:33d4e66780c0 304 dateTime.tm_mon, // sl_tm_mon
IanBenzMaxim 0:33d4e66780c0 305 dateTime.tm_year // sl_tm_year
IanBenzMaxim 0:33d4e66780c0 306 };
IanBenzMaxim 0:33d4e66780c0 307 return sl_DevSet(SL_DEVICE_GENERAL_CONFIGURATION,
IanBenzMaxim 0:33d4e66780c0 308 SL_DEVICE_GENERAL_CONFIGURATION_DATE_TIME,
IanBenzMaxim 0:33d4e66780c0 309 sizeof(SlDateTime_t),
IanBenzMaxim 0:33d4e66780c0 310 (const _u8 *)&slDateTime);
IanBenzMaxim 0:33d4e66780c0 311 }
IanBenzMaxim 0:33d4e66780c0 312
IanBenzMaxim 0:33d4e66780c0 313 int CC3100::set_credentials(const char * ssid, const char * pass, nsapi_security_t security)
IanBenzMaxim 0:33d4e66780c0 314 {
IanBenzMaxim 0:33d4e66780c0 315 this->ssid.assign(ssid);
IanBenzMaxim 0:33d4e66780c0 316 this->pass.assign(pass);
IanBenzMaxim 0:33d4e66780c0 317 this->security = security;
IanBenzMaxim 0:33d4e66780c0 318 return 0;
IanBenzMaxim 0:33d4e66780c0 319 }
IanBenzMaxim 0:33d4e66780c0 320
IanBenzMaxim 0:33d4e66780c0 321 int CC3100::connect(const char * ssid, const char * pass, nsapi_security_t security, uint8_t channel)
IanBenzMaxim 0:33d4e66780c0 322 {
IanBenzMaxim 0:33d4e66780c0 323 // Adapter should be disconnected.
IanBenzMaxim 0:33d4e66780c0 324 if (currentState != Disconnected)
IanBenzMaxim 0:33d4e66780c0 325 return invalidState;
IanBenzMaxim 0:33d4e66780c0 326
IanBenzMaxim 0:33d4e66780c0 327 SlSecParams_t secParams = {
IanBenzMaxim 0:33d4e66780c0 328 SL_SEC_TYPE_OPEN, // Type
IanBenzMaxim 0:33d4e66780c0 329 (_i8 *)pass, // Key
IanBenzMaxim 0:33d4e66780c0 330 strlen(pass), // KeyLen
IanBenzMaxim 0:33d4e66780c0 331 };
IanBenzMaxim 0:33d4e66780c0 332 switch (security)
IanBenzMaxim 0:33d4e66780c0 333 {
IanBenzMaxim 0:33d4e66780c0 334 case NSAPI_SECURITY_WPA2:
IanBenzMaxim 0:33d4e66780c0 335 case NSAPI_SECURITY_WPA:
IanBenzMaxim 0:33d4e66780c0 336 secParams.Type = SL_SEC_TYPE_WPA_WPA2;
IanBenzMaxim 0:33d4e66780c0 337 break;
IanBenzMaxim 0:33d4e66780c0 338
IanBenzMaxim 0:33d4e66780c0 339 case NSAPI_SECURITY_WEP:
IanBenzMaxim 0:33d4e66780c0 340 secParams.Type = SL_SEC_TYPE_WEP;
IanBenzMaxim 0:33d4e66780c0 341 break;
IanBenzMaxim 0:33d4e66780c0 342 }
IanBenzMaxim 0:33d4e66780c0 343 int result = sl_WlanConnect((const _i8 *)ssid, strlen(ssid), NULL, &secParams, NULL);
IanBenzMaxim 0:33d4e66780c0 344 if (result == SL_RET_CODE_OK)
IanBenzMaxim 0:33d4e66780c0 345 {
IanBenzMaxim 0:33d4e66780c0 346 // Wait for completion.
IanBenzMaxim 0:33d4e66780c0 347 int attempts = 1000;
IanBenzMaxim 0:33d4e66780c0 348 do
IanBenzMaxim 0:33d4e66780c0 349 {
IanBenzMaxim 0:33d4e66780c0 350 wait_ms(10);
IanBenzMaxim 0:33d4e66780c0 351 update();
IanBenzMaxim 0:33d4e66780c0 352 } while ((currentState != Connected) && (--attempts > 0));
IanBenzMaxim 0:33d4e66780c0 353 if (attempts == 0)
IanBenzMaxim 0:33d4e66780c0 354 result = SL_RET_CODE_ABORT;
IanBenzMaxim 0:33d4e66780c0 355 }
IanBenzMaxim 0:33d4e66780c0 356 return result;
IanBenzMaxim 0:33d4e66780c0 357 }
IanBenzMaxim 0:33d4e66780c0 358
IanBenzMaxim 0:33d4e66780c0 359 int CC3100::connect(const char * ssid, const char * username, const char * password)
IanBenzMaxim 0:33d4e66780c0 360 {
IanBenzMaxim 0:33d4e66780c0 361 // Adapter should be disconnected.
IanBenzMaxim 0:33d4e66780c0 362 if (currentState != Disconnected)
IanBenzMaxim 0:33d4e66780c0 363 return invalidState;
IanBenzMaxim 0:33d4e66780c0 364
IanBenzMaxim 0:33d4e66780c0 365 uint8_t values = 0;
IanBenzMaxim 0:33d4e66780c0 366 sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, 19, 1, &values);
IanBenzMaxim 0:33d4e66780c0 367
IanBenzMaxim 0:33d4e66780c0 368 SlSecParams_t secParams = {
IanBenzMaxim 0:33d4e66780c0 369 SL_SEC_TYPE_WPA_ENT, // Type
IanBenzMaxim 0:33d4e66780c0 370 (_i8 *)password, // Key
IanBenzMaxim 0:33d4e66780c0 371 strlen(password) // KeyLen
IanBenzMaxim 0:33d4e66780c0 372 };
IanBenzMaxim 0:33d4e66780c0 373 SlSecParamsExt_t secParamsExt = {
IanBenzMaxim 0:33d4e66780c0 374 (_i8 *)username, // User
IanBenzMaxim 0:33d4e66780c0 375 strlen(username), // UserLen
IanBenzMaxim 0:33d4e66780c0 376 NULL, // AnonUser
IanBenzMaxim 0:33d4e66780c0 377 0, // AnonUserLen
IanBenzMaxim 0:33d4e66780c0 378 0, // CertIndex
IanBenzMaxim 0:33d4e66780c0 379 SL_ENT_EAP_METHOD_PEAP0_MSCHAPv2 // EapMethod
IanBenzMaxim 0:33d4e66780c0 380 };
IanBenzMaxim 0:33d4e66780c0 381 int result = sl_WlanConnect((const _i8 *)ssid, strlen(ssid), NULL, &secParams, &secParamsExt);
IanBenzMaxim 0:33d4e66780c0 382 if (result == SL_RET_CODE_OK)
IanBenzMaxim 0:33d4e66780c0 383 {
IanBenzMaxim 0:33d4e66780c0 384 // Wait for completion.
IanBenzMaxim 0:33d4e66780c0 385 int attempts = 1000;
IanBenzMaxim 0:33d4e66780c0 386 do
IanBenzMaxim 0:33d4e66780c0 387 {
IanBenzMaxim 0:33d4e66780c0 388 wait_ms(10);
IanBenzMaxim 0:33d4e66780c0 389 update();
IanBenzMaxim 0:33d4e66780c0 390 } while ((currentState != Connected) && (--attempts > 0));
IanBenzMaxim 0:33d4e66780c0 391 if (attempts == 0)
IanBenzMaxim 0:33d4e66780c0 392 result = SL_RET_CODE_ABORT;
IanBenzMaxim 0:33d4e66780c0 393 }
IanBenzMaxim 0:33d4e66780c0 394 return result;
IanBenzMaxim 0:33d4e66780c0 395 }
IanBenzMaxim 0:33d4e66780c0 396
IanBenzMaxim 0:33d4e66780c0 397 int CC3100::disconnect()
IanBenzMaxim 0:33d4e66780c0 398 {
IanBenzMaxim 0:33d4e66780c0 399 // Adapter should be connected.
IanBenzMaxim 0:33d4e66780c0 400 if (currentState != Connected)
IanBenzMaxim 0:33d4e66780c0 401 return invalidState;
IanBenzMaxim 0:33d4e66780c0 402
IanBenzMaxim 0:33d4e66780c0 403 return sl_WlanDisconnect();
IanBenzMaxim 0:33d4e66780c0 404 }
IanBenzMaxim 0:33d4e66780c0 405
IanBenzMaxim 0:33d4e66780c0 406 int CC3100::gethostbyname(const char *host, SocketAddress *address, nsapi_version_t version)
IanBenzMaxim 0:33d4e66780c0 407 {
IanBenzMaxim 0:33d4e66780c0 408 // TODO: Add IPv6 support
IanBenzMaxim 0:33d4e66780c0 409
IanBenzMaxim 0:33d4e66780c0 410 // Adapter should be connected.
IanBenzMaxim 0:33d4e66780c0 411 if (currentState != Connected)
IanBenzMaxim 0:33d4e66780c0 412 return invalidState;
IanBenzMaxim 0:33d4e66780c0 413
IanBenzMaxim 0:33d4e66780c0 414 uint32_t addressInt;
IanBenzMaxim 0:33d4e66780c0 415 int result;
IanBenzMaxim 0:33d4e66780c0 416 int attempts = 1000;
IanBenzMaxim 0:33d4e66780c0 417 do // Wait for DNS servers.
IanBenzMaxim 0:33d4e66780c0 418 {
IanBenzMaxim 0:33d4e66780c0 419 wait_ms(10);
IanBenzMaxim 0:33d4e66780c0 420 result = sl_NetAppDnsGetHostByName((_i8 *)host, strlen(host), (_u32 *)&addressInt, SL_AF_INET);
IanBenzMaxim 0:33d4e66780c0 421 } while ((result == SL_NET_APP_DNS_NO_SERVER) && (--attempts > 0));
IanBenzMaxim 0:33d4e66780c0 422 if (result == SL_RET_CODE_OK)
IanBenzMaxim 0:33d4e66780c0 423 {
IanBenzMaxim 0:33d4e66780c0 424 nsapi_addr_t addressBytes = {
IanBenzMaxim 0:33d4e66780c0 425 NSAPI_IPv4, // version
IanBenzMaxim 0:33d4e66780c0 426 0, // bytes
IanBenzMaxim 0:33d4e66780c0 427 };
IanBenzMaxim 0:33d4e66780c0 428 for (size_t i = 4; i > 0; i--)
IanBenzMaxim 0:33d4e66780c0 429 {
IanBenzMaxim 0:33d4e66780c0 430 addressBytes.bytes[i-1] = addressInt;
IanBenzMaxim 0:33d4e66780c0 431 addressInt >>= 8;
IanBenzMaxim 0:33d4e66780c0 432 }
IanBenzMaxim 0:33d4e66780c0 433 address->set_addr(addressBytes);
IanBenzMaxim 0:33d4e66780c0 434 }
IanBenzMaxim 0:33d4e66780c0 435 return result;
IanBenzMaxim 0:33d4e66780c0 436 }
IanBenzMaxim 0:33d4e66780c0 437
IanBenzMaxim 0:33d4e66780c0 438 int CC3100::ping(const SocketAddress & address)
IanBenzMaxim 0:33d4e66780c0 439 {
IanBenzMaxim 0:33d4e66780c0 440 // Adapter should be connected.
IanBenzMaxim 0:33d4e66780c0 441 if (currentState != Connected)
IanBenzMaxim 0:33d4e66780c0 442 return invalidState;
IanBenzMaxim 0:33d4e66780c0 443
IanBenzMaxim 0:33d4e66780c0 444 SlPingStartCommand_t pingParams = {
IanBenzMaxim 0:33d4e66780c0 445 1000, // PingIntervalTime
IanBenzMaxim 0:33d4e66780c0 446 20, // PingSize
IanBenzMaxim 0:33d4e66780c0 447 3000, // PingRequestTimeout
IanBenzMaxim 0:33d4e66780c0 448 3, // TotalNumberOfAttempts
IanBenzMaxim 0:33d4e66780c0 449 0, // Flags
IanBenzMaxim 0:33d4e66780c0 450 0 // Ip
IanBenzMaxim 0:33d4e66780c0 451 };
IanBenzMaxim 0:33d4e66780c0 452 for (size_t i = 0; i < 4; i++)
IanBenzMaxim 0:33d4e66780c0 453 {
IanBenzMaxim 0:33d4e66780c0 454 pingParams.Ip <<= 8;
IanBenzMaxim 0:33d4e66780c0 455 pingParams.Ip |= address.get_addr().bytes[i];
IanBenzMaxim 0:33d4e66780c0 456 }
IanBenzMaxim 0:33d4e66780c0 457 SlPingReport_t pingReport;
IanBenzMaxim 0:33d4e66780c0 458 int result = sl_NetAppPingStart((SlPingStartCommand_t*)&pingParams, SL_AF_INET,
IanBenzMaxim 0:33d4e66780c0 459 (SlPingReport_t*)&pingReport, SimpleLinkPingReport);
IanBenzMaxim 0:33d4e66780c0 460 if (result == SL_RET_CODE_OK)
IanBenzMaxim 0:33d4e66780c0 461 {
IanBenzMaxim 0:33d4e66780c0 462 // Wait for completion.
IanBenzMaxim 0:33d4e66780c0 463 currentState = Pinging;
IanBenzMaxim 0:33d4e66780c0 464 int attempts = 1000;
IanBenzMaxim 0:33d4e66780c0 465 do
IanBenzMaxim 0:33d4e66780c0 466 {
IanBenzMaxim 0:33d4e66780c0 467 wait_ms(10);
IanBenzMaxim 0:33d4e66780c0 468 update();
IanBenzMaxim 0:33d4e66780c0 469 } while ((currentState == Pinging) && (--attempts > 0));
IanBenzMaxim 0:33d4e66780c0 470 if (attempts == 0)
IanBenzMaxim 0:33d4e66780c0 471 result = SL_RET_CODE_ABORT;
IanBenzMaxim 0:33d4e66780c0 472 }
IanBenzMaxim 0:33d4e66780c0 473 return result;
IanBenzMaxim 0:33d4e66780c0 474 }
IanBenzMaxim 0:33d4e66780c0 475
IanBenzMaxim 0:33d4e66780c0 476 int CC3100::socket_open(nsapi_socket_t *handle, nsapi_protocol_t proto)
IanBenzMaxim 0:33d4e66780c0 477 {
IanBenzMaxim 0:33d4e66780c0 478 int16_t result;
IanBenzMaxim 0:33d4e66780c0 479 switch (proto)
IanBenzMaxim 0:33d4e66780c0 480 {
IanBenzMaxim 0:33d4e66780c0 481 case NSAPI_TCP:
IanBenzMaxim 0:33d4e66780c0 482 result = sl_Socket(SL_AF_INET, SL_SOCK_STREAM, 0);
IanBenzMaxim 0:33d4e66780c0 483 break;
IanBenzMaxim 0:33d4e66780c0 484
IanBenzMaxim 0:33d4e66780c0 485 case NSAPI_UDP:
IanBenzMaxim 0:33d4e66780c0 486 result = sl_Socket(SL_AF_INET, SL_SOCK_DGRAM, 0);
IanBenzMaxim 0:33d4e66780c0 487 break;
IanBenzMaxim 0:33d4e66780c0 488
IanBenzMaxim 0:33d4e66780c0 489 case SL_SEC_SOCKET:
IanBenzMaxim 0:33d4e66780c0 490 result = sl_Socket(SL_AF_INET, SL_SOCK_STREAM, SL_SEC_SOCKET);
IanBenzMaxim 0:33d4e66780c0 491 break;
IanBenzMaxim 0:33d4e66780c0 492
IanBenzMaxim 0:33d4e66780c0 493 default:
IanBenzMaxim 0:33d4e66780c0 494 result = SL_SOC_ERROR;
IanBenzMaxim 0:33d4e66780c0 495 break;
IanBenzMaxim 0:33d4e66780c0 496 }
IanBenzMaxim 0:33d4e66780c0 497 if (result >= 0)
IanBenzMaxim 0:33d4e66780c0 498 {
IanBenzMaxim 0:33d4e66780c0 499 *handle = new int16_t(result);
IanBenzMaxim 0:33d4e66780c0 500
IanBenzMaxim 0:33d4e66780c0 501 // Set non-blocking.
IanBenzMaxim 0:33d4e66780c0 502 SlSockNonblocking_t enableOption = {
IanBenzMaxim 0:33d4e66780c0 503 1 // NonblockingEnabled
IanBenzMaxim 0:33d4e66780c0 504 };
IanBenzMaxim 0:33d4e66780c0 505 result = sl_SetSockOpt(*((int16_t *)*handle), SL_SOL_SOCKET,SL_SO_NONBLOCKING,
IanBenzMaxim 0:33d4e66780c0 506 (_u8 *)&enableOption, sizeof(enableOption));
IanBenzMaxim 0:33d4e66780c0 507
IanBenzMaxim 0:33d4e66780c0 508 if (result < 0)
IanBenzMaxim 0:33d4e66780c0 509 socket_close(*handle);
IanBenzMaxim 0:33d4e66780c0 510 }
IanBenzMaxim 0:33d4e66780c0 511 return result;
IanBenzMaxim 0:33d4e66780c0 512 }
IanBenzMaxim 0:33d4e66780c0 513
IanBenzMaxim 0:33d4e66780c0 514 int CC3100::socket_set_cert_path(nsapi_socket_t handle, const char * certPath)
IanBenzMaxim 0:33d4e66780c0 515 {
IanBenzMaxim 0:33d4e66780c0 516 // Set CA certificate.
IanBenzMaxim 0:33d4e66780c0 517 return sl_SetSockOpt(*((int16_t *)handle), SL_SOL_SOCKET, SL_SO_SECURE_FILES_CA_FILE_NAME,
IanBenzMaxim 0:33d4e66780c0 518 certPath, strlen(certPath));
IanBenzMaxim 0:33d4e66780c0 519 }
IanBenzMaxim 0:33d4e66780c0 520
IanBenzMaxim 0:33d4e66780c0 521 int CC3100::socket_close(nsapi_socket_t handle)
IanBenzMaxim 0:33d4e66780c0 522 {
IanBenzMaxim 0:33d4e66780c0 523 int result = sl_Close(*((int16_t *)handle));
IanBenzMaxim 0:33d4e66780c0 524 delete handle;
IanBenzMaxim 0:33d4e66780c0 525 return result;
IanBenzMaxim 0:33d4e66780c0 526 }
IanBenzMaxim 0:33d4e66780c0 527
IanBenzMaxim 0:33d4e66780c0 528 int CC3100::socket_bind(nsapi_socket_t handle, const SocketAddress &address)
IanBenzMaxim 0:33d4e66780c0 529 {
IanBenzMaxim 0:33d4e66780c0 530 // TODO: Add IPv6 support
IanBenzMaxim 0:33d4e66780c0 531 if (address.get_addr().version != NSAPI_IPv4)
IanBenzMaxim 0:33d4e66780c0 532 return SL_SOC_ERROR;
IanBenzMaxim 0:33d4e66780c0 533
IanBenzMaxim 0:33d4e66780c0 534 SlSockAddrIn_t localAddr = {
IanBenzMaxim 0:33d4e66780c0 535 AF_INET, // sin_family
IanBenzMaxim 0:33d4e66780c0 536 sl_Htons(address.get_port()), // sin_port
IanBenzMaxim 0:33d4e66780c0 537 { // sin_addr
IanBenzMaxim 0:33d4e66780c0 538 0 // s_addr
IanBenzMaxim 0:33d4e66780c0 539 }
IanBenzMaxim 0:33d4e66780c0 540 };
IanBenzMaxim 0:33d4e66780c0 541 for (size_t i = 4; i > 0; i--)
IanBenzMaxim 0:33d4e66780c0 542 {
IanBenzMaxim 0:33d4e66780c0 543 localAddr.sin_addr.s_addr <<= 8;
IanBenzMaxim 0:33d4e66780c0 544 localAddr.sin_addr.s_addr |= address.get_addr().bytes[i-1];
IanBenzMaxim 0:33d4e66780c0 545 }
IanBenzMaxim 0:33d4e66780c0 546 return sl_Bind(*((int16_t *)handle), (SlSockAddr_t *)&localAddr, sizeof(localAddr));
IanBenzMaxim 0:33d4e66780c0 547 }
IanBenzMaxim 0:33d4e66780c0 548
IanBenzMaxim 0:33d4e66780c0 549 int CC3100::socket_listen(nsapi_socket_t handle, int backlog)
IanBenzMaxim 0:33d4e66780c0 550 {
IanBenzMaxim 0:33d4e66780c0 551 return sl_Listen(*((int16_t *)handle), backlog);
IanBenzMaxim 0:33d4e66780c0 552 }
IanBenzMaxim 0:33d4e66780c0 553
IanBenzMaxim 0:33d4e66780c0 554 int CC3100::socket_connect(nsapi_socket_t handle, const SocketAddress &address)
IanBenzMaxim 0:33d4e66780c0 555 {
IanBenzMaxim 0:33d4e66780c0 556 // TODO: Add IPv6 support
IanBenzMaxim 0:33d4e66780c0 557 if (address.get_addr().version != NSAPI_IPv4)
IanBenzMaxim 0:33d4e66780c0 558 return SL_SOC_ERROR;
IanBenzMaxim 0:33d4e66780c0 559
IanBenzMaxim 0:33d4e66780c0 560 SlSockAddrIn_t addr = {
IanBenzMaxim 0:33d4e66780c0 561 AF_INET, // sin_family
IanBenzMaxim 0:33d4e66780c0 562 sl_Htons(address.get_port()), // sin_port
IanBenzMaxim 0:33d4e66780c0 563 { // sin_addr
IanBenzMaxim 0:33d4e66780c0 564 0 // s_addr
IanBenzMaxim 0:33d4e66780c0 565 }
IanBenzMaxim 0:33d4e66780c0 566 };
IanBenzMaxim 0:33d4e66780c0 567 for (size_t i = 4; i > 0; i--)
IanBenzMaxim 0:33d4e66780c0 568 {
IanBenzMaxim 0:33d4e66780c0 569 addr.sin_addr.s_addr <<= 8;
IanBenzMaxim 0:33d4e66780c0 570 addr.sin_addr.s_addr |= address.get_addr().bytes[i-1];
IanBenzMaxim 0:33d4e66780c0 571 }
IanBenzMaxim 0:33d4e66780c0 572 int result;
IanBenzMaxim 0:33d4e66780c0 573 int attempts = 1000;
IanBenzMaxim 0:33d4e66780c0 574 do
IanBenzMaxim 0:33d4e66780c0 575 {
IanBenzMaxim 0:33d4e66780c0 576 wait_ms(10);
IanBenzMaxim 0:33d4e66780c0 577 result = sl_Connect(*((int16_t *)handle), (SlSockAddr_t *)&addr, sizeof(addr));
IanBenzMaxim 0:33d4e66780c0 578 } while ((result == SL_EALREADY) && (--attempts > 0));
IanBenzMaxim 0:33d4e66780c0 579 if (result > 0)
IanBenzMaxim 0:33d4e66780c0 580 result = 0;
IanBenzMaxim 0:33d4e66780c0 581 return result;
IanBenzMaxim 0:33d4e66780c0 582 }
IanBenzMaxim 0:33d4e66780c0 583
IanBenzMaxim 0:33d4e66780c0 584 int CC3100::socket_send(nsapi_socket_t handle, const void *data, unsigned size)
IanBenzMaxim 0:33d4e66780c0 585 {
IanBenzMaxim 0:33d4e66780c0 586 return sl_Send(*((int16_t *)handle), data, size, 0);
IanBenzMaxim 0:33d4e66780c0 587 }
IanBenzMaxim 0:33d4e66780c0 588
IanBenzMaxim 0:33d4e66780c0 589 int CC3100::socket_recv(nsapi_socket_t handle, void *data, unsigned size)
IanBenzMaxim 0:33d4e66780c0 590 {
IanBenzMaxim 0:33d4e66780c0 591 int result = sl_Recv(*((int16_t *)handle), data, size, 0);
IanBenzMaxim 0:33d4e66780c0 592 if (result == SL_EAGAIN)
IanBenzMaxim 0:33d4e66780c0 593 result = NSAPI_ERROR_WOULD_BLOCK;
IanBenzMaxim 0:33d4e66780c0 594 return result;
IanBenzMaxim 0:33d4e66780c0 595 }