Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.

Dependencies:   mbed

Committer:
dflet
Date:
Tue Sep 15 16:45:04 2015 +0000
Revision:
22:f9b5e0b80bf2
Parent:
16:7e5aab2fabba
Removed some debug.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:50cedd586816 1 /*
dflet 0:50cedd586816 2 * wlan.c - CC31xx/CC32xx Host Driver Implementation
dflet 0:50cedd586816 3 *
dflet 0:50cedd586816 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:50cedd586816 5 *
dflet 0:50cedd586816 6 *
dflet 0:50cedd586816 7 * Redistribution and use in source and binary forms, with or without
dflet 0:50cedd586816 8 * modification, are permitted provided that the following conditions
dflet 0:50cedd586816 9 * are met:
dflet 0:50cedd586816 10 *
dflet 0:50cedd586816 11 * Redistributions of source code must retain the above copyright
dflet 0:50cedd586816 12 * notice, this list of conditions and the following disclaimer.
dflet 0:50cedd586816 13 *
dflet 0:50cedd586816 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:50cedd586816 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:50cedd586816 16 * documentation and/or other materials provided with the
dflet 0:50cedd586816 17 * distribution.
dflet 0:50cedd586816 18 *
dflet 0:50cedd586816 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:50cedd586816 20 * its contributors may be used to endorse or promote products derived
dflet 0:50cedd586816 21 * from this software without specific prior written permission.
dflet 0:50cedd586816 22 *
dflet 0:50cedd586816 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:50cedd586816 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:50cedd586816 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:50cedd586816 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:50cedd586816 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:50cedd586816 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:50cedd586816 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:50cedd586816 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:50cedd586816 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:50cedd586816 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:50cedd586816 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:50cedd586816 34 *
dflet 0:50cedd586816 35 */
dflet 0:50cedd586816 36
dflet 0:50cedd586816 37
dflet 0:50cedd586816 38
dflet 0:50cedd586816 39 /*****************************************************************************/
dflet 0:50cedd586816 40 /* Include files */
dflet 0:50cedd586816 41 /*****************************************************************************/
dflet 0:50cedd586816 42 #include "cc3100_simplelink.h"
dflet 0:50cedd586816 43 #include "cc3100_protocol.h"
dflet 0:50cedd586816 44 #include "cc3100_driver.h"
dflet 0:50cedd586816 45
dflet 0:50cedd586816 46 #include "cc3100_wlan.h"
dflet 0:50cedd586816 47 #include "cc3100_wlan_rx_filters.h"
dflet 0:50cedd586816 48
dflet 0:50cedd586816 49 /*****************************************************************************/
dflet 0:50cedd586816 50 /* Macro declarations */
dflet 0:50cedd586816 51 /*****************************************************************************/
dflet 0:50cedd586816 52 #define MAX_SSID_LEN (32)
dflet 0:50cedd586816 53 #define MAX_KEY_LEN (63)
dflet 0:50cedd586816 54 #define MAX_USER_LEN (32)
dflet 0:50cedd586816 55 #define MAX_ANON_USER_LEN (32)
dflet 0:50cedd586816 56 #define MAX_SMART_CONFIG_KEY (16)
dflet 0:50cedd586816 57
dflet 0:50cedd586816 58 namespace mbed_cc3100 {
dflet 0:50cedd586816 59
dflet 0:50cedd586816 60 cc3100_wlan::cc3100_wlan(cc3100_driver &driver, cc3100_wlan_rx_filters &wlan_filters)
dflet 0:50cedd586816 61 : _driver(driver), _wlan_filters(wlan_filters)
dflet 0:50cedd586816 62 {
dflet 0:50cedd586816 63
dflet 0:50cedd586816 64 }
dflet 0:50cedd586816 65
dflet 0:50cedd586816 66 cc3100_wlan::~cc3100_wlan()
dflet 0:50cedd586816 67 {
dflet 0:50cedd586816 68
dflet 0:50cedd586816 69 }
dflet 0:50cedd586816 70
dflet 0:50cedd586816 71 /*****************************************************************************
dflet 0:50cedd586816 72 sl_WlanConnect
dflet 0:50cedd586816 73 *****************************************************************************/
dflet 0:50cedd586816 74 typedef struct {
dflet 0:50cedd586816 75 _WlanConnectEapCommand_t Args;
dflet 0:50cedd586816 76 int8_t Strings[MAX_SSID_LEN + MAX_KEY_LEN + MAX_USER_LEN + MAX_ANON_USER_LEN];
dflet 0:50cedd586816 77 } _WlanConnectCmd_t;
dflet 0:50cedd586816 78
dflet 0:50cedd586816 79 typedef union {
dflet 0:50cedd586816 80 _WlanConnectCmd_t Cmd;
dflet 0:50cedd586816 81 _BasicResponse_t Rsp;
dflet 0:50cedd586816 82 } _SlWlanConnectMsg_u;
dflet 0:50cedd586816 83
dflet 0:50cedd586816 84
dflet 0:50cedd586816 85 #if _SL_INCLUDE_FUNC(sl_WlanConnect)
dflet 0:50cedd586816 86 int16_t cc3100_wlan::sl_WlanConnect(const signed char* pName, const int16_t NameLen, const uint8_t *pMacAddr, const SlSecParams_t* pSecParams , const SlSecParamsExt_t* pSecExtParams)
dflet 0:50cedd586816 87 {
dflet 0:50cedd586816 88 _SlWlanConnectMsg_u Msg = {0};
dflet 0:50cedd586816 89 _SlCmdCtrl_t CmdCtrl = {0};
dflet 0:50cedd586816 90
dflet 0:50cedd586816 91 CmdCtrl.TxDescLen = 0;/* init */
dflet 0:50cedd586816 92 CmdCtrl.RxDescLen = sizeof(_BasicResponse_t);
dflet 0:50cedd586816 93
dflet 0:50cedd586816 94 /* verify SSID length */
dflet 0:50cedd586816 95 VERIFY_PROTOCOL(NameLen <= MAX_SSID_LEN);
dflet 0:50cedd586816 96 /* verify SSID is not NULL */
dflet 0:50cedd586816 97 if( NULL == pName )
dflet 0:50cedd586816 98 {
dflet 0:50cedd586816 99 return SL_INVALPARAM;
dflet 0:50cedd586816 100 }
dflet 0:50cedd586816 101
dflet 0:50cedd586816 102 /* update SSID length */
dflet 0:50cedd586816 103 Msg.Cmd.Args.Common.SsidLen = (uint8_t)NameLen;
dflet 0:50cedd586816 104 /* Profile with no security */
dflet 0:50cedd586816 105 /* Enterprise security profile */
dflet 0:50cedd586816 106 if (NULL != pSecExtParams) {
dflet 0:50cedd586816 107 /* Update command opcode */
dflet 0:50cedd586816 108 CmdCtrl.Opcode = SL_OPCODE_WLAN_WLANCONNECTEAPCOMMAND;
dflet 0:50cedd586816 109 CmdCtrl.TxDescLen += sizeof(_WlanConnectEapCommand_t);
dflet 0:50cedd586816 110 /* copy SSID */
dflet 0:50cedd586816 111 memcpy(EAP_SSID_STRING(&Msg), pName, NameLen);
dflet 0:50cedd586816 112 CmdCtrl.TxDescLen += NameLen;
dflet 0:50cedd586816 113 /* Copy password if supplied */
dflet 0:50cedd586816 114 if ((NULL != pSecParams) && (pSecParams->KeyLen > 0)) {
dflet 0:50cedd586816 115 /* update security type */
dflet 0:50cedd586816 116 Msg.Cmd.Args.Common.SecType = pSecParams->Type;
dflet 0:50cedd586816 117 /* verify key length */
dflet 0:50cedd586816 118 if (pSecParams->KeyLen > MAX_KEY_LEN) {
dflet 0:50cedd586816 119 return SL_INVALPARAM;
dflet 0:50cedd586816 120 }
dflet 0:50cedd586816 121 /* update key length */
dflet 0:50cedd586816 122 Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen;
dflet 0:50cedd586816 123 ARG_CHECK_PTR(pSecParams->Key);
dflet 0:50cedd586816 124 /* copy key */
dflet 0:50cedd586816 125 memcpy(EAP_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen);
dflet 0:50cedd586816 126 CmdCtrl.TxDescLen += pSecParams->KeyLen;
dflet 0:50cedd586816 127 } else {
dflet 0:50cedd586816 128 Msg.Cmd.Args.Common.PasswordLen = 0;
dflet 0:50cedd586816 129 }
dflet 0:50cedd586816 130 ARG_CHECK_PTR(pSecExtParams);
dflet 0:50cedd586816 131 /* Update Eap bitmask */
dflet 0:50cedd586816 132 Msg.Cmd.Args.EapBitmask = pSecExtParams->EapMethod;
dflet 0:50cedd586816 133 /* Update Certificate file ID index - currently not supported */
dflet 0:50cedd586816 134 Msg.Cmd.Args.CertIndex = pSecExtParams->CertIndex;
dflet 0:50cedd586816 135 /* verify user length */
dflet 0:50cedd586816 136 if (pSecExtParams->UserLen > MAX_USER_LEN) {
dflet 0:50cedd586816 137 return SL_INVALPARAM;
dflet 0:50cedd586816 138 }
dflet 0:50cedd586816 139 Msg.Cmd.Args.UserLen = pSecExtParams->UserLen;
dflet 0:50cedd586816 140 /* copy user name (identity) */
dflet 0:50cedd586816 141 if(pSecExtParams->UserLen > 0) {
dflet 0:50cedd586816 142 memcpy(EAP_USER_STRING(&Msg), pSecExtParams->User, pSecExtParams->UserLen);
dflet 0:50cedd586816 143 CmdCtrl.TxDescLen += pSecExtParams->UserLen;
dflet 0:50cedd586816 144 }
dflet 0:50cedd586816 145 /* verify Anonymous user length */
dflet 0:50cedd586816 146 if (pSecExtParams->AnonUserLen > MAX_ANON_USER_LEN) {
dflet 0:50cedd586816 147 return SL_INVALPARAM;
dflet 0:50cedd586816 148 }
dflet 0:50cedd586816 149 Msg.Cmd.Args.AnonUserLen = pSecExtParams->AnonUserLen;
dflet 0:50cedd586816 150 /* copy Anonymous user */
dflet 0:50cedd586816 151 if(pSecExtParams->AnonUserLen > 0) {
dflet 0:50cedd586816 152 memcpy(EAP_ANON_USER_STRING(&Msg), pSecExtParams->AnonUser, pSecExtParams->AnonUserLen);
dflet 0:50cedd586816 153 CmdCtrl.TxDescLen += pSecExtParams->AnonUserLen;
dflet 0:50cedd586816 154 }
dflet 0:50cedd586816 155
dflet 0:50cedd586816 156 }
dflet 0:50cedd586816 157
dflet 0:50cedd586816 158 /* Regular or open security profile */
dflet 0:50cedd586816 159 else {
dflet 0:50cedd586816 160 /* Update command opcode */
dflet 0:50cedd586816 161 CmdCtrl.Opcode = SL_OPCODE_WLAN_WLANCONNECTCOMMAND;
dflet 0:50cedd586816 162 CmdCtrl.TxDescLen += sizeof(_WlanConnectCommon_t);
dflet 0:50cedd586816 163 /* copy SSID */
dflet 0:50cedd586816 164 memcpy(SSID_STRING(&Msg), pName, NameLen);
dflet 0:50cedd586816 165 CmdCtrl.TxDescLen += NameLen;
dflet 0:50cedd586816 166 /* Copy password if supplied */
dflet 0:50cedd586816 167 if( NULL != pSecParams ) {
dflet 0:50cedd586816 168 /* update security type */
dflet 0:50cedd586816 169 Msg.Cmd.Args.Common.SecType = pSecParams->Type;
dflet 0:50cedd586816 170 /* verify key length is valid */
dflet 0:50cedd586816 171 if (pSecParams->KeyLen > MAX_KEY_LEN) {
dflet 0:50cedd586816 172 return SL_INVALPARAM;
dflet 0:50cedd586816 173 }
dflet 0:50cedd586816 174 /* update key length */
dflet 0:50cedd586816 175 Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen;
dflet 0:50cedd586816 176 CmdCtrl.TxDescLen += pSecParams->KeyLen;
dflet 0:50cedd586816 177 /* copy key (could be no key in case of WPS pin) */
dflet 0:50cedd586816 178 if( NULL != pSecParams->Key ) {
dflet 0:50cedd586816 179 memcpy(PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen);
dflet 0:50cedd586816 180 }
dflet 0:50cedd586816 181 }
dflet 0:50cedd586816 182 /* Profile with no security */
dflet 0:50cedd586816 183 else {
dflet 0:50cedd586816 184 Msg.Cmd.Args.Common.PasswordLen = 0;
dflet 0:50cedd586816 185 Msg.Cmd.Args.Common.SecType = SL_SEC_TYPE_OPEN;
dflet 0:50cedd586816 186 }
dflet 0:50cedd586816 187 }
dflet 0:50cedd586816 188 /* If BSSID is not null, copy to buffer, otherwise set to 0 */
dflet 0:50cedd586816 189 if(NULL != pMacAddr) {
dflet 0:50cedd586816 190 memcpy(Msg.Cmd.Args.Common.Bssid, pMacAddr, sizeof(Msg.Cmd.Args.Common.Bssid));
dflet 0:50cedd586816 191 } else {
dflet 0:50cedd586816 192 _driver._SlDrvMemZero(Msg.Cmd.Args.Common.Bssid, sizeof(Msg.Cmd.Args.Common.Bssid));
dflet 0:50cedd586816 193 }
dflet 0:50cedd586816 194
dflet 0:50cedd586816 195 VERIFY_RET_OK ( _driver._SlDrvCmdOp(&CmdCtrl, &Msg, NULL));
dflet 0:50cedd586816 196 return (int16_t)Msg.Rsp.status;
dflet 0:50cedd586816 197 }
dflet 0:50cedd586816 198 #endif
dflet 0:50cedd586816 199
dflet 0:50cedd586816 200 /*******************************************************************************/
dflet 0:50cedd586816 201 /* sl_Disconnect */
dflet 0:50cedd586816 202 /* ******************************************************************************/
dflet 0:50cedd586816 203 #if _SL_INCLUDE_FUNC(sl_WlanDisconnect)
dflet 0:50cedd586816 204 int16_t cc3100_wlan::sl_WlanDisconnect(void)
dflet 0:50cedd586816 205 {
dflet 0:50cedd586816 206 return _driver._SlDrvBasicCmd(SL_OPCODE_WLAN_WLANDISCONNECTCOMMAND);
dflet 0:50cedd586816 207 }
dflet 0:50cedd586816 208 #endif
dflet 0:50cedd586816 209
dflet 0:50cedd586816 210 /******************************************************************************/
dflet 0:50cedd586816 211 /* sl_PolicySet */
dflet 0:50cedd586816 212 /******************************************************************************/
dflet 0:50cedd586816 213 typedef union {
dflet 0:50cedd586816 214 _WlanPoliciySetGet_t Cmd;
dflet 0:50cedd586816 215 _BasicResponse_t Rsp;
dflet 0:50cedd586816 216 } _SlPolicyMsg_u;
dflet 0:50cedd586816 217
dflet 0:50cedd586816 218 #if _SL_INCLUDE_FUNC(sl_WlanPolicySet)
dflet 0:50cedd586816 219 const _SlCmdCtrl_t _SlPolicySetCmdCtrl = {
dflet 0:50cedd586816 220 SL_OPCODE_WLAN_POLICYSETCOMMAND,
dflet 0:50cedd586816 221 sizeof(_WlanPoliciySetGet_t),
dflet 0:50cedd586816 222 sizeof(_BasicResponse_t)
dflet 0:50cedd586816 223 };
dflet 0:50cedd586816 224
dflet 0:50cedd586816 225 int16_t cc3100_wlan::sl_WlanPolicySet(const uint8_t Type , const uint8_t Policy, uint8_t *pVal, const uint8_t ValLen)
dflet 0:50cedd586816 226 {
dflet 0:50cedd586816 227
dflet 0:50cedd586816 228 _SlPolicyMsg_u Msg;
dflet 0:50cedd586816 229 _SlCmdExt_t CmdExt;
dflet 0:50cedd586816 230
dflet 0:50cedd586816 231 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:50cedd586816 232 CmdExt.TxPayloadLen = ValLen;
dflet 0:50cedd586816 233 CmdExt.pTxPayload = (uint8_t *)pVal;
dflet 0:50cedd586816 234
dflet 0:50cedd586816 235 Msg.Cmd.PolicyType = Type;
dflet 0:50cedd586816 236 Msg.Cmd.PolicyOption = Policy;
dflet 0:50cedd586816 237 Msg.Cmd.PolicyOptionLen = ValLen;
dflet 0:50cedd586816 238
dflet 0:50cedd586816 239 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlPolicySetCmdCtrl, &Msg, &CmdExt));
dflet 0:50cedd586816 240
dflet 0:50cedd586816 241 return (int16_t)Msg.Rsp.status;
dflet 0:50cedd586816 242 }
dflet 0:50cedd586816 243 #endif
dflet 0:50cedd586816 244
dflet 0:50cedd586816 245
dflet 0:50cedd586816 246 /******************************************************************************/
dflet 0:50cedd586816 247 /* sl_PolicyGet */
dflet 0:50cedd586816 248 /******************************************************************************/
dflet 0:50cedd586816 249 typedef union {
dflet 0:50cedd586816 250 _WlanPoliciySetGet_t Cmd;
dflet 0:50cedd586816 251 _WlanPoliciySetGet_t Rsp;
dflet 0:50cedd586816 252 } _SlPolicyGetMsg_u;
dflet 0:50cedd586816 253
dflet 0:50cedd586816 254 #if _SL_INCLUDE_FUNC(sl_WlanPolicyGet)
dflet 0:50cedd586816 255 const _SlCmdCtrl_t _SlPolicyGetCmdCtrl = {
dflet 0:50cedd586816 256 SL_OPCODE_WLAN_POLICYGETCOMMAND,
dflet 0:50cedd586816 257 sizeof(_WlanPoliciySetGet_t),
dflet 0:50cedd586816 258 sizeof(_WlanPoliciySetGet_t)
dflet 0:50cedd586816 259 };
dflet 0:50cedd586816 260
dflet 0:50cedd586816 261 int16_t cc3100_wlan::sl_WlanPolicyGet(const uint8_t Type , uint8_t Policy,uint8_t *pVal,uint8_t *pValLen)
dflet 0:50cedd586816 262 {
dflet 0:50cedd586816 263 _SlPolicyGetMsg_u Msg;
dflet 0:50cedd586816 264 _SlCmdExt_t CmdExt;
dflet 0:50cedd586816 265
dflet 0:50cedd586816 266 if (*pValLen == 0) {
dflet 0:50cedd586816 267 return SL_EZEROLEN;
dflet 0:50cedd586816 268 }
dflet 0:50cedd586816 269 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:50cedd586816 270 CmdExt.RxPayloadLen = *pValLen;
dflet 0:50cedd586816 271 CmdExt.pRxPayload = pVal;
dflet 0:50cedd586816 272
dflet 0:50cedd586816 273 Msg.Cmd.PolicyType = Type;
dflet 0:50cedd586816 274 Msg.Cmd.PolicyOption = Policy;
dflet 0:50cedd586816 275 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlPolicyGetCmdCtrl, &Msg, &CmdExt));
dflet 0:50cedd586816 276
dflet 0:50cedd586816 277
dflet 0:50cedd586816 278 if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) {
dflet 0:50cedd586816 279 *pValLen = Msg.Rsp.PolicyOptionLen;
dflet 0:50cedd586816 280 return SL_ESMALLBUF;
dflet 0:50cedd586816 281 } else {
dflet 0:50cedd586816 282 /* no pointer valus, fill the results into int8_t */
dflet 0:50cedd586816 283 *pValLen = (uint8_t)CmdExt.ActualRxPayloadLen;
dflet 0:50cedd586816 284 if( 0 == CmdExt.ActualRxPayloadLen ) {
dflet 0:50cedd586816 285 *pValLen = 1;
dflet 0:50cedd586816 286 pVal[0] = Msg.Rsp.PolicyOption;
dflet 0:50cedd586816 287 }
dflet 0:50cedd586816 288 }
dflet 0:50cedd586816 289 return (int16_t)SL_OS_RET_CODE_OK;
dflet 0:50cedd586816 290 }
dflet 0:50cedd586816 291 #endif
dflet 0:50cedd586816 292
dflet 0:50cedd586816 293
dflet 0:50cedd586816 294 /*******************************************************************************/
dflet 0:50cedd586816 295 /* sl_ProfileAdd */
dflet 0:50cedd586816 296 /*******************************************************************************/
dflet 0:50cedd586816 297 typedef struct {
dflet 0:50cedd586816 298 _WlanAddGetEapProfile_t Args;
dflet 0:50cedd586816 299 int8_t Strings[MAX_SSID_LEN + MAX_KEY_LEN + MAX_USER_LEN + MAX_ANON_USER_LEN];
dflet 0:50cedd586816 300 } _SlProfileParams_t;
dflet 0:50cedd586816 301
dflet 0:50cedd586816 302 typedef union {
dflet 0:50cedd586816 303 _SlProfileParams_t Cmd;
dflet 0:50cedd586816 304 _BasicResponse_t Rsp;
dflet 0:50cedd586816 305 } _SlProfileAddMsg_u;
dflet 0:50cedd586816 306
dflet 0:50cedd586816 307
dflet 0:50cedd586816 308
dflet 0:50cedd586816 309 #if _SL_INCLUDE_FUNC(sl_WlanProfileAdd)
dflet 0:50cedd586816 310 int16_t cc3100_wlan::sl_WlanProfileAdd(const int8_t* pName,
dflet 0:50cedd586816 311 const int16_t NameLen,
dflet 0:50cedd586816 312 const uint8_t *pMacAddr,
dflet 0:50cedd586816 313 const SlSecParams_t* pSecParams ,
dflet 0:50cedd586816 314 const SlSecParamsExt_t* pSecExtParams,
dflet 0:50cedd586816 315 const uint32_t Priority,
dflet 0:50cedd586816 316 const uint32_t Options)
dflet 0:50cedd586816 317 {
dflet 0:50cedd586816 318 _SlProfileAddMsg_u Msg;
dflet 0:50cedd586816 319 _SlCmdCtrl_t CmdCtrl = {0};
dflet 0:50cedd586816 320 CmdCtrl.TxDescLen = 0;/* init */
dflet 0:50cedd586816 321 CmdCtrl.RxDescLen = sizeof(_BasicResponse_t);
dflet 0:50cedd586816 322
dflet 0:50cedd586816 323 /* update priority */
dflet 0:50cedd586816 324 Msg.Cmd.Args.Common.Priority = (uint8_t)Priority;
dflet 0:50cedd586816 325 /* verify SSID is not NULL */
dflet 0:50cedd586816 326 if( NULL == pName )
dflet 0:50cedd586816 327 {
dflet 0:50cedd586816 328 return SL_INVALPARAM;
dflet 0:50cedd586816 329 }
dflet 0:50cedd586816 330
dflet 0:50cedd586816 331 /* verify SSID length */
dflet 0:50cedd586816 332 VERIFY_PROTOCOL(NameLen <= MAX_SSID_LEN);
dflet 0:50cedd586816 333 /* update SSID length */
dflet 0:50cedd586816 334 Msg.Cmd.Args.Common.SsidLen = (uint8_t)NameLen;
dflet 0:50cedd586816 335
dflet 0:50cedd586816 336
dflet 0:50cedd586816 337 /* Enterprise security profile */
dflet 0:50cedd586816 338 if (NULL != pSecExtParams) {
dflet 0:50cedd586816 339 /* Update command opcode */
dflet 0:50cedd586816 340 CmdCtrl.Opcode = SL_OPCODE_WLAN_EAP_PROFILEADDCOMMAND;
dflet 0:50cedd586816 341 CmdCtrl.TxDescLen += sizeof(_WlanAddGetEapProfile_t);
dflet 0:50cedd586816 342
dflet 0:50cedd586816 343 /* copy SSID */
dflet 0:50cedd586816 344 memcpy(EAP_PROFILE_SSID_STRING(&Msg), pName, NameLen);
dflet 0:50cedd586816 345 CmdCtrl.TxDescLen += NameLen;
dflet 0:50cedd586816 346
dflet 0:50cedd586816 347 /* Copy password if supplied */
dflet 0:50cedd586816 348 if ((NULL != pSecParams) && (pSecParams->KeyLen > 0)) {
dflet 0:50cedd586816 349 /* update security type */
dflet 0:50cedd586816 350 Msg.Cmd.Args.Common.SecType = pSecParams->Type;
dflet 0:50cedd586816 351
dflet 0:50cedd586816 352 if( SL_SEC_TYPE_WEP == Msg.Cmd.Args.Common.SecType ) {
dflet 0:50cedd586816 353 Msg.Cmd.Args.Common.WepKeyId = 0;
dflet 0:50cedd586816 354 }
dflet 0:50cedd586816 355
dflet 0:50cedd586816 356 /* verify key length */
dflet 0:50cedd586816 357 if (pSecParams->KeyLen > MAX_KEY_LEN) {
dflet 0:50cedd586816 358 return SL_INVALPARAM;
dflet 0:50cedd586816 359 }
dflet 0:50cedd586816 360 VERIFY_PROTOCOL(pSecParams->KeyLen <= MAX_KEY_LEN);
dflet 0:50cedd586816 361 /* update key length */
dflet 0:50cedd586816 362 Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen;
dflet 0:50cedd586816 363 CmdCtrl.TxDescLen += pSecParams->KeyLen;
dflet 0:50cedd586816 364 ARG_CHECK_PTR(pSecParams->Key);
dflet 0:50cedd586816 365 /* copy key */
dflet 0:50cedd586816 366 memcpy(EAP_PROFILE_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen);
dflet 0:50cedd586816 367 } else {
dflet 0:50cedd586816 368 Msg.Cmd.Args.Common.PasswordLen = 0;
dflet 0:50cedd586816 369 }
dflet 0:50cedd586816 370
dflet 0:50cedd586816 371 ARG_CHECK_PTR(pSecExtParams);
dflet 0:50cedd586816 372 /* Update Eap bitmask */
dflet 0:50cedd586816 373 Msg.Cmd.Args.EapBitmask = pSecExtParams->EapMethod;
dflet 0:50cedd586816 374 /* Update Certificate file ID index - currently not supported */
dflet 0:50cedd586816 375 Msg.Cmd.Args.CertIndex = pSecExtParams->CertIndex;
dflet 0:50cedd586816 376 /* verify user length */
dflet 0:50cedd586816 377 if (pSecExtParams->UserLen > MAX_USER_LEN) {
dflet 0:50cedd586816 378 return SL_INVALPARAM;
dflet 0:50cedd586816 379 }
dflet 0:50cedd586816 380 Msg.Cmd.Args.UserLen = pSecExtParams->UserLen;
dflet 0:50cedd586816 381 /* copy user name (identity) */
dflet 0:50cedd586816 382 if(pSecExtParams->UserLen > 0) {
dflet 0:50cedd586816 383 memcpy(EAP_PROFILE_USER_STRING(&Msg), pSecExtParams->User, pSecExtParams->UserLen);
dflet 0:50cedd586816 384 CmdCtrl.TxDescLen += pSecExtParams->UserLen;
dflet 0:50cedd586816 385 }
dflet 0:50cedd586816 386
dflet 0:50cedd586816 387 /* verify Anonymous user length (for tunneled) */
dflet 0:50cedd586816 388 if (pSecExtParams->AnonUserLen > MAX_ANON_USER_LEN) {
dflet 0:50cedd586816 389 return SL_INVALPARAM;
dflet 0:50cedd586816 390 }
dflet 0:50cedd586816 391 Msg.Cmd.Args.AnonUserLen = pSecExtParams->AnonUserLen;
dflet 0:50cedd586816 392
dflet 0:50cedd586816 393 /* copy Anonymous user */
dflet 0:50cedd586816 394 if(pSecExtParams->AnonUserLen > 0) {
dflet 0:50cedd586816 395 memcpy(EAP_PROFILE_ANON_USER_STRING(&Msg), pSecExtParams->AnonUser, pSecExtParams->AnonUserLen);
dflet 0:50cedd586816 396 CmdCtrl.TxDescLen += pSecExtParams->AnonUserLen;
dflet 0:50cedd586816 397 }
dflet 0:50cedd586816 398
dflet 0:50cedd586816 399 }
dflet 0:50cedd586816 400 /* Regular or open security profile */
dflet 0:50cedd586816 401 else {
dflet 0:50cedd586816 402 /* Update command opcode */
dflet 0:50cedd586816 403 CmdCtrl.Opcode = SL_OPCODE_WLAN_PROFILEADDCOMMAND;
dflet 0:50cedd586816 404 /* update commnad length */
dflet 0:50cedd586816 405 CmdCtrl.TxDescLen += sizeof(_WlanAddGetProfile_t);
dflet 0:50cedd586816 406
dflet 0:50cedd586816 407 if (NULL != pName) {
dflet 0:50cedd586816 408 /* copy SSID */
dflet 0:50cedd586816 409 memcpy(PROFILE_SSID_STRING(&Msg), pName, NameLen);
dflet 0:50cedd586816 410 CmdCtrl.TxDescLen += NameLen;
dflet 0:50cedd586816 411 }
dflet 0:50cedd586816 412
dflet 0:50cedd586816 413 /* Copy password if supplied */
dflet 0:50cedd586816 414 if( NULL != pSecParams ) {
dflet 0:50cedd586816 415 /* update security type */
dflet 0:50cedd586816 416 Msg.Cmd.Args.Common.SecType = pSecParams->Type;
dflet 0:50cedd586816 417
dflet 0:50cedd586816 418 if( SL_SEC_TYPE_WEP == Msg.Cmd.Args.Common.SecType ) {
dflet 0:50cedd586816 419 Msg.Cmd.Args.Common.WepKeyId = 0;
dflet 0:50cedd586816 420 }
dflet 0:50cedd586816 421
dflet 0:50cedd586816 422 /* verify key length */
dflet 0:50cedd586816 423 if (pSecParams->KeyLen > MAX_KEY_LEN) {
dflet 0:50cedd586816 424 return SL_INVALPARAM;
dflet 0:50cedd586816 425 }
dflet 0:50cedd586816 426 /* update key length */
dflet 0:50cedd586816 427 Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen;
dflet 0:50cedd586816 428 CmdCtrl.TxDescLen += pSecParams->KeyLen;
dflet 0:50cedd586816 429 /* copy key (could be no key in case of WPS pin) */
dflet 0:50cedd586816 430 if( NULL != pSecParams->Key ) {
dflet 0:50cedd586816 431 memcpy(PROFILE_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen);
dflet 0:50cedd586816 432 }
dflet 0:50cedd586816 433 } else {
dflet 0:50cedd586816 434 Msg.Cmd.Args.Common.SecType = SL_SEC_TYPE_OPEN;
dflet 0:50cedd586816 435 Msg.Cmd.Args.Common.PasswordLen = 0;
dflet 0:50cedd586816 436 }
dflet 0:50cedd586816 437
dflet 0:50cedd586816 438 }
dflet 0:50cedd586816 439
dflet 0:50cedd586816 440
dflet 0:50cedd586816 441 /* If BSSID is not null, copy to buffer, otherwise set to 0 */
dflet 0:50cedd586816 442 if(NULL != pMacAddr) {
dflet 0:50cedd586816 443 memcpy(Msg.Cmd.Args.Common.Bssid, pMacAddr, sizeof(Msg.Cmd.Args.Common.Bssid));
dflet 0:50cedd586816 444 } else {
dflet 0:50cedd586816 445 _driver._SlDrvMemZero(Msg.Cmd.Args.Common.Bssid, sizeof(Msg.Cmd.Args.Common.Bssid));
dflet 0:50cedd586816 446 }
dflet 0:50cedd586816 447
dflet 0:50cedd586816 448 VERIFY_RET_OK(_driver._SlDrvCmdOp(&CmdCtrl, &Msg, NULL));
dflet 0:50cedd586816 449
dflet 0:50cedd586816 450 return (int16_t)Msg.Rsp.status;
dflet 0:50cedd586816 451 }
dflet 0:50cedd586816 452 #endif
dflet 0:50cedd586816 453
dflet 0:50cedd586816 454 /*******************************************************************************/
dflet 0:50cedd586816 455 /* sl_ProfileGet */
dflet 0:50cedd586816 456 /*******************************************************************************/
dflet 0:50cedd586816 457 typedef union {
dflet 0:50cedd586816 458 _WlanProfileDelGetCommand_t Cmd;
dflet 0:50cedd586816 459 _SlProfileParams_t Rsp;
dflet 0:50cedd586816 460 } _SlProfileGetMsg_u;
dflet 0:50cedd586816 461
dflet 0:50cedd586816 462 #if _SL_INCLUDE_FUNC(sl_WlanProfileGet)
dflet 0:50cedd586816 463 const _SlCmdCtrl_t _SlProfileGetCmdCtrl = {
dflet 0:50cedd586816 464 SL_OPCODE_WLAN_PROFILEGETCOMMAND,
dflet 0:50cedd586816 465 sizeof(_WlanProfileDelGetCommand_t),
dflet 0:50cedd586816 466 sizeof(_SlProfileParams_t)
dflet 0:50cedd586816 467 };
dflet 0:50cedd586816 468
dflet 0:50cedd586816 469 int16_t cc3100_wlan::sl_WlanProfileGet(const int16_t Index,int8_t* pName, int16_t *pNameLen, uint8_t *pMacAddr, SlSecParams_t* pSecParams, SlGetSecParamsExt_t* pEntParams, uint32_t *pPriority)
dflet 0:50cedd586816 470 {
dflet 0:50cedd586816 471 _SlProfileGetMsg_u Msg;
dflet 0:50cedd586816 472 Msg.Cmd.index = (uint8_t)Index;
dflet 0:50cedd586816 473
dflet 0:50cedd586816 474 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlProfileGetCmdCtrl, &Msg, NULL));
dflet 0:50cedd586816 475
dflet 0:50cedd586816 476 pSecParams->Type = Msg.Rsp.Args.Common.SecType;
dflet 0:50cedd586816 477 /* since password is not transferred in getprofile, password length should always be zero */
dflet 0:50cedd586816 478 pSecParams->KeyLen = Msg.Rsp.Args.Common.PasswordLen;
dflet 0:50cedd586816 479 if (NULL != pEntParams) {
dflet 0:50cedd586816 480 pEntParams->UserLen = Msg.Rsp.Args.UserLen;
dflet 0:50cedd586816 481 /* copy user name */
dflet 0:50cedd586816 482 if (pEntParams->UserLen > 0) {
dflet 0:50cedd586816 483 memcpy(pEntParams->User, EAP_PROFILE_USER_STRING(&Msg), pEntParams->UserLen);
dflet 0:50cedd586816 484 }
dflet 0:50cedd586816 485 pEntParams->AnonUserLen = Msg.Rsp.Args.AnonUserLen;
dflet 0:50cedd586816 486 /* copy anonymous user name */
dflet 0:50cedd586816 487 if (pEntParams->AnonUserLen > 0) {
dflet 0:50cedd586816 488 memcpy(pEntParams->AnonUser, EAP_PROFILE_ANON_USER_STRING(&Msg), pEntParams->AnonUserLen);
dflet 0:50cedd586816 489 }
dflet 0:50cedd586816 490 }
dflet 0:50cedd586816 491
dflet 0:50cedd586816 492 *pNameLen = Msg.Rsp.Args.Common.SsidLen;
dflet 0:50cedd586816 493 *pPriority = Msg.Rsp.Args.Common.Priority;
dflet 0:50cedd586816 494
dflet 0:50cedd586816 495 if (NULL != Msg.Rsp.Args.Common.Bssid) {
dflet 0:50cedd586816 496 memcpy(pMacAddr, Msg.Rsp.Args.Common.Bssid, sizeof(Msg.Rsp.Args.Common.Bssid));
dflet 0:50cedd586816 497 }
dflet 0:50cedd586816 498
dflet 0:50cedd586816 499 memcpy(pName, EAP_PROFILE_SSID_STRING(&Msg), *pNameLen);
dflet 0:50cedd586816 500
dflet 0:50cedd586816 501 return (int16_t)Msg.Rsp.Args.Common.SecType;
dflet 0:50cedd586816 502
dflet 0:50cedd586816 503 }
dflet 0:50cedd586816 504 #endif
dflet 0:50cedd586816 505
dflet 0:50cedd586816 506 /*******************************************************************************/
dflet 0:50cedd586816 507 /* sl_ProfileDel */
dflet 0:50cedd586816 508 /*******************************************************************************/
dflet 0:50cedd586816 509 typedef union {
dflet 0:50cedd586816 510 _WlanProfileDelGetCommand_t Cmd;
dflet 0:50cedd586816 511 _BasicResponse_t Rsp;
dflet 0:50cedd586816 512 } _SlProfileDelMsg_u;
dflet 0:50cedd586816 513
dflet 0:50cedd586816 514 #if _SL_INCLUDE_FUNC(sl_WlanProfileDel)
dflet 0:50cedd586816 515 const _SlCmdCtrl_t _SlProfileDelCmdCtrl = {
dflet 0:50cedd586816 516 SL_OPCODE_WLAN_PROFILEDELCOMMAND,
dflet 0:50cedd586816 517 sizeof(_WlanProfileDelGetCommand_t),
dflet 0:50cedd586816 518 sizeof(_BasicResponse_t)
dflet 0:50cedd586816 519 };
dflet 0:50cedd586816 520
dflet 0:50cedd586816 521 int16_t cc3100_wlan::sl_WlanProfileDel(const int16_t Index)
dflet 0:50cedd586816 522 {
dflet 0:50cedd586816 523 _SlProfileDelMsg_u Msg;
dflet 0:50cedd586816 524
dflet 0:50cedd586816 525 Msg.Cmd.index = (uint8_t)Index;
dflet 0:50cedd586816 526
dflet 0:50cedd586816 527 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlProfileDelCmdCtrl, &Msg, NULL));
dflet 0:50cedd586816 528
dflet 0:50cedd586816 529 return (int16_t)Msg.Rsp.status;
dflet 0:50cedd586816 530 }
dflet 0:50cedd586816 531 #endif
dflet 0:50cedd586816 532
dflet 0:50cedd586816 533 /******************************************************************************/
dflet 0:50cedd586816 534 /* sl_WlanGetNetworkList */
dflet 0:50cedd586816 535 /******************************************************************************/
dflet 0:50cedd586816 536 typedef union {
dflet 0:50cedd586816 537 _WlanGetNetworkListCommand_t Cmd;
dflet 0:50cedd586816 538 _WlanGetNetworkListResponse_t Rsp;
dflet 0:50cedd586816 539 } _SlWlanGetNetworkListMsg_u;
dflet 0:50cedd586816 540
dflet 0:50cedd586816 541 #if _SL_INCLUDE_FUNC(sl_WlanGetNetworkList)
dflet 0:50cedd586816 542 const _SlCmdCtrl_t _SlWlanGetNetworkListCtrl = {
dflet 0:50cedd586816 543 SL_OPCODE_WLAN_SCANRESULTSGETCOMMAND,
dflet 0:50cedd586816 544 sizeof(_WlanGetNetworkListCommand_t),
dflet 0:50cedd586816 545 sizeof(_WlanGetNetworkListResponse_t)
dflet 0:50cedd586816 546 };
dflet 0:50cedd586816 547
dflet 0:50cedd586816 548 int16_t cc3100_wlan::sl_WlanGetNetworkList(const uint8_t Index, const uint8_t Count, Sl_WlanNetworkEntry_t *pEntries)
dflet 0:50cedd586816 549 {
dflet 0:50cedd586816 550 int16_t retVal = 0;
dflet 0:50cedd586816 551 _SlWlanGetNetworkListMsg_u Msg;
dflet 0:50cedd586816 552 _SlCmdExt_t CmdExt;
dflet 0:50cedd586816 553
dflet 0:50cedd586816 554 if (Count == 0) {
dflet 0:50cedd586816 555 return SL_EZEROLEN;
dflet 0:50cedd586816 556 }
dflet 0:50cedd586816 557
dflet 0:50cedd586816 558 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:50cedd586816 559 CmdExt.RxPayloadLen = sizeof(Sl_WlanNetworkEntry_t)*(Count);
dflet 0:50cedd586816 560 CmdExt.pRxPayload = (uint8_t *)pEntries;
dflet 0:50cedd586816 561
dflet 0:50cedd586816 562 Msg.Cmd.index = Index;
dflet 0:50cedd586816 563 Msg.Cmd.count = Count;
dflet 0:50cedd586816 564
dflet 0:50cedd586816 565 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanGetNetworkListCtrl, &Msg, &CmdExt));
dflet 0:50cedd586816 566 retVal = Msg.Rsp.status;
dflet 0:50cedd586816 567
dflet 0:50cedd586816 568 return (int16_t)retVal;
dflet 0:50cedd586816 569 }
dflet 0:50cedd586816 570 #endif
dflet 0:50cedd586816 571
dflet 0:50cedd586816 572 /*******************************************************************************/
dflet 0:50cedd586816 573 /* sl_WlanRxStatStart */
dflet 0:50cedd586816 574 /*******************************************************************************/
dflet 0:50cedd586816 575 #if _SL_INCLUDE_FUNC(sl_WlanRxStatStart)
dflet 0:50cedd586816 576 int16_t cc3100_wlan::sl_WlanRxStatStart(void)
dflet 0:50cedd586816 577 {
dflet 0:50cedd586816 578 return _driver._SlDrvBasicCmd(SL_OPCODE_WLAN_STARTRXSTATCOMMAND);
dflet 0:50cedd586816 579 }
dflet 0:50cedd586816 580 #endif
dflet 0:50cedd586816 581
dflet 0:50cedd586816 582 #if _SL_INCLUDE_FUNC(sl_WlanRxStatStop)
dflet 0:50cedd586816 583 int16_t cc3100_wlan::sl_WlanRxStatStop(void)
dflet 0:50cedd586816 584 {
dflet 0:50cedd586816 585 return _driver._SlDrvBasicCmd(SL_OPCODE_WLAN_STOPRXSTATCOMMAND);
dflet 0:50cedd586816 586 }
dflet 0:50cedd586816 587 #endif
dflet 0:50cedd586816 588
dflet 0:50cedd586816 589 #if _SL_INCLUDE_FUNC(sl_WlanRxStatGet)
dflet 0:50cedd586816 590 int16_t cc3100_wlan::sl_WlanRxStatGet(SlGetRxStatResponse_t *pRxStat, const uint32_t Flags)
dflet 0:50cedd586816 591 {
dflet 0:50cedd586816 592 _SlCmdCtrl_t CmdCtrl = {SL_OPCODE_WLAN_GETRXSTATCOMMAND, 0, sizeof(SlGetRxStatResponse_t)};
dflet 0:50cedd586816 593 _driver._SlDrvMemZero(pRxStat, sizeof(SlGetRxStatResponse_t));
dflet 0:50cedd586816 594 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&CmdCtrl, pRxStat, NULL));
dflet 0:50cedd586816 595
dflet 0:50cedd586816 596 return 0;
dflet 0:50cedd586816 597 }
dflet 0:50cedd586816 598 #endif
dflet 0:50cedd586816 599
dflet 0:50cedd586816 600
dflet 0:50cedd586816 601
dflet 0:50cedd586816 602 /******************************************************************************/
dflet 0:50cedd586816 603 /* sl_WlanSmartConfigStop */
dflet 0:50cedd586816 604 /******************************************************************************/
dflet 0:50cedd586816 605 #if _SL_INCLUDE_FUNC(sl_WlanSmartConfigStop)
dflet 0:50cedd586816 606 int16_t cc3100_wlan::sl_WlanSmartConfigStop(void)
dflet 0:50cedd586816 607 {
dflet 0:50cedd586816 608 return _driver._SlDrvBasicCmd(SL_OPCODE_WLAN_SMART_CONFIG_STOP_COMMAND);
dflet 0:50cedd586816 609 }
dflet 0:50cedd586816 610 #endif
dflet 0:50cedd586816 611
dflet 0:50cedd586816 612
dflet 0:50cedd586816 613 /******************************************************************************/
dflet 0:50cedd586816 614 /* sl_WlanSmartConfigStart */
dflet 0:50cedd586816 615 /******************************************************************************/
dflet 0:50cedd586816 616
dflet 0:50cedd586816 617
dflet 0:50cedd586816 618 typedef struct {
dflet 0:50cedd586816 619 _WlanSmartConfigStartCommand_t Args;
dflet 0:50cedd586816 620 int8_t Strings[3 * MAX_SMART_CONFIG_KEY]; /* public key + groupId1 key + groupId2 key */
dflet 0:50cedd586816 621 } _SlSmartConfigStart_t;
dflet 0:50cedd586816 622
dflet 0:50cedd586816 623 typedef union {
dflet 0:50cedd586816 624 _SlSmartConfigStart_t Cmd;
dflet 0:50cedd586816 625 _BasicResponse_t Rsp;
dflet 0:50cedd586816 626 } _SlSmartConfigStartMsg_u;
dflet 0:50cedd586816 627
dflet 0:50cedd586816 628 const _SlCmdCtrl_t _SlSmartConfigStartCmdCtrl = {
dflet 0:50cedd586816 629 SL_OPCODE_WLAN_SMART_CONFIG_START_COMMAND,
dflet 0:50cedd586816 630 sizeof(_SlSmartConfigStart_t),
dflet 0:50cedd586816 631 sizeof(_BasicResponse_t)
dflet 0:50cedd586816 632 };
dflet 0:50cedd586816 633
dflet 0:50cedd586816 634 #if _SL_INCLUDE_FUNC(sl_WlanSmartConfigStart)
dflet 0:50cedd586816 635 int16_t cc3100_wlan::sl_WlanSmartConfigStart( const uint32_t groupIdBitmask,
dflet 0:50cedd586816 636 const uint8_t cipher,
dflet 0:50cedd586816 637 const uint8_t publicKeyLen,
dflet 0:50cedd586816 638 const uint8_t group1KeyLen,
dflet 0:50cedd586816 639 const uint8_t group2KeyLen,
dflet 0:50cedd586816 640 const uint8_t* pPublicKey,
dflet 0:50cedd586816 641 const uint8_t* pGroup1Key,
dflet 0:50cedd586816 642 const uint8_t* pGroup2Key)
dflet 0:50cedd586816 643 {
dflet 0:50cedd586816 644 _SlSmartConfigStartMsg_u Msg;
dflet 0:50cedd586816 645
dflet 0:50cedd586816 646 Msg.Cmd.Args.groupIdBitmask = (uint8_t)groupIdBitmask;
dflet 0:50cedd586816 647 Msg.Cmd.Args.cipher = (uint8_t)cipher;
dflet 0:50cedd586816 648 Msg.Cmd.Args.publicKeyLen = (uint8_t)publicKeyLen;
dflet 0:50cedd586816 649 Msg.Cmd.Args.group1KeyLen = (uint8_t)group1KeyLen;
dflet 0:50cedd586816 650 Msg.Cmd.Args.group2KeyLen = (uint8_t)group2KeyLen;
dflet 0:50cedd586816 651
dflet 0:50cedd586816 652 /* copy keys (if exist) after command (one after another) */
dflet 0:50cedd586816 653 memcpy(SMART_CONFIG_START_PUBLIC_KEY_STRING(&Msg), pPublicKey, publicKeyLen);
dflet 0:50cedd586816 654 memcpy(SMART_CONFIG_START_GROUP1_KEY_STRING(&Msg), pGroup1Key, group1KeyLen);
dflet 0:50cedd586816 655 memcpy(SMART_CONFIG_START_GROUP2_KEY_STRING(&Msg), pGroup2Key, group2KeyLen);
dflet 0:50cedd586816 656
dflet 0:50cedd586816 657 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlSmartConfigStartCmdCtrl , &Msg, NULL));
dflet 0:50cedd586816 658
dflet 0:50cedd586816 659 return (int16_t)Msg.Rsp.status;
dflet 0:50cedd586816 660
dflet 0:50cedd586816 661
dflet 0:50cedd586816 662 }
dflet 0:50cedd586816 663 #endif
dflet 0:50cedd586816 664
dflet 0:50cedd586816 665 /*******************************************************************************/
dflet 0:50cedd586816 666 /* sl_WlanSetMode */
dflet 0:50cedd586816 667 /*******************************************************************************/
dflet 0:50cedd586816 668 typedef union {
dflet 0:50cedd586816 669 _WlanSetMode_t Cmd;
dflet 0:50cedd586816 670 _BasicResponse_t Rsp;
dflet 0:50cedd586816 671 } _SlwlanSetModeMsg_u;
dflet 0:50cedd586816 672
dflet 0:50cedd586816 673 const _SlCmdCtrl_t _SlWlanSetModeCmdCtrl = {
dflet 0:50cedd586816 674 SL_OPCODE_WLAN_SET_MODE,
dflet 0:50cedd586816 675 sizeof(_WlanSetMode_t),
dflet 0:50cedd586816 676 sizeof(_BasicResponse_t)
dflet 0:50cedd586816 677 };
dflet 0:50cedd586816 678
dflet 0:50cedd586816 679 /* possible values are:
dflet 0:50cedd586816 680 WLAN_SET_STA_MODE = 1
dflet 0:50cedd586816 681 WLAN_SET_AP_MODE = 2
dflet 0:50cedd586816 682 WLAN_SET_P2P_MODE = 3 */
dflet 0:50cedd586816 683 #if _SL_INCLUDE_FUNC(sl_WlanSetMode)
dflet 0:50cedd586816 684 int16_t cc3100_wlan::sl_WlanSetMode(const uint8_t mode)
dflet 0:50cedd586816 685 {
dflet 0:50cedd586816 686 _SlwlanSetModeMsg_u Msg;
dflet 0:50cedd586816 687
dflet 0:50cedd586816 688 Msg.Cmd.mode = mode;
dflet 0:50cedd586816 689
dflet 0:50cedd586816 690 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanSetModeCmdCtrl , &Msg, NULL));
dflet 16:7e5aab2fabba 691
dflet 0:50cedd586816 692 return (int16_t)Msg.Rsp.status;
dflet 0:50cedd586816 693
dflet 0:50cedd586816 694 }
dflet 0:50cedd586816 695 #endif
dflet 0:50cedd586816 696
dflet 0:50cedd586816 697 /*******************************************************************************/
dflet 0:50cedd586816 698 /* sl_WlanSet */
dflet 0:50cedd586816 699 /* ******************************************************************************/
dflet 0:50cedd586816 700 typedef union {
dflet 0:50cedd586816 701 _WlanCfgSetGet_t Cmd;
dflet 0:50cedd586816 702 _BasicResponse_t Rsp;
dflet 0:50cedd586816 703 } _SlWlanCfgSetMsg_u;
dflet 0:50cedd586816 704
dflet 0:50cedd586816 705 #if _SL_INCLUDE_FUNC(sl_WlanSet)
dflet 0:50cedd586816 706 const _SlCmdCtrl_t _SlWlanCfgSetCmdCtrl = {
dflet 0:50cedd586816 707 SL_OPCODE_WLAN_CFG_SET,
dflet 0:50cedd586816 708 sizeof(_WlanCfgSetGet_t),
dflet 0:50cedd586816 709 sizeof(_BasicResponse_t)
dflet 0:50cedd586816 710 };
dflet 0:50cedd586816 711
dflet 0:50cedd586816 712 int16_t cc3100_wlan::sl_WlanSet(const uint16_t ConfigId, const uint16_t ConfigOpt, const uint16_t ConfigLen, const uint8_t *pValues)
dflet 0:50cedd586816 713 {
dflet 0:50cedd586816 714 _SlWlanCfgSetMsg_u Msg;
dflet 0:50cedd586816 715 _SlCmdExt_t CmdExt;
dflet 0:50cedd586816 716
dflet 0:50cedd586816 717 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:50cedd586816 718 CmdExt.TxPayloadLen = (ConfigLen+3) & (~3);
dflet 0:50cedd586816 719 CmdExt.pTxPayload = (uint8_t *)pValues;
dflet 0:50cedd586816 720
dflet 0:50cedd586816 721
dflet 0:50cedd586816 722 Msg.Cmd.ConfigId = ConfigId;
dflet 0:50cedd586816 723 Msg.Cmd.ConfigLen = ConfigLen;
dflet 0:50cedd586816 724 Msg.Cmd.ConfigOpt = ConfigOpt;
dflet 0:50cedd586816 725
dflet 0:50cedd586816 726 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanCfgSetCmdCtrl, &Msg, &CmdExt));
dflet 0:50cedd586816 727
dflet 0:50cedd586816 728 return (int16_t)Msg.Rsp.status;
dflet 0:50cedd586816 729 }
dflet 0:50cedd586816 730 #endif
dflet 0:50cedd586816 731
dflet 0:50cedd586816 732
dflet 0:50cedd586816 733 /******************************************************************************/
dflet 0:50cedd586816 734 /* sl_WlanGet */
dflet 0:50cedd586816 735 /******************************************************************************/
dflet 0:50cedd586816 736 typedef union {
dflet 0:50cedd586816 737 _WlanCfgSetGet_t Cmd;
dflet 0:50cedd586816 738 _WlanCfgSetGet_t Rsp;
dflet 0:50cedd586816 739 } _SlWlanCfgMsgGet_u;
dflet 0:50cedd586816 740
dflet 0:50cedd586816 741 #if _SL_INCLUDE_FUNC(sl_WlanGet)
dflet 0:50cedd586816 742 const _SlCmdCtrl_t _SlWlanCfgGetCmdCtrl = {
dflet 0:50cedd586816 743 SL_OPCODE_WLAN_CFG_GET,
dflet 0:50cedd586816 744 sizeof(_WlanCfgSetGet_t),
dflet 0:50cedd586816 745 sizeof(_WlanCfgSetGet_t)
dflet 0:50cedd586816 746 };
dflet 0:50cedd586816 747
dflet 0:50cedd586816 748 int16_t cc3100_wlan::sl_WlanGet(const uint16_t ConfigId, uint16_t *pConfigOpt,uint16_t *pConfigLen, uint8_t *pValues)
dflet 0:50cedd586816 749 {
dflet 0:50cedd586816 750 _SlWlanCfgMsgGet_u Msg;
dflet 0:50cedd586816 751 _SlCmdExt_t CmdExt;
dflet 0:50cedd586816 752
dflet 0:50cedd586816 753 if (*pConfigLen == 0) {
dflet 0:50cedd586816 754 return SL_EZEROLEN;
dflet 0:50cedd586816 755 }
dflet 0:50cedd586816 756
dflet 0:50cedd586816 757 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:50cedd586816 758 CmdExt.RxPayloadLen = *pConfigLen;
dflet 0:50cedd586816 759 CmdExt.pRxPayload = (uint8_t *)pValues;
dflet 0:50cedd586816 760
dflet 0:50cedd586816 761 Msg.Cmd.ConfigId = ConfigId;
dflet 0:50cedd586816 762 if( pConfigOpt ) {
dflet 0:50cedd586816 763 Msg.Cmd.ConfigOpt = (uint16_t)*pConfigOpt;
dflet 0:50cedd586816 764 }
dflet 0:50cedd586816 765 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanCfgGetCmdCtrl, &Msg, &CmdExt));
dflet 0:50cedd586816 766
dflet 0:50cedd586816 767 if( pConfigOpt ) {
dflet 0:50cedd586816 768 *pConfigOpt = (uint8_t)Msg.Rsp.ConfigOpt;
dflet 0:50cedd586816 769 }
dflet 0:50cedd586816 770 if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) {
dflet 0:50cedd586816 771 *pConfigLen = (uint8_t)CmdExt.RxPayloadLen;
dflet 0:50cedd586816 772 return SL_ESMALLBUF;
dflet 0:50cedd586816 773 } else {
dflet 0:50cedd586816 774 *pConfigLen = (uint8_t)CmdExt.ActualRxPayloadLen;
dflet 0:50cedd586816 775 }
dflet 0:50cedd586816 776
dflet 0:50cedd586816 777
dflet 0:50cedd586816 778 return (int16_t)Msg.Rsp.Status;
dflet 0:50cedd586816 779 }
dflet 0:50cedd586816 780 #endif
dflet 0:50cedd586816 781
dflet 0:50cedd586816 782 cc3100_wlan_rx_filters::cc3100_wlan_rx_filters(cc3100_driver &driver)
dflet 0:50cedd586816 783 : _driver(driver)
dflet 0:50cedd586816 784 {
dflet 0:50cedd586816 785
dflet 0:50cedd586816 786 }
dflet 0:50cedd586816 787
dflet 0:50cedd586816 788 cc3100_wlan_rx_filters::~cc3100_wlan_rx_filters()
dflet 0:50cedd586816 789 {
dflet 0:50cedd586816 790
dflet 0:50cedd586816 791 }
dflet 0:50cedd586816 792
dflet 0:50cedd586816 793 /******************************************************************************/
dflet 0:50cedd586816 794 /* RX filters message command response structures */
dflet 0:50cedd586816 795 /******************************************************************************/
dflet 0:50cedd586816 796
dflet 0:50cedd586816 797 /* Set command */
dflet 0:50cedd586816 798 typedef union {
dflet 0:50cedd586816 799 _WlanRxFilterAddCommand_t Cmd;
dflet 0:50cedd586816 800 _WlanRxFilterAddCommandReponse_t Rsp;
dflet 0:50cedd586816 801 } _SlrxFilterAddMsg_u;
dflet 0:50cedd586816 802
dflet 0:50cedd586816 803 /* Set command */
dflet 0:50cedd586816 804 typedef union _SlRxFilterSetMsg_u {
dflet 0:50cedd586816 805 _WlanRxFilterSetCommand_t Cmd;
dflet 0:50cedd586816 806 _WlanRxFilterSetCommandReponse_t Rsp;
dflet 0:50cedd586816 807 } _SlRxFilterSetMsg_u;
dflet 0:50cedd586816 808
dflet 0:50cedd586816 809 /* Get command */
dflet 0:50cedd586816 810 typedef union _SlRxFilterGetMsg_u {
dflet 0:50cedd586816 811 _WlanRxFilterGetCommand_t Cmd;
dflet 0:50cedd586816 812 _WlanRxFilterGetCommandReponse_t Rsp;
dflet 0:50cedd586816 813 } _SlRxFilterGetMsg_u;
dflet 0:50cedd586816 814
dflet 0:50cedd586816 815
dflet 0:50cedd586816 816 #if _SL_INCLUDE_FUNC(sl_WlanRxFilterAdd)
dflet 0:50cedd586816 817
dflet 0:50cedd586816 818 const _SlCmdCtrl_t _SlRxFilterAddtCmdCtrl =
dflet 0:50cedd586816 819 {
dflet 0:50cedd586816 820 SL_OPCODE_WLAN_WLANRXFILTERADDCOMMAND,
dflet 0:50cedd586816 821 sizeof(_WlanRxFilterAddCommand_t),
dflet 0:50cedd586816 822 sizeof(_WlanRxFilterAddCommandReponse_t)
dflet 0:50cedd586816 823 };
dflet 0:50cedd586816 824
dflet 0:50cedd586816 825
dflet 0:50cedd586816 826 /*******************************************************************************/
dflet 0:50cedd586816 827 /* RX filters */
dflet 0:50cedd586816 828 /*******************************************************************************/
dflet 0:50cedd586816 829 SlrxFilterID_t cc3100_wlan_rx_filters::sl_WlanRxFilterAdd( SlrxFilterRuleType_t RuleType,
dflet 0:50cedd586816 830 SlrxFilterFlags_t FilterFlags,
dflet 0:50cedd586816 831 const SlrxFilterRule_t* const Rule,
dflet 0:50cedd586816 832 const SlrxFilterTrigger_t* const Trigger,
dflet 0:50cedd586816 833 const SlrxFilterAction_t* const Action,
dflet 0:50cedd586816 834 SlrxFilterID_t* pFilterId)
dflet 0:50cedd586816 835 {
dflet 0:50cedd586816 836
dflet 0:50cedd586816 837
dflet 0:50cedd586816 838 _SlrxFilterAddMsg_u Msg;
dflet 0:50cedd586816 839 Msg.Cmd.RuleType = RuleType;
dflet 0:50cedd586816 840 /* filterId is zero */
dflet 0:50cedd586816 841 Msg.Cmd.FilterId = 0;
dflet 0:50cedd586816 842 Msg.Cmd.FilterFlags = FilterFlags;
dflet 0:50cedd586816 843 memcpy( &(Msg.Cmd.Rule), Rule, sizeof(SlrxFilterRule_t) );
dflet 0:50cedd586816 844 memcpy( &(Msg.Cmd.Trigger), Trigger, sizeof(SlrxFilterTrigger_t) );
dflet 0:50cedd586816 845 memcpy( &(Msg.Cmd.Action), Action, sizeof(SlrxFilterAction_t) );
dflet 0:50cedd586816 846 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlRxFilterAddtCmdCtrl, &Msg, NULL) );
dflet 0:50cedd586816 847 *pFilterId = Msg.Rsp.FilterId;
dflet 0:50cedd586816 848 return (int16_t)Msg.Rsp.Status;
dflet 0:50cedd586816 849
dflet 0:50cedd586816 850 }
dflet 0:50cedd586816 851 #endif
dflet 0:50cedd586816 852
dflet 0:50cedd586816 853
dflet 0:50cedd586816 854
dflet 0:50cedd586816 855 /*******************************************************************************/
dflet 0:50cedd586816 856 /* RX filters */
dflet 0:50cedd586816 857 /*******************************************************************************/
dflet 0:50cedd586816 858 #if _SL_INCLUDE_FUNC(sl_WlanRxFilterSet)
dflet 0:50cedd586816 859 const _SlCmdCtrl_t _SlRxFilterSetCmdCtrl =
dflet 0:50cedd586816 860 {
dflet 0:50cedd586816 861 SL_OPCODE_WLAN_WLANRXFILTERSETCOMMAND,
dflet 0:50cedd586816 862 sizeof(_WlanRxFilterSetCommand_t),
dflet 0:50cedd586816 863 sizeof(_WlanRxFilterSetCommandReponse_t)
dflet 0:50cedd586816 864 };
dflet 0:50cedd586816 865
dflet 0:50cedd586816 866 int16_t cc3100_wlan_rx_filters::sl_WlanRxFilterSet(const SLrxFilterOperation_t RxFilterOperation,
dflet 0:50cedd586816 867 const uint8_t* const pInputBuffer,
dflet 0:50cedd586816 868 uint16_t InputbufferLength)
dflet 0:50cedd586816 869 {
dflet 0:50cedd586816 870 _SlRxFilterSetMsg_u Msg;
dflet 0:50cedd586816 871 _SlCmdExt_t CmdExt;
dflet 0:50cedd586816 872
dflet 0:50cedd586816 873 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:50cedd586816 874 CmdExt.TxPayloadLen = InputbufferLength;
dflet 0:50cedd586816 875 CmdExt.pTxPayload = (uint8_t *)pInputBuffer;
dflet 0:50cedd586816 876
dflet 0:50cedd586816 877 Msg.Cmd.RxFilterOperation = RxFilterOperation;
dflet 0:50cedd586816 878 Msg.Cmd.InputBufferLength = InputbufferLength;
dflet 0:50cedd586816 879
dflet 0:50cedd586816 880
dflet 0:50cedd586816 881 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlRxFilterSetCmdCtrl, &Msg, &CmdExt) );
dflet 0:50cedd586816 882
dflet 0:50cedd586816 883
dflet 0:50cedd586816 884 return (int16_t)Msg.Rsp.Status;
dflet 0:50cedd586816 885 }
dflet 0:50cedd586816 886 #endif
dflet 0:50cedd586816 887
dflet 0:50cedd586816 888 /******************************************************************************/
dflet 0:50cedd586816 889 /* RX filters */
dflet 0:50cedd586816 890 /******************************************************************************/
dflet 0:50cedd586816 891 #if _SL_INCLUDE_FUNC(sl_WlanRxFilterGet)
dflet 0:50cedd586816 892 const _SlCmdCtrl_t _SlRxFilterGetCmdCtrl =
dflet 0:50cedd586816 893 {
dflet 0:50cedd586816 894 SL_OPCODE_WLAN_WLANRXFILTERGETCOMMAND,
dflet 0:50cedd586816 895 sizeof(_WlanRxFilterGetCommand_t),
dflet 0:50cedd586816 896 sizeof(_WlanRxFilterGetCommandReponse_t)
dflet 0:50cedd586816 897 };
dflet 0:50cedd586816 898
dflet 0:50cedd586816 899 int16_t cc3100_wlan_rx_filters::sl_WlanRxFilterGet(const SLrxFilterOperation_t RxFilterOperation,
dflet 0:50cedd586816 900 uint8_t* pOutputBuffer,
dflet 0:50cedd586816 901 uint16_t OutputbufferLength)
dflet 0:50cedd586816 902 {
dflet 0:50cedd586816 903 _SlRxFilterGetMsg_u Msg;
dflet 0:50cedd586816 904 _SlCmdExt_t CmdExt;
dflet 0:50cedd586816 905
dflet 0:50cedd586816 906 if (OutputbufferLength == 0) {
dflet 0:50cedd586816 907 return SL_EZEROLEN;
dflet 0:50cedd586816 908 }
dflet 0:50cedd586816 909
dflet 0:50cedd586816 910 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:50cedd586816 911 CmdExt.RxPayloadLen = OutputbufferLength;
dflet 0:50cedd586816 912 CmdExt.pRxPayload = (uint8_t *)pOutputBuffer;
dflet 0:50cedd586816 913
dflet 0:50cedd586816 914 Msg.Cmd.RxFilterOperation = RxFilterOperation;
dflet 0:50cedd586816 915 Msg.Cmd.OutputBufferLength = OutputbufferLength;
dflet 0:50cedd586816 916
dflet 0:50cedd586816 917
dflet 0:50cedd586816 918 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlRxFilterGetCmdCtrl, &Msg, &CmdExt) );
dflet 0:50cedd586816 919
dflet 0:50cedd586816 920 if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) {
dflet 0:50cedd586816 921 return SL_ESMALLBUF;
dflet 0:50cedd586816 922 }
dflet 0:50cedd586816 923
dflet 0:50cedd586816 924 return (int16_t)Msg.Rsp.Status;
dflet 0:50cedd586816 925 }
dflet 0:50cedd586816 926 #endif
dflet 0:50cedd586816 927
dflet 0:50cedd586816 928 }//namespace mbed_cc3100
dflet 0:50cedd586816 929
dflet 0:50cedd586816 930