TI's MQTT Demo with freertos CM4F

Dependencies:   mbed

Committer:
dflet
Date:
Thu Sep 03 14:07:01 2015 +0000
Revision:
0:1e7b5dd9edb4
First commit, it's been hanging around for a while. Updated SPI mode change 1 to 0.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:1e7b5dd9edb4 1 /*
dflet 0:1e7b5dd9edb4 2 * netapp.c - CC31xx/CC32xx Host Driver Implementation
dflet 0:1e7b5dd9edb4 3 *
dflet 0:1e7b5dd9edb4 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:1e7b5dd9edb4 5 *
dflet 0:1e7b5dd9edb4 6 *
dflet 0:1e7b5dd9edb4 7 * Redistribution and use in source and binary forms, with or without
dflet 0:1e7b5dd9edb4 8 * modification, are permitted provided that the following conditions
dflet 0:1e7b5dd9edb4 9 * are met:
dflet 0:1e7b5dd9edb4 10 *
dflet 0:1e7b5dd9edb4 11 * Redistributions of source code must retain the above copyright
dflet 0:1e7b5dd9edb4 12 * notice, this list of conditions and the following disclaimer.
dflet 0:1e7b5dd9edb4 13 *
dflet 0:1e7b5dd9edb4 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:1e7b5dd9edb4 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:1e7b5dd9edb4 16 * documentation and/or other materials provided with the
dflet 0:1e7b5dd9edb4 17 * distribution.
dflet 0:1e7b5dd9edb4 18 *
dflet 0:1e7b5dd9edb4 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:1e7b5dd9edb4 20 * its contributors may be used to endorse or promote products derived
dflet 0:1e7b5dd9edb4 21 * from this software without specific prior written permission.
dflet 0:1e7b5dd9edb4 22 *
dflet 0:1e7b5dd9edb4 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:1e7b5dd9edb4 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:1e7b5dd9edb4 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:1e7b5dd9edb4 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:1e7b5dd9edb4 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:1e7b5dd9edb4 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:1e7b5dd9edb4 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:1e7b5dd9edb4 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:1e7b5dd9edb4 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:1e7b5dd9edb4 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:1e7b5dd9edb4 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:1e7b5dd9edb4 34 *
dflet 0:1e7b5dd9edb4 35 */
dflet 0:1e7b5dd9edb4 36
dflet 0:1e7b5dd9edb4 37
dflet 0:1e7b5dd9edb4 38
dflet 0:1e7b5dd9edb4 39 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 40 /* Include files */
dflet 0:1e7b5dd9edb4 41 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 42 #include "cc3100_simplelink.h"
dflet 0:1e7b5dd9edb4 43 #include "cc3100_protocol.h"
dflet 0:1e7b5dd9edb4 44 #include "cc3100_driver.h"
dflet 0:1e7b5dd9edb4 45
dflet 0:1e7b5dd9edb4 46 #include "cc3100_netapp.h"
dflet 0:1e7b5dd9edb4 47 #include "fPtr_func.h"
dflet 0:1e7b5dd9edb4 48
dflet 0:1e7b5dd9edb4 49 namespace mbed_cc3100 {
dflet 0:1e7b5dd9edb4 50
dflet 0:1e7b5dd9edb4 51 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 52 /* Macro declarations */
dflet 0:1e7b5dd9edb4 53 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 54 const uint32_t NETAPP_MDNS_OPTIONS_ADD_SERVICE_BIT = ((uint32_t)0x1 << 31);
dflet 0:1e7b5dd9edb4 55
dflet 0:1e7b5dd9edb4 56 #ifdef SL_TINY
dflet 0:1e7b5dd9edb4 57 const uint8_t NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH = 63;
dflet 0:1e7b5dd9edb4 58 #else
dflet 0:1e7b5dd9edb4 59 const uint8_t NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH = 255;
dflet 0:1e7b5dd9edb4 60 #endif
dflet 0:1e7b5dd9edb4 61
dflet 0:1e7b5dd9edb4 62 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 63 cc3100_netapp::cc3100_netapp(cc3100_driver &driver, cc3100_nonos &nonos)
dflet 0:1e7b5dd9edb4 64 : _driver(driver), _nonos(nonos)
dflet 0:1e7b5dd9edb4 65 {
dflet 0:1e7b5dd9edb4 66 }
dflet 0:1e7b5dd9edb4 67 #else
dflet 0:1e7b5dd9edb4 68 cc3100_netapp::cc3100_netapp(cc3100_driver &driver)
dflet 0:1e7b5dd9edb4 69 : _driver(driver)
dflet 0:1e7b5dd9edb4 70 {
dflet 0:1e7b5dd9edb4 71 }
dflet 0:1e7b5dd9edb4 72 #endif
dflet 0:1e7b5dd9edb4 73 cc3100_netapp::~cc3100_netapp()
dflet 0:1e7b5dd9edb4 74 {
dflet 0:1e7b5dd9edb4 75
dflet 0:1e7b5dd9edb4 76 }
dflet 0:1e7b5dd9edb4 77
dflet 0:1e7b5dd9edb4 78
dflet 0:1e7b5dd9edb4 79 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 80 /* API functions */
dflet 0:1e7b5dd9edb4 81 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 82
dflet 0:1e7b5dd9edb4 83 /*****************************************************************************
dflet 0:1e7b5dd9edb4 84 sl_NetAppStart
dflet 0:1e7b5dd9edb4 85 *****************************************************************************/
dflet 0:1e7b5dd9edb4 86 typedef union {
dflet 0:1e7b5dd9edb4 87 _NetAppStartStopCommand_t Cmd;
dflet 0:1e7b5dd9edb4 88 _NetAppStartStopResponse_t Rsp;
dflet 0:1e7b5dd9edb4 89 } _SlNetAppStartStopMsg_u;
dflet 0:1e7b5dd9edb4 90
dflet 0:1e7b5dd9edb4 91 #if _SL_INCLUDE_FUNC(sl_NetAppStart)
dflet 0:1e7b5dd9edb4 92 const _SlCmdCtrl_t _SlNetAppStartCtrl = {
dflet 0:1e7b5dd9edb4 93 SL_OPCODE_NETAPP_START_COMMAND,
dflet 0:1e7b5dd9edb4 94 sizeof(_NetAppStartStopCommand_t),
dflet 0:1e7b5dd9edb4 95 sizeof(_NetAppStartStopResponse_t)
dflet 0:1e7b5dd9edb4 96 };
dflet 0:1e7b5dd9edb4 97
dflet 0:1e7b5dd9edb4 98 int16_t cc3100_netapp::sl_NetAppStart(const uint32_t AppBitMap)
dflet 0:1e7b5dd9edb4 99 {
dflet 0:1e7b5dd9edb4 100 _SlNetAppStartStopMsg_u Msg;
dflet 0:1e7b5dd9edb4 101 Msg.Cmd.appId = AppBitMap;
dflet 0:1e7b5dd9edb4 102 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlNetAppStartCtrl, &Msg, NULL));
dflet 0:1e7b5dd9edb4 103
dflet 0:1e7b5dd9edb4 104 return Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 105 }
dflet 0:1e7b5dd9edb4 106 #endif
dflet 0:1e7b5dd9edb4 107
dflet 0:1e7b5dd9edb4 108 /*****************************************************************************
dflet 0:1e7b5dd9edb4 109 sl_NetAppStop
dflet 0:1e7b5dd9edb4 110 *****************************************************************************/
dflet 0:1e7b5dd9edb4 111 #if _SL_INCLUDE_FUNC(sl_NetAppStop)
dflet 0:1e7b5dd9edb4 112 const _SlCmdCtrl_t _SlNetAppStopCtrl =
dflet 0:1e7b5dd9edb4 113 {
dflet 0:1e7b5dd9edb4 114 SL_OPCODE_NETAPP_STOP_COMMAND,
dflet 0:1e7b5dd9edb4 115 sizeof(_NetAppStartStopCommand_t),
dflet 0:1e7b5dd9edb4 116 sizeof(_NetAppStartStopResponse_t)
dflet 0:1e7b5dd9edb4 117 };
dflet 0:1e7b5dd9edb4 118 int16_t cc3100_netapp::sl_NetAppStop(const uint32_t AppBitMap)
dflet 0:1e7b5dd9edb4 119 {
dflet 0:1e7b5dd9edb4 120 _SlNetAppStartStopMsg_u Msg;
dflet 0:1e7b5dd9edb4 121 Msg.Cmd.appId = AppBitMap;
dflet 0:1e7b5dd9edb4 122 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlNetAppStopCtrl, &Msg, NULL));
dflet 0:1e7b5dd9edb4 123
dflet 0:1e7b5dd9edb4 124 return Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 125 }
dflet 0:1e7b5dd9edb4 126 #endif
dflet 0:1e7b5dd9edb4 127
dflet 0:1e7b5dd9edb4 128
dflet 0:1e7b5dd9edb4 129 /******************************************************************************/
dflet 0:1e7b5dd9edb4 130 /* sl_NetAppGetServiceList */
dflet 0:1e7b5dd9edb4 131 /******************************************************************************/
dflet 0:1e7b5dd9edb4 132 typedef struct {
dflet 0:1e7b5dd9edb4 133 uint8_t IndexOffest;
dflet 0:1e7b5dd9edb4 134 uint8_t MaxServiceCount;
dflet 0:1e7b5dd9edb4 135 uint8_t Flags;
dflet 0:1e7b5dd9edb4 136 int8_t Padding;
dflet 0:1e7b5dd9edb4 137 } NetappGetServiceListCMD_t;
dflet 0:1e7b5dd9edb4 138
dflet 0:1e7b5dd9edb4 139 typedef union {
dflet 0:1e7b5dd9edb4 140 NetappGetServiceListCMD_t Cmd;
dflet 0:1e7b5dd9edb4 141 _BasicResponse_t Rsp;
dflet 0:1e7b5dd9edb4 142 } _SlNetappGetServiceListMsg_u;
dflet 0:1e7b5dd9edb4 143
dflet 0:1e7b5dd9edb4 144 #if _SL_INCLUDE_FUNC(sl_NetAppGetServiceList)
dflet 0:1e7b5dd9edb4 145 const _SlCmdCtrl_t _SlGetServiceListeCtrl = {
dflet 0:1e7b5dd9edb4 146 SL_OPCODE_NETAPP_NETAPP_MDNS_LOOKUP_SERVICE,
dflet 0:1e7b5dd9edb4 147 sizeof(NetappGetServiceListCMD_t),
dflet 0:1e7b5dd9edb4 148 sizeof(_BasicResponse_t)
dflet 0:1e7b5dd9edb4 149 };
dflet 0:1e7b5dd9edb4 150
dflet 0:1e7b5dd9edb4 151 int16_t cc3100_netapp::sl_NetAppGetServiceList(const uint8_t IndexOffest,
dflet 0:1e7b5dd9edb4 152 const uint8_t MaxServiceCount,
dflet 0:1e7b5dd9edb4 153 const uint8_t Flags,
dflet 0:1e7b5dd9edb4 154 int8_t *pBuffer,
dflet 0:1e7b5dd9edb4 155 const uint32_t RxBufferLength
dflet 0:1e7b5dd9edb4 156 )
dflet 0:1e7b5dd9edb4 157 {
dflet 0:1e7b5dd9edb4 158 int32_t retVal= 0;
dflet 0:1e7b5dd9edb4 159 _SlNetappGetServiceListMsg_u Msg;
dflet 0:1e7b5dd9edb4 160 _SlCmdExt_t CmdExt;
dflet 0:1e7b5dd9edb4 161 uint16_t ServiceSize = 0;
dflet 0:1e7b5dd9edb4 162 uint16_t BufferSize = 0;
dflet 0:1e7b5dd9edb4 163
dflet 0:1e7b5dd9edb4 164 /*
dflet 0:1e7b5dd9edb4 165 Calculate RX pBuffer size
dflet 0:1e7b5dd9edb4 166 WARNING:
dflet 0:1e7b5dd9edb4 167 if this size is BufferSize than 1480 error should be returned because there
dflet 0:1e7b5dd9edb4 168 is no place in the RX packet.
dflet 0:1e7b5dd9edb4 169 */
dflet 0:1e7b5dd9edb4 170 switch(Flags) {
dflet 0:1e7b5dd9edb4 171 case SL_NET_APP_FULL_SERVICE_WITH_TEXT_IPV4_TYPE:
dflet 0:1e7b5dd9edb4 172 ServiceSize = sizeof(SlNetAppGetFullServiceWithTextIpv4List_t);
dflet 0:1e7b5dd9edb4 173 break;
dflet 0:1e7b5dd9edb4 174
dflet 0:1e7b5dd9edb4 175 case SL_NET_APP_FULL_SERVICE_IPV4_TYPE:
dflet 0:1e7b5dd9edb4 176 ServiceSize = sizeof(SlNetAppGetFullServiceIpv4List_t);
dflet 0:1e7b5dd9edb4 177 break;
dflet 0:1e7b5dd9edb4 178
dflet 0:1e7b5dd9edb4 179 case SL_NET_APP_SHORT_SERVICE_IPV4_TYPE:
dflet 0:1e7b5dd9edb4 180 ServiceSize = sizeof(SlNetAppGetShortServiceIpv4List_t);
dflet 0:1e7b5dd9edb4 181 break;
dflet 0:1e7b5dd9edb4 182
dflet 0:1e7b5dd9edb4 183 default:
dflet 0:1e7b5dd9edb4 184 ServiceSize = sizeof(_BasicResponse_t);
dflet 0:1e7b5dd9edb4 185 break;
dflet 0:1e7b5dd9edb4 186 }
dflet 0:1e7b5dd9edb4 187
dflet 0:1e7b5dd9edb4 188
dflet 0:1e7b5dd9edb4 189
dflet 0:1e7b5dd9edb4 190 BufferSize = MaxServiceCount * ServiceSize;
dflet 0:1e7b5dd9edb4 191
dflet 0:1e7b5dd9edb4 192 /*Check the size of the requested services is smaller than size of the user buffer.
dflet 0:1e7b5dd9edb4 193 If not an error is returned in order to avoid overwriting memory. */
dflet 0:1e7b5dd9edb4 194 if(RxBufferLength <= BufferSize) {
dflet 0:1e7b5dd9edb4 195 return SL_ERROR_NETAPP_RX_BUFFER_LENGTH_ERROR;
dflet 0:1e7b5dd9edb4 196 }
dflet 0:1e7b5dd9edb4 197
dflet 0:1e7b5dd9edb4 198 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:1e7b5dd9edb4 199 CmdExt.RxPayloadLen = BufferSize;
dflet 0:1e7b5dd9edb4 200
dflet 0:1e7b5dd9edb4 201 CmdExt.pRxPayload = (uint8_t *)pBuffer;
dflet 0:1e7b5dd9edb4 202
dflet 0:1e7b5dd9edb4 203 Msg.Cmd.IndexOffest = IndexOffest;
dflet 0:1e7b5dd9edb4 204 Msg.Cmd.MaxServiceCount = MaxServiceCount;
dflet 0:1e7b5dd9edb4 205 Msg.Cmd.Flags = Flags;
dflet 0:1e7b5dd9edb4 206 Msg.Cmd.Padding = 0;
dflet 0:1e7b5dd9edb4 207
dflet 0:1e7b5dd9edb4 208 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlGetServiceListeCtrl, &Msg, &CmdExt));
dflet 0:1e7b5dd9edb4 209 retVal = Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 210
dflet 0:1e7b5dd9edb4 211 return (int16_t)retVal;
dflet 0:1e7b5dd9edb4 212 }
dflet 0:1e7b5dd9edb4 213
dflet 0:1e7b5dd9edb4 214 #endif
dflet 0:1e7b5dd9edb4 215
dflet 0:1e7b5dd9edb4 216 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 217 /* sl_mDNSRegisterService */
dflet 0:1e7b5dd9edb4 218 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 219 /*
dflet 0:1e7b5dd9edb4 220 * The below struct depicts the constant parameters of the command/API RegisterService.
dflet 0:1e7b5dd9edb4 221 *
dflet 0:1e7b5dd9edb4 222 1. ServiceLen - The length of the service should be smaller than NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH.
dflet 0:1e7b5dd9edb4 223 2. TextLen - The length of the text should be smaller than NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH.
dflet 0:1e7b5dd9edb4 224 3. port - The port on this target host.
dflet 0:1e7b5dd9edb4 225 4. TTL - The TTL of the service
dflet 0:1e7b5dd9edb4 226 5. Options - bitwise parameters:
dflet 0:1e7b5dd9edb4 227 bit 0 - is unique (means if the service needs to be unique)
dflet 0:1e7b5dd9edb4 228 bit 31 - for internal use if the service should be added or deleted (set means ADD).
dflet 0:1e7b5dd9edb4 229 bit 1-30 for future.
dflet 0:1e7b5dd9edb4 230
dflet 0:1e7b5dd9edb4 231 NOTE:
dflet 0:1e7b5dd9edb4 232
dflet 0:1e7b5dd9edb4 233 1. There are another variable parameter is this API which is the service name and the text.
dflet 0:1e7b5dd9edb4 234 2. According to now there is no warning and Async event to user on if the service is a unique.
dflet 0:1e7b5dd9edb4 235 *
dflet 0:1e7b5dd9edb4 236 */
dflet 0:1e7b5dd9edb4 237
dflet 0:1e7b5dd9edb4 238 typedef struct {
dflet 0:1e7b5dd9edb4 239 uint8_t ServiceNameLen;
dflet 0:1e7b5dd9edb4 240 uint8_t TextLen;
dflet 0:1e7b5dd9edb4 241 uint16_t Port;
dflet 0:1e7b5dd9edb4 242 uint32_t TTL;
dflet 0:1e7b5dd9edb4 243 uint32_t Options;
dflet 0:1e7b5dd9edb4 244 } NetappMdnsSetService_t;
dflet 0:1e7b5dd9edb4 245
dflet 0:1e7b5dd9edb4 246 typedef union {
dflet 0:1e7b5dd9edb4 247 NetappMdnsSetService_t Cmd;
dflet 0:1e7b5dd9edb4 248 _BasicResponse_t Rsp;
dflet 0:1e7b5dd9edb4 249 } _SlNetappMdnsRegisterServiceMsg_u;
dflet 0:1e7b5dd9edb4 250
dflet 0:1e7b5dd9edb4 251 #if _SL_INCLUDE_FUNC(sl_NetAppMDNSRegisterUnregisterService)
dflet 0:1e7b5dd9edb4 252 const _SlCmdCtrl_t _SlRegisterServiceCtrl = {
dflet 0:1e7b5dd9edb4 253 SL_OPCODE_NETAPP_MDNSREGISTERSERVICE,
dflet 0:1e7b5dd9edb4 254 sizeof(NetappMdnsSetService_t),
dflet 0:1e7b5dd9edb4 255 sizeof(_BasicResponse_t)
dflet 0:1e7b5dd9edb4 256 };
dflet 0:1e7b5dd9edb4 257
dflet 0:1e7b5dd9edb4 258 /******************************************************************************
dflet 0:1e7b5dd9edb4 259
dflet 0:1e7b5dd9edb4 260 sl_NetAppMDNSRegisterService
dflet 0:1e7b5dd9edb4 261
dflet 0:1e7b5dd9edb4 262 CALLER user from its host
dflet 0:1e7b5dd9edb4 263
dflet 0:1e7b5dd9edb4 264
dflet 0:1e7b5dd9edb4 265 DESCRIPTION:
dflet 0:1e7b5dd9edb4 266 Add/delete service
dflet 0:1e7b5dd9edb4 267 The function manipulates the command that register the service and call
dflet 0:1e7b5dd9edb4 268 to the NWP in order to add/delete the service to/from the mDNS package and to/from the DB.
dflet 0:1e7b5dd9edb4 269
dflet 0:1e7b5dd9edb4 270 This register service is a service offered by the application.
dflet 0:1e7b5dd9edb4 271 This unregister service is a service offered by the application before.
dflet 0:1e7b5dd9edb4 272
dflet 0:1e7b5dd9edb4 273 The service name should be full service name according to RFC
dflet 0:1e7b5dd9edb4 274 of the DNS-SD - means the value in name field in SRV answer.
dflet 0:1e7b5dd9edb4 275
dflet 0:1e7b5dd9edb4 276 Example for service name:
dflet 0:1e7b5dd9edb4 277 1. PC1._ipp._tcp.local
dflet 0:1e7b5dd9edb4 278 2. PC2_server._ftp._tcp.local
dflet 0:1e7b5dd9edb4 279
dflet 0:1e7b5dd9edb4 280 If the option is_unique is set, mDNS probes the service name to make sure
dflet 0:1e7b5dd9edb4 281 it is unique before starting to announce the service on the network.
dflet 0:1e7b5dd9edb4 282 Instance is the instance portion of the service name.
dflet 0:1e7b5dd9edb4 283
dflet 0:1e7b5dd9edb4 284
dflet 0:1e7b5dd9edb4 285
dflet 0:1e7b5dd9edb4 286
dflet 0:1e7b5dd9edb4 287 PARAMETERS:
dflet 0:1e7b5dd9edb4 288
dflet 0:1e7b5dd9edb4 289 The command is from constant parameters and variables parameters.
dflet 0:1e7b5dd9edb4 290
dflet 0:1e7b5dd9edb4 291 Constant parameters are:
dflet 0:1e7b5dd9edb4 292
dflet 0:1e7b5dd9edb4 293 ServiceLen - The length of the service.
dflet 0:1e7b5dd9edb4 294 TextLen - The length of the service should be smaller than 64.
dflet 0:1e7b5dd9edb4 295 port - The port on this target host.
dflet 0:1e7b5dd9edb4 296 TTL - The TTL of the service
dflet 0:1e7b5dd9edb4 297 Options - bitwise parameters:
dflet 0:1e7b5dd9edb4 298 bit 0 - is unique (means if the service needs to be unique)
dflet 0:1e7b5dd9edb4 299 bit 31 - for internal use if the service should be added or deleted (set means ADD).
dflet 0:1e7b5dd9edb4 300 bit 1-30 for future.
dflet 0:1e7b5dd9edb4 301
dflet 0:1e7b5dd9edb4 302 The variables parameters are:
dflet 0:1e7b5dd9edb4 303
dflet 0:1e7b5dd9edb4 304 Service name(full service name) - The service name.
dflet 0:1e7b5dd9edb4 305 Example for service name:
dflet 0:1e7b5dd9edb4 306 1. PC1._ipp._tcp.local
dflet 0:1e7b5dd9edb4 307 2. PC2_server._ftp._tcp.local
dflet 0:1e7b5dd9edb4 308
dflet 0:1e7b5dd9edb4 309 Text - The description of the service.
dflet 0:1e7b5dd9edb4 310 should be as mentioned in the RFC
dflet 0:1e7b5dd9edb4 311 (according to type of the service IPP,FTP...)
dflet 0:1e7b5dd9edb4 312
dflet 0:1e7b5dd9edb4 313 NOTE - pay attention
dflet 0:1e7b5dd9edb4 314
dflet 0:1e7b5dd9edb4 315 1. Temporary - there is an allocation on stack of internal buffer.
dflet 0:1e7b5dd9edb4 316 Its size is NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH.
dflet 0:1e7b5dd9edb4 317 It means that the sum of the text length and service name length cannot be bigger than
dflet 0:1e7b5dd9edb4 318 NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH.
dflet 0:1e7b5dd9edb4 319 If it is - An error is returned.
dflet 0:1e7b5dd9edb4 320
dflet 0:1e7b5dd9edb4 321 2. According to now from certain constraints the variables parameters are set in the
dflet 0:1e7b5dd9edb4 322 attribute part (contain constant parameters)
dflet 0:1e7b5dd9edb4 323
dflet 0:1e7b5dd9edb4 324
dflet 0:1e7b5dd9edb4 325
dflet 0:1e7b5dd9edb4 326 RETURNS: Status - the immediate response of the command status.
dflet 0:1e7b5dd9edb4 327 0 means success.
dflet 0:1e7b5dd9edb4 328
dflet 0:1e7b5dd9edb4 329
dflet 0:1e7b5dd9edb4 330
dflet 0:1e7b5dd9edb4 331 ******************************************************************************/
dflet 0:1e7b5dd9edb4 332 int16_t cc3100_netapp::sl_NetAppMDNSRegisterUnregisterService(const char* pServiceName,
dflet 0:1e7b5dd9edb4 333 const uint8_t ServiceNameLen,
dflet 0:1e7b5dd9edb4 334 const char* pText,
dflet 0:1e7b5dd9edb4 335 const uint8_t TextLen,
dflet 0:1e7b5dd9edb4 336 const uint16_t Port,
dflet 0:1e7b5dd9edb4 337 const uint32_t TTL,
dflet 0:1e7b5dd9edb4 338 const uint32_t Options)
dflet 0:1e7b5dd9edb4 339 {
dflet 0:1e7b5dd9edb4 340
dflet 0:1e7b5dd9edb4 341 _SlNetappMdnsRegisterServiceMsg_u Msg;
dflet 0:1e7b5dd9edb4 342 _SlCmdExt_t CmdExt ;
dflet 0:1e7b5dd9edb4 343 unsigned char ServiceNameAndTextBuffer[NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH];
dflet 0:1e7b5dd9edb4 344 unsigned char *TextPtr;
dflet 0:1e7b5dd9edb4 345
dflet 0:1e7b5dd9edb4 346 /*
dflet 0:1e7b5dd9edb4 347
dflet 0:1e7b5dd9edb4 348 NOTE - pay attention
dflet 0:1e7b5dd9edb4 349
dflet 0:1e7b5dd9edb4 350 1. Temporary - there is an allocation on stack of internal buffer.
dflet 0:1e7b5dd9edb4 351 Its size is NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH.
dflet 0:1e7b5dd9edb4 352 It means that the sum of the text length and service name length cannot be bigger than
dflet 0:1e7b5dd9edb4 353 NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH.
dflet 0:1e7b5dd9edb4 354 If it is - An error is returned.
dflet 0:1e7b5dd9edb4 355
dflet 0:1e7b5dd9edb4 356 2. According to now from certain constraints the variables parameters are set in the
dflet 0:1e7b5dd9edb4 357 attribute part (contain constant parameters)
dflet 0:1e7b5dd9edb4 358
dflet 0:1e7b5dd9edb4 359
dflet 0:1e7b5dd9edb4 360 */
dflet 0:1e7b5dd9edb4 361
dflet 0:1e7b5dd9edb4 362 /*build the attribute part of the command.
dflet 0:1e7b5dd9edb4 363 It contains the constant parameters of the command*/
dflet 0:1e7b5dd9edb4 364
dflet 0:1e7b5dd9edb4 365 Msg.Cmd.ServiceNameLen = ServiceNameLen;
dflet 0:1e7b5dd9edb4 366 Msg.Cmd.Options = Options;
dflet 0:1e7b5dd9edb4 367 Msg.Cmd.Port = Port;
dflet 0:1e7b5dd9edb4 368 Msg.Cmd.TextLen = TextLen;
dflet 0:1e7b5dd9edb4 369 Msg.Cmd.TTL = TTL;
dflet 0:1e7b5dd9edb4 370
dflet 0:1e7b5dd9edb4 371 /*Build the payload part of the command
dflet 0:1e7b5dd9edb4 372 Copy the service name and text to one buffer.
dflet 0:1e7b5dd9edb4 373 NOTE - pay attention
dflet 0:1e7b5dd9edb4 374 The size of the service length + the text length should be smaller than 255,
dflet 0:1e7b5dd9edb4 375 Until the simplelink drive supports to variable length through SPI command. */
dflet 0:1e7b5dd9edb4 376 if(TextLen + ServiceNameLen > (NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH - 1 )) { /*-1 is for giving a place to set null termination at the end of the text*/
dflet 0:1e7b5dd9edb4 377 return -1;
dflet 0:1e7b5dd9edb4 378 }
dflet 0:1e7b5dd9edb4 379
dflet 0:1e7b5dd9edb4 380 _driver._SlDrvMemZero(ServiceNameAndTextBuffer, NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH);
dflet 0:1e7b5dd9edb4 381
dflet 0:1e7b5dd9edb4 382
dflet 0:1e7b5dd9edb4 383 /*Copy the service name*/
dflet 0:1e7b5dd9edb4 384 memcpy(ServiceNameAndTextBuffer,
dflet 0:1e7b5dd9edb4 385 pServiceName,
dflet 0:1e7b5dd9edb4 386 ServiceNameLen);
dflet 0:1e7b5dd9edb4 387
dflet 0:1e7b5dd9edb4 388 if(TextLen > 0 ) {
dflet 0:1e7b5dd9edb4 389
dflet 0:1e7b5dd9edb4 390 TextPtr = &ServiceNameAndTextBuffer[ServiceNameLen];
dflet 0:1e7b5dd9edb4 391 /*Copy the text just after the service name*/
dflet 0:1e7b5dd9edb4 392 memcpy(TextPtr, pText, TextLen);
dflet 0:1e7b5dd9edb4 393 }
dflet 0:1e7b5dd9edb4 394
dflet 0:1e7b5dd9edb4 395 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:1e7b5dd9edb4 396 CmdExt.TxPayloadLen = (TextLen + ServiceNameLen);
dflet 0:1e7b5dd9edb4 397 CmdExt.pTxPayload = (uint8_t *)ServiceNameAndTextBuffer;
dflet 0:1e7b5dd9edb4 398
dflet 0:1e7b5dd9edb4 399
dflet 0:1e7b5dd9edb4 400 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlRegisterServiceCtrl, &Msg, &CmdExt));
dflet 0:1e7b5dd9edb4 401
dflet 0:1e7b5dd9edb4 402 return (int16_t)Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 403
dflet 0:1e7b5dd9edb4 404
dflet 0:1e7b5dd9edb4 405 }
dflet 0:1e7b5dd9edb4 406 #endif
dflet 0:1e7b5dd9edb4 407
dflet 0:1e7b5dd9edb4 408 /**********************************************************************************************/
dflet 0:1e7b5dd9edb4 409 #if _SL_INCLUDE_FUNC(sl_NetAppMDNSRegisterService)
dflet 0:1e7b5dd9edb4 410 int16_t cc3100_netapp::sl_NetAppMDNSRegisterService(const char* pServiceName,
dflet 0:1e7b5dd9edb4 411 const uint8_t ServiceNameLen,
dflet 0:1e7b5dd9edb4 412 const char* pText,
dflet 0:1e7b5dd9edb4 413 const uint8_t TextLen,
dflet 0:1e7b5dd9edb4 414 const uint16_t Port,
dflet 0:1e7b5dd9edb4 415 const uint32_t TTL,
dflet 0:1e7b5dd9edb4 416 uint32_t Options)
dflet 0:1e7b5dd9edb4 417 {
dflet 0:1e7b5dd9edb4 418
dflet 0:1e7b5dd9edb4 419 /*
dflet 0:1e7b5dd9edb4 420
dflet 0:1e7b5dd9edb4 421 NOTE - pay attention
dflet 0:1e7b5dd9edb4 422
dflet 0:1e7b5dd9edb4 423 1. Temporary - there is an allocation on stack of internal buffer.
dflet 0:1e7b5dd9edb4 424 Its size is NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH.
dflet 0:1e7b5dd9edb4 425 It means that the sum of the text length and service name length cannot be bigger than
dflet 0:1e7b5dd9edb4 426 NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH.
dflet 0:1e7b5dd9edb4 427 If it is - An error is returned.
dflet 0:1e7b5dd9edb4 428
dflet 0:1e7b5dd9edb4 429 2. According to now from certain constraints the variables parameters are set in the
dflet 0:1e7b5dd9edb4 430 attribute part (contain constant parameters)
dflet 0:1e7b5dd9edb4 431
dflet 0:1e7b5dd9edb4 432 */
dflet 0:1e7b5dd9edb4 433
dflet 0:1e7b5dd9edb4 434 /*Set the add service bit in the options parameter.
dflet 0:1e7b5dd9edb4 435 In order not use different opcodes for the register service and unregister service
dflet 0:1e7b5dd9edb4 436 bit 31 in option is taken for this purpose. if it is set it means in NWP that the service should be added
dflet 0:1e7b5dd9edb4 437 if it is cleared it means that the service should be deleted and there is only meaning to pServiceName
dflet 0:1e7b5dd9edb4 438 and ServiceNameLen values. */
dflet 0:1e7b5dd9edb4 439 Options |= NETAPP_MDNS_OPTIONS_ADD_SERVICE_BIT;
dflet 0:1e7b5dd9edb4 440
dflet 0:1e7b5dd9edb4 441 return (sl_NetAppMDNSRegisterUnregisterService( pServiceName, ServiceNameLen, pText, TextLen, Port, TTL, Options));
dflet 0:1e7b5dd9edb4 442
dflet 0:1e7b5dd9edb4 443
dflet 0:1e7b5dd9edb4 444 }
dflet 0:1e7b5dd9edb4 445 #endif
dflet 0:1e7b5dd9edb4 446 /**********************************************************************************************/
dflet 0:1e7b5dd9edb4 447
dflet 0:1e7b5dd9edb4 448
dflet 0:1e7b5dd9edb4 449
dflet 0:1e7b5dd9edb4 450 /**********************************************************************************************/
dflet 0:1e7b5dd9edb4 451 #if _SL_INCLUDE_FUNC(sl_NetAppMDNSUnRegisterService)
dflet 0:1e7b5dd9edb4 452 int16_t cc3100_netapp::sl_NetAppMDNSUnRegisterService(const char* pServiceName, const uint8_t ServiceNameLen)
dflet 0:1e7b5dd9edb4 453 {
dflet 0:1e7b5dd9edb4 454 uint32_t Options = 0;
dflet 0:1e7b5dd9edb4 455
dflet 0:1e7b5dd9edb4 456 /*
dflet 0:1e7b5dd9edb4 457
dflet 0:1e7b5dd9edb4 458 NOTE - pay attention
dflet 0:1e7b5dd9edb4 459
dflet 0:1e7b5dd9edb4 460 The size of the service length should be smaller than 255,
dflet 0:1e7b5dd9edb4 461 Until the simplelink drive supports to variable length through SPI command.
dflet 0:1e7b5dd9edb4 462
dflet 0:1e7b5dd9edb4 463
dflet 0:1e7b5dd9edb4 464 */
dflet 0:1e7b5dd9edb4 465
dflet 0:1e7b5dd9edb4 466 /*Clear the add service bit in the options parameter.
dflet 0:1e7b5dd9edb4 467 In order not use different opcodes for the register service and unregister service
dflet 0:1e7b5dd9edb4 468 bit 31 in option is taken for this purpose. if it is set it means in NWP that the service should be added
dflet 0:1e7b5dd9edb4 469 if it is cleared it means that the service should be deleted and there is only meaning to pServiceName
dflet 0:1e7b5dd9edb4 470 and ServiceNameLen values.*/
dflet 0:1e7b5dd9edb4 471
dflet 0:1e7b5dd9edb4 472 Options &= (~NETAPP_MDNS_OPTIONS_ADD_SERVICE_BIT);
dflet 0:1e7b5dd9edb4 473
dflet 0:1e7b5dd9edb4 474 return (sl_NetAppMDNSRegisterUnregisterService(pServiceName, ServiceNameLen, NULL, 0, 0, 0, Options));
dflet 0:1e7b5dd9edb4 475
dflet 0:1e7b5dd9edb4 476
dflet 0:1e7b5dd9edb4 477 }
dflet 0:1e7b5dd9edb4 478 #endif
dflet 0:1e7b5dd9edb4 479 /**********************************************************************************************/
dflet 0:1e7b5dd9edb4 480
dflet 0:1e7b5dd9edb4 481
dflet 0:1e7b5dd9edb4 482
dflet 0:1e7b5dd9edb4 483 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 484 /* sl_DnsGetHostByService */
dflet 0:1e7b5dd9edb4 485 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 486 /*
dflet 0:1e7b5dd9edb4 487 * The below struct depicts the constant parameters of the command/API sl_DnsGetHostByService.
dflet 0:1e7b5dd9edb4 488 *
dflet 0:1e7b5dd9edb4 489 1. ServiceLen - The length of the service should be smaller than 255.
dflet 0:1e7b5dd9edb4 490 2. AddrLen - TIPv4 or IPv6 (SL_AF_INET , SL_AF_INET6).
dflet 0:1e7b5dd9edb4 491 *
dflet 0:1e7b5dd9edb4 492 */
dflet 0:1e7b5dd9edb4 493
dflet 0:1e7b5dd9edb4 494 typedef struct {
dflet 0:1e7b5dd9edb4 495 uint8_t ServiceLen;
dflet 0:1e7b5dd9edb4 496 uint8_t AddrLen;
dflet 0:1e7b5dd9edb4 497 uint16_t Padding;
dflet 0:1e7b5dd9edb4 498 } _GetHostByServiceCommand_t;
dflet 0:1e7b5dd9edb4 499
dflet 0:1e7b5dd9edb4 500
dflet 0:1e7b5dd9edb4 501
dflet 0:1e7b5dd9edb4 502 /*
dflet 0:1e7b5dd9edb4 503 * The below structure depict the constant parameters that are returned in the Async event answer
dflet 0:1e7b5dd9edb4 504 * according to command/API sl_DnsGetHostByService for IPv4 and IPv6.
dflet 0:1e7b5dd9edb4 505 *
dflet 0:1e7b5dd9edb4 506 1Status - The status of the response.
dflet 0:1e7b5dd9edb4 507 2.Address - Contains the IP address of the service.
dflet 0:1e7b5dd9edb4 508 3.Port - Contains the port of the service.
dflet 0:1e7b5dd9edb4 509 4.TextLen - Contains the max length of the text that the user wants to get.
dflet 0:1e7b5dd9edb4 510 it means that if the test of service is bigger that its value than
dflet 0:1e7b5dd9edb4 511 the text is cut to inout_TextLen value.
dflet 0:1e7b5dd9edb4 512 Output: Contain the length of the text that is returned. Can be full text or part
dflet 0:1e7b5dd9edb4 513 of the text (see above).
dflet 0:1e7b5dd9edb4 514
dflet 0:1e7b5dd9edb4 515 *
dflet 0:1e7b5dd9edb4 516
dflet 0:1e7b5dd9edb4 517 typedef struct {
dflet 0:1e7b5dd9edb4 518 uint16_t Status;
dflet 0:1e7b5dd9edb4 519 uint16_t TextLen;
dflet 0:1e7b5dd9edb4 520 uint32_t Port;
dflet 0:1e7b5dd9edb4 521 uint32_t Address;
dflet 0:1e7b5dd9edb4 522 } _GetHostByServiceIPv4AsyncResponse_t;
dflet 0:1e7b5dd9edb4 523 */
dflet 0:1e7b5dd9edb4 524
dflet 0:1e7b5dd9edb4 525 typedef struct {
dflet 0:1e7b5dd9edb4 526 uint16_t Status;
dflet 0:1e7b5dd9edb4 527 uint16_t TextLen;
dflet 0:1e7b5dd9edb4 528 uint32_t Port;
dflet 0:1e7b5dd9edb4 529 uint32_t Address[4];
dflet 0:1e7b5dd9edb4 530 } _GetHostByServiceIPv6AsyncResponse_t;
dflet 0:1e7b5dd9edb4 531
dflet 0:1e7b5dd9edb4 532
dflet 0:1e7b5dd9edb4 533 typedef union {
dflet 0:1e7b5dd9edb4 534 _GetHostByServiceIPv4AsyncResponse_t IpV4;
dflet 0:1e7b5dd9edb4 535 _GetHostByServiceIPv6AsyncResponse_t IpV6;
dflet 0:1e7b5dd9edb4 536 } _GetHostByServiceAsyncResponseAttribute_u;
dflet 0:1e7b5dd9edb4 537
dflet 0:1e7b5dd9edb4 538 typedef union {
dflet 0:1e7b5dd9edb4 539 _GetHostByServiceCommand_t Cmd;
dflet 0:1e7b5dd9edb4 540 _BasicResponse_t Rsp;
dflet 0:1e7b5dd9edb4 541 } _SlGetHostByServiceMsg_u;
dflet 0:1e7b5dd9edb4 542
dflet 0:1e7b5dd9edb4 543 #if _SL_INCLUDE_FUNC(sl_NetAppDnsGetHostByService)
dflet 0:1e7b5dd9edb4 544 const _SlCmdCtrl_t _SlGetHostByServiceCtrl = {
dflet 0:1e7b5dd9edb4 545 SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICE,
dflet 0:1e7b5dd9edb4 546 sizeof(_GetHostByServiceCommand_t),
dflet 0:1e7b5dd9edb4 547 sizeof(_BasicResponse_t)
dflet 0:1e7b5dd9edb4 548 };
dflet 0:1e7b5dd9edb4 549
dflet 0:1e7b5dd9edb4 550 int32_t cc3100_netapp::sl_NetAppDnsGetHostByService(unsigned char *pServiceName, /* string containing all (or only part): name + subtype + service */
dflet 0:1e7b5dd9edb4 551 const uint8_t ServiceLen,
dflet 0:1e7b5dd9edb4 552 const uint8_t Family, /* 4-IPv4 , 16-IPv6 */
dflet 0:1e7b5dd9edb4 553 uint32_t pAddr[],
dflet 0:1e7b5dd9edb4 554 uint32_t *pPort,
dflet 0:1e7b5dd9edb4 555 uint16_t *pTextLen, /* in: max len , out: actual len */
dflet 0:1e7b5dd9edb4 556 unsigned char *pText)
dflet 0:1e7b5dd9edb4 557 {
dflet 0:1e7b5dd9edb4 558
dflet 0:1e7b5dd9edb4 559 _SlGetHostByServiceMsg_u Msg;
dflet 0:1e7b5dd9edb4 560 _SlCmdExt_t CmdExt ;
dflet 0:1e7b5dd9edb4 561 _GetHostByServiceAsyncResponse_t AsyncRsp;
dflet 0:1e7b5dd9edb4 562 uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:1e7b5dd9edb4 563
dflet 0:1e7b5dd9edb4 564 /*
dflet 0:1e7b5dd9edb4 565 Note:
dflet 0:1e7b5dd9edb4 566 1. The return's attributes are belonged to first service that is found.
dflet 0:1e7b5dd9edb4 567 It can be other services with the same service name will response to
dflet 0:1e7b5dd9edb4 568 the query. The results of these responses are saved in the peer cache of the NWP, and
dflet 0:1e7b5dd9edb4 569 should be read by another API.
dflet 0:1e7b5dd9edb4 570
dflet 0:1e7b5dd9edb4 571 2. Text length can be 120 bytes only - not more
dflet 0:1e7b5dd9edb4 572 It is because of constraints in the NWP on the buffer that is allocated for the Async event.
dflet 0:1e7b5dd9edb4 573
dflet 0:1e7b5dd9edb4 574 3.The API waits to Async event by blocking. It means that the API is finished only after an Async event
dflet 0:1e7b5dd9edb4 575 is sent by the NWP.
dflet 0:1e7b5dd9edb4 576
dflet 0:1e7b5dd9edb4 577 4.No rolling option!!! - only PTR type is sent.
dflet 0:1e7b5dd9edb4 578
dflet 0:1e7b5dd9edb4 579
dflet 0:1e7b5dd9edb4 580 */
dflet 0:1e7b5dd9edb4 581 /*build the attribute part of the command.
dflet 0:1e7b5dd9edb4 582 It contains the constant parameters of the command */
dflet 0:1e7b5dd9edb4 583
dflet 0:1e7b5dd9edb4 584 Msg.Cmd.ServiceLen = ServiceLen;
dflet 0:1e7b5dd9edb4 585 Msg.Cmd.AddrLen = Family;
dflet 0:1e7b5dd9edb4 586
dflet 0:1e7b5dd9edb4 587 /*Build the payload part of the command
dflet 0:1e7b5dd9edb4 588 Copy the service name and text to one buffer.*/
dflet 0:1e7b5dd9edb4 589 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:1e7b5dd9edb4 590 CmdExt.TxPayloadLen = ServiceLen;
dflet 0:1e7b5dd9edb4 591
dflet 0:1e7b5dd9edb4 592 CmdExt.pTxPayload = (uint8_t *)pServiceName;
dflet 0:1e7b5dd9edb4 593
dflet 0:1e7b5dd9edb4 594
dflet 0:1e7b5dd9edb4 595 /*set pointers to the output parameters (the returned parameters).
dflet 0:1e7b5dd9edb4 596 This pointers are belonged to local struct that is set to global Async response parameter.
dflet 0:1e7b5dd9edb4 597 It is done in order not to run more than one sl_DnsGetHostByService at the same time.
dflet 0:1e7b5dd9edb4 598 The API should be run only if global parameter is pointed to NULL. */
dflet 0:1e7b5dd9edb4 599 AsyncRsp.out_pText = pText;
dflet 0:1e7b5dd9edb4 600 AsyncRsp.inout_TextLen = (uint16_t* )pTextLen;
dflet 0:1e7b5dd9edb4 601 AsyncRsp.out_pPort = pPort;
dflet 0:1e7b5dd9edb4 602 AsyncRsp.out_pAddr = (uint32_t *)pAddr;
dflet 0:1e7b5dd9edb4 603
dflet 0:1e7b5dd9edb4 604
dflet 0:1e7b5dd9edb4 605 ObjIdx = _driver._SlDrvProtectAsyncRespSetting((uint8_t*)&AsyncRsp, GETHOSYBYSERVICE_ID, SL_MAX_SOCKETS);
dflet 0:1e7b5dd9edb4 606
dflet 0:1e7b5dd9edb4 607 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
dflet 0:1e7b5dd9edb4 608 {
dflet 0:1e7b5dd9edb4 609 return SL_POOL_IS_EMPTY;
dflet 0:1e7b5dd9edb4 610 }
dflet 0:1e7b5dd9edb4 611
dflet 0:1e7b5dd9edb4 612 if (SL_AF_INET6 == Family) {
dflet 0:1e7b5dd9edb4 613 g_pCB->ObjPool[ObjIdx].AdditionalData |= SL_NETAPP_FAMILY_MASK;
dflet 0:1e7b5dd9edb4 614 }
dflet 0:1e7b5dd9edb4 615 /* Send the command */
dflet 0:1e7b5dd9edb4 616 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlGetHostByServiceCtrl, &Msg, &CmdExt));
dflet 0:1e7b5dd9edb4 617
dflet 0:1e7b5dd9edb4 618
dflet 0:1e7b5dd9edb4 619
dflet 0:1e7b5dd9edb4 620 /* If the immediate reponse is O.K. than wait for aSYNC event response. */
dflet 0:1e7b5dd9edb4 621 if(SL_RET_CODE_OK == Msg.Rsp.status) {
dflet 0:1e7b5dd9edb4 622 _driver._SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
dflet 0:1e7b5dd9edb4 623
dflet 0:1e7b5dd9edb4 624 /* If we are - it means that Async event was sent.
dflet 0:1e7b5dd9edb4 625 The results are copied in the Async handle return functions */
dflet 0:1e7b5dd9edb4 626
dflet 0:1e7b5dd9edb4 627 Msg.Rsp.status = AsyncRsp.Status;
dflet 0:1e7b5dd9edb4 628 }
dflet 0:1e7b5dd9edb4 629
dflet 0:1e7b5dd9edb4 630 _driver._SlDrvReleasePoolObj(ObjIdx);
dflet 0:1e7b5dd9edb4 631 return Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 632 }
dflet 0:1e7b5dd9edb4 633 #endif
dflet 0:1e7b5dd9edb4 634
dflet 0:1e7b5dd9edb4 635 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 636 /* _sl_HandleAsync_DnsGetHostByAddr */
dflet 0:1e7b5dd9edb4 637 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 638 #ifndef SL_TINY_EXT
dflet 0:1e7b5dd9edb4 639 void cc3100_netapp::_sl_HandleAsync_DnsGetHostByAddr(void *pVoidBuf)
dflet 0:1e7b5dd9edb4 640 {
dflet 0:1e7b5dd9edb4 641 SL_TRACE0(DBG_MSG, MSG_303, "STUB: _sl_HandleAsync_DnsGetHostByAddr not implemented yet!");
dflet 0:1e7b5dd9edb4 642 return;
dflet 0:1e7b5dd9edb4 643 }
dflet 0:1e7b5dd9edb4 644 #endif
dflet 0:1e7b5dd9edb4 645 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 646 /* sl_DnsGetHostByName */
dflet 0:1e7b5dd9edb4 647 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 648 typedef union {
dflet 0:1e7b5dd9edb4 649 _GetHostByNameIPv4AsyncResponse_t IpV4;
dflet 0:1e7b5dd9edb4 650 _GetHostByNameIPv6AsyncResponse_t IpV6;
dflet 0:1e7b5dd9edb4 651 } _GetHostByNameAsyncResponse_u;
dflet 0:1e7b5dd9edb4 652
dflet 0:1e7b5dd9edb4 653 typedef union {
dflet 0:1e7b5dd9edb4 654 _GetHostByNameCommand_t Cmd;
dflet 0:1e7b5dd9edb4 655 _BasicResponse_t Rsp;
dflet 0:1e7b5dd9edb4 656 } _SlGetHostByNameMsg_u;
dflet 0:1e7b5dd9edb4 657
dflet 0:1e7b5dd9edb4 658 #if _SL_INCLUDE_FUNC(sl_NetAppDnsGetHostByName)
dflet 0:1e7b5dd9edb4 659 const _SlCmdCtrl_t _SlGetHostByNameCtrl = {
dflet 0:1e7b5dd9edb4 660 SL_OPCODE_NETAPP_DNSGETHOSTBYNAME,
dflet 0:1e7b5dd9edb4 661 sizeof(_GetHostByNameCommand_t),
dflet 0:1e7b5dd9edb4 662 sizeof(_BasicResponse_t)
dflet 0:1e7b5dd9edb4 663 };
dflet 0:1e7b5dd9edb4 664
dflet 0:1e7b5dd9edb4 665 int16_t cc3100_netapp::sl_NetAppDnsGetHostByName(unsigned char * hostname, const uint16_t usNameLen, uint32_t* out_ip_addr, const uint8_t family)
dflet 0:1e7b5dd9edb4 666 {
dflet 0:1e7b5dd9edb4 667 _SlGetHostByNameMsg_u Msg;
dflet 0:1e7b5dd9edb4 668 _SlCmdExt_t ExtCtrl;
dflet 0:1e7b5dd9edb4 669 _GetHostByNameAsyncResponse_u AsyncRsp;
dflet 0:1e7b5dd9edb4 670 uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:1e7b5dd9edb4 671
dflet 0:1e7b5dd9edb4 672 _driver._SlDrvResetCmdExt(&ExtCtrl);
dflet 0:1e7b5dd9edb4 673 ExtCtrl.TxPayloadLen = usNameLen;
dflet 0:1e7b5dd9edb4 674
dflet 0:1e7b5dd9edb4 675 ExtCtrl.pTxPayload = (unsigned char *)hostname;
dflet 0:1e7b5dd9edb4 676
dflet 0:1e7b5dd9edb4 677
dflet 0:1e7b5dd9edb4 678 Msg.Cmd.Len = usNameLen;
dflet 0:1e7b5dd9edb4 679 Msg.Cmd.family = family;
dflet 0:1e7b5dd9edb4 680
dflet 0:1e7b5dd9edb4 681 /*Use Obj to issue the command, if not available try later */
dflet 0:1e7b5dd9edb4 682 ObjIdx = (uint8_t)_driver._SlDrvWaitForPoolObj(GETHOSYBYNAME_ID,SL_MAX_SOCKETS);
dflet 0:1e7b5dd9edb4 683 if (MAX_CONCURRENT_ACTIONS == ObjIdx) {
dflet 0:1e7b5dd9edb4 684 printf("SL_POOL_IS_EMPTY \r\n");
dflet 0:1e7b5dd9edb4 685 return SL_POOL_IS_EMPTY;
dflet 0:1e7b5dd9edb4 686 }
dflet 0:1e7b5dd9edb4 687
dflet 0:1e7b5dd9edb4 688 _driver._SlDrvProtectionObjLockWaitForever();
dflet 0:1e7b5dd9edb4 689
dflet 0:1e7b5dd9edb4 690 g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&AsyncRsp;
dflet 0:1e7b5dd9edb4 691 /*set bit to indicate IPv6 address is expected */
dflet 0:1e7b5dd9edb4 692 if (SL_AF_INET6 == family) {
dflet 0:1e7b5dd9edb4 693 g_pCB->ObjPool[ObjIdx].AdditionalData |= SL_NETAPP_FAMILY_MASK;
dflet 0:1e7b5dd9edb4 694 }
dflet 0:1e7b5dd9edb4 695
dflet 0:1e7b5dd9edb4 696 _driver._SlDrvProtectionObjUnLock();
dflet 0:1e7b5dd9edb4 697
dflet 0:1e7b5dd9edb4 698 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlGetHostByNameCtrl, &Msg, &ExtCtrl));
dflet 0:1e7b5dd9edb4 699
dflet 0:1e7b5dd9edb4 700 if(SL_RET_CODE_OK == Msg.Rsp.status) {
dflet 0:1e7b5dd9edb4 701 _driver._SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
dflet 0:1e7b5dd9edb4 702 Msg.Rsp.status = AsyncRsp.IpV4.status;
dflet 0:1e7b5dd9edb4 703
dflet 0:1e7b5dd9edb4 704 if(SL_OS_RET_CODE_OK == (int16_t)Msg.Rsp.status) {
dflet 0:1e7b5dd9edb4 705 memcpy((int8_t *)out_ip_addr, (signed char *)&AsyncRsp.IpV4.ip0, (SL_AF_INET == family) ? SL_IPV4_ADDRESS_SIZE : SL_IPV6_ADDRESS_SIZE);
dflet 0:1e7b5dd9edb4 706 }
dflet 0:1e7b5dd9edb4 707 }
dflet 0:1e7b5dd9edb4 708 _driver._SlDrvReleasePoolObj(ObjIdx);
dflet 0:1e7b5dd9edb4 709 return Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 710 }
dflet 0:1e7b5dd9edb4 711 #endif
dflet 0:1e7b5dd9edb4 712
dflet 0:1e7b5dd9edb4 713 #ifndef SL_TINY_EXT
dflet 0:1e7b5dd9edb4 714 void cc3100_netapp::CopyPingResultsToReport(_PingReportResponse_t *pResults,SlPingReport_t *pReport)
dflet 0:1e7b5dd9edb4 715 {
dflet 0:1e7b5dd9edb4 716 pReport->PacketsSent = pResults->numSendsPings;
dflet 0:1e7b5dd9edb4 717 pReport->PacketsReceived = pResults->numSuccsessPings;
dflet 0:1e7b5dd9edb4 718 pReport->MinRoundTime = pResults->rttMin;
dflet 0:1e7b5dd9edb4 719 pReport->MaxRoundTime = pResults->rttMax;
dflet 0:1e7b5dd9edb4 720 pReport->AvgRoundTime = pResults->rttAvg;
dflet 0:1e7b5dd9edb4 721 pReport->TestTime = pResults->testTime;
dflet 0:1e7b5dd9edb4 722 }
dflet 0:1e7b5dd9edb4 723 #endif
dflet 0:1e7b5dd9edb4 724 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 725 /* sl_PingStart */
dflet 0:1e7b5dd9edb4 726 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 727 typedef union {
dflet 0:1e7b5dd9edb4 728 _PingStartCommand_t Cmd;
dflet 0:1e7b5dd9edb4 729 _PingReportResponse_t Rsp;
dflet 0:1e7b5dd9edb4 730 } _SlPingStartMsg_u;
dflet 0:1e7b5dd9edb4 731
dflet 0:1e7b5dd9edb4 732
dflet 0:1e7b5dd9edb4 733 typedef enum {
dflet 0:1e7b5dd9edb4 734 CMD_PING_TEST_RUNNING = 0,
dflet 0:1e7b5dd9edb4 735 CMD_PING_TEST_STOPPED
dflet 0:1e7b5dd9edb4 736 } _SlPingStatus_e;
dflet 0:1e7b5dd9edb4 737
dflet 0:1e7b5dd9edb4 738 P_SL_DEV_PING_CALLBACK pPingCallBackFunc;
dflet 0:1e7b5dd9edb4 739
dflet 0:1e7b5dd9edb4 740 #if _SL_INCLUDE_FUNC(sl_NetAppPingStart)
dflet 0:1e7b5dd9edb4 741 int16_t cc3100_netapp::sl_NetAppPingStart(const SlPingStartCommand_t* pPingParams, const uint8_t family, SlPingReport_t *pReport, const P_SL_DEV_PING_CALLBACK pPingCallback)
dflet 0:1e7b5dd9edb4 742 {
dflet 0:1e7b5dd9edb4 743
dflet 0:1e7b5dd9edb4 744 _SlCmdCtrl_t CmdCtrl = {0, sizeof(_PingStartCommand_t), sizeof(_BasicResponse_t)};
dflet 0:1e7b5dd9edb4 745 _SlPingStartMsg_u Msg;
dflet 0:1e7b5dd9edb4 746 _PingReportResponse_t PingRsp;
dflet 0:1e7b5dd9edb4 747 uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:1e7b5dd9edb4 748
dflet 0:1e7b5dd9edb4 749 if( 0 == pPingParams->Ip )
dflet 0:1e7b5dd9edb4 750 { /* stop any ongoing ping */
dflet 0:1e7b5dd9edb4 751 return _driver._SlDrvBasicCmd(SL_OPCODE_NETAPP_PINGSTOP);
dflet 0:1e7b5dd9edb4 752 }
dflet 0:1e7b5dd9edb4 753
dflet 0:1e7b5dd9edb4 754 if(SL_AF_INET == family) {
dflet 0:1e7b5dd9edb4 755 CmdCtrl.Opcode = SL_OPCODE_NETAPP_PINGSTART;
dflet 0:1e7b5dd9edb4 756 memcpy(&Msg.Cmd.ip0, &pPingParams->Ip, SL_IPV4_ADDRESS_SIZE);
dflet 0:1e7b5dd9edb4 757 } else {
dflet 0:1e7b5dd9edb4 758 CmdCtrl.Opcode = SL_OPCODE_NETAPP_PINGSTART_V6;
dflet 0:1e7b5dd9edb4 759 memcpy(&Msg.Cmd.ip0, &pPingParams->Ip, SL_IPV6_ADDRESS_SIZE);
dflet 0:1e7b5dd9edb4 760 }
dflet 0:1e7b5dd9edb4 761
dflet 0:1e7b5dd9edb4 762 Msg.Cmd.pingIntervalTime = pPingParams->PingIntervalTime;
dflet 0:1e7b5dd9edb4 763 Msg.Cmd.PingSize = pPingParams->PingSize;
dflet 0:1e7b5dd9edb4 764 Msg.Cmd.pingRequestTimeout = pPingParams->PingRequestTimeout;
dflet 0:1e7b5dd9edb4 765 Msg.Cmd.totalNumberOfAttempts = pPingParams->TotalNumberOfAttempts;
dflet 0:1e7b5dd9edb4 766 Msg.Cmd.flags = pPingParams->Flags;
dflet 0:1e7b5dd9edb4 767
dflet 0:1e7b5dd9edb4 768 if( pPingCallback ) {
dflet 0:1e7b5dd9edb4 769 pPingCallBackFunc = pPingCallback;
dflet 0:1e7b5dd9edb4 770 } else {
dflet 0:1e7b5dd9edb4 771 /*Use Obj to issue the command, if not available try later */
dflet 0:1e7b5dd9edb4 772 ObjIdx = (uint8_t)_driver._SlDrvWaitForPoolObj(PING_ID,SL_MAX_SOCKETS);
dflet 0:1e7b5dd9edb4 773 if (MAX_CONCURRENT_ACTIONS == ObjIdx) {
dflet 0:1e7b5dd9edb4 774 return SL_POOL_IS_EMPTY;
dflet 0:1e7b5dd9edb4 775 }
dflet 0:1e7b5dd9edb4 776 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 777 OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, SL_OS_WAIT_FOREVER));
dflet 0:1e7b5dd9edb4 778 #else
dflet 0:1e7b5dd9edb4 779 OSI_RET_OK_CHECK(sl_LockObjLock(&g_pCB->ProtectionLockObj, SL_OS_WAIT_FOREVER));
dflet 0:1e7b5dd9edb4 780 #endif
dflet 0:1e7b5dd9edb4 781 /* async response handler for non callback mode */
dflet 0:1e7b5dd9edb4 782 g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&PingRsp;
dflet 0:1e7b5dd9edb4 783 pPingCallBackFunc = NULL;
dflet 0:1e7b5dd9edb4 784 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 785 OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj));
dflet 0:1e7b5dd9edb4 786 #else
dflet 0:1e7b5dd9edb4 787 OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->ProtectionLockObj));
dflet 0:1e7b5dd9edb4 788 #endif
dflet 0:1e7b5dd9edb4 789 }
dflet 0:1e7b5dd9edb4 790
dflet 0:1e7b5dd9edb4 791
dflet 0:1e7b5dd9edb4 792 VERIFY_RET_OK(_driver._SlDrvCmdOp(&CmdCtrl, &Msg, NULL));
dflet 0:1e7b5dd9edb4 793 /*send the command*/
dflet 0:1e7b5dd9edb4 794 if(CMD_PING_TEST_RUNNING == (int16_t)Msg.Rsp.status || CMD_PING_TEST_STOPPED == (int16_t)Msg.Rsp.status ) {
dflet 0:1e7b5dd9edb4 795 /* block waiting for results if no callback function is used */
dflet 0:1e7b5dd9edb4 796 if( NULL == pPingCallback ) {
dflet 0:1e7b5dd9edb4 797 _driver._SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
dflet 0:1e7b5dd9edb4 798 if( SL_OS_RET_CODE_OK == (int16_t)PingRsp.status ) {
dflet 0:1e7b5dd9edb4 799 CopyPingResultsToReport(&PingRsp,pReport);
dflet 0:1e7b5dd9edb4 800 }
dflet 0:1e7b5dd9edb4 801 _driver._SlDrvReleasePoolObj(ObjIdx);
dflet 0:1e7b5dd9edb4 802 }
dflet 0:1e7b5dd9edb4 803 } else {
dflet 0:1e7b5dd9edb4 804 /* ping failure, no async response */
dflet 0:1e7b5dd9edb4 805 if( NULL == pPingCallback ) {
dflet 0:1e7b5dd9edb4 806 _driver._SlDrvReleasePoolObj(ObjIdx);
dflet 0:1e7b5dd9edb4 807 }
dflet 0:1e7b5dd9edb4 808 }
dflet 0:1e7b5dd9edb4 809
dflet 0:1e7b5dd9edb4 810 return Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 811 }
dflet 0:1e7b5dd9edb4 812 #endif
dflet 0:1e7b5dd9edb4 813
dflet 0:1e7b5dd9edb4 814 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 815 /* sl_NetAppSet */
dflet 0:1e7b5dd9edb4 816 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 817 typedef union {
dflet 0:1e7b5dd9edb4 818 _NetAppSetGet_t Cmd;
dflet 0:1e7b5dd9edb4 819 _BasicResponse_t Rsp;
dflet 0:1e7b5dd9edb4 820 } _SlNetAppMsgSet_u;
dflet 0:1e7b5dd9edb4 821
dflet 0:1e7b5dd9edb4 822 #if _SL_INCLUDE_FUNC(sl_NetAppSet)
dflet 0:1e7b5dd9edb4 823 const _SlCmdCtrl_t _SlNetAppSetCmdCtrl = {
dflet 0:1e7b5dd9edb4 824 SL_OPCODE_NETAPP_NETAPPSET,
dflet 0:1e7b5dd9edb4 825 sizeof(_NetAppSetGet_t),
dflet 0:1e7b5dd9edb4 826 sizeof(_BasicResponse_t)
dflet 0:1e7b5dd9edb4 827 };
dflet 0:1e7b5dd9edb4 828
dflet 0:1e7b5dd9edb4 829 int32_t cc3100_netapp::sl_NetAppSet(const uint8_t AppId ,const uint8_t Option, const uint8_t OptionLen, const uint8_t *pOptionValue)
dflet 0:1e7b5dd9edb4 830 {
dflet 0:1e7b5dd9edb4 831
dflet 0:1e7b5dd9edb4 832 _SlNetAppMsgSet_u Msg;
dflet 0:1e7b5dd9edb4 833 _SlCmdExt_t CmdExt;
dflet 0:1e7b5dd9edb4 834
dflet 0:1e7b5dd9edb4 835 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:1e7b5dd9edb4 836 CmdExt.TxPayloadLen = (OptionLen+3) & (~3);
dflet 0:1e7b5dd9edb4 837
dflet 0:1e7b5dd9edb4 838 CmdExt.pTxPayload = (uint8_t *)pOptionValue;
dflet 0:1e7b5dd9edb4 839
dflet 0:1e7b5dd9edb4 840 Msg.Cmd.AppId = AppId;
dflet 0:1e7b5dd9edb4 841 Msg.Cmd.ConfigLen = OptionLen;
dflet 0:1e7b5dd9edb4 842 Msg.Cmd.ConfigOpt = Option;
dflet 0:1e7b5dd9edb4 843
dflet 0:1e7b5dd9edb4 844 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlNetAppSetCmdCtrl, &Msg, &CmdExt));
dflet 0:1e7b5dd9edb4 845
dflet 0:1e7b5dd9edb4 846 return (int16_t)Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 847 }
dflet 0:1e7b5dd9edb4 848 #endif
dflet 0:1e7b5dd9edb4 849
dflet 0:1e7b5dd9edb4 850 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 851 /* sl_NetAppSendTokenValue */
dflet 0:1e7b5dd9edb4 852 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 853 typedef union {
dflet 0:1e7b5dd9edb4 854 sl_NetAppHttpServerSendToken_t Cmd;
dflet 0:1e7b5dd9edb4 855 _BasicResponse_t Rsp;
dflet 0:1e7b5dd9edb4 856 } _SlNetAppMsgSendTokenValue_u;
dflet 0:1e7b5dd9edb4 857
dflet 0:1e7b5dd9edb4 858 #if defined(sl_HttpServerCallback) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)
dflet 0:1e7b5dd9edb4 859 const _SlCmdCtrl_t _SlNetAppSendTokenValueCmdCtrl = {
dflet 0:1e7b5dd9edb4 860 SL_OPCODE_NETAPP_HTTPSENDTOKENVALUE,
dflet 0:1e7b5dd9edb4 861 sizeof(sl_NetAppHttpServerSendToken_t),
dflet 0:1e7b5dd9edb4 862 sizeof(_BasicResponse_t)
dflet 0:1e7b5dd9edb4 863 };
dflet 0:1e7b5dd9edb4 864
dflet 0:1e7b5dd9edb4 865 uint16_t cc3100_netapp::sl_NetAppSendTokenValue(slHttpServerData_t * Token_value)
dflet 0:1e7b5dd9edb4 866 {
dflet 0:1e7b5dd9edb4 867
dflet 0:1e7b5dd9edb4 868 _SlNetAppMsgSendTokenValue_u Msg;
dflet 0:1e7b5dd9edb4 869 _SlCmdExt_t CmdExt;
dflet 0:1e7b5dd9edb4 870
dflet 0:1e7b5dd9edb4 871 CmdExt.TxPayloadLen = (Token_value->value_len+3) & (~3);
dflet 0:1e7b5dd9edb4 872 CmdExt.RxPayloadLen = 0;
dflet 0:1e7b5dd9edb4 873 CmdExt.pTxPayload = (uint8_t *) Token_value->token_value;
dflet 0:1e7b5dd9edb4 874 CmdExt.pRxPayload = NULL;
dflet 0:1e7b5dd9edb4 875
dflet 0:1e7b5dd9edb4 876 Msg.Cmd.token_value_len = Token_value->value_len;
dflet 0:1e7b5dd9edb4 877 Msg.Cmd.token_name_len = Token_value->name_len;
dflet 0:1e7b5dd9edb4 878 memcpy(&Msg.Cmd.token_name[0], Token_value->token_name, Token_value->name_len);
dflet 0:1e7b5dd9edb4 879
dflet 0:1e7b5dd9edb4 880
dflet 0:1e7b5dd9edb4 881 VERIFY_RET_OK(_driver._SlDrvCmdSend((_SlCmdCtrl_t *)&_SlNetAppSendTokenValueCmdCtrl, &Msg, &CmdExt));
dflet 0:1e7b5dd9edb4 882
dflet 0:1e7b5dd9edb4 883 return Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 884 }
dflet 0:1e7b5dd9edb4 885 #endif
dflet 0:1e7b5dd9edb4 886
dflet 0:1e7b5dd9edb4 887 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 888 /* sl_NetAppGet */
dflet 0:1e7b5dd9edb4 889 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 890 typedef union {
dflet 0:1e7b5dd9edb4 891 _NetAppSetGet_t Cmd;
dflet 0:1e7b5dd9edb4 892 _NetAppSetGet_t Rsp;
dflet 0:1e7b5dd9edb4 893 } _SlNetAppMsgGet_u;
dflet 0:1e7b5dd9edb4 894
dflet 0:1e7b5dd9edb4 895 #if _SL_INCLUDE_FUNC(sl_NetAppGet)
dflet 0:1e7b5dd9edb4 896 const _SlCmdCtrl_t _SlNetAppGetCmdCtrl = {
dflet 0:1e7b5dd9edb4 897 SL_OPCODE_NETAPP_NETAPPGET,
dflet 0:1e7b5dd9edb4 898 sizeof(_NetAppSetGet_t),
dflet 0:1e7b5dd9edb4 899 sizeof(_NetAppSetGet_t)
dflet 0:1e7b5dd9edb4 900 };
dflet 0:1e7b5dd9edb4 901
dflet 0:1e7b5dd9edb4 902 int32_t cc3100_netapp::sl_NetAppGet(const uint8_t AppId, const uint8_t Option, uint8_t *pOptionLen, uint8_t *pOptionValue)
dflet 0:1e7b5dd9edb4 903 {
dflet 0:1e7b5dd9edb4 904 _SlNetAppMsgGet_u Msg;
dflet 0:1e7b5dd9edb4 905 _SlCmdExt_t CmdExt;
dflet 0:1e7b5dd9edb4 906
dflet 0:1e7b5dd9edb4 907 if (*pOptionLen == 0) {
dflet 0:1e7b5dd9edb4 908 return SL_EZEROLEN;
dflet 0:1e7b5dd9edb4 909 }
dflet 0:1e7b5dd9edb4 910
dflet 0:1e7b5dd9edb4 911 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:1e7b5dd9edb4 912 CmdExt.RxPayloadLen = *pOptionLen;
dflet 0:1e7b5dd9edb4 913
dflet 0:1e7b5dd9edb4 914 CmdExt.pRxPayload = (uint8_t *)pOptionValue;
dflet 0:1e7b5dd9edb4 915
dflet 0:1e7b5dd9edb4 916 Msg.Cmd.AppId = AppId;
dflet 0:1e7b5dd9edb4 917 Msg.Cmd.ConfigOpt = Option;
dflet 0:1e7b5dd9edb4 918 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlNetAppGetCmdCtrl, &Msg, &CmdExt));
dflet 0:1e7b5dd9edb4 919
dflet 0:1e7b5dd9edb4 920
dflet 0:1e7b5dd9edb4 921 if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) {
dflet 0:1e7b5dd9edb4 922 *pOptionLen = (uint8_t)CmdExt.RxPayloadLen;
dflet 0:1e7b5dd9edb4 923 return SL_ESMALLBUF;
dflet 0:1e7b5dd9edb4 924 } else {
dflet 0:1e7b5dd9edb4 925 *pOptionLen = (uint8_t)CmdExt.ActualRxPayloadLen;
dflet 0:1e7b5dd9edb4 926 }
dflet 0:1e7b5dd9edb4 927
dflet 0:1e7b5dd9edb4 928 return (int16_t)Msg.Rsp.Status;
dflet 0:1e7b5dd9edb4 929 }
dflet 0:1e7b5dd9edb4 930 #endif
dflet 0:1e7b5dd9edb4 931
dflet 0:1e7b5dd9edb4 932 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 933 cc3100_flowcont::cc3100_flowcont(cc3100_driver &driver, cc3100_nonos &nonos)
dflet 0:1e7b5dd9edb4 934 : _driver(driver), _nonos(nonos)
dflet 0:1e7b5dd9edb4 935 {
dflet 0:1e7b5dd9edb4 936 }
dflet 0:1e7b5dd9edb4 937 #else
dflet 0:1e7b5dd9edb4 938 cc3100_flowcont::cc3100_flowcont(cc3100_driver &driver)
dflet 0:1e7b5dd9edb4 939 : _driver(driver)
dflet 0:1e7b5dd9edb4 940 {
dflet 0:1e7b5dd9edb4 941 }
dflet 0:1e7b5dd9edb4 942 #endif
dflet 0:1e7b5dd9edb4 943 cc3100_flowcont::~cc3100_flowcont()
dflet 0:1e7b5dd9edb4 944 {
dflet 0:1e7b5dd9edb4 945
dflet 0:1e7b5dd9edb4 946 }
dflet 0:1e7b5dd9edb4 947 #if 0
dflet 0:1e7b5dd9edb4 948 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 949 /* _SlDrvFlowContInit */
dflet 0:1e7b5dd9edb4 950 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 951 void cc3100_flowcont::_SlDrvFlowContInit(void)
dflet 0:1e7b5dd9edb4 952 {
dflet 0:1e7b5dd9edb4 953 g_pCB->FlowContCB.TxPoolCnt = FLOW_CONT_MIN;
dflet 0:1e7b5dd9edb4 954
dflet 0:1e7b5dd9edb4 955 OSI_RET_OK_CHECK(_nonos.sl_LockObjCreate(&g_pCB->FlowContCB.TxLockObj, "TxLockObj"));
dflet 0:1e7b5dd9edb4 956
dflet 0:1e7b5dd9edb4 957 OSI_RET_OK_CHECK(_nonos.sl_SyncObjCreate(&g_pCB->FlowContCB.TxSyncObj, "TxSyncObj"));
dflet 0:1e7b5dd9edb4 958 }
dflet 0:1e7b5dd9edb4 959
dflet 0:1e7b5dd9edb4 960 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 961 /* _SlDrvFlowContDeinit */
dflet 0:1e7b5dd9edb4 962 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 963 void cc3100_flowcont::_SlDrvFlowContDeinit(void)
dflet 0:1e7b5dd9edb4 964 {
dflet 0:1e7b5dd9edb4 965 g_pCB->FlowContCB.TxPoolCnt = 0;
dflet 0:1e7b5dd9edb4 966
dflet 0:1e7b5dd9edb4 967 OSI_RET_OK_CHECK(_nonos.sl_LockObjDelete(&g_pCB->FlowContCB.TxLockObj, 0));
dflet 0:1e7b5dd9edb4 968
dflet 0:1e7b5dd9edb4 969 OSI_RET_OK_CHECK(_nonos.sl_SyncObjDelete(&g_pCB->FlowContCB.TxSyncObj, 0));
dflet 0:1e7b5dd9edb4 970 }
dflet 0:1e7b5dd9edb4 971 #endif
dflet 0:1e7b5dd9edb4 972 }//namespace mbed_cc3100
dflet 0:1e7b5dd9edb4 973
dflet 0:1e7b5dd9edb4 974