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:
Thu Mar 02 10:15:53 2017 -0600
Revision:
3:d2799d8497c0
Parent:
0:33d4e66780c0
Child:
13:6a6225690c2e
Fixed error when removing non-printable characters from Text objects. Program is now running on GCC.

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