Simple LED control project using CC3100 as Access Point and socket
Fork of cc3100_Test_Demo by
simplelink/cc3100_wlan.cpp
- Committer:
- dflet
- Date:
- 2015-02-10
- Revision:
- 0:e89ba455dbcf
File content as of revision 0:e89ba455dbcf:
/* * wlan.c - CC31xx/CC32xx Host Driver Implementation * * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /*****************************************************************************/ /* Include files */ /*****************************************************************************/ #include "cc3100_simplelink.h" #include "cc3100_protocol.h" #include "cc3100_driver.h" #include "cc3100_wlan.h" #include "cc3100_wlan_rx_filters.h" /*****************************************************************************/ /* Macro declarations */ /*****************************************************************************/ #define MAX_SSID_LEN (32) #define MAX_KEY_LEN (63) #define MAX_USER_LEN (32) #define MAX_ANON_USER_LEN (32) #define MAX_SMART_CONFIG_KEY (16) namespace mbed_cc3100 { cc3100_wlan::cc3100_wlan(cc3100_driver &driver, cc3100_wlan_rx_filters &wlan_filters) : _driver(driver), _wlan_filters(wlan_filters) { } cc3100_wlan::~cc3100_wlan() { } /***************************************************************************** sl_WlanConnect *****************************************************************************/ typedef struct { _WlanConnectEapCommand_t Args; int8_t Strings[MAX_SSID_LEN + MAX_KEY_LEN + MAX_USER_LEN + MAX_ANON_USER_LEN]; } _WlanConnectCmd_t; typedef union { _WlanConnectCmd_t Cmd; _BasicResponse_t Rsp; } _SlWlanConnectMsg_u; #if _SL_INCLUDE_FUNC(sl_WlanConnect) int16_t cc3100_wlan::sl_WlanConnect(signed char* pName, int16_t NameLen, uint8_t *pMacAddr, SlSecParams_t* pSecParams , SlSecParamsExt_t* pSecExtParams) { _SlWlanConnectMsg_u Msg = {0}; _SlCmdCtrl_t CmdCtrl = {0}; CmdCtrl.TxDescLen = 0;/* init */ CmdCtrl.RxDescLen = sizeof(_BasicResponse_t); /* verify SSID length */ VERIFY_PROTOCOL(NameLen <= MAX_SSID_LEN); /* update SSID length */ Msg.Cmd.Args.Common.SsidLen = (uint8_t)NameLen; /* Profile with no security */ /* Enterprise security profile */ if (NULL != pSecExtParams) { /* Update command opcode */ CmdCtrl.Opcode = SL_OPCODE_WLAN_WLANCONNECTEAPCOMMAND; CmdCtrl.TxDescLen += sizeof(_WlanConnectEapCommand_t); /* copy SSID */ memcpy(EAP_SSID_STRING(&Msg), pName, NameLen); CmdCtrl.TxDescLen += NameLen; /* Copy password if supplied */ if ((NULL != pSecParams) && (pSecParams->KeyLen > 0)) { /* update security type */ Msg.Cmd.Args.Common.SecType = pSecParams->Type; /* verify key length */ if (pSecParams->KeyLen > MAX_KEY_LEN) { return SL_INVALPARAM; } /* update key length */ Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen; ARG_CHECK_PTR(pSecParams->Key); /* copy key */ memcpy(EAP_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen); CmdCtrl.TxDescLen += pSecParams->KeyLen; } else { Msg.Cmd.Args.Common.PasswordLen = 0; } ARG_CHECK_PTR(pSecExtParams); /* Update Eap bitmask */ Msg.Cmd.Args.EapBitmask = pSecExtParams->EapMethod; /* Update Certificate file ID index - currently not supported */ Msg.Cmd.Args.CertIndex = pSecExtParams->CertIndex; /* verify user length */ if (pSecExtParams->UserLen > MAX_USER_LEN) { return SL_INVALPARAM; } Msg.Cmd.Args.UserLen = pSecExtParams->UserLen; /* copy user name (identity) */ if(pSecExtParams->UserLen > 0) { memcpy(EAP_USER_STRING(&Msg), pSecExtParams->User, pSecExtParams->UserLen); CmdCtrl.TxDescLen += pSecExtParams->UserLen; } /* verify Anonymous user length */ if (pSecExtParams->AnonUserLen > MAX_ANON_USER_LEN) { return SL_INVALPARAM; } Msg.Cmd.Args.AnonUserLen = pSecExtParams->AnonUserLen; /* copy Anonymous user */ if(pSecExtParams->AnonUserLen > 0) { memcpy(EAP_ANON_USER_STRING(&Msg), pSecExtParams->AnonUser, pSecExtParams->AnonUserLen); CmdCtrl.TxDescLen += pSecExtParams->AnonUserLen; } } /* Regular or open security profile */ else { /* Update command opcode */ CmdCtrl.Opcode = SL_OPCODE_WLAN_WLANCONNECTCOMMAND; CmdCtrl.TxDescLen += sizeof(_WlanConnectCommon_t); /* copy SSID */ memcpy(SSID_STRING(&Msg), pName, NameLen); CmdCtrl.TxDescLen += NameLen; /* Copy password if supplied */ if( NULL != pSecParams ) { /* update security type */ Msg.Cmd.Args.Common.SecType = pSecParams->Type; /* verify key length is valid */ if (pSecParams->KeyLen > MAX_KEY_LEN) { return SL_INVALPARAM; } /* update key length */ Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen; CmdCtrl.TxDescLen += pSecParams->KeyLen; /* copy key (could be no key in case of WPS pin) */ if( NULL != pSecParams->Key ) { memcpy(PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen); } } /* Profile with no security */ else { Msg.Cmd.Args.Common.PasswordLen = 0; Msg.Cmd.Args.Common.SecType = SL_SEC_TYPE_OPEN; } } /* If BSSID is not null, copy to buffer, otherwise set to 0 */ if(NULL != pMacAddr) { memcpy(Msg.Cmd.Args.Common.Bssid, pMacAddr, sizeof(Msg.Cmd.Args.Common.Bssid)); } else { memset(Msg.Cmd.Args.Common.Bssid, 0, sizeof(Msg.Cmd.Args.Common.Bssid)); } VERIFY_RET_OK ( _driver._SlDrvCmdOp(&CmdCtrl, &Msg, NULL)); return (int16_t)Msg.Rsp.status; } #endif /*******************************************************************************/ /* sl_Disconnect */ /* ******************************************************************************/ #if _SL_INCLUDE_FUNC(sl_WlanDisconnect) int16_t cc3100_wlan::sl_WlanDisconnect(void) { return _driver._SlDrvBasicCmd(SL_OPCODE_WLAN_WLANDISCONNECTCOMMAND); } #endif /******************************************************************************/ /* sl_PolicySet */ /******************************************************************************/ typedef union { _WlanPoliciySetGet_t Cmd; _BasicResponse_t Rsp; } _SlPolicyMsg_u; const _SlCmdCtrl_t _SlPolicySetCmdCtrl = { SL_OPCODE_WLAN_POLICYSETCOMMAND, sizeof(_WlanPoliciySetGet_t), sizeof(_BasicResponse_t) }; #if _SL_INCLUDE_FUNC(sl_WlanPolicySet) int16_t cc3100_wlan::sl_WlanPolicySet(uint8_t Type , const uint8_t Policy, uint8_t *pVal,uint8_t ValLen) { _SlPolicyMsg_u Msg; _SlCmdExt_t CmdExt; CmdExt.TxPayloadLen = ValLen; CmdExt.RxPayloadLen = 0; CmdExt.pTxPayload = (uint8_t *)pVal; CmdExt.pRxPayload = NULL; Msg.Cmd.PolicyType = Type; Msg.Cmd.PolicyOption = Policy; Msg.Cmd.PolicyOptionLen = ValLen; VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlPolicySetCmdCtrl, &Msg, &CmdExt)); return (int16_t)Msg.Rsp.status; } #endif /******************************************************************************/ /* sl_PolicyGet */ /******************************************************************************/ typedef union { _WlanPoliciySetGet_t Cmd; _WlanPoliciySetGet_t Rsp; } _SlPolicyGetMsg_u; const _SlCmdCtrl_t _SlPolicyGetCmdCtrl = { SL_OPCODE_WLAN_POLICYGETCOMMAND, sizeof(_WlanPoliciySetGet_t), sizeof(_WlanPoliciySetGet_t) }; #if _SL_INCLUDE_FUNC(sl_WlanPolicyGet) int16_t cc3100_wlan::sl_WlanPolicyGet(uint8_t Type , uint8_t Policy,uint8_t *pVal,uint8_t *pValLen) { _SlPolicyGetMsg_u Msg; _SlCmdExt_t CmdExt; if (*pValLen == 0) { return SL_EZEROLEN; } CmdExt.TxPayloadLen = 0; CmdExt.RxPayloadLen = *pValLen; CmdExt.pTxPayload = NULL; CmdExt.pRxPayload = pVal; CmdExt.ActualRxPayloadLen = 0; Msg.Cmd.PolicyType = Type; Msg.Cmd.PolicyOption = Policy; VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlPolicyGetCmdCtrl, &Msg, &CmdExt)); if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) { *pValLen = Msg.Rsp.PolicyOptionLen; return SL_ESMALLBUF; } else { /* no pointer valus, fill the results into int8_t */ *pValLen = (uint8_t)CmdExt.ActualRxPayloadLen; if( 0 == CmdExt.ActualRxPayloadLen ) { *pValLen = 1; pVal[0] = Msg.Rsp.PolicyOption; } } return (int16_t)SL_OS_RET_CODE_OK; } #endif /*******************************************************************************/ /* sl_ProfileAdd */ /*******************************************************************************/ typedef struct { _WlanAddGetEapProfile_t Args; int8_t Strings[MAX_SSID_LEN + MAX_KEY_LEN + MAX_USER_LEN + MAX_ANON_USER_LEN]; } _SlProfileParams_t; typedef union { _SlProfileParams_t Cmd; _BasicResponse_t Rsp; } _SlProfileAddMsg_u; #if _SL_INCLUDE_FUNC(sl_WlanProfileAdd) int16_t cc3100_wlan::sl_WlanProfileAdd(int8_t* pName, int16_t NameLen, uint8_t *pMacAddr, SlSecParams_t* pSecParams , SlSecParamsExt_t* pSecExtParams, uint32_t Priority, uint32_t Options) { _SlProfileAddMsg_u Msg; _SlCmdCtrl_t CmdCtrl = {0}; CmdCtrl.TxDescLen = 0;/* init */ CmdCtrl.RxDescLen = sizeof(_BasicResponse_t); /* update priority */ Msg.Cmd.Args.Common.Priority = (uint8_t)Priority; /* verify SSID length */ VERIFY_PROTOCOL(NameLen <= MAX_SSID_LEN); /* update SSID length */ Msg.Cmd.Args.Common.SsidLen = (uint8_t)NameLen; /* Enterprise security profile */ if (NULL != pSecExtParams) { /* Update command opcode */ CmdCtrl.Opcode = SL_OPCODE_WLAN_EAP_PROFILEADDCOMMAND; CmdCtrl.TxDescLen += sizeof(_WlanAddGetEapProfile_t); /* copy SSID */ memcpy(EAP_PROFILE_SSID_STRING(&Msg), pName, NameLen); CmdCtrl.TxDescLen += NameLen; /* Copy password if supplied */ if ((NULL != pSecParams) && (pSecParams->KeyLen > 0)) { /* update security type */ Msg.Cmd.Args.Common.SecType = pSecParams->Type; if( SL_SEC_TYPE_WEP == Msg.Cmd.Args.Common.SecType ) { Msg.Cmd.Args.Common.WepKeyId = 0; } /* verify key length */ if (pSecParams->KeyLen > MAX_KEY_LEN) { return SL_INVALPARAM; } VERIFY_PROTOCOL(pSecParams->KeyLen <= MAX_KEY_LEN); /* update key length */ Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen; CmdCtrl.TxDescLen += pSecParams->KeyLen; ARG_CHECK_PTR(pSecParams->Key); /* copy key */ memcpy(EAP_PROFILE_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen); } else { Msg.Cmd.Args.Common.PasswordLen = 0; } ARG_CHECK_PTR(pSecExtParams); /* Update Eap bitmask */ Msg.Cmd.Args.EapBitmask = pSecExtParams->EapMethod; /* Update Certificate file ID index - currently not supported */ Msg.Cmd.Args.CertIndex = pSecExtParams->CertIndex; /* verify user length */ if (pSecExtParams->UserLen > MAX_USER_LEN) { return SL_INVALPARAM; } Msg.Cmd.Args.UserLen = pSecExtParams->UserLen; /* copy user name (identity) */ if(pSecExtParams->UserLen > 0) { memcpy(EAP_PROFILE_USER_STRING(&Msg), pSecExtParams->User, pSecExtParams->UserLen); CmdCtrl.TxDescLen += pSecExtParams->UserLen; } /* verify Anonymous user length (for tunneled) */ if (pSecExtParams->AnonUserLen > MAX_ANON_USER_LEN) { return SL_INVALPARAM; } Msg.Cmd.Args.AnonUserLen = pSecExtParams->AnonUserLen; /* copy Anonymous user */ if(pSecExtParams->AnonUserLen > 0) { memcpy(EAP_PROFILE_ANON_USER_STRING(&Msg), pSecExtParams->AnonUser, pSecExtParams->AnonUserLen); CmdCtrl.TxDescLen += pSecExtParams->AnonUserLen; } } /* Regular or open security profile */ else { /* Update command opcode */ CmdCtrl.Opcode = SL_OPCODE_WLAN_PROFILEADDCOMMAND; /* update commnad length */ CmdCtrl.TxDescLen += sizeof(_WlanAddGetProfile_t); if (NULL != pName) { /* copy SSID */ memcpy(PROFILE_SSID_STRING(&Msg), pName, NameLen); CmdCtrl.TxDescLen += NameLen; } /* Copy password if supplied */ if( NULL != pSecParams ) { /* update security type */ Msg.Cmd.Args.Common.SecType = pSecParams->Type; if( SL_SEC_TYPE_WEP == Msg.Cmd.Args.Common.SecType ) { Msg.Cmd.Args.Common.WepKeyId = 0; } /* verify key length */ if (pSecParams->KeyLen > MAX_KEY_LEN) { return SL_INVALPARAM; } /* update key length */ Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen; CmdCtrl.TxDescLen += pSecParams->KeyLen; /* copy key (could be no key in case of WPS pin) */ if( NULL != pSecParams->Key ) { memcpy(PROFILE_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen); } } else { Msg.Cmd.Args.Common.SecType = SL_SEC_TYPE_OPEN; Msg.Cmd.Args.Common.PasswordLen = 0; } } /* If BSSID is not null, copy to buffer, otherwise set to 0 */ if(NULL != pMacAddr) { memcpy(Msg.Cmd.Args.Common.Bssid, pMacAddr, sizeof(Msg.Cmd.Args.Common.Bssid)); } else { memset(Msg.Cmd.Args.Common.Bssid, 0, sizeof(Msg.Cmd.Args.Common.Bssid)); } VERIFY_RET_OK(_driver._SlDrvCmdOp(&CmdCtrl, &Msg, NULL)); return (int16_t)Msg.Rsp.status; } #endif /*******************************************************************************/ /* sl_ProfileGet */ /*******************************************************************************/ typedef union { _WlanProfileDelGetCommand_t Cmd; _SlProfileParams_t Rsp; } _SlProfileGetMsg_u; const _SlCmdCtrl_t _SlProfileGetCmdCtrl = { SL_OPCODE_WLAN_PROFILEGETCOMMAND, sizeof(_WlanProfileDelGetCommand_t), sizeof(_SlProfileParams_t) }; #if _SL_INCLUDE_FUNC(sl_WlanProfileGet) int16_t cc3100_wlan::sl_WlanProfileGet(int16_t Index,int8_t* pName, int16_t *pNameLen, uint8_t *pMacAddr, SlSecParams_t* pSecParams, SlGetSecParamsExt_t* pEntParams, uint32_t *pPriority) { _SlProfileGetMsg_u Msg; Msg.Cmd.index = (uint8_t)Index; VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlProfileGetCmdCtrl, &Msg, NULL)); pSecParams->Type = Msg.Rsp.Args.Common.SecType; /* since password is not transferred in getprofile, password length should always be zero */ pSecParams->KeyLen = Msg.Rsp.Args.Common.PasswordLen; if (NULL != pEntParams) { pEntParams->UserLen = Msg.Rsp.Args.UserLen; /* copy user name */ if (pEntParams->UserLen > 0) { memcpy(pEntParams->User, EAP_PROFILE_USER_STRING(&Msg), pEntParams->UserLen); } pEntParams->AnonUserLen = Msg.Rsp.Args.AnonUserLen; /* copy anonymous user name */ if (pEntParams->AnonUserLen > 0) { memcpy(pEntParams->AnonUser, EAP_PROFILE_ANON_USER_STRING(&Msg), pEntParams->AnonUserLen); } } *pNameLen = Msg.Rsp.Args.Common.SsidLen; *pPriority = Msg.Rsp.Args.Common.Priority; if (NULL != Msg.Rsp.Args.Common.Bssid) { memcpy(pMacAddr, Msg.Rsp.Args.Common.Bssid, sizeof(Msg.Rsp.Args.Common.Bssid)); } memcpy(pName, EAP_PROFILE_SSID_STRING(&Msg), *pNameLen); return (int16_t)Msg.Rsp.Args.Common.SecType; } #endif /*******************************************************************************/ /* sl_ProfileDel */ /*******************************************************************************/ typedef union { _WlanProfileDelGetCommand_t Cmd; _BasicResponse_t Rsp; } _SlProfileDelMsg_u; const _SlCmdCtrl_t _SlProfileDelCmdCtrl = { SL_OPCODE_WLAN_PROFILEDELCOMMAND, sizeof(_WlanProfileDelGetCommand_t), sizeof(_BasicResponse_t) }; #if _SL_INCLUDE_FUNC(sl_WlanProfileDel) int16_t cc3100_wlan::sl_WlanProfileDel(int16_t Index) { _SlProfileDelMsg_u Msg; Msg.Cmd.index = (uint8_t)Index; VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlProfileDelCmdCtrl, &Msg, NULL)); return (int16_t)Msg.Rsp.status; } #endif /******************************************************************************/ /* sl_WlanGetNetworkList */ /******************************************************************************/ typedef union { _WlanGetNetworkListCommand_t Cmd; _WlanGetNetworkListResponse_t Rsp; } _SlWlanGetNetworkListMsg_u; const _SlCmdCtrl_t _SlWlanGetNetworkListCtrl = { SL_OPCODE_WLAN_SCANRESULTSGETCOMMAND, sizeof(_WlanGetNetworkListCommand_t), sizeof(_WlanGetNetworkListResponse_t) }; #if _SL_INCLUDE_FUNC(sl_WlanGetNetworkList) int16_t cc3100_wlan::sl_WlanGetNetworkList(uint8_t Index, uint8_t Count, Sl_WlanNetworkEntry_t *pEntries) { int16_t retVal = 0; _SlWlanGetNetworkListMsg_u Msg; _SlCmdExt_t CmdExt; if (Count == 0) { return SL_EZEROLEN; } CmdExt.TxPayloadLen = 0; CmdExt.RxPayloadLen = sizeof(Sl_WlanNetworkEntry_t)*(Count); CmdExt.pTxPayload = NULL; CmdExt.pRxPayload = (uint8_t *)pEntries; Msg.Cmd.index = Index; Msg.Cmd.count = Count; VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanGetNetworkListCtrl, &Msg, &CmdExt)); retVal = Msg.Rsp.status; return (int16_t)retVal; } #endif /*******************************************************************************/ /* sl_WlanRxStatStart */ /*******************************************************************************/ #if _SL_INCLUDE_FUNC(sl_WlanRxStatStart) int16_t cc3100_wlan::sl_WlanRxStatStart(void) { return _driver._SlDrvBasicCmd(SL_OPCODE_WLAN_STARTRXSTATCOMMAND); } #endif #if _SL_INCLUDE_FUNC(sl_WlanRxStatStop) int16_t cc3100_wlan::sl_WlanRxStatStop(void) { return _driver._SlDrvBasicCmd(SL_OPCODE_WLAN_STOPRXSTATCOMMAND); } #endif #if _SL_INCLUDE_FUNC(sl_WlanRxStatGet) int16_t cc3100_wlan::sl_WlanRxStatGet(SlGetRxStatResponse_t *pRxStat,uint32_t Flags) { _SlCmdCtrl_t CmdCtrl = {SL_OPCODE_WLAN_GETRXSTATCOMMAND, 0, sizeof(SlGetRxStatResponse_t)}; memset(pRxStat,0,sizeof(SlGetRxStatResponse_t)); VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&CmdCtrl, pRxStat, NULL)); return 0; } #endif /******************************************************************************/ /* sl_WlanSmartConfigStop */ /******************************************************************************/ #if _SL_INCLUDE_FUNC(sl_WlanSmartConfigStop) int16_t cc3100_wlan::sl_WlanSmartConfigStop(void) { return _driver._SlDrvBasicCmd(SL_OPCODE_WLAN_SMART_CONFIG_STOP_COMMAND); } #endif /******************************************************************************/ /* sl_WlanSmartConfigStart */ /******************************************************************************/ typedef struct { _WlanSmartConfigStartCommand_t Args; int8_t Strings[3 * MAX_SMART_CONFIG_KEY]; /* public key + groupId1 key + groupId2 key */ } _SlSmartConfigStart_t; typedef union { _SlSmartConfigStart_t Cmd; _BasicResponse_t Rsp; } _SlSmartConfigStartMsg_u; const _SlCmdCtrl_t _SlSmartConfigStartCmdCtrl = { SL_OPCODE_WLAN_SMART_CONFIG_START_COMMAND, sizeof(_SlSmartConfigStart_t), sizeof(_BasicResponse_t) }; #if _SL_INCLUDE_FUNC(sl_WlanSmartConfigStart) int16_t cc3100_wlan::sl_WlanSmartConfigStart( const uint32_t groupIdBitmask, const uint8_t cipher, const uint8_t publicKeyLen, const uint8_t group1KeyLen, const uint8_t group2KeyLen, const uint8_t* pPublicKey, const uint8_t* pGroup1Key, const uint8_t* pGroup2Key) { _SlSmartConfigStartMsg_u Msg; Msg.Cmd.Args.groupIdBitmask = (uint8_t)groupIdBitmask; Msg.Cmd.Args.cipher = (uint8_t)cipher; Msg.Cmd.Args.publicKeyLen = (uint8_t)publicKeyLen; Msg.Cmd.Args.group1KeyLen = (uint8_t)group1KeyLen; Msg.Cmd.Args.group2KeyLen = (uint8_t)group2KeyLen; /* copy keys (if exist) after command (one after another) */ memcpy(SMART_CONFIG_START_PUBLIC_KEY_STRING(&Msg), pPublicKey, publicKeyLen); memcpy(SMART_CONFIG_START_GROUP1_KEY_STRING(&Msg), pGroup1Key, group1KeyLen); memcpy(SMART_CONFIG_START_GROUP2_KEY_STRING(&Msg), pGroup2Key, group2KeyLen); VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlSmartConfigStartCmdCtrl , &Msg, NULL)); return (int16_t)Msg.Rsp.status; } #endif /*******************************************************************************/ /* sl_WlanSetMode */ /*******************************************************************************/ typedef union { _WlanSetMode_t Cmd; _BasicResponse_t Rsp; } _SlwlanSetModeMsg_u; const _SlCmdCtrl_t _SlWlanSetModeCmdCtrl = { SL_OPCODE_WLAN_SET_MODE, sizeof(_WlanSetMode_t), sizeof(_BasicResponse_t) }; /* possible values are: WLAN_SET_STA_MODE = 1 WLAN_SET_AP_MODE = 2 WLAN_SET_P2P_MODE = 3 */ #if _SL_INCLUDE_FUNC(sl_WlanSetMode) int16_t cc3100_wlan::sl_WlanSetMode(const uint8_t mode) { _SlwlanSetModeMsg_u Msg; Msg.Cmd.mode = mode; VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanSetModeCmdCtrl , &Msg, NULL)); return (int16_t)Msg.Rsp.status; } #endif /*******************************************************************************/ /* sl_WlanSet */ /* ******************************************************************************/ typedef union { _WlanCfgSetGet_t Cmd; _BasicResponse_t Rsp; } _SlWlanCfgSetMsg_u; const _SlCmdCtrl_t _SlWlanCfgSetCmdCtrl = { SL_OPCODE_WLAN_CFG_SET, sizeof(_WlanCfgSetGet_t), sizeof(_BasicResponse_t) }; #if _SL_INCLUDE_FUNC(sl_WlanSet) int16_t cc3100_wlan::sl_WlanSet(uint16_t ConfigId ,uint16_t ConfigOpt,uint16_t ConfigLen, uint8_t *pValues) { _SlWlanCfgSetMsg_u Msg; _SlCmdExt_t CmdExt; CmdExt.TxPayloadLen = (ConfigLen+3) & (~3); CmdExt.RxPayloadLen = 0; CmdExt.pTxPayload = (uint8_t *)pValues; CmdExt.pRxPayload = NULL; Msg.Cmd.ConfigId = ConfigId; Msg.Cmd.ConfigLen = ConfigLen; Msg.Cmd.ConfigOpt = ConfigOpt; VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanCfgSetCmdCtrl, &Msg, &CmdExt)); return (int16_t)Msg.Rsp.status; } #endif /******************************************************************************/ /* sl_WlanGet */ /******************************************************************************/ typedef union { _WlanCfgSetGet_t Cmd; _WlanCfgSetGet_t Rsp; } _SlWlanCfgMsgGet_u; const _SlCmdCtrl_t _SlWlanCfgGetCmdCtrl = { SL_OPCODE_WLAN_CFG_GET, sizeof(_WlanCfgSetGet_t), sizeof(_WlanCfgSetGet_t) }; #if _SL_INCLUDE_FUNC(sl_WlanGet) int16_t cc3100_wlan::sl_WlanGet(uint16_t ConfigId, uint16_t *pConfigOpt,uint16_t *pConfigLen, uint8_t *pValues) { _SlWlanCfgMsgGet_u Msg; _SlCmdExt_t CmdExt; if (*pConfigLen == 0) { return SL_EZEROLEN; } CmdExt.TxPayloadLen = 0; CmdExt.RxPayloadLen = *pConfigLen; CmdExt.pTxPayload = NULL; CmdExt.pRxPayload = (uint8_t *)pValues; CmdExt.ActualRxPayloadLen = 0; Msg.Cmd.ConfigId = ConfigId; if( pConfigOpt ) { Msg.Cmd.ConfigOpt = (uint16_t)*pConfigOpt; } VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanCfgGetCmdCtrl, &Msg, &CmdExt)); if( pConfigOpt ) { *pConfigOpt = (uint8_t)Msg.Rsp.ConfigOpt; } if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) { *pConfigLen = (uint8_t)CmdExt.RxPayloadLen; return SL_ESMALLBUF; } else { *pConfigLen = (uint8_t)CmdExt.ActualRxPayloadLen; } return (int16_t)Msg.Rsp.Status; } #endif cc3100_wlan_rx_filters::cc3100_wlan_rx_filters(cc3100_driver &driver) : _driver(driver) { } cc3100_wlan_rx_filters::~cc3100_wlan_rx_filters() { } /******************************************************************************/ /* RX filters message command response structures */ /******************************************************************************/ /* Set command */ typedef union { _WlanRxFilterAddCommand_t Cmd; _WlanRxFilterAddCommandReponse_t Rsp; } _SlrxFilterAddMsg_u; const _SlCmdCtrl_t _SlRxFilterAddtCmdCtrl = { SL_OPCODE_WLAN_WLANRXFILTERADDCOMMAND, sizeof(_WlanRxFilterAddCommand_t), sizeof(_WlanRxFilterAddCommandReponse_t) }; /* Set command */ typedef union _SlRxFilterSetMsg_u { _WlanRxFilterSetCommand_t Cmd; _WlanRxFilterSetCommandReponse_t Rsp; } _SlRxFilterSetMsg_u; const _SlCmdCtrl_t _SlRxFilterSetCmdCtrl = { SL_OPCODE_WLAN_WLANRXFILTERSETCOMMAND, sizeof(_WlanRxFilterSetCommand_t), sizeof(_WlanRxFilterSetCommandReponse_t) }; /* Get command */ typedef union _SlRxFilterGetMsg_u { _WlanRxFilterGetCommand_t Cmd; _WlanRxFilterGetCommandReponse_t Rsp; } _SlRxFilterGetMsg_u; const _SlCmdCtrl_t _SlRxFilterGetCmdCtrl = { SL_OPCODE_WLAN_WLANRXFILTERGETCOMMAND, sizeof(_WlanRxFilterGetCommand_t), sizeof(_WlanRxFilterGetCommandReponse_t) }; /*******************************************************************************/ /* RX filters */ /*******************************************************************************/ #if _SL_INCLUDE_FUNC(sl_WlanRxFilterAdd) SlrxFilterID_t cc3100_wlan_rx_filters::sl_WlanRxFilterAdd( SlrxFilterRuleType_t RuleType, SlrxFilterFlags_t FilterFlags, const SlrxFilterRule_t* const Rule, const SlrxFilterTrigger_t* const Trigger, const SlrxFilterAction_t* const Action, SlrxFilterID_t* pFilterId) { _SlrxFilterAddMsg_u Msg; Msg.Cmd.RuleType = RuleType; /* filterId is zero */ Msg.Cmd.FilterId = 0; Msg.Cmd.FilterFlags = FilterFlags; memcpy( &(Msg.Cmd.Rule), Rule, sizeof(SlrxFilterRule_t) ); memcpy( &(Msg.Cmd.Trigger), Trigger, sizeof(SlrxFilterTrigger_t) ); memcpy( &(Msg.Cmd.Action), Action, sizeof(SlrxFilterAction_t) ); VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlRxFilterAddtCmdCtrl, &Msg, NULL) ); *pFilterId = Msg.Rsp.FilterId; return (int16_t)Msg.Rsp.Status; } #endif /*******************************************************************************/ /* RX filters */ /*******************************************************************************/ #if _SL_INCLUDE_FUNC(sl_WlanRxFilterSet) int16_t cc3100_wlan_rx_filters::sl_WlanRxFilterSet(const SLrxFilterOperation_t RxFilterOperation, const uint8_t* const pInputBuffer, uint16_t InputbufferLength) { _SlRxFilterSetMsg_u Msg; _SlCmdExt_t CmdExt; CmdExt.TxPayloadLen = InputbufferLength; CmdExt.pTxPayload = (uint8_t *)pInputBuffer; CmdExt.RxPayloadLen = 0; CmdExt.pRxPayload = (uint8_t *)NULL; Msg.Cmd.RxFilterOperation = RxFilterOperation; Msg.Cmd.InputBufferLength = InputbufferLength; VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlRxFilterSetCmdCtrl, &Msg, &CmdExt) ); return (int16_t)Msg.Rsp.Status; } #endif /******************************************************************************/ /* RX filters */ /******************************************************************************/ #if _SL_INCLUDE_FUNC(sl_WlanRxFilterGet) int16_t cc3100_wlan_rx_filters::sl_WlanRxFilterGet(const SLrxFilterOperation_t RxFilterOperation, uint8_t* pOutputBuffer, uint16_t OutputbufferLength) { _SlRxFilterGetMsg_u Msg; _SlCmdExt_t CmdExt; if (OutputbufferLength == 0) { return SL_EZEROLEN; } CmdExt.TxPayloadLen = 0; CmdExt.pTxPayload = NULL; CmdExt.RxPayloadLen = OutputbufferLength; CmdExt.pRxPayload = (uint8_t *)pOutputBuffer; CmdExt.ActualRxPayloadLen = 0; Msg.Cmd.RxFilterOperation = RxFilterOperation; Msg.Cmd.OutputBufferLength = OutputbufferLength; VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlRxFilterGetCmdCtrl, &Msg, &CmdExt) ); if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) { return SL_ESMALLBUF; } return (int16_t)Msg.Rsp.Status; } #endif }//namespace mbed_cc3100